算术逻辑单元(ALU)与加法器设计

🎯 学习目标

  • 理解 ALU 的功能与基本结构
  • 掌握多位加法器的两种实现方式:行波进位 vs 超前进位
  • 了解 ALU 如何支持加法、减法、逻辑运算及自增/自减
  • 认识 ALU 在 CPU 中的核心地位

一、什么是 ALU?

ALU(Arithmetic Logic Unit) 是 CPU 中执行基本运算的数字电路模块。

✅ 主要功能:

类型 操作示例
算术运算 加(ADD)、减(SUB)、自增(INC)、自减(DEC)
逻辑运算 AND、OR、XOR、NOT
比较/标志 判断结果是否为零(Zero)、是否溢出(Overflow)

📌 现代 ALU 通常不直接实现乘除,但一定包含加法器和逻辑门阵列。


二、多位加法器设计

1. 行波进位加法器(Ripple Carry Adder)

  • 将 N 个全加器(Full Adder)级联
  • 第 i 位的进位输出(Cout)作为第 i+1 位的进位输入(Cin)
  • 最低位 Cin = 0

✅ 优点:结构简单,硬件成本低
❌ 缺点:进位逐级传递,延迟大(32 位 ≈ 32 级延迟)


2. 超前进位加法器(Carry Lookahead Adder, CLA)

  • 提前并行计算每一位的进位,不依赖前一级 Cout
  • 引入两个关键信号:
    • 生成(Generate): ( G_i = A_i \cdot B_i ) → 本位必然产生进位
    • 传播(Propagate): ( P_i = A_i \oplus B_i ) → 本位会传递进位

进位公式示例:
[
\begin{aligned}
C_1 &= G_0 \
C_2 &= G_1 + P_1 G_0 \
C_3 &= G_2 + P_2 G_1 + P_2 P_1 G_0 \
\end{aligned}
]

✅ 优点:延迟显著降低(接近常数)
⚠️ 代价:电路复杂度高,通常用于 4~8 位小组,再分组级联

🌐 现代 CPU 广泛采用多级超前进位结构以平衡速度与面积。


三、ALU 如何支持多种操作?

核心设计:功能单元 + 多路选择器(MUX)

1
2
3
4
5
6
7
8
9
10
        A ────────────────┐
├──[AND]──┐
B ────────────────┤ │
├──[OR]───┤
├──[XOR]──┼── MUX ──→ Result
├──[ADD]──┤
Control Signal ──→[SEL]─────┘
控制信号(如 ALUOp) 决定 MUX 选择哪一路输出
减法通过补码实现:
A - B = A + (-B) = A + (\sim B + 1)

四、自增(INC)与自减(DEC)的实现

方法 1:复用加法器(通用方式)

  • 自增:A + 1
  • 自减:A + (-1)(-1 的补码 = 全 1,如 111…111)
  • 通过 MUX 将 B 输入替换为常数 1 或 -1

方法 2:专用递增器(高性能场景)

  • 用于程序计数器(PC)、循环计数器等关键路径
  • 利用 +1 的进位规律(连续 1 变 0,首个 0 变 1)并行生成结果
  • 延迟远低于通用加法器
    💡 即使指令集无 INC 指令(如 MIPS),编译器也会用 addi $reg, $reg, 1 实现。

五、ALU 的典型接口(以教学级 MIPS 为例)

输入信号

信号名 位宽 说明
A[31:0] 32 位 第一个操作数
B[31:0] 32 位 第二个操作数
ALUOp[2:0] 3 位 控制信号:
010 = ADD
110 = SUB
• 其他值对应 AND/OR/XOR 等

输出信号

信号名 位宽 说明
Result[31:0] 32 位 运算结果
Zero 1 位 Result == 0,则置 1;否则为 0
→ 用于 beq 等条件跳转指令
Overflow 1 位 加法溢出标志:
符号位进位 ≠ 最高数值位进位 时置 1

🔍 Zero 信号生成方法
Result[31:0] 的所有位进行 OR 运算,然后取反:
[
\text{Zero} = \overline{R_{31} + R_{30} + \cdots + R_0}
]
→ 只有当所有位都是 0 时,OR 结果为 0,取反后 Zero = 1。🔍 Zero 信号生成:将 Result 所有位 OR 后取反。

📝 小结

ALU 是 CPU 的运算核心,支持算术与逻辑操作
行波进位 简单但慢,超前进位 快但复杂
减法 = 加负数(补码),无需独立减法器
自增/自减 通常通过加法器 + 常数实现
控制信号 + MUX 实现操作选择
ALU 输出的 Zero / Overflow 标志对程序控制流至关重要