二进制数比较

时间:2010-05-06 03:40:08

标签: algorithm bit-manipulation verilog

如果我有一个32位的二进制补码数,我想知道最简单的两种数字相等的方法是什么...知道这个的最快的位运算符是什么?我知道xor'ing这两个数字并检查结果是否正常工作......其他任何一个?

如果数字大于0怎么样?我可以查看第31位以查看它是否大于或等于0 ..但是bgtz怎么样?

3 个答案:

答案 0 :(得分: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还支持您通常期望的其他比较运算符(!=,&lt; =等)。合成器相当“智能”,因此像x != 0这样的东西通常会合成一个N输入OR门而不是比较器。

答案 1 :(得分: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

答案 2 :(得分:0)

如果您可以xor然后将结果与零进行比较,那么您可以将结果与某个值进行比较,如果您可以将某些值与值进行比较,那么您可以只使用xor和32位零来比较这两个值。