Altifigence Academy

16 / 63 · 概念

加法器与进位传递结构

推导全加器表达式,结合功能、位宽与延迟分析串行进位结构。

用两个比特表示一位相加的结果

ai,bi,cia_i,b_i,c_i 的和为 0~3,因此需要和位 sis_i 与向下一位传递的进位 ci+1c_{i+1}。三个输入中有奇数个 1 时,和位为 1;至少有两个 1 时,进位为 1。

si=ai⊕bi⊕cis_i=a_i\oplus b_i\oplus c_i
ci+1=aibi+(ai⊕bi)cic_{i+1}=a_ib_i+(a_i\oplus b_i)c_i

将 gi=aibig_i=a_ib_i 定义为生成项(generate),pi=ai⊕bip_i=a_i\oplus b_i 定义为传播项(propagate),便有 ci+1=gi+picic_{i+1}=g_i+p_ic_i,其中 ++ 表示 OR。半加器是没有进位输入的特例,和由 XOR 得到,进位由 AND 得到。

改变三个输入,检查 a+b+cin = sum+2×cout 是否始终成立。进位会成为下一位的输入,其权重与 sum 不同。

本位的和与下一位的进位

a + b + cin = sum + 2 × cout

进位需要经过多远

考虑四位 1111 + 0001。bit 0 产生进位,并传到其余三位。存储的和为 0000,最高位进位为 1。在串行进位结构中,低位进位可能让高位计算等待。

c2=g1+p1g0+p1p0c0c_2=g_1+p_1g_0+p_1p_0c_0

这样展开表达式,可以看出并行计算进位的可能性。实际高速加法器会组合组传播和组生成项,但同时面临扇入、布线和单元库所决定的面积与延迟权衡。RTL 中的 + 不一定会实现为某个串行进位电路。

在设计中保留和的位宽

SystemVerilog
logic [3:0] a, b, sum;
logic cin, cout;
logic [4:0] wide_sum;
assign wide_sum = {1'b0, a} + {1'b0, b} + {4'b0000, cin};
assign sum = wide_sum[3:0];
assign cout = wide_sum[4];

最大结果为 15+15+1=3115+15+1=31,因此 5 位足够。应先决定只需要低位和,还是要向下一级传递进位,或需要饱和处理。下方实验用于检查一位全加器的真值表真值表 完整列出所有可能输入组合及每种组合输出的表格。随时间的变化需要另行通过波形检查。了解更多,并不是测量实际综合电路延迟的工具。

更改输入

自己试试

四位 unsigned 运算中,a=9a=9、b=6b=6、cin=1c_{in}=1 时,求完整和、四位和与进位。将同一电路解释为 signed 加法时,能否只凭进位判断溢出?

阅读解释

完整的和为 16,位串是 10000,因此 sum=0000、carry=1。按 signed 解释,1001 为 -7,所以 −7+6+1=0-7+6+1=0,没有超出范围。进位与有符号溢出是不同条件。

你的选择适用于此浏览器,可随时在页脚更改。