この章では、前章で学んだフリップフロップを使ってカウンタを実装します。
カウンタとは、その名の通り数を数える回路です。8 ビットのカウンタを例に取りましょう。カウンタはクロックと呼ばれる 1 つの入力端子と 8 つの出力端子を持ちます。
カウンタはクロックが 1 になった回数を数えます。
まず初期状態ではクロックは 0 とし、カウンタは 00000000 を出力しているとします。入力クロックを 1 に変化させるとカウンタは 00000001 を出力するようになります。この後クロックを 0 に変化させても出力は 00000001 のままで、次にクロックを 1 に変化させると 00000010 となります。この要領で、クロックの値が 1 になるたびに出力信号が 1 ずつ増えていきます。
これを実装しましょう。実はカウンタの正体はほぼフリップフロップそのままです。クロックが 1 になるたびに値を増やすには加算器を使います。簡単なので先に回路図を出してしまいましょう。
なぜこれで動作するのでしょうか。初期状態でクロックが 0 とし、フリップフロップは 00000000 を出力しているとします。これに 1 足された値がフリップフロップに入力されているので、フリップフロップへの入力は 00000001 です。ただしクロックが 0 である限りはこの入力が何であろうとフリップフロップは 00000000 を出力し続けます。クロックが 1 になったとしましょう。するとこの瞬間の入力値の 00000001 がフリップフロップの出力として採用されることになります。この後は加算器を通った後の 00000010 がフリップフロップに入力されることになります。やはりここでも、クロックが 0 に戻って再び 1 に変わるまでは入力は無視されつづけ、クロックが立ち上がった瞬間に採用されてフリップフロップの出力が 00000010 になります。この要領で、フリップフロップの入力には今の値プラス 1 が入力され続け、クロックの値が立ち上がるたびにその値が採用されてカウントアップを実現しているのです。
ここで実は 2 つごまかしている説明があります。一つ目は、「瞬間」という用語です。最初の章で述べたように、論理回路では理想的には電流の遅延などは基本的に考えません。この考えに則ると、クロックが立ち上がった瞬間に、フリップフロップから出てきた出力が加算器を通ってフリップフロップへの入力へと回り、これが同じ瞬間に起こるのでやはりそれが出力へと回されるという無限ループが起こりそうです。実際に電子回路を組むとなるとそのようなタイミング制御が重要になってくるのも確かです。しかし、ここでは簡単のため、都合よく、加算器の出力結果がフリップフロップまで回ってくるのはクロックが立ち上がる瞬間よりも後だと考えてください。
二つ目のごまかしは、初期状態についてです。上ではフリップフロップは初期に 00000000 を取ると仮定していますが、実際はどういう状態を取っているかはこちらが決めることはできず、謎の値からはじまり、謎の値 + 1、謎の値 + 2 とカウントアップしていくことになります。これに対処するため、リセット回路というものを作りましょう
リセット回路付きのカウンタは 2 つの入力端子 CK, RESET と 8 つの出力端子を持ちます。リセット信号 RESET は基本的には常に 0 にしておき、その場合は通常のカウンタと同じように動作します。リセット信号 RESET が 1 であれば、カウンタは次のクロックの立ち上がりで 00000000 となります。
これは、加算器からの出力か 00000000 かを選択するセレクタで実現できます。
リセット信号が 0 のときはセレクタは加算器からの出力を選ぶので通常のカウンタ回路と同じように動作します。一方、リセット信号が 1 のときにはフリップフロップへの入力が強制的に 00000000 になるので、次のクロックの立ち上がりでカウンタの値が 00000000 になります。ただしリセット信号を 0 に戻すと、加算器側が選ばれるようになり、ここから通常のカウンタ回路と同様に 00000001, 00000010, 00000011 とカウントアップがはじまります。
リセット信号を一瞬だけ 1 にしてから観測をはじめると、0 からカウントアップすることが保証できます。物理的なリセットボタンがリセット信号につながっていると考えると分かりやすいと思います。
ここまでは、クロック信号も人手で入力する信号のように述べてきましたが、通常はクロック回路と呼ばれる専用の回路の出力を全てのクロック信号に共通に入力します。クロック回路は以下のような方形波を一定のリズムで出力します。
例えばクロックがちょうど 1 秒に 1 回立ち上がるスピードだとすると、カウンタによって時計を作ることができます。たとえばカウンタの出力を LED ライトにつなげると、2 進数のストップウォッチが作れます。オシャレですね。
現代のコンピュータではクロックは非常に高速です。CPU のスペック表でクロック何ヘルツと書いてあるのを見たことがある方もいるかもしれません。たとえば 2 GHz というと 1 秒間に 20 億回クロックが立ち上がっています。現代のコンピュータはそれだけのスピードでフリップフロップ(レジスタ)の値を書き換えているのです。たとえばプログラミングの際、スリープ入れずに while(True) a += 1 と書くとすごい勢いで a がカウントアップされていきますが、これはとてつもないスピードのクロックでカウンタが更新されていると考えてください。
- カウンタはクロックの立ち上がりのたびに出力が 1 増える回路
- カウンタはフリップフロップと加算器で実装できる
- リセットボタンとセレクタをカウンタにつなげることでリセット回路を構築できる
- クロックは専用の回路から一定のスピードで供給される
次章ではついに、本格的なコンピュータの設計に取りかかります。