基本上我的模块中有以下代码。我想将一个数字更改为2的补码。
EG。 100变为-100,-200变为200。
我找到的一个快捷方式是从LSB读取,直到你到达' 1'然后翻转它后面的所有位。我正在使用性能最低的权衡来尝试使用32位转换器(我听说num< = not(num)+ 1资源很重)
flipBit <= '0'; -- reset the flip bit
FOR i IN 0 TO 31 LOOP
IF flipBit = '1' THEN
tempSubtract(i) <= not Operand2(i);
ELSE
tempSubtract(i) <= Operand2(i);
END IF;
IF Operand2(i) = '1' THEN
flipBit <= '1';
END IF;
END LOOP;
但是,所有这一切都不是为了整个事情。另外,当我做num&lt; = not(num)+1时,这很慢,它也给了我乱码数字。
谁能告诉我什么错了?感谢。
答案 0 :(得分:2)
这是综合工具可能比你做得更好的东西,所以我建议只使用z <= -a;
,其中a
和z
的类型为signed
。
这将导致综合优化目标架构的否定,无论它是什么。例如,在FPGA中计算非+ 1非常有效。
答案 1 :(得分:0)
您可以这样做:signal&lt; = signal * -1,工具会为您合成它。但这可能不是最有效的。我不认为它会占用那么多逻辑。如果您真的需要一个更有效的解决方案,您可以这样做:
您是否有任何理由需要在1个时钟周期内进行上述转换?如果你花了32个时钟来做它会更容易,可能更少的资源。我建议您删除FOR循环,因为它会导致您遇到的大多数问题。