Appearance
单周期数据通路
2026 大纲 五(三)数据通路的功能和基本结构。
"一个周期干完一条指令"这句话,把硬件结构全定死了
单周期的定义只有一句:每条指令在一个时钟周期内完成,CPI 恒为 1。听上去只是个时间约定,可它立刻推出一串硬件上的强制要求——因为一条指令用到的所有部件必须同时在空间上展开、一次走完,不能分时复用。
顺着这一句往下推:
🔴 指令存储器与数据存储器必须分开(哈佛结构)。lw 在同一个周期里既要取指令、又要读数据,一个存储器办不到。
🔴 需要多个加法器。算 PC
与算分支目标是两件事,同一周期都要做,而 ALU 这时正忙着算别的,不能共用。 🔴 寄存器堆要两个读端口。否则 R 型指令读 rs 和 rt 就得占两个周期,单周期立刻不成立。
同一句话也定死了它的代价:
🔴 R 型指令不访存、beq 连写回都没有,但同样要等满一个时钟周期——为最慢的那条指令买单,所有指令一起付账。CPI 虽然只有 1,但每个周期都很长,主频被压得很低。这正是多周期与流水线要解决的问题。
还有一条结构上的排他性,判断题很爱考:
🔴 单周期不能用内部单总线。 单总线同一时刻只能传一个数据,而一条指令至少要在总线上传好几趟(取指、读操作数、写结果),这些传送必须分时、也就必须占多个时钟周期——那它就不是单周期了。反过来也成立:单总线数据通路一定是多周期的。
⚠️ 与之配套的另一条:一条指令执行期间控制信号保持不变。单周期的控制信号由组合逻辑直接从操作码译出,整个时钟周期就是同一组值——那些"步骤"是同时在空间上展开的,不是在时间上分步的。控制信号随步骤变化的是多周期 CPU,它的控制器是状态机。
交互可视化
两种数据通路模型
本文采用 MIPS 风格的教学模型(RegDst、ALUSrc、MemToReg 这套信号命名),它把"指令如何流过通路"画得非常直观,是理解流水线的必要铺垫。另一种是单总线结构
一、部件是怎么推出来的
从"要执行哪些指令"出发,每个部件都是某个功能的必要条件:
| 指令要做什么 | 因此必须有 | 部件 |
|---|---|---|
| 记住取哪条指令 | 一个能保存地址的状态元件 | PC |
| 按地址取出指令 | 一个只读的存储部件 | 指令存储器 |
| 读写通用寄存器 | 两读一写的多端口存储 | 寄存器堆 |
| 运算、算地址、比较 | 一个算术逻辑部件 | ALU |
| 访问内存数据 | 可读可写的存储部件 | 数据存储器 |
| 把 16 位立即数与 32 位数运算 | 位数补齐 | 符号扩展单元 |
| 算 PC+4、算分支目标 | 与 ALU 并行的加法电路 | 加法器 ×2 |
| 在多个数据来源中挑一个 | 由控制信号选通 | 多路选择器 MUX |
二、控制信号
| 信号 | 作用 |
|---|---|
| RegDst | 选择目的寄存器编号的来源(R 型用 rd,I 型用 rt) |
| ALUSrc | 选择 ALU 的第二操作数(寄存器值 或 立即数) |
| MemToReg | 选择写回寄存器的数据(ALU 结果 或 内存读出值) |
| RegWrite | 允许写寄存器堆 |
| MemRead | 读数据存储器 |
| MemWrite | 写数据存储器 |
| Branch | 分支控制,与 ALU 的零标志相与后决定 PC 的来源 |
| Jump | 无条件转移控制,选中"拼接出来的跳转目标"作为下条指令地址 |
| ExtOp | 扩展器的方式:1 符号扩展(立即数是有符号数)、0 零扩展(立即数是逻辑常量) |
| ALUOp | 告知 ALU 控制部件本条指令要做哪类运算 |
控制信号汇总表
| 指令 | RegDst | ALUSrc | MemToReg | RegWrite | MemRead | MemWrite | Branch | Jump |
|---|---|---|---|---|---|---|---|---|
| R 型 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| lw | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
| sw | x | 1 | x | 0 | 0 | 1 | 0 | 0 |
| beq | x | 0 | x | 0 | 0 | 0 | 1 | 0 |
| j | x | x | x | 0 | 0 | 0 | 0 | 1 |
x 表示无关项(don't care)。表中未列 ExtOp:上面五条指令用到立即数的地方都按有符号处理,ExtOp 恒为 1;R 型和 j 不经过扩展器,取 x。
🔴 控制信号分两类,无关项的待遇完全不同。选择类(RegDst、ALUSrc、MemToReg、Branch)控制 MUX 挑哪一路,挑错了只是某个结果没被用到,可以取 x;写使能类(RegWrite、MemWrite)决定状态元件要不要真的写进去,错误地置 1 会污染寄存器或内存,绝不能是 x。看表里的 sw 那一行:RegDst 是 x,但 RegWrite 必须明确写 0。
🔴 ExtOp 的判据是"这个立即数该不该带符号",不是指令属于哪一类。 lw / sw 的偏移、beq 的位移都按有符号处理,所以恒为 1;
ori、andi这类把立即数当逻辑常量用的才取 0(零扩展)。
控制器的实现就是把这张表当作真值表:输入是操作码,输出是每个控制信号,逐列写出逻辑表达式即可。这类组合逻辑通常用 PLA 实现。
三、各类指令在通路上的数据流
R 型指令(add / sub / and / or / slt),格式 op | rs | rt | rd | shamt | funct:
- PC → 指令存储器,取出指令
- 指令中的 rs、rt 字段 → 寄存器堆,读出两个操作数
- 两个操作数 → ALU,执行 funct 指定的运算
- ALU 结果 → 寄存器堆,写入 rd 号寄存器
lw 指令,格式 lw rt, imm(rs),功能
sw 指令,格式 sw rt, imm(rs),功能
beq 指令,格式 beq rs, rt, label:取指的同时另一个加法器算出 PC+4 → 读寄存器 rs 和 rt → ALU 算 rs
j 指令,格式 j target:数据流只有一条,把跳转目标拼出来送 PC,寄存器堆和数据存储器全程不参与。
两条转移指令的目标地址生成方式不同,一个靠相加、一个靠拼接:
🔴 beq(相对寻址)
PC 符号扩展(imm16) ,范围是以当前位置为中心的 KB,可正可负;j(伪直接寻址) PC 高 4 位拼接 26 位字段 ,能覆盖 B 256 MB。但那高 4 位是照抄当前 PC 的,所以 j 跳不出当前的 256 MB 段,要跨段必须改用 jr。
顺带解释两个设计选择:beq 为什么复用 ALU 做减法而不配专用比较器——因为减法器已经在那里了,让它顺带产生 Zero 标志几乎不增加成本;分支目标地址为什么要用独立加法器——ALU 这个周期正忙着做减法,而单周期里没有第二个时刻可用。同一条原则的两面:复用已有部件优于新增部件,但同一周期内抢不过来时只能新增。

(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
这张图是把按指令类型逐步搭出来的几张通路(R 型 / I 型运算 / load-store / 分支 / 无条件转移)合并的结果。合并的方法很机械:同一个部件的输入端如果有多个来源,就在那里插一个 MUX,并为它引一个控制信号。图上带下划线的名字就是控制器要产生的全部控制信号。
四、专用数据通路是被单周期逼出来的
单周期 CPU 必须用专用数据通路——部件之间直接连线、多路数据同时流动,代价是连线多、电路复杂、部件利用率低(一条指令期间大部分部件是闲置的)。
| 数据通路结构 | 同时可传数据 | 必然的周期数 |
|---|---|---|
| 单总线 | 1 路 | 多周期 |
| 多总线 | 若干路 | 多周期(周期数变少) |
| 专用数据通路 | 不受限 | 可做到单周期 |
五、时钟周期由哪条路径决定
单周期的时钟周期由关键路径定,而关键路径通常是 lw——它是唯一串起全部五个环节(取指、读寄存器、ALU、访存、写回)的指令:
⚠️ 两头的三项最容易漏:锁存延迟(Clk-to-Q,时钟沿之后 PC 的输出要过一小段才稳定)、建立时间(数据必须在下个时钟沿到来之前提前稳定)、时钟扭斜(时钟信号到达各处的时刻并不一致)。只算中间那四项会低估时钟周期。
考点速记
- 单周期 CPI 恒为 1,代价是指令存储器与数据存储器必须分开、需要多个加法器、寄存器堆要两个读端口;R 型和 beq 走完自己的路径后只能空等——为最慢的指令买单,所有指令一起付账,所以它的时钟频率反而较低。
- 控制信号分选择类与写使能类,只有选择类可以取无关项 x;一条指令执行期间控制信号保持不变,因为它由组合逻辑直接从操作码译出。
- 时钟周期
关键路径(通常是 lw),必须计入锁存延迟、建立时间与时钟扭斜;单周期不能用内部单总线,必须用专用数据通路,反之单总线数据通路必然是多周期的。
这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):
- 挑关于单周期处理器的错误叙述:四个选项通常踩"可以采用单总线结构数据通路"(错,单总线必然多周期)、"处理器时钟频率较低"(对,周期被最慢指令拉长)、"指令执行过程中控制信号不变"(对,组合逻辑直接译出)、"每条指令的 CPI 为 1"(对,这是定义)。
- 问哪几类处理器理想情况下 CPI 为 1:单周期(定义如此)与基本流水线(理想吞吐每周期一条)是;多周期 CPI
;超标量理想 CPI (每周期发射多条)。同一组判断也会写成"数据通路结构与 CPI 的关系"来问。 - 挑关于数据通路与控制器的错误叙述里涉及单周期的那一项:"单周期 CPU 的控制器比多周期 CPU 的更简单"是对的——单周期控制器是纯组合逻辑,多周期的是状态机。
易错:认为单周期"CPI 为 1 所以最快"。CPI 低但周期长,整体性能通常不如多周期与流水线。
易错:把单总线数据通路配给单周期。两者互斥。
易错:给 sw 的 RegWrite 填 x。写使能类信号绝不能是无关项。
易错:算关键路径时只加中间四项,漏掉锁存延迟、建立时间与时钟扭斜。
易错:以为
j指令能跳到任意地址。它的高 4 位照抄当前 PC,跳不出当前 256 MB 段。
教材出处
- 无条件转移指令的目标地址计算
与 Jump 信号、完整的取指令部件(图 5.14、图 5.15):袁春风《计算机组成与系统结构》第 3 版 §5.2.2 数据通路的设计,印刷页 p142 - 完整的单周期数据通路与控制信号(图 5.16):同上,印刷页 p143
- 控制信号取值表与主控制器/ALU 控制器的划分(表 5.4、图 5.22):同上,§5.2.3 控制器的设计,印刷页 p147
- lw 指令周期的关键路径构成(图 5.24):同上,§5.2.4 时钟周期的确定,印刷页 p149