进阶 #hardware#arithmetic

算术逻辑单元

ALU(Arithmetic Logic Unit)是CPU中的计算核心,执行加减法和与或非等运算

什么是 ALU?

ALU(Arithmetic Logic Unit,算术逻辑单元) 是 CPU 中负责执行计算的核心部件。它将之前学过的 加法器逻辑门 等电路组合成一个可编程的计算单元——通过控制信号选择执行哪种运算。

简单来说,ALU 就是计算机的”计算器”。

ALU 结构概览

graph TD
    A[输入 A<br>N 位] --> ALU_CORE[ALU 核心]
    B[输入 B<br>N 位] --> ALU_CORE
    SEL[操作选择<br>OP₀ OP₁] --> ALU_CORE

    ALU_CORE --> RESULT[输出结果<br>N 位]
    ALU_CORE --> FLAGS[标志位<br>零/进位/溢出]

ALU 有两个 N 位输入(A 和 B),输出一个 N 位结果,同时产生若干标志位

支持的运算

一个典型的 ALU 可以执行以下运算:

算术运算

操作功能说明
ADDA + B二进制加法
SUBA - B用补码实现(A + ¬B + 1)
INCA + 1递增
DECA - 1递减

逻辑运算

操作功能说明
ANDA & B按位与
ORA | B按位或
XORA ⊕ B按位异或
NOT~A按位取反

内部实现

ALU 内部将算术运算和逻辑运算分开计算,然后用多路选择器选出最终结果:

graph LR
    subgraph ALU[ALU 内部]
        ADD[加法器] --> MUX
        SUB[减法器<br>A + ¬B + 1] --> MUX
        AND[与门阵列] --> MUX
        OR[或门阵列] --> MUX
        XOR[异或门阵列] --> MUX
        NOT[非门阵列] --> MUX

        MUX[多路选择器] --> RESULT[输出]
        ADD --> FLAG[标志位计算]
        SUB --> FLAG
    end

    A[输入 A] --> ADD
    B[输入 B] --> ADD
    A --> SUB
    B --> SUB
    A --> AND
    B --> AND
    A --> OR
    B --> OR
    A --> XOR
    B --> XOR
    A --> NOT

    SEL[操作选择] --> MUX

减法实现

减法用补码加法实现:

$$A - B = A + (\overline{B} + 1)$$

  • 将 B 的所有位取反(用非门)
  • 加 1(将进位输入设为 1)
  • 用同一个加法器执行加法

这就是为什么 CPU 中只需要加法器就能同时实现加减法

多路选择器

多路选择器(Multiplexer,MUX) 根据控制信号从多个输入中选一个输出:

  • OP = 00 → 输出加法结果
  • OP = 01 → 输出减法结果
  • OP = 10 → 输出按位与
  • OP = 11 → 输出按位或

标志位

ALU 除了输出计算结果,还会输出标志位反映运算状态:

标志含义判断条件
Z(零标志)结果是否为 0所有输出位均为 0
C(进位标志)是否产生进位最高位有进位输出
V(溢出标志)是否溢出符号位进位与最高位进位不同
N(负标志)结果是否为负最高位(符号位)为 1

💡 溢出标志(V) 涉及到”有符号数”(补码)的概念,目前你可能还不熟悉。简单来说,当计算结果超出了 N 位能表示的范围时就会溢出。这在后续章节中会详细讲解,现在可以先跳过。

例如,计算 $0111_2 + 0001_2 = 1000_2$(7 + 1 = 8):

  • 对于 4 位有符号数,结果是 -8(溢出)
  • V 标志置 1

小结

ALU 是 CPU 的计算核心。它将加法器、逻辑门、多路选择器等组合成一个多功能计算单元,通过控制信号灵活切换运算类型。标志位为后续的条件跳转和分支判断提供了基础。

至此,我们已经学习了从二进制到 ALU 的完整硬件知识链:二进制 → 布尔代数逻辑门 → 加法器 → 触发器 → 寄存器RAMALU。接下来,可以将这些部件组合成完整的 CPU