26-计组-数据通路
✅ 一、数据通路基础
1. 数据通路的定义
数据通路:指令在执行过程中数据所经过的路径及其相关硬件部件的统称。
2. 数据通路包含的部件:
ALU(算术逻辑单元)
通用寄存器组
PSW(程序状态字)
MMU(内存管理单元)
Cache
浮点运算逻辑
异常/中断处理逻辑
3. 数据通路的控制方式
由控制部件发出控制信号进行控制,分为:
(1)操作元件(组合逻辑)
特性:无记忆功能,输出只依赖当前输入,不受时钟控制。
常见部件:加法器、多路选择器、ALU、译码器等
(2)存储元件(时序逻辑)
特性:受时钟控制,有记忆功能,输入在时钟沿写入,输出随时可读。
常见部件:PC、IR、通用寄存器、锁存器、特殊寄存器(含三态门、自增、清零等功能)
✅ 二、数据通路的结构分类
1. 单总线数据通路
✅ 核心部件:
MAR(Memory Address Register):存储器地址寄存器
MDR(Memory Data Register):存储器数据寄存器
✅ 工作机制:
CPU 通过 MAR/MDR 与主存通信
所有寄存器通过 一条内总线 连接
同一个时刻只能一个部件把信息送到总线
ALU 负责组合逻辑运算,无记忆功能
一、运算示例:R[R3] ← R[R1] + R[R2]
此示例描述了一条指令的执行过程,通过寄存器R1和R2的值相加,结果存入寄存器R3。以下是三个步骤的整理和说明:
1. 步骤:R1out, Yin
- 操作:将寄存器R1中的值输出到总线,存入暂存寄存器Y。
- 数据流:R[R1] → Y。
- 说明:
- R1out:表示寄存器R1的内容通过数据总线输出。
- Yin:暂存寄存器Y接收R1的值,临时存储第一个操作数。
- 作用:为后续加法运算准备第一个操作数,Y作为临时存储器避免直接操作R1。
- 上下文:这是执行周期的一部分,准备操作数以送入ALU(算术逻辑单元)进行运算。
- 示例:若R1 = 10,则Y = 10。
2. 步骤:R2out, add(Zin)
- 操作:将寄存器R2中的值输出到总线,同时触发ALU执行加法运算,结果存入暂存寄存器Z。
- 数据流:R[R2] → ALU,Y + R[R2] → Z。
- 说明:
- R2out:寄存器R2的内容输出到数据总线,作为加法的第二个操作数。
- add:ALU执行加法运算,将Y中的值(R1的值)与R2的值相加。
- Zin:加法结果存入暂存寄存器Z。
- 作用:完成加法运算,Z临时保存运算结果,等待写入目标寄存器。
- 上下文:仍在执行周期,ALU完成指令指定的运算(加法)。
- 示例:若R2 = 20,Y = 10,则Z = 10 + 20 = 30。
3. 步骤:Zout, R3in
- 操作:将暂存寄存器Z中的值输出到总线,写入寄存器R3。
- 数据流:Z → R[R3]。
- 说明:
- Zout:寄存器Z的内容(加法结果)通过数据总线输出。
- R3in:寄存器R3接收总线上的数据,将结果写入R3。
- 作用:将运算结果从临时寄存器Z存储到目标寄存器R3,完成指令的constexpr
System: R[R3]。
- 上下文:这是执行周期的最后步骤,将ALU的运算结果保存到目标位置。
- 示例:Z = 30,写入R3后,R3 = 30。
运算示例
- 指令:R[R3] ← R[R1] + R[R2]。
- 完整流程:
- R1的值存入Y(准备第一个操作数)。
- R2的值与Y相加,结果存入Z(执行加法)。
- Z的值写入R3(存储结果)。
- 核心寄存器:
- R1, R2:源操作数寄存器。
- R3:目标寄存器,存储结果。
- Y, Z:临时寄存器,分别用于存储中间操作数和运算结果。
- 关联:此过程发生在执行周期,是指令周期中完成运算的核心步骤。
1. 步骤:R1out, MARin
- 操作:将寄存器R1中的值输出到总线,送入内存地址寄存器(MAR)。
- 数据流:R[R1] → MAR。
- 说明:
- R1out:寄存器R1的内容(存储操作数的地址)输出到数据总线。
- MARin:MAR接收R1的值,存储要访问的主存地址。
- 作用:确定主存中需要读取的数据地址(R1中存储的是操作数的地址)。
- 上下文:这是间址周期或执行周期的一部分,用于计算和传递操作数的有效地址。
- 示例:若R1 = 1000(主存地址),则MAR = 1000。
2. 步骤:read
- 操作:控制单元发出读命令,主存根据MAR中的地址读取数据。
- 数据流:主存(MAR) → MDR。
- 说明:
- read:控制单元通过控制总线向主存发出读信号,MAR中的地址通过地址总线送至主存。
- 作用:主存根据MAR提供的地址(如1000),读取对应内存单元的数据,送入内存数据寄存器(MDR)。
- 上下文:仍在间址周期或执行周期,获取操作数数据。
- 示例:主存地址1000的数据(如50)读入MDR,MDR = 50。
3. 步骤:MDRout, R2in
- 操作:将MDR中的数据输出到总线,写入寄存器R2。
- 数据流:MDR → R[R2]。
- 说明:
- MDRout:MDR的内容(主存读取的数据)通过数据总线输出。
- R2in:寄存器R2接收总线上的数据,将主存数据写入R2。
- 作用:将从主存读取的操作数存储到目标寄存器R2,完成数据加载。
- 上下文:这是间址周期或执行周期的最后步骤,完成操作数从主存到寄存器的传递。
- 示例:MDR = 50,写入R2后,R2 = 50。
总结:主存读取示例
- 指令:从主存地址(R1指定的地址)读取数据到R2。
- 完整流程:
- R1的值送入MAR(指定主存地址)。
- 发出读命令,主存数据读入MDR。
- MDR的数据写入R2。
- 核心寄存器:
- R1:存储操作数的地址。
- MAR:保存主存访问地址。
- MDR:临时存储主存读取的数据。
- R2:目标寄存器,存储读取的数据。
- 关联:此过程通常发生在间址周期(若R1提供间接寻址地址)或执行周期(获取操作数)。
2. 三总线数据通路
✅ 特点:
拥有 3条总线:A总线、B总线、C总线(或称系统总线)
允许同时读取2个操作数,写回1个结果
执行指令的周期数明显减少,效率高于单总线
✅ 主要部件:
PC、通用寄存器、寄存器堆、ALU、IR、MAR、MDR
3. 单周期数据通路
✅ 特点:
所有指令在一个时钟周期内完成
包括取指、译码、执行、访存、写回等多个阶段操作
✅ 问题:
为保证所有指令都能执行完,必须以最慢的指令决定时钟周期时间
→ 导致 时钟周期很长CPI 固定为 1,但单条指令执行时间长,效率低
✅ 应用:
常见于 教学CPU、RISC简易系统、嵌入式设计
✅ 三、多周期 CPU 与 CPI 分析
✅ 多周期 CPU 特点:
特性 | 描述 |
---|---|
执行分阶段 | 每个阶段(IF/ID/EX/MEM/WB)分布在多个时钟周期内 |
CPI > 1 | 不同指令使用的周期数不同,平均 CPI 大于 1 |
利用率高 | 部件可在不同周期复用,硬件利用率更高 |
设计灵活 | 不同指令可用不同周期组合优化执行效率 |
⏱ CPI 举例:
指令类型 | 阶段数 | 所需周期 |
---|---|---|
add | 4 | IF, ID, EX, WB |
lw | 5 | IF, ID, EX, MEM, WB |
beq | 3 | IF, ID, EX |
CPI 总值 = 所有指令使用的周期 × 指令比例的加权平均
🔁 总结对比:单周期 vs 多周期 CPU
项目 | 单周期 CPU | 多周期 CPU |
---|---|---|
CPI | 固定为 1 | 通常 >1(平均取决于指令结构) |
时钟周期时间 | 由最慢指令决定,较长 | 每阶段独立,短周期 |
指令执行方式 | 所有阶段一次性完成 | 每个阶段一个周期,顺序进行 |
硬件利用率 | 低,大部分时间闲置 | 高,各阶段时间复用 |
执行效率 | 慢(尽管 CPI=1,但周期长) | 更高效(周期短+灵活组合) |
✅ 四、CPI ≠ 阶段数 的根本原因解释
很多人误解:一条指令经过 5 个阶段,CPI 就应该是 5,其实不是!
CPI(Cycles Per Instruction)是平均每条指令花费的时钟周期数,它与 CPU 结构密切相关,而不是和阶段数量直接挂钩。
阶段是“做什么”,CPI 是“花多久”,不在一个维度。
举例:
单周期 CPU:5 个阶段全压缩在 1 个周期 → CPI = 1
多周期 CPU:每个阶段一个周期 → CPI ≈ 3 ~ 5
流水线 CPU:多个指令并发交错 → CPI ≈ 1
✅ 五、主频与时钟周期关系
🔁 主频与时钟周期时间成反比:
主频(f)=1时钟周期时间(T)\text{主频(f)} = \frac{1}{\text{时钟周期时间(T)}}主频(f)=时钟周期时间(T)1
举例:
T = 2ns → f = 500 MHz
T = 0.5ns → f = 2 GHz
→ 时钟周期越长,主频越低,性能越差
✅ 六、结语 · 思维口诀
✅ 阶段是“干什么”,周期是“用多久”,CPI 是“平均花几拍”
✅ 多周期灵活,单周期简单,流水线高效
✅ 时钟长,主频低;CPI高,程序慢;全看结构和优化!
✅ 流水线并行执行原理
📌 一、流水线执行的基本思想
将指令执行过程划分为若干阶段,使得多条指令分阶段并行执行,从而提高指令吞吐率。
📌 二、典型五段流水线结构(以 MIPS 为例)
阶段缩写 | 全称 | 作用 |
---|---|---|
IF | Instruction Fetch(取指) | 从内存中取出指令 |
ID | Instruction Decode(译码) | 指令译码、读寄存器 |
EX | Execute(执行) | 运算/地址计算/分支判断 |
MEM | Memory Access(访存) | 数据读写内存 |
WB | Write Back(写回) | 将结果写回寄存器 |
📌 三、流水线并行实例
假设流水线中正同时处理 5 条指令,在某一时钟周期的状态如下:
指令序号 | 当前阶段 |
---|---|
第 1 条指令 | WB(写回) |
第 2 条指令 | MEM(访存) |
第 3 条指令 | EX(执行) |
第 4 条指令 | ID(译码) |
第 5 条指令 | IF(取指) |
✅ 即:5 条指令分别处于流水线的 5 个不同阶段,同时并行执行!
📌 四、流水线“流动”过程
每当一个时钟周期结束:
每条指令推进到下一个阶段
一条新指令进入 IF 阶段
整条流水线整体向前推进一“步”,如同传送带一样移动
📌 五、流水线执行结果分析
每条指令仍然需要经过 5 个阶段(5 个周期)完成
但由于流水线并行执行,一旦填满流水线后:
每个时钟周期都会有一条指令完成(从 WB 阶段输出结果)
效果是:平均每条指令仅用 1 个周期完成(CPI ≈ 1)
📌 六、关键结论
✅ 流水线的本质:并行执行多个指令的不同阶段,从而提高整体吞吐率
✅ 虽然每条指令仍需多个周期,但流水线可以“每周期输出一条指令”,极大提升 CPU 执行效率