Vhdl 如何在不使用加法器的情况下实现数字的2-补

Vhdl 如何在不使用加法器的情况下实现数字的2-补,vhdl,verilog,fpga,twos-complement,Vhdl,Verilog,Fpga,Twos Complement,在两个补码中,要反转一个数字的符号,通常只需对每一位求反并加1。 例如: 011 (3) 100 + 1 = 101 (-3) 在VHDL中是: a <= std_logic_vector(unsigned(not(a)) + 1); a我想没有更简单的方法,但是加法器可能没有你想象的那么糟糕 如果您试图说反转32位数字,那么合成工具可能从32位加法器结构开始。然而,当看到B输入总是绑定到1时,由于未使用的门(以及一个管脚绑定到地的门,或者一个管脚绑定到逻辑1的门,等等),它可以“挖空

在两个补码中,要反转一个数字的符号,通常只需对每一位求反并加1。 例如:

011 (3)
100 + 1 = 101 (-3)
在VHDL中是:

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

a我想没有更简单的方法,但是加法器可能没有你想象的那么糟糕

如果您试图说反转32位数字,那么合成工具可能从32位加法器结构开始。然而,当看到
B
输入总是绑定到1时,由于未使用的门(以及一个管脚绑定到地的门,或者一个管脚绑定到逻辑1的门,等等),它可以“挖空”很多结构


因此,我想剩下的是一个相当有效的逻辑块,它只增加一个输入数。

如果你只是试图创建一个二元补码位模式,那么一元的
-
也可以工作

a = 3'b001 ; //        1
b = -a     ; //3'b111 -1
c = ~a + 1 ; //3'b111 -1
Tim还正确地指出,仅仅因为您使用了
+
或通过一元数暗示了一个,合成工具就可以自由地对此进行优化

全加器有3个输入(A、B、进位)和2个输出(和进位)。因为我们使用的第二个输入只有1位宽,并且在LSB没有进位,所以我们不需要“全加器”

有2个输入(A,B)和2个输出(和进位)的半加法器在这里是完美的

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


据我所知,在verilog中不可能写下需要半加法器,但任何大小的数字加上1位只需要半加法器,而不是全加法器

在这种逻辑层次上,你很少能超越合成器——它很可能使用了它所拥有的最佳模块。除非您想强制采用另一种特定的方式,而且增量电路不需要顺序结构或内存,否则它可以直接硬接线。少门