如何在不使用加法器的情况下制作数字的2补码

时间:2013-01-26 17:48:36

标签: vhdl verilog fpga twos-complement

在双补码中反转一个数字的符号,你通常只是否定每一位并加1。 例如:

011 (3)
100 + 1 = 101 (-3)

在VHDL中是:

a <= std_logic_vector(unsigned(not(a)) + 1);

通过这种方式,合成器使用N位加法器。

是否有另一种更有效的解决方案而不使用加法器?

2 个答案:

答案 0 :(得分:5)

我猜想有一种更简单的方法可以做到这一点,但加法器可能没有您想象的那么糟糕。

如果您试图说明反转32位数字,则综合工具可能以32位加法器结构开始。然而,当看到B输入总是连接到1时,由于未使用的门(AND门与一个引脚接地,OR门与一个引脚并联),它可以“掏空”许多结构逻辑1,等等。

所以你留下的东西我想象的是一个合理有效的逻辑blob,它只会增加一个输入数字。

答案 1 :(得分:1)

如果您只是想创建一个二进制补码位模式,那么一元-也可以。

a = 3'b001 ; //        1
b = -a     ; //3'b111 -1
c = ~a + 1 ; //3'b111 -1
蒂姆也正确地指出,仅仅因为你使用+或通过一元来暗示一个 - ,综合工具可以自由地优化它。

全加器有3个输入(A,B,Carry_in)和2个输出(Sum Carry_out)。因为对于我们的使用,第二个输入只有1位宽,而在LSB没有进位,我们不需要'全加器'。

有一个输入(A,B)和2个输出(Sum Carry)的半加法器在这里是完美的。

对于LSB,半加器B输入将为高+1。其余的B位输入将用于从前一位传播Carry。

我没有办法在verilog中写下你想要一个半加法器,但任何大小的数字加上1位只需要一个半加法器而不是一个更好的加法器。