デジタル回路で数を比較する

デジタル回路で数を比較する

 デジタル回路は数を扱う事で様々な計算を行う回路です。だいたいの教科書ではandとかorとかDFFなどを解説して、1ビットの論理演算やメモリなどを使うことはできるようになります。しかし、現実問題として1ビットの演算などはほとんど扱う事はありません。

 デジタルは数を扱って、初めて生きる回路です。よく、8ビットとか16ビットとかのバスを扱いますが、そのビット数で示される数を演算するのがデジタル回路です。

 8ビットや16ビットのパラレルデータ線の事を「バス」と呼びますが、バスという言葉は1ビットでもバスです。パラレルの信号線だけがバスでは無いので注意してください。1つの信号線(1ビットでも多ビットでも)にぶら下がるデバイスがある物をバスといいます。なので、1対1の時にバスという方が誤りな気もします。

 8ビットでも16ビットでも、2進数の複数ビット幅を持った信号には、必ず0~ビット数までの重みづけがあります。重みづけの小さい方をLSB(least significant bit)といい、重みづけの大きい方をMSB(most significant bit)といいます。SPIなどのシリアルデータであっても同様です。

 よく、シリアルデータの先頭をLSB、最後をMSBと言う方がいますが、それは間違いです。データの重みでLSBとMSBが決まります。

 2進数で8ビットの時には、HDLで以下のように宣言します。

reg [7:0] rdata; // verilog
signal rdata: std_logic_vector(7 downto 0); — VHDL

 この場合のrdata(0)がLSBで、rdata(7)がMSBになります。

 このようにデータには2進数の重みがある。という事を理解しておいてください。わかりにくければ、10進数で考えてOKです。10進数の数字の桁が大きい方(例えば百の桁)がMSBで桁が低い方(例えば0の桁)がLSBです。

 データは重みをもっているので、束ねて「数」になります。8ビットというのは8本の信号でしかありませんが、各々の信号に重み(桁)が決まっているので、8ビット集まると0~255までの「数」になります。

 数になる事がわかれば、そこには比較することができます。比較には何個か種類があります。

  • 大きい
  • 小さい
  • 同じ
  • 違う

 これらは算数で習ったものと同じです。このように数を比較することをコンパレートといい、コンパレートする回路の事をコンパレータと呼びます。

 VHDLやVerilogなどのHDLを使わなかった時代にコンパレータを設計するのは、面倒な作業でした。しかし、今はHDLでコンパレータを設計できますので、何も苦労することはありません。各言語の関係演算子を覚えておけば良いだけです。

 数式と関係演算子の対応を次に示します。Verilogは少しわかりにくく、私も良く間違えます。

 数を比較する。という事でいえば、VHDLやVerilogは上記のように数式を各言語に合わせた書き方をするだけですから難しくはありません。

 デジタル回路は2進数で動作している。という事を念頭に比較対象を考えてください。「等しい」場合や「違う」場合にはその値ピンポイントなので、そのまま書くしかありませんが、大小の比較の場合には値を一旦2進数に直してみて、2進数でキレの良い数値にできるのであれば、桁を考えます。

 例えば、「半分」を考えてみると、8ビットでは7F(hex)か80(hex)になりますが、80(hex)の方がゼロが多く、2進数でキレの良い数という事になります。また、80(hex)を2進数で考えると、10000000(bin)ですので、80(hex)以降はMSBがすべて”1″であることに気が付くと思います。つまり、8ビット全部を比較しなくてもMSBだけを比較するだけで、「半分」を判別できることになります。

 具体的にはVHDLやVerilogで A>B  とするのではなく、 A(7)=’1’ とするだけで半分が計算できます。

 こうすることで、FPGAのロジックは節約できることになります。8ビット程度の数のコンパレートをするのに、こんな事を考える必要はない。という意見も多いと思いますが、値を比較する回路は一旦2進数で考えるように習慣づけておくと、高速回路設計やビット数の多い比較などでは最適な回路設計ができるようになるでしょう。