сравнение двоичных чисел - PullRequest
3 голосов
/ 06 мая 2010

Если у меня есть 32-разрядное число с двумя дополнительными числами, и я хочу знать, какой самый простой способ узнать, что два числа равны ... какой бы самый быстрый побитовый оператор знал это? Я знаю xor'ing обоих чисел и проверить, если результаты равны нулю хорошо работает ... любой другой?

как насчет, если число больше 0 ?? Я могу проверить 31-й бит, чтобы увидеть, больше или равен 0 .. но как насчет bgtz?

Ответы [ 3 ]

9 голосов
/ 06 мая 2010

Вопреки вашим комментариям, '==' является частью 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 также поддерживает другие операторы сравнения, которые вы обычно ожидаете (! =, <= И т. Д.). Синтезаторы довольно «умны», поэтому что-то вроде <code>x != 0 обычно синтезируется в логический элемент с N-входом или вместо компаратора.

1 голос
/ 30 июля 2010
// 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 голосов
/ 07 мая 2010

если вы можете xor и затем сравнить результат с нулем, тогда вы можете сравнить результат с некоторым значением, и если вы можете сравнить что-то со значением, то вы можете просто сравнить два значения без использования xor и 32-битного нуля.

...