Vhdl 如何在不使用加法器的情况下实现数字的2-补
在两个补码中,要反转一个数字的符号,通常只需对每一位求反并加1。 例如: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的门,等等),它可以“挖空
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位只需要半加法器,而不是全加法器 在这种逻辑层次上,你很少能超越合成器——它很可能使用了它所拥有的最佳模块。除非您想强制采用另一种特定的方式,而且增量电路不需要顺序结构或内存,否则它可以直接硬接线。少门