この記事はセルオートマトンによるCPU作成連載記事の7つ目です。(2022/12/14)
自己保持回路ではクロックが来るごとに状態が反転することができました。これを複数並べれば2進数によるカウンタを作れます。
1つ目の自己保持回路がクロックを受け取り、01状態が反転します。2つ目の自己保持回路は1つ目の自己保持回路が1から0に戻るときにクロックを受け取ることで、2進数での2の位を表現します。3つ目は同様に、2つ目が1から0に戻るときにクロックを受け取ることで2進数の4の位を表現します。4つ目も同じく、3つ目が1から0に戻るときにクロックを受け取ることで2進数の8の位を表現します。
このカウンタはCPUの中ではプログラムカウンタで利用します。プログラムカウンタは実行中の命令番地を表します。クロックが来るごとに次の命令を実行するためにカウンタを1つ進めます。CPUはプログラムカウンタが指しているメモリ番地の値をメモリから読み取って、命令を実行します。
このカウンタをそのままプログラムカウンタとして利用するには機能が足りません。CPUはループや条件分岐のためにジャンプすることがあります。ジャンプするときにはプログラムカウンタを任意の値に書き換えることが必要です。また、命令の長さが命令によって異なる命令セットの場合は、1ずつ増やすとは限りません。この辺はあとで考えることにします。
次は応用です。2の位へのクロックは8の位が0のときに限るようにします。また、8の位が1のときは1の位が1から0に戻るときにもクロックを追加で受け取るようにしています。これにより9の次が0に戻る、サイクル10のカウンタになります。
次はさきほどとほとんど同じですが、サイクル6のカウンタです。
これまでの回路を組み合わせればバイナリ時計が作れそうです。
バイナリ時計は2進数で時刻を表現した時計です。
ここでは分と時の計4桁をそれぞれ2進数で表現しています。
時間は24で1サイクルでロジックが少し複雑ですので、線が混み合っています。
時間の桁まで変わるときは間に合ってなくて、時間が変わりきる前に次の分に進んでしまいます。
後日、リセット機能付きカウンタにつながります。また、バイナリ時計は7セグメントディスプレイ付きバイナリ時計も作成しています。