3

32ビットの2の補数があり、2つの数値が等しいことを知る最も簡単な方法を知りたい場合、これを知るための最速のビット演算子は何でしょうか。私は両方の数値を排他的論理和することを知っており、結果がゼロであるかどうかを確認します...他のものはありますか?

数値が0より大きい場合はどうですか?31番目のビットをチェックして0以上かどうかを確認できますが、bgtzはどうですか?

4

3 に答える 3

9

あなたのコメントに反して、'=='はVerilogの一部であり、私の記憶が今夜いつもよりずっと悪くない限り、それはうまく合成されるはずです。たとえば、次のように書くことができます。

// warning: untested, incomplete and utterly useless in any case.
// It's been a while since I wrote much Verilog, so my syntax is probably a bit off
// anyway (might well be more like VHDL than it should be).
//
module add_when_equal(clock, a, b, x, y, z);
input clock;
input [31:0] a, b, x, y;
output [31:0] z;
reg [31:0] a, b, x, y, z;

always begin: main
   @(posedge clock);
   if (a == b)
       z <= x + y;
end
endmodule;

Verilogは、通常期待する他の比較演算子(!=、<=など)もサポートします。シンセサイザーはかなり「スマート」であるため、x != 0通常、コンパレータではなくN入力ORゲートに合成されます。

于 2010-05-06T04:23:01.277 に答える
1
// this should work as comparator for Equality
wire [31:0] Cmp1, Cmp2;
wire Equal;
assign Equal  =  &{Cmp1 ~^ Cmp2}; // using XNOR
assign Equal  = ~|{Cmp1  ^ Cmp2}; // using XOR
于 2010-07-30T09:58:03.257 に答える
0

xorを実行して結果をゼロと比較できる場合は、結果をある値と比較できます。何かを値と比較できる場合は、xorと32ビットのゼロを使用せずに2つの値を比較できます。

于 2010-05-07T19:53:42.310 に答える