16 / 63 · 概念
加法器与进位传递结构
推导全加器表达式,结合功能、位宽与延迟分析串行进位结构。
课时内容可免费阅读,选课后可保存学习进度。
用两个比特表示一位相加的结果
的和为 0~3,因此需要和位 与向下一位传递的进位 。三个输入中有奇数个 1 时,和位为 1;至少有两个 1 时,进位为 1。
将 定义为生成项(generate), 定义为传播项(propagate),便有 ,其中 表示 OR。半加器是没有进位输入的特例,和由 XOR 得到,进位由 AND 得到。
改变三个输入,检查 a+b+cin = sum+2×cout 是否始终成立。进位会成为下一位的输入,其权重与 sum 不同。
a + b + cin = sum + 2 × cout
进位需要经过多远
考虑四位 1111 + 0001。bit 0 产生进位,并传到其余三位。存储的和为 0000,最高位进位为 1。在串行进位结构中,低位进位可能让高位计算等待。
这样展开表达式,可以看出并行计算进位的可能性。实际高速加法器会组合组传播和组生成项,但同时面临扇入、布线和单元库所决定的面积与延迟权衡。RTL 中的 + 不一定会实现为某个串行进位电路。
在设计中保留和的位宽
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];最大结果为 ,因此 5 位足够。应先决定只需要低位和,还是要向下一级传递进位,或需要饱和处理。下方实验用于检查一位全加器的真值表真值表 完整列出所有可能输入组合及每种组合输出的表格。随时间的变化需要另行通过波形检查。了解更多,并不是测量实际综合电路延迟的工具。
更改输入
自己试试
四位 unsigned 运算中,、、 时,求完整和、四位和与进位。将同一电路解释为 signed 加法时,能否只凭进位判断溢出?
阅读解释
完整的和为 16,位串是 10000,因此 sum=0000、carry=1。按 signed 解释,1001 为 -7,所以 ,没有超出范围。进位与有符号溢出是不同条件。