进阶 #hardware#arithmetic

全加器

全加器是处理三个二进制位(两个加数+进位输入)相加的完整加法电路

什么是全加器?

还记得半加器的局限吗?它只能加两个数,但实际计算中经常需要加三个——因为还有来自低位的进位。

还是用竖式来理解。计算二进制 $11 + 01$:

  1   1
+ 0   1
--------

从右往左算:

  • 最低位(个位):1 + 1 = 0,进位 1 ✅ 半加器就能做
  • 第二位:1 + 0 + 进位(1) = ?这里有三个数要同时加。半加器做不了。

全加器(Full Adder) 就是为解决这个问题而生的——它多了一个进位输入(Carry-in,Cin),可以处理三个位的加法。

真值表

A、B 是两个加数,Cin 是来自低位的进位:

ABCin和 (S)进位 (Cout)
00000
00110
01010
01101
10010
10101
11001
11111

电路实现

全加器可以用两个半加器 + 一个或门巧妙地搭出来:

graph TD
    subgraph HA1[半加器 1:算 A + B]
        A[A] --> XOR1[XOR]
        B[B] --> XOR1
        A --> AND1[AND]
        B --> AND1
    end

    subgraph HA2[半加器 2:算 A+B 的结果 + Cin]
        Cin[C<sub>in</sub>] --> XOR2[XOR]
        S1[中间和] --> XOR2
        Cin --> AND2[AND]
        S1 --> AND2
    end

    XOR1 --> S1
    XOR2 --> S[和 S]
    AND1 --> OR[或门 OR]
    AND2 --> OR
    OR --> Cout[进位 C<sub>out</sub>]

思路是这样的:

  1. 先用一个半加器算 A + B,得到”中间和”和”进位 1”
  2. 再用第二个半加器算 中间和 + Cin,得到”最终和”和”进位 2”
  3. 只要”进位 1”或”进位 2”中有一个为 1,最终进位就是 1(用或门)

级联:接力赛式的多位加法

全加器的真正力量在于级联——像接力赛一样把多个全加器串起来,低位的进位输出传给高位的进位输入:

graph LR
    FA0[FA₀] --> S0[S₀]
    FA1[FA₁] --> S1[S₁]
    FA2[FA₂] --> S2[S₂]
    FA3[FA₃] --> S3[S₃]

    A0[A₀] --> FA0
    B0[B₀] --> FA0
    A1[A₁] --> FA1
    B1[B₁] --> FA1
    A2[A₂] --> FA2
    B2[B₂] --> FA2
    A3[A₃] --> FA3
    B3[B₃] --> FA3

    C0[0] --> FA0
    FA0 -->|进位| FA1
    FA1 -->|进位| FA2
    FA2 -->|进位| FA3
    FA3 --> Cout[C<sub>out</sub>]

这就像接力赛跑:第一棒(FA₀)跑完把接力棒(进位)传给第二棒(FA₁),第二棒传给第三棒……N 个全加器串联就可以计算 N 位的二进制加法。

例如 8 个全加器串联 = 8 位加法器,可以计算 0~255 的加法。

小结

全加器通过增加”进位输入”解决了多位加法的进位传递问题。它是 CPU 中 算术逻辑单元(ALU) 的核心计算部件——ALU 中的加法器就是由全加器级联构成的。接下来,我们将从”加法”走向”记忆”,学习另一种截然不同的电路——SR 锁存器