デジタル回路のバス

デジタル回路のバス

 多くのデジタル回路は数bitからなる幅を持ったbitのデータで処理されます。たとえば、音楽のCDは16bitで音をデジタルにして処理しています。テレビは8〜10bitです。

 このようにある程度のbit数から1つの値として処理するデジタルデータをバスと呼びます。意外に初心者にはバスの概念が理解しづらいようです。

 先のCDの例では16bitバスという事になります。
 説明を簡単にするために、4bitのバスの例を示します。次のような回路があるとします。

 このような回路は同じ回路が4つ組み合わせて作られているのがわかるでしょうか? バスは同じ回路をバス幅分束ねて処理する場合に便利です。

 上記の回路の場合、入力部分はInData0,InData1,InData2,InData3の4つの信号があるので、これをバスとして扱う事ができます。途中のロジックもバスにする事ができますが、わかりやすく入力と出力をバスに書き換えてみましょう。

 この2つの回路は全く同じです。Indata[3:0]とOutDat[3:0]の部分がバスになっています。一旦バスにすると、バスからバラす必要もあります。その時の様子がわかると思います。

 なんでもかんでもバスにする人や、まったくバスを使わない。という人もいますが、極端はよくありません。とにかく、半年後の自分にわかるようにする。という目的でバスにしましょう。

 バスにすると束ねてVHDLやVerilogで記述する事ができるようになります。上の例では4bitですが、32bitにもなると0〜31までのソースを追いかけるのも大変です。

 また、バスの書き方ですが、HDLでは数値は0から始める。大きい方から並べる。というのが慣例のようです。例えば、InDataのバスを記述すると次のような宣言になります。

Verilog
input [3:0] InData;

VHDL
 InData: in std_logic_vector(3 downto 0);

 バスは一絡げにすることで記述も簡素化されますし、幅を持った信号という明示になります。これは大変重要な事で、幅を持った信号という事はそのbit数が意味を持っているという事であり、それがそのまま「値」になる。という事です。したがって、意味を持たない信号をバスにすべきではありません。

 もうひとつ、タイミングがバスは同じ。という事が前提になります。ちょっとFPGAの話から外れますが、音声をFPGAで処理しようとしたり、メモリをFPGAに接続したりする時に、8bitとか16bitのバスで音声データやメモリデータをFPGAに接続するのでうすが、それをバスとして認識していると、8bitなり16bitなりのバスの遅延を同じにしなくてはならない。という意識がエンジニアに働きます。

 ここに載せた回路図はDFFが縦に並んでいます。これは、この縦のDFFは同じタイミングで動く。という事を記述しています。読みやすい回路図とかHDLというのは、このようにコメントに書かなくてもなんらかのルールで未来の自分に伝えられる回路を示します。

 VHDLとVerilogの各々のバスの記述方法については、もう少し詳しく解説する事にします。バスというのはbit数の値に意味がある束だという事を理解してください。

 バスの解説から外れますが、上記の回路でクロック信号を見てください。

 全く同じクロック信号がInDFF0〜InDFF3とOutDFF0〜OutDFF3まで入っているのがわかるでしょうか。これが同期設計です。