木曜日, 2月 07, 2008

排他的論理和(exclusive OR) その1

ある2つのデータAとBが一致すること
つまり、

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 件のコメント: