0

基本上我的模块中有以下代码。我想将一个数字更改为 2 的补码负数。

例如。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 <= not(num)+1 时,它也会给我乱码。

谁能告诉我怎么了?谢谢。

4

2 回答 2

2

这是综合工具可能比你做得更好的事情,所以我建议简单地使用z <= -a;, whereazare of type signed

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

于 2013-10-07T21:12:33.413 回答
0

你可以这样做: signal <= signal * -1 并且工具会为你合成它。不过,这可能不是最有效的。不过,我认为它不会占用太多逻辑。如果您真的需要更有效的解决方案,您可以这样做:

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

于 2013-10-07T16:41:45.583 回答