基本结构和功能
CPU的功能
- 指令控制:完成取指、分析指令和执行指令的操作
- 操作控制:一条指令的功能往往是由若干操作信号的组合来实现的,CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应部件,从而控制这些部件按指令的要求进行动作
- 时间控制:对各种操作加以时间上的控制,要为每条指令按时间顺序提供应有的控制信号
- 数据加工:进行算术或逻辑运算
- 中断处理:对计算机运行过程中的异常状况和特殊情况进行处理
运算器和控制器的功能
- 运算器:对数据进行加工
- 控制器:协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令和执行指令
- 取指令:自动形成指令地址,自动发出取指令的命令
- 分析指令:操作码译码,产生操作数有效地址
- 执行指令:根据分析指令得到的命令和操作数地址,形成控制序列,控制其他设备完成操作
- 中断处理:管理总线及输入输出,处理异常情况和特殊请求
基本结构
运算器
- 算术逻辑单元ALU:进行算术/逻辑运算
- 通用寄存器组:如AX、BX、CX、DX、SP等,用于存放操作数和各种地址信息,SP为堆栈指针,指示栈顶地址
- 暂存寄存器:暂存主存读来的数据,它不能放在通用寄存器中
- 累加寄存器:通用寄存器,用于暂时存放ALU运算的结果信息,实现加法
- 程序状态字寄存器:保留由算术逻辑运算指令或测试指令结果简历的状态信息,如OP、SF、ZF、CF
- 移位器:运算结果移位运算
- 计数器:控制乘除运算的操作步骤
上图为专用数据通路方式:根据指令执行中的数据和地址流动方向安排连接线路
但如果直接用导线连接,相当于多个寄存器同时并且一直向ALU传输数据
- 使用多路选择器,根据控制信号选择一路输出
- 使用三态门,可以控制每一路是否输出
这种方式性能高,基本不存在数据冲突,但是复杂
上图为CPU内部单总线方式:将所有寄存器的输入和输出端都连接到一条公共通路上
这种结构简单,容易实现,但数据传送产生较多冲突,性能较低
可以在其中一端放一个暂存寄存器,暂时存储从主存来的数据
如两个操作数来自R0和主存,最后结果存回R0,则为了不破坏运算前R0的内容,主存来的操作数就会直接放入暂存器
控制器
- 程序计数器PC:指出下一条指令在主存中的存放地址,自增
- 指令寄存器IR:保存当前正在执行的指令,其中地址码送给内部总线,操作码送给控制单元CU中的指令译码器ID
- 指令译码器ID:对操作码字段译码,向控制器提供特定操作信号
- 时序系统:产生各种时序信号,由统一时钟分频得到
- 微操作信号发生器:根据IR的内容,PSW的内容及时序信号,产生控制整个计算机系统所需要的各种控制信号
- 存储器地址寄存器MAR:存放要访问的主存单元地址
- 存储器数据寄存器MDR:存放向主存写入和读出的信息
指令执行过程
指令周期
CPU从主存中取出并执行一条指令所需的全部时间
指令周期常用若干机器周期表示,又称CPU周期
一个机器周期又包含若干时钟周期(节拍,T周期),是CPU操作最基本的单位
每个指令周期内机器周期可以不等,每个机器周期内的节拍数也可以不等
例:
周期流程
指令周期的流程大体如上,通过触发器来指明当前是什么周期
取指周期
- 当前指令地址送至MAR,记作\((PC)\rarr MAR\)
- CU发出控制信号,经控制总线传到主存,发出的是读信号,记作\(1\rarr R\)(R为读操作的接口)
- 将MAR所指主存中的内容经数据总线送入MDR,记作\(M(MAR)\rarr MDR\)
- 将MDR中的内容(此时为指令)送入IR,记作\((MDR)\rarr IR\)
- CU发出控制信号,形成下一条指令地址,记作\((PC)+1\rarr PC\)
间址周期
- 将指令的地址码送入MAR,记作\(Ad(IR)\rarr MAR\)或\(Ad(MDR)\rarr MAR\)(因为MDR是复制入IR的)
- CU发出控制信号,启动主存读操作,记作\(1\rarr R\)
- 将MAR所指主存中的内容经过数据总线送入MDR,记作\(M(MAR)\rarr MDR\)
- (可选,有的是这么实现的)将有效地址送至指令IR的地址码字段,记作\((MDR)\rarr Ad(IR)\)
执行周期
根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果
不同指令的执行周期操作不同
中断周期
为了能恢复当前任务,需要保存断电,一般用堆栈保存,用sp表示栈顶地址,假设sp指向栈顶元素,进栈操作是先修改指针,后存入数据
CU控制将sp-1,修改后的地址送入MAR,记作\((sp)-1\rarr sp, sp\rarr MAR\)
CU发出控制信号, 启动主存做写操作,记作\(1\rarr W\)
将断点内容(PC内容)送入MDR,记作\((PC)\rarr MDR\)
CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC,记作\(向量地址\rarr PC\)
指令执行方案
单指令周期
对所有指令选用相同执行时间,对于指令之间串行执行,指令周期取决于执行时间最长的指令的执行时间
这样对于本来可以在更短时间内完成的指令,会浪费时间,整体会降低运行速度
多指令周期
对不同类型指令选用不同步骤执行,指令之间串行执行,可以选用不同个数的时钟周期来完成不同指令的执行过程
流水线方案
在每一个时钟周期启动一条指令 ,尽量让多条指令同时运行,但各自处在不同执行步骤中,指令之间并行运行
数据通路
数据通路即数据在功能部件之间传送的路径, 由控制部件产生的控制信号建立数据通路
CPU内部单总线
- 内部总线:同一部件间的总线,如CPU内部连接各寄存器和运算部分之间的总线
- 系统总线:同一台计算机系统的各部件,如CPU、内存通道和各IO接口之间连接的总线
- 寄存器之间的数据传送
如把PC内容送到MAR:
- \((PC)\rarr Bus\),PCout有效,PC内容送总线
- \(Bus\rarr MAR\),MARin有效,总线内容送MAR
- 主存与CPU之间的数据传送:
如CPU从主存读取指令:
- 将PC指向的指令地址放到MAR:\((PC)\rarr Bus \rarr MAR\),PCout和MARin有效,现行指令地址传入MAR
- \(1\rarr R\),CU通过控制总线发读命令
- \(MEM(MAR)\rarr MDR\), MDRinE有效,根据MAR的地址读出对应数据,通过数据总线送入MDR
- \(MDR\rarr Bus\rarr IR\),MDRout和IRin有效,现行指令传入IR
- 执行算术运算或逻辑运算
如一条加法指令:
\(Ad(IR)\rarr Bus\rarr MAR\),AdIRout和MARin有效
或\((MDR)\rarr MAR\),MDRout和MARin有效
\(1\rarr R\),CU发读命令
\(MEM(MAR)\rarr 数据总线 \rarr MDR\),MDRin有效
\((MDR)\rarr Bus \rarr Y\),MDRout和Yin有效,操作数传入Y
\((ACC)+(Y)\rarr Z\),Accout和ALUin有效,CU向ALU发送加命令
\((Z)\rarr Bus\rarr ACC\),Zout和ACCin有效,结果传入ACC
专用数据通路
- 取指周期
- \((PC)\rarr MAR\),C0有效
- \((MAR)\rarr 主存\),C1有效
- \(1\rarr R\),CU向主存发送读命令
- \(M(MAR)\rarr MDR\),C2有效
- \((MDR)\rarr IR\),C3有效
- \((PC)+1\rarr PC\)
- \(Op(IR)\rarr CU\),C4有效
控制器设计
硬布线控制器
根据指令操作码、目前的机器周期、节拍信号和机器状态条件,控制单元CU可以确定现在这个节拍下应该发出哪些微命令
如所有指令的取指周期,T0节拍下一定要完成\((PC)\rarr MAR\),可以依次设计出逻辑表达式\(C_1=FE\cdot T_0\),用一个与门连接两个电路即可
设计步骤
- 分析每个阶段的微操作序列(取指、间址、执行、中断):确定哪些指令在什么阶段、什么条件下会使用到的微操作
- 选择CPU的控制方式:采用定长还是不定长机器周期,每个机器周期安排几个节拍
- 安排微操作时序:如何用给定节拍完成整个机器周期内所有微操作
- 电路设计:确定每个微操作命令的逻辑表达式,并用电路实现
分析微操作序列
这样我们可以获得指令操作码、目前的机器周期、和机器状态条件
安排微操作时序
原则:
- 微操作先后顺序不得随意更改
- 被控对象不同的微操作尽量安排在一个节拍内完成
- 占用时间较短的微操作尽量安排在一个节拍内完成,并允许有先后顺序
例1:取指周期,我们假设一个机器周期有三个节拍
微操作1是寄存器之间的操作,2是和主存的操作,只要存储器空闲,就可以把他们放到T0一个节拍内完成
微操作3要在1之后,4要在3之后,5要在4之后,6在1之后
所以3和6可以在一块,没有前后依赖,可以放到T1一个节拍完成
4和5可以在一块,且他们都是寄存器间的操作,占用时间较短,可以放到T2一个节拍完成,可以有先后顺序
例2:间址操作
例3:执行周期
电路设计
- 列出操作时间表
这里的状态I表示是否进入间接寻址
IND表示间址周期是否结束
这里是把执行周期所有指令可能用到的都列了出来
写出微操作的最简表达式
去之前列出的表中找对应微操作,看哪些指令对应为1,就加入逻辑表达式
- 画出对应电路图
硬布线控制器特点
- 指令越多,设计和实现越复杂,一般用于RISC
- 如果扩充一条新指令,控制器设计就要大改,扩充指令较困难
- 使用纯硬件控制,速度很快
微程序控制器
微程序:由微指令序列组成,每一种指令对应一个微程序
基本格式:
工作原理
- 取指周期对应的微程序段通常是公用的,因此若某指令中有n条机器指令,则CM中微程序个数至少是n+1个
- 有些早期CPU和物联网设备的CPU可以不提供间接寻址和终端功能
- 物理上,取值、执行周期看起来像两个微程序,但是逻辑上要把它们看作一个整体
编码方式
水平型微命令:一条微指令能定义多个可并行的微命令
格式:

直接编码方式:在微指令的操作控制字段中,每一位代表一个微操作命令,某位为1表示该控制信号有效
优点:简单直观,速度快并行性好
缺点:微指令字节过长,控存容量极大
字段直接编码方式:将微指令的控制字段分成若干段,每段经译码后发出控制信号

字段间接编码方式:一些字段某些微命令需要由另一个字段的某些微命令来解释

分段原则:
- 互斥性微命令分在同一段内,相容性微命令分在不同段内
- 每个小段内包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间
- 一般每个小段还要留出一个状态,表示本字段不发出任何微命令,因此当某字段长度为n位时,最多表示\(2^n-1\)个微命令,通常用000表示不操作
优点:可以缩短指令字长
缺点:要通过译码再发出微命令,更慢
垂直型微命令:一条微指令只能定义一个微命令,由微操作吗规定具体功能
格式:

混合型微命令: 在垂直的基础上加一些不太复杂的并行操作
地址形成方式
下地址字段指出:微指令格式中设置一个下地址字段,直接指出后继微指令的地址,又称断定方式
根据机器指令的操作码形成:当机器指令取至指令寄存器后,微指令地址由操作码经过微地址形成部件形成
增量计数器法:\((CMAR)+1\rarr CMAR\)
分支转移:指明判别条件和转移成功的去向

测试网络:内部有一个测试源
由硬件产生微程序入口地址:
第一条微指令地址由专门硬件产生(有专门硬件记录取指周期微程序首地址),中断周期由硬件产生中断周期微程序首地址
微程序控制单元的设计
- 分析每个阶段的微操作序列,写出对应机器指令的微操作命令和节拍安排
- 取指周期第一条微指令地址由硬件自动给出
- 用微指令a的下地址表示b的地址
- 用当前微指令的下地址表示找到下一条微指令\(Ad(CMDR)\rarr CMAR\)
- 根据指令操作码缺点执行周期微指令序列的首地址\(微地址形成部件\rarr CMAR\)
- 确定微指令格式
- 根据微操作个数决定采用何种编码方式,以便确定操作控制字段位数
- 根据CM中存储的微指令总数,确定顺序控制字段位数
- 编写微指令码点
微程序设计分类
静态微程序设计和动态微程序设计
静态:微程序无需改变,采用ROM
动态:通过改变微程序和微程序改变机器指令,采用EPROM
毫微程序设计:用毫微程序解释微程序
指令流水线
定义
一条指令的执行过程可以分成多个阶段,根据计算机的不同具体分发也不同,大体分为取指、分析和执行
- 取指:根据PC内容访问主存储器,取出一条指令送到IR中
- 分析:对指令操作码译码,按照给定寻址方式和地址字段中的内容形成有效地址EA,并从EA中取出操作数
- 执行:根据操作码字段,完成指令规定的功能,即把结果写道通用计算器或主存中
设三个阶段的时间都相等为t,按一下几种执行方式分析n条指令的执行时间:
- 顺序执行方式:耗时3nt
优点:简单,硬件代价小
缺点:执行指令速度较慢,任何时刻只有一条指令在执行
- 一次重叠执行方式:耗时\(3t+(n-1)\times 2t=(1+2n)t\)
优点:执行时间缩短三分之一,利用率提高
- 二次重叠执行方式:耗时\(3t+(n-1)\times t=(2+n)t\)
优点:执行时间缩短三分之二,理想的指令执行方式
性能指标
吞吐率
单位时间内流水线所完成的任务数量,或者是输出结果的数量
设任务数为n,处理完成n个任务的时间\(T_k\)
则流水线吞吐率\(TP=\frac{n}{T_k}\)
理想情况下,时空图如下
则\(T_k=(k+n-1)\Delta t\)
当连续输入任务n趋于无穷时,最大吞吐率为\(TP=\frac{1}{n}\)
加速比
不用流水线和使用流水线所用时间之比
理想情况下的时空图如下
实际加速比\(S=\frac{kn}{k+n-1}\)
当连续输入任务n趋于无穷时,最大加速比为\(S=k\)
效率
流水线设备利用率,即忙碌时间占总时间的比例
时空图上,流水线效率可以表示为完成n个任务占用时空区有效面积与n个任务用时和k个流水段所围成的时空区总面积之比
理想情况下:
当连续输入任务n趋于无穷时,最高效率\(E=1\)
影响因素
以五段式流水线为例
结构相关(资源冲突)
由于多条指令在同一时刻争用同一资源而形成的冲突
解决方法:
- 后一相关指令暂停一周期
- 资源重复配置:数据存储器+指令存储器
数据相关(数据冲突)
在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况
解决方法:
把遇到的数据相关指令及后续指令都暂停若干周期
硬件阻塞:由硬件系统在等待的周期插入气泡bubble,实现等待
软件插入:由编译器发现数据冲突,并在可能
数据旁路技术:将上一条指令算好的数直接传入ALU,不需要等待写回

编译优化:通过编译器调整指令顺序来解决数据相关
控制相关(控制冲突)
当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关
解决方法:
- 转移指令分支预测,分为简单预测和动态预测
- 预测转移成功和不成功两个控制流方向上的目标指令
- 加快和提前形成条件码
- 提高转移方向的猜准率
分类
多发技术
超标量技术
每个时钟周期可以并发多条指令,但不能调整指令的执行顺序
通过编译优化,把可并行执行的指令搭配起来
超流水技术
一个时钟周期内再分段,这样在一个时钟周期内一个功能部件会被使用多次,速度是原来的三倍
超长指令字
由编译程序挖掘指令间潜在的并行性,将多余能并行操作的指令组合成一条具有多个操作码字段的超长指令字
五段式指令流水线
机器周期的设置
每个阶段的耗时取成一样,以最长为准
理想情况下,每个机器周期只消耗一个时钟周期
流水线每个功能段部件后面都要有一个缓冲寄存器(锁存器),为了保存本流水段的执行结果,提供给下一流水段使用
五段式指令流水线
下面分析五类常见指令如何根据该流水线执行
运算类指令
- IF:根据PC从指令Cache中取指令到IF段的锁存器中
- ID:取出操作数到ID段的锁存器
- EX:运算,结果存入EX段锁存器
- M:空段,因为RISC中运算类指令从寄存器中取数,结果也要放回寄存器,不需要写回主存
- WB:将运算结果写回指定寄存器
LOAD指令
将主存地址中的某个数据取到指定寄存器中
- IF:根据PC从指令Cache中取指令到IF段的锁存器中
- ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm
- EX:运算,得到有效地址EA
- M:根据EA从数据Cache中取数并放入锁存器
- WB:将取出的数写回寄存器
STORE指令
将寄存器中的某个暑假存到指定主存地址中
- IF:根据PC从指令Cache中取指令到IF段的锁存器中
- ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm,将要存的数放到锁存器B
- EX:运算,得到有效地址,并将锁存器B的内容放到锁存器Store
- M:写入数据Cache
- WB:空段
条件转移指令
通常使用相对寻址
- IF:根据PC从指令Cache中取指令到IF段的锁存器中
- ID:进行比较的两个数放入锁存器AB,偏移量放入Imm
- EX:运算,比较两个数
- M:将目标PC值写回PC
- WB:空段,这里PC不算通用寄存器,所以不放在WB段
无条件转移指令
通常使用相对寻址
- IF:根据PC从指令Cache中取指令到IF段的锁存器中
- ID:偏移量放入Imm
- EX:将目标PC值写回PC
- M,WB:空段