二进制数比较

3
如果我有一个32位的二进制补码数,想要知道两个数字是否相等,最简单的方法是什么?最快的按位运算符是什么?我知道对这两个数字进行异或运算,并检查结果是否为零可以很好地解决问题...还有其他的方法吗?
如果一个数字大于0怎么办?我可以检查第31位来判断它是否大于或等于0...但bgtz怎么办?

3
你觉得简单的比较速度不够快吗? - David Z
"==对我来说不够好,因为我是通过Verilog进行综合的。" - aherlambang
3
如果你在自定义硬件中仅限于使用位运算符,这不会取决于你的位运算符的相对性能吗?我们应该向你询问这个问题。 - Alan
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门而不是比较器。


10
好的。在FPGA上,过早进行优化尤其糟糕。例如常见操作,如==,很可能已经有了最佳映射,再进一步分解只会让情况变得更糟。 - Potatoswatter

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

0

如果您可以进行异或运算,然后将结果与零进行比较,那么您就可以将结果与某个值进行比较,如果您可以将某些内容与一个值进行比较,那么您就可以直接比较这两个值,而不需要使用异或和32位零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接