Skip to content

算术逻辑单元(ALU)

2026 大纲 二(二)1 基本运算部件(加法器,算术逻辑部件 ALU)。

整个运算体系压在一个加法器上

减法靠求补、乘法靠"移位 + 加"、除法靠"移位 + 加/减",连浮点尾数运算最后也落回定点加减。整台机器的运算能力压在加法器上,它的延迟就是运算速度的上限——这就是本篇要盯着加法器不放的原因。

加法器的原子是一位全加器,两个式子:

Si=AiBiCi,Ci+1=Gi+PiCi

其中 Gi=AiBi生成(我自己就有进位),Pi=Ai+Bi传递(你给我进位我就传下去)。整章的加速手段全在第二个式子上做文章:

🔴 串行进位慢的唯一原因是"高位进位依赖低位进位"。 全加器内部从进位输入到进位输出是 2 级门,n 位就是 2n 级,延迟与位数成正比。先行进位的做法是把这个递推式一层层代入,使每个 Ci 只依赖 GPC0,于是全部进位可以并行产生——4 位全先行进位的关键路径是 6 级门延迟(异或按 3 级计),与位数无关

⚠️ 先澄清一组只差一个字的名词:串行加法器 串行进位加法器。前者是 1 个全加器分时复用、要花 n 个时钟周期;后者是 n 个全加器空间排开、1 个周期内产生 O(n) 级门延迟。

交互可视化

加载可视化中...
加载可视化中...

一、一位全加器:唯一的原子

全加器(Full Adder, FA)三个输入 AiBiCi,两个输出:本位和 Si、向高位的进位 Ci+1

Si=AiBiCiCi+1=AiBi+(Ai+Bi)Ci

进位表达式读起来就是两句人话:AiBi——两位都是 1,不管低位来不来进位,本位一定往高位送(Ai+Bi)Ci——两位中有一个是 1,则低位送来的进位会穿过本位继续往上走。各起个名字:

Gi=AiBi(进位生成函数)Pi=Ai+Bi(进位传递函数)Ci+1=Gi+PiCi

二、串行进位:慢在一根链条上

n 个全加器级联,第 i 位的进位输出直接接到第 i+1 位的进位输入:

C1=G0+P0C0,C2=G1+P1C1,,Cn=Gn1+Pn1Cn1

最低位的进位像投进水面的石头,涟漪一圈圈往外扩——所以这种结构叫行波进位加法器(Carry Ripple Adder, CRA)。延迟 2n 级门,与位数成正比。要提速只能从"高位进位依赖低位进位"这句话下手:尽量避免进位之间的依赖关系。

串行加法器串行进位加法器(行波)
全加器数量1 个n
数据怎么进每个时钟周期送 1 位n 位同时送入
进位怎么传存进触发器,下个周期用沿导线逐级传到高位
n 位加法耗时n 个时钟周期1 个时钟周期内的 O(n) 级门延迟
硬件成本最低中等

串行加法器是分时复用一个全加器,串行进位加法器是空间上排开 n 个全加器。 前者省硬件、慢在周期数上;后者快在一拍出结果、慢在这一拍很长。

三、先行进位:把依赖链拆成一层展开式

把递推式一层层代入,直到每个 Ci 都只依赖 GP 和最初的 C0

C1=G0+P0C0C2=G1+P1G0+P1P0C0C3=G2+P2G1+P2P1G0+P2P1P0C0C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0

现在每个 Ci 都是一个两级与或式:所有 GjPj 在同一级门延迟内并行产生,C0 从一开始就有。只要输入到齐,C1C4 几乎同时出现——它们之间没有先后顺序。实现这组表达式的电路叫先行进位部件(CLU),用它构成的加法器叫先行进位加法器(CLA),也称并行进位加法器。

4 位全先行进位的关键路径(异或门按 3 级门计)门延迟
XiYi 产生 PiGi1
PiGiC0 产生全部进位 C1C42
PiCi 异或产生全部和3
合计6(与位数无关)

🔴 全先行做不大,卡的是扇入。 理论上 32 位也能做成一级全先行进位、还是 6 级门延迟,但那样的 C32 需要三十多个输入端的与门和或门,物理上做不出来。所以实际一律分组分层

结构说明延迟
组内串行 + 组间串行纯行波加法器O(n)
组内并行 + 组间串行4 位一组 CLA,组间行波O(n/4)
组内并行 + 组间并行两级先行进位与位数无关

🔴 两级 CLA 里,组内其余进位比组进位晚一级。 组间 CLU 只算出各组的进位输入 C4C8C12;组内其余进位(C1,C2,C3,C5,)必须等组进位回灌之后再算一级。漏掉这一级,是估算延迟时最典型的错法。

⚠️ 顺带一处符号约定:Pi 用"或"还是"异或"定义,对进位的结果完全相同——只有 Ai=Bi=1 时两式取值不同,而这时 Gi=1 已经让 Ci+1=1 了。异或定义可以复用于求和(Si=PiCi)省一个门,或定义的"传递"含义更直白。看题面给的是哪一个。

把进位生成函数与传递函数真算一遍:4 位 CLA 代入一组数(想确认四个进位式确实同时求值、没有先后时展开)

A=1010B=0111C0=0。先算辅助函数 GiPii 从最低位起编号为 0):

iAiBiGi=AiBiPi=Ai+Bi
00101
11111
20101
31001

代入展开式:

C1=G0+P0C0=0+10=0C2=G1+P1G0+P1P0C0=1+0+0=1C3=G2+P2G1+P2P1G0+P2P1P0C0=0+1+0+0=1C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0=0+0+1+0+0=1Si=AiBiCiS=0001,C4=1

核对:10102+01112=100012,即 10+7=17

注意这四个式子没有先后顺序——它们同时求值。行波加法器里必须先有 C1 才能算 C2,这里不必。

16 位两级先行进位的 8T 是怎么一级一级数出来的(想核对自己有没有漏掉组进位回灌那一级时展开)

16 位加法器采用 4 位一组的两级先行进位结构,设一级门延迟为 T(此例中异或门也按 1T 计):

阶段延迟说明
各位产生 GiPi1TXiYi 经一级门
组内 CLU 产生组级 GP2T与、或两级
组间 CLU 产生各组的进位输入 C4C8C122TGPC0 算出
组进位回灌后,各组内部再算其余进位2T← 最容易漏的一级
求和 Si=PiCi1T
合计8T对比 16 位行波约 32T

组间 CLU 只算出每一组的进位输入C4C8C12)。组内其余各位的进位(C1,C2,C3,C5,)必须等组进位回来之后再算一级才产生,漏掉这 2T 会得到 6T 的错误结果。

另外注意本例把异或门按 1T 计;教材在算 4 位全先行进位的 6 级门延迟时,异或门按 3 级门计。两套计法各自内部自洽,比较延迟时必须先统一口径,看题面怎么规定。

四、从加法器到 ALU

第一步:带标志加法器

一个纯粹的 n 位加法器只会算两个数的和,既不能做减法,也不能告诉你结果有没有溢出。要让它支持无符号数和带符号数的加减,得在它外面补两样东西:

  1. 求补通路Y 输入端串一排反相器接二选一多路器,控制端 Sub 同时作为最低位进位送入,Sub=1 时电路算 X+Y+1=XY
  2. 标志生成逻辑:从进位链和结果上引出四条信息
图 3.6 用全加器实现 n 位带标志加法器的电路
图 3.6 用全加器实现 n 位带标志加法器的电路
(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
标志表达式从哪儿引出对谁有意义
ZFZF=1F=0结果全零检测(一个或非门)两者都有
SFSF=Fn1结果最高位,直接引线带符号数
OFOF=CnCn1进位链最高两级,一个异或门带符号数
CFCF=SubCout进位输出与 Sub 异或无符号数

标志位的完整推导、减法版 OF 的独立表达式与三种溢出判别方法的统一,见 补码加减运算与溢出判别

教材图中用全加器画加法器只是为了讲清标志怎么产生;真正的电路一定用多级先行进位方式。

第二步:加上逻辑运算

一位 ALU 的内部结构很朴素:一个全加器算加法,若干逻辑门分别算「与」「或」,再用一个多路选择器按 ALUop 挑一路输出。n 位 ALU 就是 n 个这样的单元加上进位链。

由此可以给 ALU 下一个准确的定义,也顺带分清它与加法器的边界:

🔴 ALU = 带标志加法器(核心)+ 逻辑运算门 + 多路选择器,是一种组合逻辑电路。对照之下:纯加法器只出和与进位;带标志加法器能加能减、能出四个标志,但不做逻辑运算

🔴 ALUop 的位数决定操作种类的上限:3 位最多 8 种。题面给出 ALU 支持几种运算,就能反推控制字段至少几位(log2k)。

第三步:移位器为什么在 ALU 外面

桶形移位器(barrel shifter)用大量多路选择器直接把每一位选到目标位置,一次完成任意位数的移位,而不是移一位重复若干次。

🔴 一次移多位不在 ALU 内部做。 ALU 顺带能移一两位,但一次移任意位数要用 ALU 外部的桶形移位器。放在外面有两点理由:简化 ALU 的控制逻辑、以及让移位与 ALU 运算可以并行。数据通路图上 ALU 旁边那个独立的方块就是它。

移位规则本身见 定点数的移位运算

考点速记

  1. 加法器是整个运算体系的瓶颈;串行进位慢的唯一原因是高位进位依赖低位进位(2n 级门),先行进位把递推式展开成只依赖 GPC0 的两级与或式,4 位全先行进位 6 级门延迟且与位数无关。
  2. 全先行进位受扇入限制做不大,实际是组内并行 + 组间并行的两级结构;两级 CLA 中组内其余进位要等组进位回灌后再算一级,不与组进位同时产生。
  3. ALU = 带标志加法器 + 逻辑运算门 + 多路选择器,ALUop 位数决定操作种类上限;四个标志从进位链与结果上引出,其中 CF=SubCout一次移多位由 ALU 外部的桶形移位器完成,好处是简化控制逻辑并支持移位与运算并行。

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 给一条减法指令与两个操作数,问执行后 CF 与 OF 各是多少:按 X+Y+1 实做,CF 取 Cout 的反(够减不置借位),OF 用 Cn1Cn。两个标志分别算,别互相推。
  • 给一组数据下的 OF 与 CF,问换一组数据后是多少:考的是两者互相独立,重算一遍即可。
  • 问某条件转移指令的转移条件表达式:先分清无符号比较还是带符号比较——无符号用 CF 与 ZF("大于"是 CF+ZF),带符号用 SF、OF 与 ZF。
  • 大题里问 SF 与 OF 的逻辑表达式SF 就是结果最高位 Fn1;加法的 OF=An1Bn1Fn1+An1Bn1Fn1(同号相加、和却异号),减法版要单独写(异号相减、差与被减数异号)。题目要求"输入变量为 A15B15F15"时,答的就是这两个式子。
  • 大题里问 ALUop / 移位控制信号至少几位log2(支持的操作种类数)

易错:减法直接把 Cout 当 CF。要取反。

易错:把加法的 OF 表达式照抄到减法上。同号项要换成异号项。

易错:估算两级 CLA 延迟时,把组内其余进位当成与组进位同时产生。它们要晚一级。

易错:把桶形移位器算进 ALU 内部。它在 ALU 外面,为的是简化控制并支持并行。

教材出处
  • 全加器公式、Pi/Gi 的定义与含义、串行进位加法器(行波进位)延迟为 2n 级门:袁春风《计算机组成与系统结构》第 3 版 §3.2.1~§3.2.2,印刷页 p56–p57
  • 先行进位表达式展开、4 位全先行进位加法器关键路径 6 级门延迟、32 位全先行进位因扇入过大不现实、两级先行进位延迟与位数无关:同书印刷页 p57–p58
  • 带标志加法器电路(图 3.6)与四个标志表达式:同书 §3.2.3 带标志加法器,印刷页 p58
  • ALU 以带标志加法器为核心、ALUop 位数决定操作种类、一位 ALU 结构、桶形移位器置于 ALU 之外的两点理由:同书 §3.2.4 算术逻辑部件,印刷页 p59
  • 补码加减运算部件(图 3.9)中 Sub 同时控制反相器与最低位进位输入:同书 §3.3.1,印刷页 p60

相关知识

补码加减运算与溢出判别定点数的移位运算乘除运算的基本原理与实现结构

真题练习