行为逻辑顺序,代码不能工作?

时间:2013-10-07 16:26:47

标签: vhdl

基本上我的模块中有以下代码。我想将一个数字更改为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时,这很慢,它也给了我乱码数字。

谁能告诉我什么错了?感谢。

2 个答案:

答案 0 :(得分:2)

这是综合工具可能比你做得更好的东西,所以我建议只使用z <= -a;,其中az的类型为signed

这将导致综合优化目标架构的否定,无论它是什么。例如,在FPGA中计算非+ 1非常有效。

答案 1 :(得分:0)

您可以这样做:signal&lt; = signal * -1,工具会为您合成它。但这可能不是最有效的。我不认为它会占用那么多逻辑。如果您真的需要一个更有效的解决方案,您可以这样做:

您是否有任何理由需要在1个时钟周期内进行上述转换?如果你花了32个时钟来做它会更容易,可能更少的资源。我建议您删除FOR循环,因为它会导致您遇到的大多数问题。