つまり、
A = B
を確認する回路をVerilog HDLで記述するにはどう書けばよいでしょうか?
assign equal = (A==B) ? 1'b1 : 1'b0;
こんな記述が一番妥当なところでしょうか。
ではもう少し具体的にどのような回路で構成されているか
わかるように記述するとどう書きますか?
A - B = 0
なので、次のように書けそうです。
(リダクション演算子については前回を参照)
assign equal = ~|(A - B);
しかし、データの比較のためにわざわざ減算器が登場するのも。。。
そこで、排他的論理和(exclusive OR)です。
ややこしい名前なので普通は"XOR"や"EOR"などと略します。
学生の頃、数学で習ったと思いますがXORの真理値表は次のとおりです。
入力A | 入力B | 出力 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0と0及び1と1の場合は0でそれ以外は1です。
つまり、2つが一致していれば0となり、異なれば1となります。
XORを使えば、
A XOR B = 0
となるので、次のような記述で2つのデータが一致しているかどうかを判断できます。
assign equal = ~|(A ^ B);
A ^ Bの演算結果は対応する各ビット毎のXORの結果となります。
つまり、C = A ^ Bとすると
C[0] = A[0] ^ B[0]
C[0] = A[1] ^ B[1]
…
C[i] = A[i] ^ B[i]
です。
ちなみに上記の3つの記述をXilinx ISEで論理合成にかけた結果、次のようになりました。
比較対照のA,Bはそれぞれ32bitとしています。
ターゲットデバイスは"xc3s1200e-4fg320"です。
【通常の比較】
Number of Slices: 8
Number of 4 input LUTs: 16
【減算による比較】
Number of Slices: 20
Number of 4 input LUTs: 40
【XORによる比較】
Number of Slices: 8
Number of 4 input LUTs: 16
普通に書くと、XORによる比較器が生成されるようですね。
高校生の頃だったと思いますが、数学の授業で初めて排他的論理和を習ったとき
名前もややこしいせいか、なんでわざわざこんな演算が必要なのだろうと感じましたが
この仕事をはじめてやっと、その意味がわかるようになりました。
別の仕事やってたらもう一生見なかったかもしれない。
0 件のコメント:
コメントを投稿