运算部件

810 字
4 分钟
运算部件

运算部件#

加法器#

全加器(Full Adder, FA)#

一位全加器有三个输入、两个输出:

信号含义
AiA_i被加数的第 i 位
BiB_i加数的第 i 位
Ci1C_{i-1}低位传来的进位(carry in)
SiS_i本位和(sum)
CiC_i向高位的进位(carry out)

逻辑表达式#

Si=AiBiCi1S_i = A_i \oplus B_i \oplus C_{i-1}Ci=(AiBi)Ci1+AiBiC_i = (A_i \oplus B_i)\,C_{i-1} + A_i B_i

示例#

Ai=1A_i = 1, Bi=0B_i = 0, Ci1=0C_{i-1} = 0(无进位):

Si=100=1,Ci=(10)0+10=0S_i = 1 \oplus 0 \oplus 0 = 1, \qquad C_i = (1 \oplus 0) \cdot 0 + 1 \cdot 0 = 0

结果:和为 1,进位为 0 ✓


串行进位加法器(Serial Carry Adder)#

将 n 个一位全加器首尾相连,就得到了 n 位串行进位加法器——实质上就是做二进制加法。

A_n B_n A_2 B_2 A_1 B_1
│ │ │ │ │ │
┌──┴──┴──┐ ┌──┴──┴──┐ ┌──┴──┴──┐
C_n─┤ FA ├─...──C_2┤ FA ├─C_1───┤ FA ├──C_0
└────┬────┘ └────┬────┘ └────┬────┘
S_n S_2 S_1

每一位的进位必须等待低位计算完成,因此延迟随位数线性增长。

计算示例#

1 1 0 1 (13)
+ 0 1 0 1 ( 5)
───────────
= 1 0 0 1 0 (18)

黄色位表示进位链传播的过程。


进位前瞻(Carry Lookahead)#

串行进位的瓶颈在于:CiC_i 必须等 Ci1C_{i-1} 算完。进位前瞻的思路是用组合逻辑直接算出每一位的进位,无需等待。

定义两个中间信号:

信号公式含义
进位生成 GiG_iGi=AiBiG_i = A_i B_i本位自己就能产生进位
进位传播 PiP_iPi=AiBiP_i = A_i \oplus B_i低位进位能从本位”穿过去”

则进位递推公式:

Ci=Gi+PiCi1C_i = G_i + P_i \cdot C_{i-1}

展开到 C0C_0 后,所有进位可在 3 级门延迟内同时算出:

C1=G1+P1C0C2=G2+P2C1=G2+P2G1+P2P1C0C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0\begin{aligned} C_1 &= G_1 + P_1 C_0 \\ C_2 &= G_2 + P_2 C_1 = G_2 + P_2 G_1 + P_2 P_1 C_0 \\ C_3 &= G_3 + P_3 C_2 = G_3 + P_3 G_2 + P_3 P_2 G_1 + P_3 P_2 P_1 C_0 \\ C_4 &= G_4 + P_4 C_3 = G_4 + P_4 G_3 + P_4 P_3 G_2 + P_4 P_3 P_2 G_1 + P_4 P_3 P_2 P_1 C_0 \end{aligned}

结论CiC_i 只取决于 AABB 的第 1 位到第 i 位以及 C0C_0,与中间进位无关。


带标志加法器#

加法器在输出结果的同时,还生成四个标志位(flag),供条件分支等指令使用:

┌─────────────────────┐
│ OF SF ZF CF │ ← 标志输出
├─────────────────────┤
A ──────→│ │──────→ F (n位和)
B ──────→│ 加法器 │
Cin ──────→│ │──────→ Cout
└─────────────────────┘
标志名称含义
OFOverflow Flag溢出标志,OF=CnCn1OF = C_n \oplus C_{n-1}
SFSign Flag符号标志,结果的最高位
ZFZero Flag零标志,结果为 0 时置 1
CFCarry Flag进位标志,最高位向上进位

其中 CnC_n 为最高位(符号位)进位,Cn1C_{n-1} 为次高位进位。

OF 仅对带符号数运算有效。无符号数用 CF 判断溢出。


算术逻辑单元(ALU)#

ALU 是 CPU 的核心运算部件,根据控制信号选择不同的运算功能。

┌──────────────────────────┐
│ OF SF ZF CF │ ← 标志
├──────────────────────────┤
A ──────→│ │──────→ F (n位结果)
B ──────→│ ALU │
Cin ──────→│ │──────→ Cout
ALUop ──────→│ │ (s位操作选择)
└──────────────────────────┘
端口方向说明
A, B输入n 位操作数
Cin输入进位输入
ALUop输入s 位操作控制端,决定执行什么功能(加/减/与/或/非等)
F输出n 位计算结果
Cout输出进位输出
OF, SF, ZF, CF输出状态标志
运算部件
https://dongyanzhang.com/posts/计算机组成原理/运算部件/
作者
阿东阿言
发布于
2026-07-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
阿东阿言
I share my notes | projects | experience here...
公告
欢迎来到阿东阿言的博客
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
25
分类
3
标签
5
总字数
11,186
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
v1.0.0
文章许可
CC BY-NC-SA 4.0