如果我有一個32位的二進制補碼,我想知道知道兩個數字相等的最簡單的方法是什麼......要知道這個最快的按位運算符是什麼?我知道兩個數字並檢查結果是否爲零效果很好......任何其他人的?二進制數比較
如果數字大於0,怎麼樣?我可以檢查第31'位,看它是大於還是等於0 ..但bgtz怎麼樣?
如果我有一個32位的二進制補碼,我想知道知道兩個數字相等的最簡單的方法是什麼......要知道這個最快的按位運算符是什麼?我知道兩個數字並檢查結果是否爲零效果很好......任何其他人的?二進制數比較
如果數字大於0,怎麼樣?我可以檢查第31'位,看它是大於還是等於0 ..但bgtz怎麼樣?
與你的評論相反,'=='是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輸入或門而不是比較器。
是的。不成熟的優化在FPGA上尤其糟糕,其中常見的操作(例如'==')可能具有已知的最佳映射,並且將其進一步分解只會使事情變得更糟。 – Potatoswatter 2010-05-06 04:36:11
如果你可以異或然後將結果與零進行比較,那麼你可以將結果與一些值進行比較,如果你可以比較某個值,那麼你可以比較這兩個值而不使用異或和32位零。
// 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-05-06 03:44:15
==對我來說不夠好,因爲我通過verilog來完成它並對它進行合成 – aherlambang 2010-05-06 03:45:52
'a xor a'有什麼問題? – glebm 2010-05-06 03:49:06