进阶 #hardware#arithmetic
全加器
全加器是处理三个二进制位(两个加数+进位输入)相加的完整加法电路
什么是全加器?
还记得半加器的局限吗?它只能加两个数,但实际计算中经常需要加三个——因为还有来自低位的进位。
还是用竖式来理解。计算二进制 $11 + 01$:
1 1
+ 0 1
--------
从右往左算:
- 最低位(个位):1 + 1 = 0,进位 1 ✅ 半加器就能做
- 第二位:1 + 0 + 进位(1) = ?这里有三个数要同时加。半加器做不了。
全加器(Full Adder) 就是为解决这个问题而生的——它多了一个进位输入(Carry-in,Cin),可以处理三个位的加法。
真值表
A、B 是两个加数,Cin 是来自低位的进位:
| A | B | Cin | 和 (S) | 进位 (Cout) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
电路实现
全加器可以用两个半加器 + 一个或门巧妙地搭出来:
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>]
思路是这样的:
- 先用一个半加器算 A + B,得到”中间和”和”进位 1”
- 再用第二个半加器算 中间和 + Cin,得到”最终和”和”进位 2”
- 只要”进位 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 锁存器。