运算部件
810 字
4 分钟
运算部件
运算部件
加法器
全加器(Full Adder, FA)
一位全加器有三个输入、两个输出:
| 信号 | 含义 |
|---|---|
| 被加数的第 i 位 | |
| 加数的第 i 位 | |
| 低位传来的进位(carry in) | |
| 本位和(sum) | |
| 向高位的进位(carry out) |
逻辑表达式
示例
, , (无进位):
结果:和为 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)
串行进位的瓶颈在于: 必须等 算完。进位前瞻的思路是用组合逻辑直接算出每一位的进位,无需等待。
定义两个中间信号:
| 信号 | 公式 | 含义 |
|---|---|---|
| 进位生成 | 本位自己就能产生进位 | |
| 进位传播 | 低位进位能从本位”穿过去” |
则进位递推公式:
展开到 后,所有进位可在 3 级门延迟内同时算出:
结论: 只取决于 和 的第 1 位到第 i 位以及 ,与中间进位无关。
带标志加法器
加法器在输出结果的同时,还生成四个标志位(flag),供条件分支等指令使用:
┌─────────────────────┐ │ OF SF ZF CF │ ← 标志输出 ├─────────────────────┤ A ──────→│ │──────→ F (n位和) B ──────→│ 加法器 │ Cin ──────→│ │──────→ Cout └─────────────────────┘| 标志 | 名称 | 含义 |
|---|---|---|
| OF | Overflow Flag | 溢出标志, |
| SF | Sign Flag | 符号标志,结果的最高位 |
| ZF | Zero Flag | 零标志,结果为 0 时置 1 |
| CF | Carry Flag | 进位标志,最高位向上进位 |
其中 为最高位(符号位)进位, 为次高位进位。
OF 仅对带符号数运算有效。无符号数用 CF 判断溢出。
算术逻辑单元(ALU)
ALU 是 CPU 的核心运算部件,根据控制信号选择不同的运算功能。
┌──────────────────────────┐ │ OF SF ZF CF │ ← 标志 ├──────────────────────────┤ A ──────→│ │──────→ F (n位结果) B ──────→│ ALU │ Cin ──────→│ │──────→ CoutALUop ──────→│ │ (s位操作选择) └──────────────────────────┘| 端口 | 方向 | 说明 |
|---|---|---|
| A, B | 输入 | n 位操作数 |
| Cin | 输入 | 进位输入 |
| ALUop | 输入 | s 位操作控制端,决定执行什么功能(加/减/与/或/非等) |
| F | 输出 | n 位计算结果 |
| Cout | 输出 | 进位输出 |
| OF, SF, ZF, CF | 输出 | 状态标志 |



