🎯 学习目标
- 理解 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 | A ────────────────┐ |
四、自增(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 标志对程序控制流至关重要