Skip to content

单周期数据通路

2026 大纲 五(三)数据通路的功能和基本结构

"一个周期干完一条指令"这句话,把硬件结构全定死了

单周期的定义只有一句:每条指令在一个时钟周期内完成,CPI 恒为 1。听上去只是个时间约定,可它立刻推出一串硬件上的强制要求——因为一条指令用到的所有部件必须同时在空间上展开、一次走完,不能分时复用。

顺着这一句往下推:

🔴 指令存储器与数据存储器必须分开(哈佛结构)。lw 在同一个周期里既要取指令、又要读数据,一个存储器办不到。

🔴 需要多个加法器。算 PC+4 与算分支目标是两件事,同一周期都要做,而 ALU 这时正忙着算别的,不能共用。

🔴 寄存器堆要两个读端口。否则 R 型指令读 rs 和 rt 就得占两个周期,单周期立刻不成立。

同一句话也定死了它的代价

🔴 R 型指令不访存、beq 连写回都没有,但同样要等满一个时钟周期——为最慢的那条指令买单,所有指令一起付账。CPI 虽然只有 1,但每个周期都很长,主频被压得很低。这正是多周期与流水线要解决的问题。

还有一条结构上的排他性,判断题很爱考:

🔴 单周期不能用内部单总线。 单总线同一时刻只能传一个数据,而一条指令至少要在总线上传好几趟(取指、读操作数、写结果),这些传送必须分时、也就必须占多个时钟周期——那它就不是单周期了。反过来也成立:单总线数据通路一定是多周期的

⚠️ 与之配套的另一条:一条指令执行期间控制信号保持不变。单周期的控制信号由组合逻辑直接从操作码译出,整个时钟周期就是同一组值——那些"步骤"是同时在空间上展开的,不是在时间上分步的。控制信号随步骤变化的是多周期 CPU,它的控制器是状态机。

交互可视化

加载可视化中...

两种数据通路模型

本文采用 MIPS 风格的教学模型(RegDst、ALUSrc、MemToReg 这套信号命名),它把"指令如何流过通路"画得非常直观,是理解流水线的必要铺垫。另一种是单总线结构 + 微操作传送语句((PC)MAR 这种写法),见《单总线数据通路》。两种模型描述的是同一件事,只是抽象层次不同。

一、部件是怎么推出来的

从"要执行哪些指令"出发,每个部件都是某个功能的必要条件:

指令要做什么因此必须有部件
记住取哪条指令一个能保存地址的状态元件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 控制部件本条指令要做哪类运算

控制信号汇总表

指令RegDstALUSrcMemToRegRegWriteMemReadMemWriteBranchJump
R 型10010000
lw01111000
swx1x00100
beqx0x00010
jxxx00001

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;oriandi 这类把立即数当逻辑常量用的才取 0(零扩展)。

控制器的实现就是把这张表当作真值表:输入是操作码,输出是每个控制信号,逐列写出逻辑表达式即可。这类组合逻辑通常用 PLA 实现。

三、各类指令在通路上的数据流

R 型指令(add / sub / and / or / slt),格式 op | rs | rt | rd | shamt | funct

  1. PC → 指令存储器,取出指令
  2. 指令中的 rs、rt 字段 → 寄存器堆,读出两个操作数
  3. 两个操作数 → ALU,执行 funct 指定的运算
  4. ALU 结果 → 寄存器堆,写入 rd 号寄存器

lw 指令,格式 lw rt, imm(rs),功能 rtM[rs+imm]:取指 → 读寄存器 rs → 符号扩展 imm(16 位 → 32 位)→ ALU 算 rs + 立即数得有效地址 → 有效地址送数据存储器读出数据 → 数据写入 rt。

sw 指令,格式 sw rt, imm(rs),功能 M[rs+imm]rt:取指 → 读寄存器 rs 和 rt → 符号扩展 imm → ALU 算基址 + 偏移 → rt 的值写入该有效地址。

beq 指令,格式 beq rs, rt, label:取指的同时另一个加法器算出 PC+4 → 读寄存器 rs 和 rt → ALU 算 rs rt 得零标志 Zero → 符号扩展并左移 2 位的偏移量 + (PC+4) = 分支目标地址 → 若 Zero =1 且 Branch =1 则 PC ← 分支目标地址,否则 PC ← PC+4。

j 指令,格式 j target:数据流只有一条,把跳转目标拼出来送 PC,寄存器堆和数据存储器全程不参与

PCPC31:28当前 PC 的高 4 位  target25:0指令给的 26 位  00按字对齐,低 2 位恒 0

两条转移指令的目标地址生成方式不同,一个靠相加、一个靠拼接

🔴 beq(相对寻址)= PC+4 + 符号扩展(imm16) ×4,范围是以当前位置为中心的 ±128 KB,可正可负j(伪直接寻址)= PC 高 4 位拼接 26 位字段 ×4,能覆盖 228 B = 256 MB。但那高 4 位是照抄当前 PC 的,所以 j 跳不出当前的 256 MB 段,要跨段必须改用 jr

顺带解释两个设计选择:beq 为什么复用 ALU 做减法而不配专用比较器——因为减法器已经在那里了,让它顺带产生 Zero 标志几乎不增加成本;分支目标地址为什么要用独立加法器——ALU 这个周期正忙着做减法,而单周期里没有第二个时刻可用。同一条原则的两面:复用已有部件优于新增部件,但同一周期内抢不过来时只能新增

图 5.16 完整的单周期数据通路
图 5.16 完整的单周期数据通路
(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)

这张图是把按指令类型逐步搭出来的几张通路(R 型 / I 型运算 / load-store / 分支 / 无条件转移)合并的结果。合并的方法很机械:同一个部件的输入端如果有多个来源,就在那里插一个 MUX,并为它引一个控制信号。图上带下划线的名字就是控制器要产生的全部控制信号。

四、专用数据通路是被单周期逼出来的

单周期 CPU 必须用专用数据通路——部件之间直接连线、多路数据同时流动,代价是连线多、电路复杂、部件利用率低(一条指令期间大部分部件是闲置的)。

数据通路结构同时可传数据必然的周期数
单总线1 路多周期
多总线若干路多周期(周期数变少)
专用数据通路不受限可做到单周期

五、时钟周期由哪条路径决定

单周期的时钟周期由关键路径定,而关键路径通常是 lw——它是唯一串起全部五个环节(取指、读寄存器、ALU、访存、写回)的指令:

TtPC 锁存+t取指令+t寄存器取数+tALU+t存储器取数+t寄存器建立+t时钟扭斜

⚠️ 两头的三项最容易漏锁存延迟(Clk-to-Q,时钟沿之后 PC 的输出要过一小段才稳定)、建立时间(数据必须在下个时钟沿到来之前提前稳定)、时钟扭斜(时钟信号到达各处的时刻并不一致)。只算中间那四项会低估时钟周期。

考点速记

  1. 单周期 CPI 恒为 1,代价是指令存储器与数据存储器必须分开、需要多个加法器、寄存器堆要两个读端口;R 型和 beq 走完自己的路径后只能空等——为最慢的指令买单,所有指令一起付账,所以它的时钟频率反而较低
  2. 控制信号分选择类写使能类,只有选择类可以取无关项 x;一条指令执行期间控制信号保持不变,因为它由组合逻辑直接从操作码译出。
  3. 时钟周期 = 关键路径(通常是 lw),必须计入锁存延迟、建立时间与时钟扭斜单周期不能用内部单总线,必须用专用数据通路,反之单总线数据通路必然是多周期的

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 挑关于单周期处理器的错误叙述:四个选项通常踩"可以采用单总线结构数据通路"(,单总线必然多周期)、"处理器时钟频率较低"(对,周期被最慢指令拉长)、"指令执行过程中控制信号不变"(对,组合逻辑直接译出)、"每条指令的 CPI 为 1"(对,这是定义)。
  • 问哪几类处理器理想情况下 CPI 为 1单周期(定义如此)与基本流水线(理想吞吐每周期一条)是;多周期 CPI >1超标量理想 CPI <1(每周期发射多条)。同一组判断也会写成"数据通路结构与 CPI 的关系"来问。
  • 挑关于数据通路与控制器的错误叙述里涉及单周期的那一项:"单周期 CPU 的控制器比多周期 CPU 的更简单"是对的——单周期控制器是纯组合逻辑,多周期的是状态机。

易错:认为单周期"CPI 为 1 所以最快"。CPI 低但周期长,整体性能通常不如多周期与流水线。

易错:把单总线数据通路配给单周期。两者互斥。

易错:给 sw 的 RegWrite 填 x。写使能类信号绝不能是无关项。

易错:算关键路径时只加中间四项,漏掉锁存延迟、建立时间与时钟扭斜。

易错:以为 j 指令能跳到任意地址。它的高 4 位照抄当前 PC,跳不出当前 256 MB 段。

教材出处
  • 无条件转移指令的目标地址计算 PC31:2PC31:28target25:0 与 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

相关知识

多周期数据通路单总线数据通路

真题练习