在用二补码来反转数字的符号时,您通常只需将每一位取反并加 1。例如:
011 (3)
100 + 1 = 101 (-3)
在 VHDL 中是:
a <= std_logic_vector(unsigned(not(a)) + 1);
以这种方式,合成器使用 N 位加法器。
不使用加法器是否有另一种更有效的解决方案?
在用二补码来反转数字的符号时,您通常只需将每一位取反并加 1。例如:
011 (3)
100 + 1 = 101 (-3)
在 VHDL 中是:
a <= std_logic_vector(unsigned(not(a)) + 1);
以这种方式,合成器使用 N 位加法器。
不使用加法器是否有另一种更有效的解决方案?
我想没有更简单的方法可以做到这一点,但加法器可能没有你想象的那么糟糕。
如果您要说反转 32 位数字,则综合工具可能会从 32 位加法器结构开始。然而,当看到B
输入总是绑定到 1 时,由于未使用的门(与门的一个引脚接地,或门的一个引脚连接到逻辑 1 等),它可以“挖空”很多结构)。
所以我想你剩下的将是一个相当有效的逻辑块,它只是增加一个输入数字。
如果您只是想创建一个二进制补码位模式,那么一元-
也可以。
a = 3'b001 ; // 1
b = -a ; //3'b111 -1
c = ~a + 1 ; //3'b111 -1
Tim 还正确地指出,仅仅因为您使用 a+
或通过一元 - 来暗示一个 -,综合工具就可以自由地对此进行优化。
全加器有 3 个输入(A、B、Carry_in)和 2 个输出(Sum Carry_out)。由于我们使用的第二个输入只有 1 位宽,并且在 LSB 处没有进位,我们不需要“全加器”。
具有 2 个输入(A、B)和 2 个输出(Sum Carry)的半加器在这里是完美的。
对于 LSB,半加器 B 输入将为高电平,即+1
. B 输入的其余位将用于传播前一位的进位。
There is no way that I am aware of to write in verilog that you want a half adder, but any size number plus 1 bit only requires a half adder rather than a fulladder.