5

在用二补码来反转数字的符号时,您通常只需将每一位取反并加 1。例如:

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

在 VHDL 中是:

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

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

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

4

2 回答 2

5

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

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

所以我想你剩下的将是一个相当有效的逻辑块,它只是增加一个输入数字。

于 2013-01-26T19:18:46.790 回答
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.

于 2013-01-27T10:12:00.533 回答