我可能在这个问题上花费的时间比我应该的要多,但这是我的发现。
我找不到负二进制数的“纯”并行前缀加法器的任何示例。我也认为这是一个悬而未决的问题,因为我没有看到任何证据证明这是不可能的。
我能得到的最接近的方法是使用两步负负加法(在文献中通常缩写为 nnba)。它基于以下属性:
设 \$f(x) = \overline{x_{n-1}}x_{n-2}...\overline{x_1}x_0\$ 和 \$g(x) = x_{n-1}\上划线{x_{n-2}}...x_1\上划线{x_0}\$。这些基本上是分别与0xAA...AA
和的 XOR 操作0x55...55
。然后你可以证明
$$-(a +_{nb} b) = g\left(f(a) + f(b) + 1\right)$$
其中左侧是负数和 \$+_{nb}\$,而右侧的 \$+\$ 是正常的二进制和。
然后可以使用相同的属性但使用零操作数简单地反转负和:
$$-x = g\left(f(x) + f(0) + 1\right)$$
因此,为了使用并行前缀加法器求和,您可以:
- 计算 \$f(a)\$ 和 \$f(b)\$,即。通过反转负二进制数的每个奇数位
- 在设置 LSB 的进位位(\$+1\$)时计算常规二进制和,得到第一个中间和 \$s_1\$。
- 反转 \$s_1\$ 的所有位(这是 \$f(g(s_1))\$)。这是第一次求和的完成,同时也开始了反演。
- 使用并行前缀加法器将结果增加
0xAA...AB
(\$=f(0)+1\$),产生第二个中间和 \$s_2\$
- 计算 \$g(s_2)\$ (反转每个偶数位)以找到最终的负数和。
我实际上试图找到一个“纯粹的”并行前缀加法器,但我认为它太复杂了,因为我愿意花时间在它上面。原因如下:
并行前缀加法器的重点是找到 \$\{0,1\}^n \times \{0,1\}^n \rightarrow \{0,1\}^n\$ 的一些操作,它允许您可以从这些位轻松计算(在本例中为 2)进位。作为一个附加的约束,操作需要是关联的才能并行计算。例如,这基本上排除了任何 NOT 运算符(不是双重否定的一部分)。例如:\$a \circ b=a\cdot \bar b\$ 不是结合运算符,因为
$$\begin{align} (a\circ b)\circ c &= a\cdot \bar b \cdot \bar c\\ a\circ (b \circ c) &= a\cdot \overline{b \ cdot \bar c} \end{对齐}$$
请注意,您问题中进位的布尔运算符包括混合术语 \$c_i^+\overline{c_i^-}\$ 和 \$c_i^-\overline{c_i^+}\$,因此无法使用照原样。对于普通二进制加法中的单进位,在考虑生成和传播时如何构造该运算符变得非常明显,但对于负进位似乎并不那么明显。