2010-05-06 64 views
3

如果我有一個32位的二進制補碼,我想知道知道兩個數字相等的最簡單的方法是什麼......要知道這個最快的按位運算符是什麼?我知道兩個數字並檢查結果是否爲零效果很好......任何其他人的?二進制數比較

如果數字大於0,怎麼樣?我可以檢查第31'位,看它是大於還是等於0 ..但bgtz怎麼樣?

+3

什麼,是一個普通的舊比較不夠快,你呢? – 2010-05-06 03:44:15

+0

==對我來說不夠好,因爲我通過verilog來完成它並對它進行合成 – aherlambang 2010-05-06 03:45:52

+0

'a xor a'有什麼問題? – glebm 2010-05-06 03:49:06

回答

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輸入或門而不是比較器。

+10

是的。不成熟的優化在FPGA上尤其糟糕,其中常見的操作(例如'==')可能具有已知的最佳映射,並且將其進一步分解只會使事情變得更糟。 – Potatoswatter 2010-05-06 04:36:11

0

如果你可以異或然後將結果與零進行比較,那麼你可以將結果與一些值進行比較,如果你可以比較某個值,那麼你可以比較這兩個值而不使用異或和32位零。

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