前回は、8ビットグレイコードカウンタを作ってみました。8ビットバイナリカウンタを作り、その出力をグレイコードに変換する、という回路で実現しています。
今回は、そのグレイコードをバイナリコードに復号する回路を作ってみます。また、出力を同期させるためのストレージレジスタも試してみましょう。
グレイコードをバイナリコードに変換する
前回のグレイコードカウンタで出力した 8ビットのグレイコードを、元のバイナリコードに変換 (復号) してみます。
グレイコードデコーダの設計
この変換もググればみつけられます。が、真理値表から論理式を求めて確認してみました。
今回も 4ビットだけの真理値表です。カルノー図をみると排他的論理和らしいことに気づきます。論理式を求めてみると、8ビットでも同様に考えればよさそうです。
グレイコードデコーダ回路
論理式から作った組み合わせ回路です。
前回のエンコーダと同じような排他的論理和を使った回路ですが、異なっている点は、上位ビットの状態を下位ビットに渡していくので遅延時間が大きくなっていくところ。そのために上位ビットと下位ビットのタイミングが合わなくなります。同期回路とするためには、そのズレを解消する必要がありそうです。
ストレージレジスタ
タイミングがズレているパルスを同期させるには、ストレージレジスタを利用します。
ストレージレジスタとは
ストレージレジスタについてはググってください。と言いたいところですが、あまり情報ないですね。
ストレージレジスタと聞いて思い浮かべるのは、これまでに何度も使ったことのあるシフトレジスタ 74HC595 です。データシートからロジックダイヤグラムを図3 に示します。
SRA~SRH は Dフリップフロップでシフトレジスタを構成しています。LRA~LRH がストレージレジスタといわれる部分で、こちらも Dフリップフロップです。シフトレジスタの出力を受けとって、クロック RCLK が入ると一斉にデータを出力します。
バラバラに入ってくる前段の出力を、クロックによって同期させて出力する。これがここでのストレージレジスタの働きです。
ストレージレジスタ回路
むずかしい回路ではないです。Dフリップフロップを 8ビット分並べてあるだけです。
デコーダから出力されたバイナリコードの各ビットを Dフリップフロップに入力しておき、クロック CK が入ったときに各ビットの値を、同期して、出力します。ただし、Dフリップフロップは次のクロックで動作しますから、データの出力は 1クロック分遅れることになります。こうした遅れを「レイテンシ」と言うようです。
実験用周辺回路
回路を実験するための周辺回路ですが、前回のグレイコードカウンタ回路と同様です。
クロック発振回路は共通で使用します。今回は Dフリップフロップ 74HC74 を使いましたので、初期化信号は負理論の RESET になります。初期化回路の負理論部分から取りだしてください。LED ビット表示回路は、もう一組同じものを作ります。
出力波形
さて、組み合わせ回路から出力された信号は、どのくらいの遅延があるのでしょうか。それを確認してみようと思ったのですが、遅延よりも波形の乱れが酷いことに気づいてしまいました。
図5 は、クロック (黄) の立ち上がり部と最下位ビットの出力波形 (青) を、Persist (持続時間) 5秒で記録したものです。
左側は組み合わせ回路 (デコーダ) の出力です。クロックより 100~200ns 遅れて、かなり荒れた波形になっています。ビットが反転するタイミングがその時々でズレますし、反転しないときにはハザードがでています。
右側がストレージレジスタの出力波形です。クロックからの遅れは 20ns で、きれいに反転しています。この波形をみれば、同期回路とするにはストレージレジスタは必須だと思えます。もちろん、レイテンシが 1 になることは忘れてはいけません。
バイナリコードからグレイコードに変換するエンコーダ回路では XORゲートが並列なので遅延も等しくなるから、ストレージレジスタがなくてもまぁいいかな〜と、当初考えていました。が、同じような状態はエンコーダでも発生しています。エンコーダもデコーダもストレージレジスタは必須だと、考え直しました。
ブレッドボード
実験したブレッドボードのようすです。
前回までに作った 8ビットバイナリカウンタとグレイコードエンコーダのブレッドボードに、今回のデコーダとストレージレジスタを加えてあります。
下から 3番目のブレッドボードがバイナリコードからグレイコードに変換するエンコーダ。その出力を下 2番目のデコーダでバイナリコードに変換しています。その出力が一番下のブレッドボードのストレージレジスタを通り、右上の LEDビット表示器で表示されます。
クロック周期を長くして観察すると、最終のバイナリコード出力が 1クロック遅れていることが確認できました。
後記
今回は、8ビットのグレイコードをバイナリコードに変換して、ストレージレジスタで同期化する回路を試してみました。
できあがった回路全体は、コードの変換をやってみた、以外に何の意味もありません。実際には、グレイコードをシリアル通信などで伝送して、受信したグレイコードをバイナリコードに復号するということをやるんだと思います。
データ伝送では、送信側と受信側のクロックが別々な (クロックドメインが異なる) 状態でも、同期化してデータをサンプリングする技が必要になる。伝送するデータがカウンタ値のような連続した値であれば、グレイコードを利用することで、ビットが変化する過渡期の間違った値をサンプリングしてしまうエラーを防ぐことができる。
つまり、サンプリングの方法が簡単になるってこと。それが 1ビットしか変化しないグレイコードをデータ伝送に利用するメリットなんです。
とまぁここまできてようやく、グレイコードを利用する利点の一端がわかった気がします。
ならば次は、実際にグレイコードを使ってデータ伝送をやってみたいじゃないですか。え?データ伝送?シリアル通信?非同期伝送といえば RS-232C?
あ、まぁ、そのうち気が向いたらに、します (;´Д`)