加法器

单位加法

单位加法(single bit addition)。

半加器(half adder)处理无低位进位的情况,常用在最低位上。

  • 和 S=A⊕BS=A\oplus B
  • 向高位进位(carry out)Cout=ABC_{out}=AB

全加器(full adder)

  • S=A⊕B⊕CS=A\oplus B\oplus C
  • Cout=AB+BC+ACC_{out}=AB+BC+AC

PGK。

  • 产生进位 generate:G=ABG=AB,若 G=1G=1,Cout=1C_{out}=1,与 CC 无关
  • 传播进位 propagate:P=A⊕BP=A\oplus B,若 P=1P=1,此时 Cout=CC_{out}=C
  • 阻断进位 kill:K=A‾⋅B‾K=\overline{A}\cdot\overline{B},若 K=1K=1,Cout=0C_{out}=0,与 CC 无关

grouped PG。

base case:

  • G0:0=G0=Cin,P0:0=P0=0G_{0:0}=G_0=C_{in}, P_{0:0}=P_{0}=0
  • Gi:i=AiBi,Pi:i=Ai⊕BiG_{i:i}=A_iB_i, P_{i:i}=A_i\oplus B_i

一个区间 DP 形式的转移(LSB 在最右边): Gi:j=Gi:k+Pi:kGk−1:j,Pi:j=Pi:kPk−1:jG_{i:j}=G_{i:k}+P_{i:k}G_{k-1:j}, P_{i:j}=P_{i:k}P_{k-1:j}

最终的和是 Si=Pi⊕Ci=Pi⊕Gi−1:0S_i=P_i\oplus C_i=P_i\oplus G_{i-1:0}

行波进位加法器

行波进位加法器(Carry-Ripple Adder, CPA)。

根据递推公式 Ci=Gi−1:0=Gi−1+Pi−1Gi−2:0=Gi−1+Pi−1Ci−1C_i=G_{i-1:0}=G_{i-1}+P_{i-1}G_{i-2:0}=G_{i-1}+P_{i-1}C_{i-1},计算每一位的进位 CiC_i,最后的 Si=Ci⊕Ai⊕BiS_i=C_i\oplus A_i\oplus B_i。

使用分层全加器(cascade full adders)实现,critical path 长度为 nn。

超前进位加法器

超前进位加法器(Carry-Lookahead Adder,CLA)。

引入高价单元(high-valency cell),分组并行计算多位的 grouped PG。

4-valency cell 组成的 CLA:一次性计算 C4=G3:0=G3+P3G2+P3P2G1+P3P2P1G0C_4=G_{3:0}=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1G_0C4​=G3:0​=G3​+P3​G2​+P3​P2​G1​+P3​P2​P1​G0​
4-valency cell 组成的 CLA:一次性计算 C4=G3:0=G3+P3G2+P3P2G1+P3P2P1G0C_4=G_{3:0}=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1G_0

mm-valency cell CLA 计算 nn 位加法的 critical path 长度为 n/mn/m。

进位选择加法器

进位选择加法器(Carry-Select Adder,CSA)。

CPA/CLA 加和的过程中,高位的计算依赖低位的进位。但进位只可能有两种 0/1,所以每组预先计算好两种情况下的结果,等到低位的进位传上来的时候直接通过 MUX 选择正确的和与进位,能够节省一些时间。

4-valency cell with CSA
4-valency cell with CSA

进位递增加法器

进位递增加法器(Carry-Increment Adder,CIA?),对 CSA 的改进。

CSA 对低位进位为 0/1 的情况各自计算一遍结果,会重复算 Pi=Ai⊕Bi,Gi=AiBiP_i=A_i\oplus B_i,G_i=A_iB_i。

CIA 则只预先计算 Cin=0C_{in}=0 的情况,如果低位进位为 1,就用累加器(increment)在结果上加 1。比起 CSA 速度更快,面积更小。

还可以采用 variable group size:低位组小,高位组大,从而平衡进位到达的时间与组内计算的时间。

树形加法器

树形加法器(tree adders)很好理解,就是递归的超前进位(recursive lookahead),组织成树结构。那么 mm-valency cell 树形加法器的 critical path 长度为 log⁡mn\log_m n。

对于 nn 位加法,理想的树深度为 L=log⁡2nL=\log_2 n,扇出不超过 2,且每两层之间最多只有一条布线轨道。

按照三个指标给不同的加法器分类(tree adder taxonomy):

  • l=l= 逻辑级数(logic levels)−L-L
  • f=log⁡2(f=\log_2 (扇出数−1)-1)
  • t=log⁡2t=\log_2 布线轨道数(wiring tracks)

三个经典的树形加法器均满足 l+f+t=L−1l+f+t=L-1:逻辑层数,扇出数与布线轨道数三者需要做 balance。关于如何从图中数出布线轨道数:一条垂直的线在某两相邻层间穿过的布线数的最大值。