前回は、グレイコードについて勉強し、4ビットグレイコードカウンタを作ってみました。
今回は、8ビットのグレイコードカウンタを作ってみようと思います。
が、なんだか設計するのがむずかしそう。そこで、まずバイナリコードを作って、それをグレイコードに変換することにしましょう。そのほうが簡単なようです。
8ビット バイナリカウンタを作る
8ビットのカウンタを作るとき、これまでやっていたように真理値表からカルノー図を作って論理式を求める、って方法では難しくなってしまいます。なので、60進カウンタでやったように、イネーブル付き同期カウンタを作って組合せるのが順当な方法かなと思います。
でも、nビット 2n進カウンタならば、そんなに難しくはありません。
8ビットカウンタの動作を考える
図1 は、4ビット 16進カウンタのタイミングチャートです。
各ビットの出力がどのタイミングで反転しているか、みていきましょう。
まず、Q0 はクロックが入るたびに反転します。なので、クロックを Tフリップフロップに入力すれば良いことがわかります。
つぎに、Q1 は Q0 が 1 のときに反転します。これは、イネーブル付き Tフリップフロップを利用して、Q0 が 0 ならば反転しない、Q1 が 1 ならば反転する、という動作をさせれば良いです。イネーブル付き Tフリップフロップは JKフリップフロップの J と K を直結すればできますから、Q0 を J1、K1 に入れてやれば良いです。
同様に、Q2 は Q0 と Q1 とが 1 のときに、Q3 は Q0、Q1、Q2 が全部 1 のときに反転します。つまり、前段までの出力を AND してイネーブル付き Tフリップフロップに入れてやれば良いということです。
8ビットカウンタ回路
ということですから、Qn は Q0~Qn-1 が 1 のときに反転すると考えていけば、8ビットカウンタができてしまいます。
なお、イネーブル付き Tフリップフロップは、Dフリップフロップで作ることも可能です。過去記事で書いていますので参照ください。
バイナリコードをグレイコードに変換する
バイナリコードができましたので、これをグレイコードに変換しましょう。
グレイコードエンコーダの設計
変換の方法はググればみつけられますが、ここは勉強ですから、真理値表を書いて論理式を求めて確かめてみます。
カルノー図を見ればもう、排他的論理和の形だと気づきますね。
真理値表は 4ビット分しか作りませんでしたが、バイナリコードの動きは同じなので、8ビットでも同様に考えていけばよさそうです。
グレイコードエンコーダ回路
論理式をもとに、組み合わせ回路を作りました。(図4)
グーグル先生の回路とちょっと違う?いや、バスラインで描いているだけで、同じ回路です。「もとのバイナリコードと、それを右シフトしたコードの排他的論理和をとる」ということが、回路図からも理解できると思います。
ちなみに、同期設計では、グレイコードをいったんストレージレジスタに取り込んで、クロックに同期させて出力します。だた、その場合は出力が 1クロック遅れることになります。こうした遅れのことを「レイテンシ」と言うようです。
実験用の周辺回路
カウンタとエンコーダができたので、実際に動かしてみましょう。実験するために必要な周辺の回路を用意します。
毎度の、シュミットトリガインバータを使ったクロック発振回路です。(図5)
カウンタが一周するのに 256カウント必要ですので、ちゃっちゃっとカウントさせるために、周期を 0.045秒と短くしています。
フリップフロップの初期化回路です。電源オン時に初期化パルスを出力します。(図6)
今回使うのは JKフリップフロップ CD4027 ですので、HIGH で初期化されます。電源オン時、0.4秒の正パルスを出力します。
インバータが 3段入っていますが、1段で良いです。空き回路をつないだだけで、意味はないです。
バイナリコードとグレイコードを、それぞれ表示するための 8ビット LED表示部です。(図7)
D6~D13 がバイナリコード、D14~D21 がグレイコードを表示します。D22 はクロック表示です。
あと、回路図描いてないですが、電源は 5Vです。テキトーに調達してください。
バイナリコードとグレイコードを見比べてみた
図8が、組み立てたブレッドボードです。
左上がクロック発振回路と初期化回路。
DIP IC 6個が並んでいるのが 8ビットバイナリカウンタです。その右下の LED がバイナリコードを表示しています。
一番下がグレイコードエンコーダ。ここでバイナリコードをグレイコードに変換しています。その上の LED がグレイコードを表示します。
動画は、バイナリコードの 0xF5 からスタートしています。すぐに 0x00 になり 0xFF までカウントした後、0x0Eで終了しています。
それに対応したグレイコードが、左下の LED 列に表示されています。
バイナリコードはガチガチ動いていきますが、グレイコードは柔らかな感じで変化していく。そんなふうに俺は感じたのですが、どうでしょうか。
後記
今回は、8ビットグレイコードカウンタを作ってみました。
グレイコードの生成は、バイナリコードから変換するのが一般的なようですから、今回やったようなバイナリカウンタとエンコーダの組み合わせが最善なのだろうと思います。じっさい 4ビットカウンタでもけっこう複雑だし、8ビットとか作ろうとしても組み合わせもできないし、初手からグレイコードを生成するってのは現実的じゃないなぁって感じました。
あ、ロジックIC 使って生成している時点でもう、現実的じゃない、わけですが (;´Д`)