第五章 CPU
5.1 CPU功能
- 指令控制:取指令、分析指令
- 操作控制:将各种操作信号送往相应部件,一条指令往往是由若干个微操作组成的,而CPU则提供若干操作信号组合完成对部件的微操作
- 时间控制:对各种操作进行时间管理
- 数据加工:算术、逻辑运算
- 中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理
CPU主要的两大器件是运算器和控制器
一、 运算器
对数据进行加工
组成部件:
算术逻辑单元:进行算术、逻辑运算
通用寄存器组:比如AX、BX、CX等,也有SP堆栈指针寄存器,用于记录主存中的堆栈的栈顶指针位置
寄存器组和CPU的连接方式:
- 专用数据通路:每个寄存器都有一个数据通路和ALU相连,制造成本高。需要使用多路选择器MUX来选择参与执行指令寄存器,该器件用于控制哪个寄存器向ALU发送信号。性能好但是价格贵,可以在需要高性能的部件上。
- CPU内部单总线:所有寄存器信号都和CPU上的专用总线进行交换。通过该总线来传输数据和选择寄存器来存取。结构简单容易实现,但是会出现冲突,需要处理冲突情况。比如ALU必须要同时接收到两个输入信号才能进行加法运算,但是总线上每时每刻只能传输一个信号,因此总线会先将操作数A传送到暂存寄存器Y中,该寄存器有一条独立于总线的线路和ALU连接,然后在总线向ALU传输操作数B的同时,Y也向ALU传输操作数A,从而完成了加法操作
除了通用寄存器外,还有:PSW(状态寄存器),ACC(累加寄存器),以及计数器(进行乘除操作)和移位器(移位运算)
二、控制器
协调并控制计算机各个部件执行指令的序列
主要功能:
- 取指令
- 分析指令
- 执行指令
- 中断处理
主要部件:
- PC(程序计数器):存放下一条指令地址,与CPU内部总线相连
- 指令寄存器(IR):存放当前需要执行的指令,与CPU内部总线相连,指令包括操作码OP和地址码Ad
- 指令译码器(ID):通过译码器可知当前执行的是什么指令,输入信号为操作码,输出信号为微操作信号,将指令转化为对应微操作。
- 微操作信号发生器:产生控制整个计算机系统所需的信号,输入信号是指令译码器的输出结果,根据翻译后的微操作执行具体的微操作。微操作信号发生器会根据指令译码器、时序系统和标志位、PSW寄存器的内容执行微操作
- 时序系统:用于产生各种时序信号,
- 存储器地址寄存器(MAR):用于存储所要访问的主存单元的地址,一端连接CPU内部总线,一端连接地址总线
- 存储器数据寄存器(MDR):用于存储向主存写入的信息或从主存读出的信息,一端连接CPU内部总线,一端连接数据总线
其中绿色字体为由微操作信号发生器的控制信号,蓝色字体为输出信号,黄色字体为数据总线相关信号,橙色框为用户可见的寄存器。
其中指令译码器、微操作信号发生器、时序系统构成了控制单元CU
5.2 指令周期
指令周期指的是CPU从主存中每取出并执行一条指令所需的全部时间
指令周期一般需要若干个机器周期,机器周期又称为CPU周期
一个机器周期包含有若干时钟周期(也成T节拍,CPU时钟周期,这是CPU操作的最基本单位),时钟周期是CPU频率的倒数
所谓机器周期就是完成一个子工作所需的周期,比如取指令机器周期、取有效地址机器周期等,机器周期有定长机器周期和不定长机器周期,每个指令周期内有若干个机器周期,比如某个指令周期里包含有取指令机器周期和执行指令机器周期。
常见指令周期如上
在CPU中会有四个触发器,用于指示当前指令执行处于哪个周期,分别是FE:取值周期、IND:间址周期、EX:执行周期、INT:中断周期
一、执行周期
主要的指令周期有:
取址周期 (间址周期) 执行周期 (中断周期)
加括号的表示为非必需周期
CPU通过触发器判断自身处于什么周期。
二、指令周期数据流
1.取址周期
- 将PC指向的当前指令送到MAR:(PC)→MAR
- CU发出控制信号,表示读还是写,这点和存储器上的读写控制位相连:1→R
- 将MAR所指向的贮存内容经过数据总线送入MDR:M(MAR)→MDR
- 将MDR的内容送入IR:(MDR)→IR
- CU发出控制信号,使得PC+1:(PC)+1→PC
TIP:M(MAR)的意思是,将MAR寄存器中的内容作为地址,在主存中寻址,也就是提取出地址为MAR内容的主存存储单元的内容
2.间址周期
- 将指令的间接地址码送入MAR: A d ( I R ) → M A R Ad(IR)\to MAR Ad(IR)→MAR或 A d ( M A R ) → M A R Ad(MAR)\to MAR Ad(MAR)→MAR
- CU发出读信号,启动主存的读操作: 1 → R 1\to R 1→R
- 将MAR所指的内容送入MDR: M ( M A R ) → M D R M(MAR)\to MDR M(MAR)→MDR
- (可选)某些指令会将得到的真实地址覆盖掉指令中的间址地址,将有效地址送到指令的地址码字段: ( M D R ) → A d ( I R ) (MDR)\to Ad(IR) (MDR)→Ad(IR)
3.执行周期
根据不同的指令、执行周期也不一样
4.中断周期
每个进程运行时,系统都会为该进程在主存中开辟空间来存放当前进程的堆栈空间,会使用堆栈来保存保存中断的断点。SP表示栈顶地址,进栈先修改指针,再存入数据(注意,在实际计算机中,一般高位是栈底,低位是栈底,因此SP–是入栈操作)
- CU控制SP-1,修改后SP的地址送入MAR。本质上是将断点存入某个存储单元中: ( S P ) − 1 → S P , ( S P ) → M A R (SP)-1\to SP, (SP)\to MAR (SP)−1→SP,(SP)→MAR
- CU发送写信号,启动主存进行写操作: 1 → W 1\to W 1→W
- 将断点(PC的内容,即当前程序执行到的位置)送入MDR,记作 ( P C ) → M A R (PC)\to MAR (PC)→MAR
- 将MDR中的内容送入栈顶(也就是SP指针)所指的内存位置,而根据1.SP指针的值已经存入了MAR,因此记作 M D R → M ( M A R ) MDR\to M(MAR) MDR→M(MAR)
- CU将中断处理程序的第一条指令放入到PC中
通过上述过程,可以将被中断的进程断开的位置地址,存入到内存中该进程堆栈的栈顶。而栈顶的位置则被存放在了MAR中
三、指令执行方案
1.单指令周期
所有指令都用相同的时间完成。控制电路设计简单,但是会浪费短指令的时间。指令之间串行执行。
2.多指令周期
对不同指令使用不同的时间。控制电路设计复杂,指令串行穿行,可以使用不同个数的时钟周期,需要更复杂的硬件设计。
3.流水线方案
并行执行指令,但各自处在于不同的执行步骤之间,尽量让多个指令同事运行。指令执行的每一阶段使用到的物理部件是不一样的,流水线方案类似于第一条指令结束第一阶段,进入第二阶段的时候,第一阶段所需的物理部件已经空闲,此时让第一条指令进入第一阶段,使得指令之间能够并行执行。
5.3 数据通路
数据通路指的是数据在功能部件之间传送的路径
数据通路分为三种基本结构:
- CPU内部单总线
- CPU内部多总线
- 专用数据通路
1.寄存器之间的数据传送
2.主存和CPU之间的数据传送
3.执行算术或逻辑运算
比如一条加法指令,它的一个操作数位于ACC,另外一个操作数通过指令的地址码来寻找,微操作序列以及控制信号为:
- A d ( I R ) → B u s → M A R Ad(IR)\to Bus \to MAR Ad(IR)→Bus→MAR,也可以从MDR中取地址码,此时MDRout和MARin有效
- 1 → R 1\to R 1→R,CU发出读信号
- M E M ( M A R ) → 数据线 → M D R MEM(MAR)\to 数据线\to MDR MEM(MAR)→数据线→MDR,此时MDRinE有效,MDRin信号用于控制MDR在CPU内部总线上的读取操作,而MDRinE信号用于控制MDR在外部总线上的读取操作
- M D R → B u s → Y MDR\to Bus\to Y MDR→Bus→Y,此时MDRout和Yin都有效,负责将操作数放入暂存寄存器Y
- ( A C C ) + ( Y ) → Z (ACC)+(Y)\to Z (ACC)+(Y)→Z,ACCout和ALUin都有效,此时CU向ALU发送加命令,ACC的值和Y中的值同时向ALU传输,但是Y和ALU的通路是独立于内部总线的,不需要总线控制。
4.专用数据通路
各个部件之间有专门的数据通路,而不是使用CPU内部总线
5.4 硬布线控制器
本节的重点是学习如何用纯硬件的方式设计控制单元CU,需要事先了解一下几点:
- 一个时钟周期(节拍)内可以并行完成多个不冲突的微操作
- 同一个微操作可能会在不同的指令的不同阶段被使用
- 定长机器周期会以最大时钟周期指令的节拍数为准
一、控制单元CU的结构、输入和输出
根据指令操作码、目前的机器周期、节拍信号、机器状态条件,可以确定现在这个时钟周期内需要发出什么微命令,这就是对控制器设计
二、硬布线控制单元设计
对硬布线控制单元的的设计有以下四个步骤:
安排微操作时序的原则:
- 微操作的先后顺序不得随意更改
- 被控对象不同的微操作尽量安排在一个节拍内完成
- 占用时间较短的微操作尽量安排在一个节拍内完成,并且允许有先后顺序
1.分析每个阶段的微操作序列
取址、间址、执行阶段需要执行的微操作序列详见本文的(二、指令数据流)
2.选择CPU控制方式
为了简化操作,我们分析采用定长机器周期,每个机器周期3个节拍
3.安排微操作时序
一个机器周期有若干个时钟周期,因此我们需要将一个机器周期内需要执行的微操作安排到各个时钟周期中,并且保证一个时钟周期内执行的微操作是不冲突的
取值周期微操作时序
间址周期微操作时序
从主存取数时间较长,必须要一个时钟周期才能保证微操作的完成
执行周期微操作时序
执行周期的主要指令有以下几种
- 非访存指令
- CLA——清除ACC
- COM——取反
- SHR——算术右移
- CSL——循环左移
- STP——停机指令
- 访存指令
- ADD X——加法指令
- STA X——存数指令
- LDA X——取数指令
- 转移指令
- JMP X——无条件转移
- BAN X——条件转移
4.电路设计
较为复杂,请见本篇的(三、组合逻辑电路设计)
三、组合逻辑电路设计
完成了上述三个步骤后,开始设计具体电路
1.列出操作时间表
2.写出最简逻辑表达式
以寻找
M
(
M
A
R
)
→
M
D
R
M(MAR)\to MDR
M(MAR)→MDR的逻辑表达式为例子
在上述表中的各个阶段找到
M
(
M
A
R
)
→
M
D
R
M(MAR)\to MDR
M(MAR)→MDR,比如
这表示在执行周期的T1节拍中,有ADD和LDA两个指令是需要执行
M
(
M
A
R
)
→
M
D
R
M(MAR)\to MDR
M(MAR)→MDR这个微操作的,将各个阶段的需要执行
M
(
M
A
R
)
→
M
D
R
M(MAR)\to MDR
M(MAR)→MDR的指令都找出来,那么他的逻辑表达式就是:
3.画出电路逻辑图
四、硬布线控制器特点
- 指令越多,设计和实现越复杂,因此一般使用于RISC
- 如果扩充一条新的指令,则控制器设计需要大改,因此扩展指令困难
- 由于使用纯硬件实现,因此速度非常快,微操作信号由组合逻辑电路即时产生
五、硬布线控制器总结
对于硬布线设计CU需要一定思考方式的转变,我们知道CU的输入信号分别是指令操作码、目前的机器周期、节拍信号、机器状态条件,输出是微操作指令。通过输入信号,当前指令位于什么机器周期中的哪个节拍,因此确定了需要执行何种微操作。
5.4 微程序控制器
一、概述
微程序是由一系列微指令序列组成,每一种指令对应一个微程序。也就是说,指令是对程序执行步骤的描述,微指令是对指令执行步骤的描述
其中微命令是和微操作是一一对应的,而微指令一般是以节拍为单位的,一个节拍内执行的所有微操作(也可以所示所有微命令)是一条微指令
也就是说一个微程序中有多个微指令,一个微指令中又有多个微命令
微指令的格式
操作控制 | 顺序控制 |
---|---|
n bit | m bit |
操作控制用于指明本条微指令包含什么微命令,顺序控制右移指明下一条微指令的地址 |
二、微程序控制器基本结构
顺序逻辑结构可以根据指令地址码的寻址特征位判断是否需要跳过间址周期。而CLK则是中断信号线路,可以根据该信号判断是否进入中断周期
控制存储器CM的内部存储内容
三、微指令设计
一条微指令包含若干个微命令,而微命令分为可以并行完成的相容性微命令和不允许并行完成的互斥性微命令
1.微指令格式
2.微指令编码
该部分是探讨水平型微指令中的操作控制比特位如何形成操作信号,目的是保证运行速度并且尽量缩短指令字长。另外也会讨论微指令的下地址是如何进行寻址的
直接编码方式
又称直接控制方式,每一位代表一个微操作命令,1表示控制信号有效。有点事简单直观,执行速度快,操作并行性号,但是缺点是微指令字长很长,对控制存储器CM的容量要求极大
字段直接编码
将微指令的控制字段分为若干个段,每段编译后发出控制信号。
- 将相容的微操作分到不同段中,将互斥的微操作分到相同段中。这样一条微指令中的若干个段是可以并行执行的。比如指令中的其中一个段为3bit,001表示A微操作,010表示B微操作,因此A和B不会同时在一条微指令中被执行,因为该段中不能同时为001和010
- 每个小段不能包含太多信息为,否则会增加电路复杂性和译码时间
- 每一小段需要留下一个状态标识本字段不发出任何微命令,通常是全0。
该种方式可以缩短微指令字长,但是要通过译码电路后才发出微命令,因此速度比直接编码慢
字段间接编码
和字段直接编码一样,将控制字段划分为若干个段
一个字段的某些微指令需要由另一个字段的某些微命令来解释,因此又称为隐式编码
优点是可以缩短微指令字长,但是削弱了并行控制能力,因此一般是一种对字段直接编码的辅助手段
微指令地址形式
- 根据微指令下地址字段直接找出,又称为断定方式
- 根据机器指令的操作码形成,可以将存放在IR的机器指令的操作码送到CU内部的微地址形成部件从而形成
- 增量计数法:(CMAR)+1→CMAR,和PC+1相似
- 分支转移:类似于条件转移,满足判别条件之后转移到指定去向
- 测试网络
- 由硬件产生微程序入口地址:
四、微程序控制单元设计
设计步骤
- 分析每个阶段微操作序列
- 写出对应机器指令的微操作命令和节拍安排
- 确定微指令格式
- 编写微指令码点
其中1.和2.和硬布线控制器设计的部分一致,但是对取值周期的微操作序列和硬布线有些许不同
一个指令周期内每个非最终指令执行完成后,需要用Ad(CMDR)→CMAR来讲下一条微指令的地址存入CMAR
在取值周期的时候,最后一个执行的微指令要执行
O
P
(
I
R
)
→
微地址形成部件
→
C
M
A
R
OP(IR)\to 微地址形成部件\to CMAR
OP(IR)→微地址形成部件→CMAR才能知道执行周期的微程序首地址
4.编写指令码点
根据操作控制字段每一位代表的操作命令,编写每一条微指令的码点
五、微程序设计分类
1.静态微程序设计和动态微程序设计
静态:微程序无需改变,采用ROM
动态:可以改变微指令和微程序改变机器指令,有利于方阵,采用EPROM
2.毫微程序设计
再套一层娃
5.5 指令流水线
对指令执行的过程进行优化,使得多条指令能够并发执行。在讨论如何优化之前,先看看传统冯诺依曼机采用的顺序执行方式(又称串行执行方式)
假设取址、分析、执行三个阶段时间都是t,有n条指令
可以让第一条指令取址完成,进入分析阶段的时候,第二条指令就开始进行取值,从而提高指令执行速度
用于表示指令执行的过程的图称为时空图
一、流水线性能指标
1.吞吐率
单位时间内能够完成的指令数量,设指令数量为n,处理完n个指令所用时间为Tk,则刘淑贤吞吐率为
T
P
=
n
T
k
TP=\frac{n}{T_k}
TP=Tkn
装入时间指的是第一条指令从取址到最后一条指令取址结束的时间,排空时间指的是第一条指令的最后一个阶段开始执行到最后一条指令执行结束的时间
2.加速比
完成同一批任务,不使用流水线所用的时间和使用流水线的时间的比值
S
=
T
0
T
k
S=\frac{T_0}{T_k}
S=TkT0其中T0是不使用流水线所用的时间,Tk是使用流水线的时间
3.效率
指的是流水线设备的利用率
二、指令流水线影响因素分类
1.机器周期
IF阶段:取指令阶段
ID阶段:译码阶段,另外负责取数。在RISC中,操作数都是从寄存器中取得的,如果所需操作数不在寄存器中,那么将会使用LOAD和STORE指令进行对主存的读写,而并非由当前指令亲自去进行访存。因此一般指令ID阶段的取数操作只需要访问寄存器。
EX阶段:执行解读那
M阶段:访存阶段
WB阶段:将最终结果写回寄存器组
为了方便流水线设计,会将每一个阶段的耗时取成一样,以最长耗时为准
其中InstructionCache和DataCache表示的是高速缓存,这种构型假设执行的指令和所需的数据都能在高速缓存中找到。因此如果高速缓存不命中,那么会导致流水线断流。
各个阶段的功能部件后面会添加一些缓冲寄存器来进行数据暂存和传输,又称为锁存器,用于保存本阶段的执行结果,其中有:
2.影响流水线的因素
(1)结构相关(资源冲突)
指的是多条指令在同一时刻争用统一资源而导致的冲突
比如说上述例子的LOAD指令和3号指令在对主存和写回寄存器的访问上产生了冲突
解决办法一般是:
- 后一相关指令暂停一个周期
- 配置更多资源:用数据存储器+指令存储器,将数据和指令分开存放
该部分和操作系统的互斥问题较为相像,可以对比学习
(2)数据相关(数据冲突)
该部分和操作系统同步问题较为相像,可以对比学习
数据相关指的是存在必须等待前一条指令执行完成,才能指令后一条指令的情况。
上述例子中,2号指令的减法需要用到1号指令的加法的结果,因此出现冲突
解决办法就是
- 将数据相关的指令和她的后续指令暂停数个时钟周期,等待数据已就绪之后再执行。其中可以使用硬件阻塞(stall)在指令中添加气泡,以及使用NOP(添加空指令)这种软件操作
- 数据旁路技术:通过专用电路,将上一条指令的结果直接作为下一条指令的ALU的一个输入端,而不需要再进行寄存器的访存
- 编译优化:调整指令顺序解决数据冲突问题
(3)控制相关(控制冲突)
当流水线遇到转移指令和其他改变PC值的指令而导致断流时,会引起控制相关
解决办法:
- 转移指令分支预测,分为简单预测和动态预测
- 预取转移成功和不成功的两个控制流方向的目标指令
- 加快和提前形成条件码,使得转移指令能够更快得知
3.流水线分类
- 部件功能级,处理机级和处理机间流水线
- 部件级是将复杂的算术逻辑运算组成流水线工作方式,比如将浮点加法操作分别数个阶段,然后采用流水线技术
- 处理机级是将一条指令的解释过程分为多个子进程,比如上面我们学习的指令流水线就是处理机级的
- 处理机间是一种宏流水,一个处理机完成一个阶段,然后将处理好的数据放在了处理期间共享存储器中
- 单功能流水线和多功能流水线
- 单功能是只能实现一种固定的专门功能的流水线,比如浮点加法流水线
- 多功能流水线指的是各段间的不同连接方式可以同时或者不同时实现多种功能的流水线,比如说指令流水线
- 动态流水线和静态流水线
- 静态流水线是在同一时间内,流水线各个段只能按照同一种功能的连接方式工作
- 动态流水线是在同一时间内,一段正在进行某种运算,而另一端却在进行另一种运算,这能够提高效率,但是会使得流水线控制复杂化
- 线性流水线
- 线性流水线,从输入到输出,每个功能段只允许经过一次,不存在反馈电路
- 非线性流水线存在反馈电路,有些功能能够数次通过流水线,可以进行线性递归运算
4.流水线多发技术
超标量技术
每个时钟周期能并发执行多条独立指令,要配置多个功能部件,一般不能调整指令执行顺序。而能够调整指令执行顺序的称为超标量乱序发射技术
超标量技术需要通过编译技术,将可并行执行的指令搭配起来
超流水技术
在一个时钟周期内再分段,是一种时分复用技术,不能调整指令的执行顺序。
超长指令字
由编译程序挖掘出指令之间潜在的并行性的时候,将多条能够并行操作的指令组合成一条具有多个操作码字段的超长指令字,甚至会高达数百位
三、五段式指令流水线
运算类指令通常包含以下几个阶段:
IF取址→ID译码/取数→EX执行→M访存→WB写回寄存器
1.运算类指令举例
其中Rs指的是源操作数,Rd为目的操作数,运算类指令是不需要
2.LOAD和STORE指令执行过程
LOAD采用基址寻址,因此需要将基址和偏移量放入ALU运算
TIPS:RISC处理器只能使用取数LOAD和存数STORE这两指令进行访存,其他指令都是从寄存器中取数
3.转移指令
条件转移指令
条件转移指令执行过程如下,条件转移指令都是使用相对寻址
无条件转移指令JMP
指令汇编格式:
(PC)+指令字长+(偏移量x指令字长)→PC
无条件转移指令的执行过程:
IF:根据PC从指令Cache取指令到IF段的锁存器
ID:偏移量放入Imm
EX:将目标PC值写回PC
M:空段
WB:空段