← 返回博客算术逻辑单元(ALU)

ALU 如何工作:从逻辑门构建算术逻辑单元

用加法器、逐位逻辑、移位器和结果多路选择器搭建一套小型 ALU,并推导其进位、零、负数与溢出输出。

DennyDenny
阅读约需 8 分钟
Chalkboard feature illustration for “ALU 如何工作:从逻辑门构建算术逻辑单元”

**要点速览:**小型 ALU 是一条组合数据通路:候选算术、逻辑和移位功能对相同输入字并行运算,再由多路选择器选出可见结果。只有明确规定操作编码、进位/借位语义、溢出行为和标志写入策略,设计才算完整。

算术逻辑单元是处理器变换数据的地方。ADD 与 SUB 需要加法器;AND、OR 与 XOR 需要并行逻辑门通道;移位需要布线或移位器网络;结果多路选择器则决定哪项候选值抵达目的端。

这幅框图可用四位或八位数据通路实现,并能揭示若干实际工程决策:

  • 减法报告借位,还是非借位?
  • 右移以零填充,还是复制符号位?
  • 哪些操作定义溢出输出?
  • ALU 自己存储标志,还是由独立寄存器捕获?
  • 先并行计算所有大型功能再选择,还是共享逻辑以减少面积?

本文构建一套内部约定一致的 4 位教学 ALU,并标出其他体系结构可能作出不同选择的位置。

从接口约定开始

除非某项操作明确要求有符号解释,否则假定输入都是无符号位向量:

端口宽度方向含义
A4输入第一操作数
B4输入第二操作数
OP3输入操作选择
Y4输出选定结果
C1输出ADD 的进位;SUB 的借位
Z1输出Y == 0000 时为 1
N1输出Y[3]
V1输出ADD 或 SUB 的有符号溢出

一种可行的操作映射是:

OP功能定义
000ADDA+BA+B
001SUBA−BA-B
010AND逐位 A∧BA\land B
011OR逐位 A∨BA\lor B
100XOR逐位 A⊕BA\oplus B
101NOT AA‾\overline A
110逻辑左移零进入第 0 位
111逻辑右移零进入第 3 位

这是一份教学规格,而不是标准编码。真实指令集可能会把移位、乘法、地址生成与比较分配到其他执行单元,也可能包含能力不同的多套 ALU。

这里描述的 ALU 没有内部状态。输入变化后,信号传播过组合网络,输出随之稳定。操作数寄存器、目的寄存器和标志寄存器都是独立的时序元件。

模块一:一只加法器完成加法与减法

波纹进位加法器连接四级全加器。对于第 ii 位:

Si=Ai⊕Bi′⊕ciS_i=A_i\oplus B'_i\oplus c_i ci+1=AiBi′+Aici+Bi′cic_{i+1}=A_iB'_i+A_ic_i+B'_ic_i

使用控制位 SUB 变换 B 与初始进位:

Bi′=Bi⊕SUBB'_i=B_i\oplus SUB c0=SUBc_0=SUB

当 SUB=0 时,网络计算 A+BA+B 。当 SUB=1 时,它计算:

A+B‾+1=A−B(mod24)A+\overline B+1=A-B\pmod {2^4}

加法器的最终进位输出随操作而有不同解释:

  • ADD 之后,c4=1c_4=1 表示无符号和超过 15;
  • SUB 之后,c4=1c_4=1 表示无符号减法无需借位。

DigiSim ALU 在 ADD 后将未反相的进位输出作为 C,在 SUB 后则输出其反相值:

CSUB=c4‾C_{\text{SUB}}=\overline{c_4}

因此,减法后 C=1 表示无符号减法发生了借位(A<BA<B)。结果位仍由同一个模 242^4 加法产生,改变的只是标志极性。

溢出并不等于进位

有符号溢出针对的是二进制补码范围 −8-8 到 +7+7,进位针对的则是无符号范围 0 到 15。

对于加法:

Vadd=A3⊕B3‾∧(A3⊕Y3)V_{\text{add}} = \overline{A_3\oplus B_3}\land(A_3\oplus Y_3)

对于减法:

Vsub=(A3⊕B3)∧(A3⊕Y3)V_{\text{sub}} = (A_3\oplus B_3)\land(A_3\oplus Y_3)

对于这套加/减器,也可以写成 V=c3⊕c4V=c_3\oplus c_4 。把 C 与 V 分开,才能让同样的四个结果位正确支持无符号与有符号解释。

模块二:并行逐位逻辑

每条位通道独立计算其逻辑:

ANDi=AiBiAND_i=A_iB_i ORi=Ai+BiOR_i=A_i+B_i XORi=Ai⊕BiXOR_i=A_i\oplus B_i NOTi=Ai‾NOT_i=\overline{A_i}

在概念实现中,四条候选总线全部并行存在。综合工具可以自由共享项、把功能映射到查找表,或选择复合标准单元。“每位一只门”描述的是布尔结构,并不能保证晶体管数量或物理延迟。

逐位功能没有跨字进位依赖,但它们选中的结果仍需穿过逻辑门、布线与输出多路选择器,因此并不是瞬间完成。

模块三:移位

固定移动一个位置的逻辑移位可以直接表示为布线:

SHL(A):  Y3=A2, Y2=A1, Y1=A0, Y0=0
SHR(A):  Y3=0,  Y2=A3, Y1=A2, Y0=A1

如果 ISA 如此规定,被移出的比特可以保留为进位候选:

SHL carry candidate = A3
SHR carry candidate = A0

算术右移只有最高位不同:它把 A3 复制到 Y3,从而扩展符号。可变距离移位需要桶形移位器等可选择路由网络;固定左移或右移一位则不需要。

模块四:结果多路选择器

输出多路选择器赋予 OP 含义。概念上:

case OP
  000: Y = arithmetic_sum
  001: Y = arithmetic_difference
  010: Y = bitwise_and
  011: Y = bitwise_or
  100: Y = bitwise_xor
  101: Y = bitwise_not_a
  110: Y = shift_left
  111: Y = shift_right

在四位实现中,可以为每个结果位绘制一只 8 选 1 多路选择器。在可编程逻辑中,它可能映射到查找表与路由资源;在 ASIC 中,则可能实现为多路选择单元、AOI/OAI 结构,或由综合选择的其他因式分解网络。

结果选择属于关键时序路径:

tALU,max≈max⁡(tcandidate functions)+tresult select+troutingt_{\text{ALU,max}} \approx \max(t_{\text{candidate functions}}) +t_{\text{result select}} +t_{\text{routing}}

这个表达式是设计估算,而不是签核方程。物理时序取决于单元、扇出、布线、电压、温度与具体实现。

结果标志

选中的 Y 值会产生两个与操作无关的候选信号:

Z=Y3∨Y2∨Y1∨Y0‾Z=\overline{Y_3\lor Y_2\lor Y_1\lor Y_0} N=Y3N=Y_3

C 与 V 则取决于操作。适用于这套教学 ALU 的一致策略如下:

操作CV
ADD最终进位输出加法溢出
SUB借位(A<BA<B),即最终进位输出的反相值减法溢出
SHL从最高有效位移出的比特0
SHR从最低有效位移出的比特0
AND/OR/XOR/NOT00

另一种设计可以在逻辑操作期间保留 C 与 V,而不是清零。这属于 ISA 与控制策略选择。组合 ALU 可以提供候选信号,由时钟驱动的标志寄存器决定装载、保留或选择性更新哪些存储位。

符号标志 N 是结果最高有效位,但减法后不能只凭它正确判断有符号小于关系:应使用 N⊕VN\oplus V 补偿有符号溢出。

4 位计算示例

6 - 3

A        = 0110
B        = 0011
~B       = 1100
A + ~B+1 = 1 0011

保存的结果为 0011(3)。未反相的进位输出为 1,因此没有发生借位,DigiSim 按借位编码的 C 输出为 0:

Y=0011, Z=0, C=0, N=0, V=0

3 - 6

A        = 0011
B        = 0110
A + ~B+1 = 0 1101

1101 作为无符号数是 13,作为有符号数是 -3。未反相的进位输出为 0,因此无符号减法发生了借位,C 为 1:

Y=1101, Z=0, C=1, N=1, V=0

7 + 1

0111 + 0001 = 1000

没有无符号进位,但 +8 无法装入 4 位有符号二进制补码:

Y=1000, Z=0, C=0, N=1, V=1

15 + 1

1111 + 0001 = 1 0000

无符号结果回绕并产生进位。作为有符号算术,-1 + 1 = 0 是有效结果:

Y=0000, Z=1, C=1, N=0, V=0

最后两组向量证明 C 与 V 并不是同一信号的别名。

ALU 位于 CPU 的什么位置

一条小型单周期数据通路可以按如下顺序工作:

  1. 源寄存器给出 A 与 B;
  2. 控制单元选择 OP;
  3. ALU 与标志生成逻辑稳定;
  4. 目的寄存器在有效时钟边沿捕获 Y;
  5. 如果使能,标志寄存器捕获选定的状态位。

最高时钟频率取决于最长的完整寄存器到寄存器路径,而不只取决于 ALU。该路径可能包含寄存器时钟到 Q 延迟、操作数选择、ALU 逻辑、结果路由、目的寄存器建立时间、时钟不确定性与偏斜。ALU 可能是关键路径,但在另一种微架构中,缓存访问、旁路网络、译码或其他逻辑也可能占主导。

优化加法器并不会自动让系统频率等比例提升。只有布局布线后该路径确实构成瓶颈,并且恢复的裕量没有被其他部分消耗时,优化才会带来收益。完整时序背景可参阅传播延迟与时钟偏斜。

74181:一个历史参照

4 位 74181 系列是很有价值的示例,因为它的接口明确暴露功能选择、模式选择、进位输入、进位输出与组进位信号。它支持一组算术和逻辑功能,并可借助超前进位支持组合成更宽字长。

不应把它当作现代 CPU 的晶体管级蓝图。现代处理器可能使用多个专用整数执行单元、独立的向量与浮点数据通路、分布式分支比较逻辑,以及实现相关的加法器结构。持续不变的是体系结构模式:变换操作数字、选择结果,并报告定义精确的状态信息。

构建并验证 4 位版本

可以把 DigiSim 的 8 位 ALU 模板作为更大的参考,也可以直接搭建四位接口:

  1. 使用 B XOR SUB 与 c0=SUB 构建四级加/减器。
  2. 添加并行 AND、OR、XOR 与 NOT 通道。
  3. 连接逻辑移位;如果 C 需要使用被移出的比特,则予以保留。
  4. 用一个八路四位多路选择器选择结果。
  5. 从选定结果生成 Z,从其最高有效位生成 N。
  6. 按照操作表选择 C 与 V。
  7. 探测 A、B、OP、Y、C、Z、N 与 V。

先用普通数值验证每一个操作码,再针对边界情况测试:

  • 零结果;
  • 全 1 加一;
  • 最大有符号正数加一;
  • 最小有符号负数减一;
  • 发生借位与不发生借位的减法;
  • 移出位为 1 的左移与右移;
  • 在不同操作类别之间切换时的标志行为。

功能仿真器能够验证真值表与控制顺序,却无法证明物理芯片的最高频率、模拟亚稳态行为,或工艺及环境角落下的时序。

数据通路工作后,把它连接到时钟驱动的 CPU 标志寄存器与分支译码器。组合计算从这一刻成为持久的体系结构状态,并能够改变程序计数器的方向。

参考资料

将想法变成真正可运行的电路。