アフィリエイト広告
アフィリエイト広告

4ビット グレイコードカウンタ

図1. 4ビット グレイコードカウンタの動作

グレイコードについて、勉強していきましょう。

動画は、4ビットグレイコードカウンタの出力を LED表示した結果です。左の LEDはクロック、周期は約 1秒です。4つ並んだ LEDがグレイコードで 0~15 をカウントしています。

規則正しいようでバラバラのようで、ちょっとわかんない動きをしていますが、1クロックごとに点滅する LEDが常に 1個だけ、というのがグレイコードの特徴です。

グレイコードとは

グレイコードとは? はい、ググってください m(_ _;)m

バイナリコードとグレイコードの比較

バイナリコードとグレイコードのビットパターンの比較
図2. コードビットパターンの比較

図2 は、バイナリコードとグレイコードのビットパターンを比較したものです。

バイナリコードは桁上がりするたびに上位のビットが 1 になり、下位ビットは同じパターンを繰り返しています。
グレイコードは対照的になっていて、上位ビットが 1 になったあと下位ビットはそれまでとは逆の動きで変化していきます。

冒頭の動画は 4ビットなので、図2 の 0~15 のパターンで点滅しています。が、LED の点滅を見るだけではよくわかりませんね。図2 のパターンと比較してみるとわかると思います。

「ハミング距離が 1 である」ということ

グレイコードの値の遷移
図3. グレイコードの値の遷移
16QAM 信号空間ダイヤグラム
図4. 16QAM 信号空間ダイヤグラム

グレイコードの特徴は「隣り合った符号の間のハミング距離が 1 である」です。
たとえば、4 は 1100 で、5 は 1101 なので 1ビット目だけが違っている。11 は 1110、12 が 1010 なので 3ビット目だけが違っている。ということ。

グレイコードは 1ビットしか変化しないので、意図しない値にならないとかノイズやエラーに強いとか言われます。それは逆に言えば「値が遷移するときはハミング距離が 1 でなければならない」ということです。
なので、たとえば 0 (0000) → 2 (0011) の遷移はハミング距離が 2 になってしまうので不可。でも、0 (0000) → 7 (0100) は可。それを表したのが図3 です。

そんな特徴を利用したのが、直角位相振幅変調 (QAM) の信号空間ダイヤグラム。図4 では、縦横に遷移するデータはどれもハミング距離が 1 になっています。

ちなみに 16値の QAM は、搬送波を位相と振幅の組み合わせで変調することで一度に 4ビットのデータを伝送することができる変調方式のこと。詳しくはグーグル先生にお尋ねくださいませ。

4ビット グレイコードカウンタ

では、4ビットのグレイコードカウンタ回路を作ってみましょう。

真理値表と論理式

4ビットグレイコードカウンタの真理値表
図5. 4ビット グレイコード真理値表

真理値表から論理式を求めます。

これまでやってきたカウンタ回路の設計と変わりないですが、Qn の並びがバイナリコードと異なりますので、カルノー図を作るときにちょっと気をつけないといけません。

4ビットグレイコードカウンタのカルノー図と論理式
図6. 4ビット グレイコード カルノー図

カウンタ回路図

求めた論理式より作った回路図です。Dフリップフロップを使いました。

4ビットグレイコードカウンタの回路図
図7. 4ビット グレイコードカウンタ回路図

実験用周辺回路

カウンタ回路の動作の実験に使う周辺回路です。

クロック発振回路図
図8. クロック発振回路

クロック発振回路です。

いつも使っているシュミットトリガインバータ 74HC14 を使った矩形波発振回路です。発振周期は約 1秒です。

初期化回路
図9. 初期化回路

電源オン時にフリップフロップをクリアするための初期化回路です。

電源オン時に LOW をフリップフロップの CLR に与えます。約 0.5秒後に HIGH となり、カウント動作を開始します。

ビット表示LED回路
図10. ビット表示LED回路

クロックとカウンタの出力の表示LEDです。

D1 がクロックの表示で、1秒周期で点滅します。
D2~D5 がグレイコードの各ビット出力により点滅します。

ブレッドボード

グレイコードカウンタのブレッドボード
図11. グレイコードカウンタ ブレッドボード

実験したブレッドボードのようすです。

一番下のブロックが組み合わせ回路の IC 6個、中央の 2個がフリップフロップです。
左上がクロック発振回路と初期化回路。その横に表示 LEDがあります。
右上は 5V電源回路で、回路図にはありませんが、ACアダプタからの 9Vを三端子レギュレータ 7805 で 5Vにしています。

動作のようすは、冒頭の動画 (図1) をご覧ください。

後記

今回は、4ビットのグレイコードカウンタを作ってみました。

グレイコードについてググると、いろいろなサイトに「データ伝送にグレイコードを使用するとノイズやエラーに対して耐性が高い」といった特徴が書かれています。でも、当初、それがどうしても理解できませんでした。
たしかに 1ビットだけが変化するならエラーを検出しやすくなりますし、変化前か変化後かの値しかないのですから、それはわかります。でも値が 0 から 2 に変化することだってあるじゃん。それはどうなるんだ? chatGPT に尋ねても「1ビットの変化が他のビットに影響を及ぼさない」などと意味不明な返事しか返ってこない。
何か根本的な理解が間違っているんじゃないかと悩んだ末に、ようやくわかりました。

「グレイコードは、2ビット以上が同時に変化するような値の変化をさせてはならない」

10進数でもバイナリコードでも 0 → 2 のような変化がありえますが、グレイコードでは 0000 → 0011 という変化はできない。1ビットだけ変化する、のではなくて「1ビットだけしか変化させない」のがグレイコードなのです。

タイトルとURLをコピーしました