【问题标题】:binary number comparison二进制数比较
【发布时间】:2011-12-14 01:33:45
【问题描述】:

如果我有一个 32 位二进制补码,并且我想知道知道两个数字相等的最简单方法是什么……知道这一点的最快按位运算符是什么?我知道对两个数字进行异或并检查结果是否为零效果很好......还有其他的吗?

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

【问题讨论】:

  • 什么,一个普通的旧比较对你来说不够快吗?
  • == 对我来说还不够好,因为我是通过 verilog 来做的并合成它
  • 如果您将自己限制在自定义硬件中的位运算符,那不取决于您的位运算符的相对性能吗?我们应该问你这个问题。

标签: algorithm bit-manipulation verilog


【解决方案1】:

与您的 cmets 不同,'==' 是 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 门而不是比较器。

【讨论】:

  • 是的。过早的优化在 FPGA 上尤其糟糕,其中常见的操作(如 ==)可能具有已知的最佳映射,进一步分解它只会让事情变得更糟。
【解决方案2】:
// 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

【讨论】:

    【解决方案3】:

    如果您可以异或然后将结果与零进行比较,那么您可以将结果与某个值进行比较,如果您可以将某个值与某个值进行比较,那么您可以只比较两个值而不使用异或和 32 位零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2011-11-22
      • 2016-08-16
      • 2013-11-28
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多