一、CPU的功能与结构
1、CPU的功能
1)指令控制
完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
2)操作控制
一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
3)时间控制
对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
4)数据加工
对数据进行算术和逻辑运算。
5)中断处理
对计算机运行过程中出现的异常情况和特殊请求进行处理。
2、运算器和控制器的功能
1)运算器
对数据进行加工
2)控制器
协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令
- 取指令:自动形成指令地址;自动发出取指令的命令
- 分析指令:操作码译码(分析本条指令要完成什么操作);产生操作数的有效地址。
- 执行指令:根据分析指令得到的"操作命令"和"操作数地址",形成操作信号控制序列,控制运算器、存储器以及I/O设备完成相应的操作。
- 中断处理:管理总线及输入输出,处理异常情况和特殊请求
3、运算器的基本结构
算术逻辑单元:进行算术/逻辑运算
通用寄存器组:如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址
累加寄存器:它是一个通用寄存器,用于暂时存放ALU运算的结果信息,用于实现加法运算
暂存寄存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容
程序状态字寄存器:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志 (SF)、零标志(ZF)、进位标志(CF) 等。PSW中的这些位参与并决定微操作的形成
移位器:对运算结果进行移位运算
计数器:控制乘除运算的操作步数
4、数据通路基本结构
1)专用数据通路方式
根据指令执行过程中的数据和地址的流动方向安排连找线路。
如果直接用导线连接,相当于多个寄存器同时并且一直向ALU传输数据
解决方法:
1、使用多路选择器根据控制信号选择一路输出
2、使用三态门,可以控制每一路是否输出
2)CPU内部单总线方式
将所有寄存器的输入端和输出端都连接到一条公共的通路上。
5、控制器的基本结构
- 程序计数器:用于指出下一条指令在主存中的存放 地址。CPU就是根据PC的内容去主存中取指令的。因 程序中指令(通常)是顺序执行的,所以PC有自增功能。
- 指令寄存器:用于保存当前正在执行的那条指令。
- 指令译码器:仅对操作码字段进行译码,向控制器 提供特定的操作信号。
- 微操作信号发生器:根据IR的内容(指令)、PSW 的内容(状态信息)及时序信号,产生控制整个计算 机系统所需的各种控制信号,其结构有组合逻辑型和 存储逻辑型两种。
- 时序系统:用于产生各种时序信号,它们都是由统 一时钟(CLOCK)分频得到。
- 存储器地址寄存器:用于存放所要访问的主存单元 的地址。
- 存储器数据寄存器:用于存放向主存写入的信息或 从主存中读出的信息。
用户可见的寄存器
- PC:
JMP
- PSW:CMP比较指令
- ACC:加法乘法
- 通用寄存器
6、总结
CPU => ALU(算术逻辑单元) + 寄存器 + 中断系统 + CU(控制单元 )
二、指令执行过程
1、指令周期
指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。
指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。
一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期,它是CPU操作的最基本单位)。
每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。
2、标志触发器
区分指令周期运行的阶段
四个工作周期都有CPU访存操作,只是访存的目的不同:
- 取指周期是为了取指令
- 间址周期是为了取有效地址
- 执行周期是为了取操作数
- 中断周期是为了保存程序断点
3、指令周期的数据流
1)取指周期
指令寄存器(IR):用于暂存当前正在执行的指令。
- 当前指令地址送至存储器地址寄存器, 记做:
(PC) → MAR
- CU发出控制信号,经控制总线传到主 存,这里是读信号,记做:
1 → R
- 将MAR所指主存中的内容经数据总线 送入MDR,记做:
M(MAR) → MDR
- 将MDR中的内容(此时是指令)送入IR, 记做:
(MDR) → IR
- CU发出控制信号,形成下一条指令地 址,记做:
(PC)+"1" → PC
2)间址周期
- 将指令的地址码送入MAR, 记做:
Ad(IR) → MAR
或Ad(MDR) → MAR
- CU发出控制信号,启动主存做读操作, 记做:
1 → R
- 将MAR所指主存中的内容经数据总线送入MDR,记做:
M(MAR) → MDR
- 将有效地址送至指令的地址码字段, 记做:
(MDR)→ Ad(IR)
3)执行周期
执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。
4)中断周期
中断:暂停当前任务去完成其他任务。 为了能够恢复当前任务,需要保存断点。 一般使用堆栈来保存断点。(这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操 作是先修改指针,后存入数据。)
- CU控制将SP减1,修改后的地址送入MAR。记作:
(SP)-1 → SP
,(SP) → MAR
(本质上是将断点存入某个存储单元,假设其地址为a,故可记做:a → MAR
) - CU发出控制信号,启动主存做写操作, 记做:
1 → W
- 将断点(PC内容) 送入MDR, 记做:
(PC) → MDR
- CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC, 记做:
向量地址→ PC
4、指令执行方案
1)单指令周期
对所有指令都选用相同的执行时间来完成 。
指令之间串行执行;指令周期取决于执行时间最 长的指令的执行时间。对于那些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的 运行速度。
2)多指令周期
对不同类型的指令选用不同的执行步骤来完成。
指令之间串行执行,可选用不同个数的时钟周期 来完成不同指令的执行过程
需要更复杂的硬件设计。
3)流水线方案
在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。
指令之间并行执行。
5、总结
三、数据通路
1、数据通路功能和结构
数据通路:数据在功能部件之间传送的路径(信息从哪里开始、中间经过哪些部件、最后传到哪里)
由控制部件产生的控制信号建立数据通路
数据通路的基本结构:
- 内部单总线方式
- CPU内部多总线方式
- 专用数据通路方式
2、CPU内部多总线方式
1)寄存器之间数据传送
比如把PC内容送至MAR,实现传送操作的流程及控制信号为:
- (PC) -> Bus:PCout有效,PC内容送总线
- Bus -> MAR:MARin有效,总线内容送MAR
2)主存与CPU之间的数据传送
比如CPU从主存读取指令,实现传送操作的流程及控制信号为:
- (PC) -> Bus -> MAR:PCout和MARin有效,现行指令地址→MAR
- 1 -> R:CU发读命令(通过控制总线发出,图中未画出)
- MEM(MAR) -> MDR:MDRin有效
- MDR -> Bus -> IR:MDRout和IRin有效,现行指令→R
3)执行算术或逻辑运算
比如一条加法指令,微操作序列及控制信号为:
- Ad(IR) -> Bus -> MAR :MDRout和MARin有效
- 1 -> R:CU发读命令
- MEM(MAR) -> 数据线 -> MDR:MDRin有效
- MDR -> Bus -> Y :MDRout和Yin有效,操作数→Y
- (ACC) + (Y) -> Z :ACCout和ALUin有效,CU向ALU发送加命令
- Z -> ACC:Zout和ACCin有效,结果→ACC
3、专用数据通路
STA
:将数据从累加器复制到内存位置
LDA
:将数据从内存位置复制到累加器和
MOV
:在寄存器加寄存器和内存之间复制数据
4、总结
四、硬布线控制器
1、微指令
根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些"微命令"
- 一个节拍内可以并行完成多个“相容的” 微操作
- 同一个微操作可能在不同指令的不同阶段被使用
- 不同指令的执行周期所需节拍数各不相同。为了简化设计,选择定长的机器周期,以可能出现的最大节拍数为准(通常以访存所需节拍数作为参考)
- 若实际所需节拍数较少,可将微操作安排在机器周期末尾几个节拍上进行
2、控制单元CU
根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些“微命令”
3、硬布线控制器的设计
- 分析每个阶段的微操作序列(取值、间址、执行、中断 四个阶段)
- 选择CPU的控制方式
- 安排微操作时序
- 电路设计
- 列出操作时间表
- 写出微操作命令的最简表达式
- 画出逻辑图
4、安排微操作时序的原则
- 微操作的先后顺序不得随意更改
- 被控对象不同的微操作,尽量安排在一个节拍内完成
- 占用时间较短的微操作,尽量安排在 一个节拍内完成,并允许有先后顺序
5、画出逻辑图
五、微程序控制器
1、设计思路
采用“存储程序”的思想,CPU出厂前将所有指令的“微程序”存入“控制器存储器”中
程序:由指令序列组成
微程序:由微指令序列组成,每一种指令对应一个微程序
指令:对程序执行步骤的描述(指令是对微指令功能的“封装”)
微指令:对指令执行步骤的描述
微命令与微操作一一对应,微指令中可能包含多个微命令
微指令基本格式 = 操作控制 + 顺序控制(指明下一条微指令的地址)
2、基本结构
微地址形成部件:产生初始微地址和后继微地址,以保证微指令的连续执行
CMAR:别名μPC,微地址寄存器,接收微地址形成部件送来的微地址,为在CM中读取微指令作准备
地址译码:将地址码转化为存储单元控制信号
控制存储器CM:用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成
CMDR:别名μIR,用于存放从CM中取出的微指令(它的位数同微指令字长相等)
3、微指令的格式
1)水平型微指令
一条微指令能定义多个可并行的微命令。
格式:操作控制 + 顺序控制
优点:微程序短,执行速度快
缺点:微指令长,编写微程序较麻烦
2)垂直型微指令
一条微指令只能定义一个微命令,由微操作码字段规定具体功能
格式:微操作码(µOP) + 目的地址(Rd)+ 源地址(Rs)
优点:微指令短、简单、规整,便于编写微程序
缺点:微程序长,执行速度慢,工作效率低
3)混合型微指令
在垂直型的基础上增加一些不太复杂的并行操作。
微指令较短,仍便于编写;微程序也不长,执行速度加快。
相容性微命令:可以并行完成的微命令。
互斥性微命令:不允许并行完成的微命令。
4、微指令的编码方式
1)直接编码(直接控制)
在微指令的操作控制字段中,每一位代表一个微操作命令
某位为 “1” 表示该控制信号有效
优点:简单、直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大。
2)字段直接编码
将微指令的控制字段分成若干 “段”,每段经译码后发出控制信号
微命令字段分段的原则:
- 互斥性微命令分在同一段内,相容性微命令分在不同段内。
- 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间。
- 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作。
优点:可以缩短微指令字长 。
缺点:要通过译码电路后再发出微命令,因此比直接编码方式慢 。
3)字段间接编码
一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码。
优点:可进一步缩短微指令字长。
缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段。
5、微指令的地址形成方式
- 微指令的下地址字段指出(断定方式):微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址。
- 根据机器指令的操作码形成:当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。
- 增量计数器法:(CMAR)+ 1 -> CMAR
- 分支转移
- 转移方式:指明判别条件
- 转移地址:指明转移成功后的去向
- 格式:操作控制字段 + 转移方式 + 转移地址
- 通过测试网络
- 由硬件产生微程序入口地址
- 第一条微指令地址:由专门硬件产生(用专门的硬件记录取指周期微程序首地址)
- 中断周期:由硬件产生中断周期微程序首地址(用专门的硬件记录)
6、微程序控制单元的设计
- 分析每个阶段的微操作序列
- 写出对应机器指令的微操作命令及节拍安排
- 写出每个周期所需要的微操作(参照硬布线)
- 补充微程序控制器特有的微操作:
- 取指周期:
- Ad ( CMDR ) -> CMAR
- OP ( IR ) -> CMAR
- 执行周期:
- Ad(CMDR) -> CMAR
- 取指周期:
- 确定微指令格式
- 根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。
- 根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数。
- 最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长。
- 编写微指令码点:根据操作控制字段每一位代表的微操作命令,编写每一条微指令的码点。
7、微程序设计分类
1)静态和动态微程序设计
静态 :微程序无需改变,采用 ROM
动态 :通过改变微指令和微程序改变机器指令,有利于仿真,采用 EPROM
2)毫微程序设计
微程序设计:用微程序解释机器指令
毫微程序设计:用毫微程序解释微程序
毫微指令与微指令 的关系好比 微指令与机器指令 的关系
8、微程序控制器与硬布线控制器区别
六、命令流水线
1、命令执行方式
设取指、分析、执行3个阶段的时间都相等,用t表示 ,按以下几种执行方式分析n条指令的执行时间
1)顺序执行方式
总耗时T = n×3t = 3nt
优点:控制简单,硬件代价小。
缺点:执行指令的速度较慢,在任何时刻,处理机中只有
一条指令在执行,各功能部件的利用率很低。
2)一次重叠执行方式
总耗时T = 3t + (n-1)×2t = (1+2n)t
优点:程序的执行时间缩短了1/3,各功能部件的利用率明显提高。
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了。
3)二次重叠执行方式
总耗时T = 3t + (n-1)×t = (2+n)t
与顺序执行方式相比,指令的执行时间缩短近2/3。这是一种理想的指令执行方式,在正常情况下,处理机中同时有3条指令在执行
可以把每条指令的执行过程分成4个或5个阶段,分成5个阶段是比较常见的做法
2、流水线的表示方法
1)流水线的表示方法
主要用于分析指令执行过程以及影响流水线的因素
2)时空图
主要用于分析流水线的性能
3、性能指标
1)吞吐率TP
吞吐率:指在单位时间内流水线所完成的任务数量,或是输出结果的数量。
一条指令的执行分为k个阶段,每个阶段耗时$Δ_t$ ,一般取$Δ_t$ = 一个时钟周期
设任务数为 n,处理完成n个任务所用的时间为 $T_K$,则计算流水线吞吐率(TP)的最基本的公式为 $TP = n/{T_k}$
当连续输入的任务n→∞时,得最大吞吐率为$TP_{max}=1/Δ_t$
$T_K=(k+n-1)Δ_t$
流水线的实际吞吐率为:$n/(k+n-1)Δ_t$
2)加速比S
加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比
设$T_0$表示不使用流水线时的执行时间,即顺序执行所用的时间,表$T_k$示使用流水线时的执行时间
则计算流水线加速比(S)的基本公式为 $S=T_0/T_k$
当连续输入的任务n→∞时,最大加速比为$S_{max}=k$
单独完成一个任务耗时为$kΔ_t$,则顺序完成n个任务耗时$T_0=nkΔ_t$
使用流水线加速比:$T_0=(k+n-1)kΔ_t$
实际加速比为:$S=kn/(k+n-1)$
3)效率E
流水线的设备利用率称为流水线的效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。
则流水线效率(E)的一般公式为:$E=T_0/kT_K$
当连续输入的任务n→∞时,最高效率为$E_{max}=1$
4、机器周期的设置
流水线每一个功能段部件后面都要有一个缓冲寄存器,或称为锁存器。作用是保存本流水段的执行结果,提供给下一流水段用。
5、影响流水线的因素
1)结构相关(资源冲突)
由于多条指令在同一时刻争用同一资源而形成的冲突称为结构相关
解决办法:
- 后一相关指令暂停一周期
- 资源重复配置:数据存储器+指令存储器
2)数据相关(数据冲突)
数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关。
解决办法:
- 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。可分为硬件阻塞(stall)和软件插入“NOP”两种方法
- 数据旁路技术
- 编译优化:通过编译器调整指令顺序来解决数据相关
3)控制相关(控制冲突)
当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关。
解决办法:
- 尽早判别转移是否发生,尽早生成转移目标地址
- 预取转移成功和不成功两个控制流方向上的目标指令
- 加快和提前形成条件码
- 提高转移方向的猜准率
4)总结
6、流水线的分类
1)流水线使用的级别
部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程。
处理机级流水是把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回5个子过程。
处理机间流水是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。
2)流水线可以完成的功能
单功能流水线指只能实现一种固定的专门功能的流水线
多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。
3)各段之间的连接方式
静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。
4)功能段之间是否有反馈信号
线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。
非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。
7、流水线的多发技术
1)超标量技术
每个时钟周期内可 并发多条独立指令
不能调整 指令的 执行顺序
要配置多个功能部件
通过编译优化技术,把可并行执行的指令搭配起来
2)超流水技术
在 一个时钟周期 内 再分段 ( 3 段)
不能调整指令的执行顺序
在一个时钟周期内一个功能部件使用多次( 3 次)
靠编译程序解决优化问题
3)超长指令字
由编译程序挖掘出指令间潜在的并行性, 将多条能并行操作的指令组合成 一条
具有多个操作码字段的超长指令字(可达几百位)
采用多个处理部件
七、五段式指令流水线
1、概述
- IF取指
- ID译码&取数
- EX 执行
- M访存
- WB写回寄存器
只有上一条指令进入ID段后,下一条指令才能开始IF段,否则会覆盖IF段锁存器的内容
2、执行过程
1)运算类指令
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:取出操作数至ID段锁存器
EX:运算,将结果存入EX段锁存器
M:空段
WB:将运算结果写回指定寄存器
运算类指令 | 指令的汇编格式 | 功能 |
---|---|---|
加法指令(两个寄存器相加) | ADD Rs,Rd | (Rs)+(Rd) -> Rd |
加法指令(寄存器与立即数相加) | ADD #996,Rd | 996+(Rd) -> Rd |
算数左移指令 | SHL Rd | (Rd)<<<2 -> Rd |
Rs指源操作数(source)
Rd指目的操作数(destination)
2)LOAD指令
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm
EX:运算,得到有效地址
M:从数据Cache中取数并放入锁存器
WB:将取出的数写回寄存器
通常,RISC处理器只有“取数LOAD”和“存数STORE”指令才能访问主存
指令 | 功能 |
---|---|
LOAD Rd,996(Rs) | (996+(Rs)) -> Rd |
3)STORE指令
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm。将要存的数放到B
EX:运算,得到有效地址。并将锁存器B的内容放到锁存器 Store。
M:写入数据Cache
WB:空段
指令 | 功能 |
---|---|
STORE Rs,996(Rd) | Rs -> (996+(Rd)) |
4)条件转移指令
转移类指令常采用相对寻址
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:进行比较的两个数放入锁存器A、B;偏移量放入 Imm
EX:运算,比较两个数
M:将目标PC值写回PC(左图没画全)
WB:空段
指令 | 功能 |
---|---|
beq Rs, Rt, #偏移量 | 若(Rs)==(Rt),则(PC)+指令字长+(偏移量×指令字长) -> PC;否则(PC)+指令字长 -> PC |
bne Rs, Rt, #偏移量 | 若(Rs)!=(Rt),则(PC)+指令字长+(偏移量×指令字长) -> PC;否则(PC)+指令字长 -> PC |
5)无条件转移指令
转移类指令常采用相对寻址
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:偏移量放入 Imm
EX:将目标PC值写回PC
M:空段
WB:空段
指令 | 功能 |
---|---|
jmp #偏移量 | (PC)+指令字长+(偏移量×指令字长) -> PC |
"WrPC段"耗时比EX段更短,可安排在EX段时间内完成。WrPC段越早完成,就越能避免控制冲突。当然,也有的地方会在WB段时间内才修改PC的值