第五章 中央处理器
5.1 CPU功能和组成
5.1.1 CPU的基本功能
CPU主要包括了运算器和控制器两大部分,运算器的功能实现第二章已经学过了,这里我们中点讨论一下控制器的内容。
当一条指令进入CPU的时候,控制器的基本功能一般分为三部分
-
取指令
自动从存储器中取出要执行的指令,并且准备下一条指令的地址
-
分析指令
获取操作码和操作数的有效地址
-
执行指令
根据操作码来对相应的设备发出命令,产生操作控制信号序列。
综合上面,CPU必须具有控制程序顺序执行(指令控制)、产生完成每条指令所需的控制命令(操作控制)、对各种操作加以时间上的控制(时间控制)、对数据进行算数和逻辑运算(数据加工)以及处理中断的能力。
5.1.2 CPU的基本组成
我们可以看到CPU主要部件控制器和运算器结构。这里我们需要牢记运算器和控制器中的一些寄存器及其功能,如DR、PSW、AR、PC等等。
5.1.3 CPU中主要的寄存器
DR缓冲寄存器
我们在图中可以看到DR的数据来源有两个,一个是ALU的运算结果,一个是从cache中取出的数据。所以DR通常是存放指令的操作数或者运算结果,并将其传送到通用寄存器。其主要功能为
- 缓冲ALU和通用寄存器之间传送的信息
- 补偿CPU和内存、外设之间的操作速度
IR指令寄存器
IR保存着当前执行的一条指令。当要执行一条指令时,先从指令cache中将其读出,再传送到IR中
PC程序计数器
存放下一条指令的地址,别忘了它会自动+1
AR数据地址寄存器
保存CPU当前访问的数据单元(cache、主存)的地址。从数据流向可以看出来,主要是存放要写入cache数据的地址。
PSW状态字寄存器
主要存放一些条件码,如算数运算产生进位、溢出、零标识时或者作为分支运算的标志
通用寄存器
通用寄存器功能很多,主要有
- 存放操作数
- 满足某种寻址方式的寄存器(基址、变址寄存器,栈指针)
MAR存储器地址寄存器
存放将被访问存储单元的地址
MDR存储器数据寄存器
存放从存储器读出或要写入存储器的数据
这些寄存器和上面的图片,大家要牢记他们的数据流通和功能,考试会经常出现。
5.1.4 操作控制器和时序产生器
这里介绍几个控制器中的名词概念
数据通路:寄存器间传送信息的通路称为数据通路
操作控制器:根据指令操作码和时序信号,产生各种操作控制信号,以便正确地选择数据通路,把有关数据打入到一个寄存器,从而完成取指令和执行指令的控制。
操作控制器用分为硬布线控制器和微程序控制器
硬布线控制器
- 采用时序逻辑技术,通过硬件设计的方式实现操作控制
- 优点是速度快、但设计较为复杂,难以调试、维修
微程序控制器(主流)
- 采用存储逻辑,即将操作信号转化为一段微程序(代码)并存入一个专门的存储器中。
- 速度比较慢,因为增加了一级信号转化微程序的流程。但是便于设计、调试。
5.2 指令周期
5.2.1 指令周期的基本概念
指令周期:取指令、分析指令到执行完该指令所需的全部时间。
机器周期(CPU周期):通常我们将指令周期划分为若干个机器周期,每个机器周期完成一个基本操作(如取值、执行等)。不同的指令机器周期的数目不同
时钟周期:通常为节拍脉冲或T周期,即主频的倒数,它是CPU中最小的时间单位,每个动作至少需要一个时钟周期。
间址周期:其实就是分析指令的过程,取操作数的有效地址
RR型指令:寄存器——寄存器指令,即从寄存器中取操作数
RS型指令:寄存器——存储器指令,即从存储器中取操作数
5.2.2典型指令的指令周期
假设CPU中有存储器地址寄存器MAR、存储器数据寄存器MDR、程序计数器PC和指令寄存器IR,接下来我们分析三个周期的数据流通情况
取址周期的数据流
首先PC寄存器中存放当前要执行指令的地址,该地址被送到MAR(存放的是地址)中并送至地址总线。控制部件CU向存储器发出读命令,读出MAR所指单元的内容,经数据总线传送到MDR中,再送至IR,这样就读出了一条在存储器中的指令了。之后CU控制PC+1,形成下一条的地址。
间址周期的数据流
取指周期结束后,将IR或MDR中的操作数的地址(这里IR和MDR本来保存的是指令,指令分为操作码和操作数部分)传入到MAR中。然后在CU的控制下,通过地址总线读出存储器中的操作数,然后经数据总线传回到MDR中。
执行周期的数据流
不同指令的执行周期是不同的,需要自己分析。。。。
总结
- MAR是存放数据或指令地址的
- MDR是存放数据或指令的
- 数据总线和地址总线作为CPU与存储器数据传送的桥梁,当然是在CU的控制下!
5.3 时序产生器和控制方式
5.4 微程序控制器
5.4.1 基本思想
微程序设计技术把操作控制信号编成所谓的“微指令”(一段代码),存放到一个只读存储器里。当机器运行时一条又—条地读出这些“微指令”,从而产生各种操作控制信号(微命令,即向执行部件发出的控制信号),使相应部件执行所规定的操作(微操作,即控制部件要执行的操作)。
从上面的文字中我们可以得到以下信息:
- 一条微指令对应多条微命令
- 一条微命令对应一个微操作
由于数据通路的结构关系,微操作可以分为两类
- 相容性微操作:在一个机器周期内可以并行执行
- 相斥性微操作:不能在同一个机器周期内并行执行
5.4.2 微指令和微程序
微指令
在一个机器周期中,一组实现操作功能的微命令的组合构成一条微命令
微指令的操作控制部分决定给出的微命令,顺序控制部分决定下一条微指令的地址,由两个P测试字段和直接地址组成。若P测试字段全为0,直接地址则给出下一条微指令的地址;否则修改直接地址,并作为下一条微指令的地址
微指令中如果操作控制字段的某一位的信息为“1”时,表示发出微命令,为“0”时,表示不发出微命令。
假设某条微指令的二进制编码为100 110 000 100 00000 ,则完成的操作是R1->X 、R3->Y、 +、 LDR1
运算器完成了R1+R3->R1的操作。
我们可以看到是LDR1的指令靠前,那为什么它却最后执行呢?因为微命令受到时序信号T1,T2,T3,T4的控制
微程序
一条机器指令的功能是用许多条微指令组成的序列来实现的,这个微指令序列通常叫做微程序。
5.4.3 微程序控制器的结构
微程序控制器主要由控制存储器、微地址寄存器、微命令寄存器和地址转移逻辑构成。
控制存储器:是一种只读存储器,因为里面存放着指令系统的微程序,不可能被用户修改。
微地址寄存器:存放微指令的直接地址,决定要读取的下一条地址
微命令寄存器:保存微指令中操作字段和判别测试字段(P字段)的信息
地址逻辑转移:负责完成当P字段不全为0时修改微地址寄存器的任务
5.4.4 机器指令、微指令、微操作的关系
- 一条机器指令对应一个微程序,这个微程序是由若干条微指令序列组成的。因此,一条机器指令的功能是由若干条微指令组成的序列来实现的。
- 从指令与微指令,程序与微程序,地址与微地址的一一对应关系来看,前者与内存储器有关,后者与控制存储器有关。
- 每一个机器周期就对应一条微指令。
下图是微程序控制器的整个流程
首先从PC中取出当前执行指令的地址,经过MAR-数据总线-指令cache-数据总线-MDR-IR的译码过程保存到了IR中。然后通过地址转换逻辑将机器指令转换为一条条微指令的地址,通过控制存储器得到微程序(微指令序列),通过微命令寄存器发出微命令信号,判断测试字段来决定下一条微指令的地址。
5.4.5 微程序设计技术
微指令编码
-
直接表示法
特点是微指令的操作控制字段中每一位代表一个微命令。这种方式有点事简单直观,输出直接用于控制。但每一条微指令需要存放所有微命令的位,所以微指令字较长,占用较大的控制存储器容量。
-
编码表示法
这种方式是将一组互斥的微命令信号组成一个字段,字段间的微命令是相容的。然后字段译码器对每一个微命令信号进行译码,译码的输出作为操作控制信号。
由于每个字段内的都是互斥的微命令,但字段间的微命令可以同时执行。所以假设我们分成了P个字段,那么可以同时从P个字段中取出P个微命令并行执行。这样我们只需要保存字段的二进制译码即可。
举个例子:假设指令系统中由128个微命令,那么直接表示法就需要128位字的微指令。编码表示法假如分为8个字段,每个字段有16个微命令需要4个二进制( 2 4 = 16 2^4=16 24=16)表示,那么就需要32位字的微指令,很明显缩短了很多。缺点就是执行速度比较慢,因为多了一个译码的流程嘛。(实际中字段长度为4位,最多只能表示七个互斥的微命令,因为默认将0000表示不操作)
-
混合表示法
就是将上面两种表示法混合使用。
微地址的形成方式
-
多路转移方式
在微指令顺序执行的时候,后续微指令的地址由顺序控制字段的直接地址给出;出现分支转移时,由顺序控制字段的判别测试位来选择跳转的微地址。如果状态信息位有n位就可以实现微程序2n路转移。
举个栗子:假设我们P判别位有1位,那么0对应一路,1对应一路;有2位则00,01,10,11共对应四路······
-
计数器方式
这种方法同用程序计数器来产生机器指令地址的方法相类似。微地址寄存器通常作为计数器,在顺序执行微指令的时候,后续微指令地址由现行微地址加一产生。为此顺序执行的微指令必须安排在控制存储器的连续单元中。
微指令格式
-
水平型微指令
一次能定义并执行多个微操作命令的微指令。也就同上面我的提到的:操作控制字段某位为“1”,表示发出该微命令,为“0”则表示不发出该命令。特点是:
- 多个微操作并发执行,效率高
- 可以用较小的微指令来完成一条机器指令
- 字长较长,不易理解
一条微程序使用多条微指令堆叠而成,每条水平型微指令较长,但微指令的数量较少,所以微程序呈矮胖的形状。
-
垂直型微指令
微指令中设置微操作码字段,对微操作码进行译码来产生相应的微命令。一条微指令译码产生一个或者几个微命令,这种微指令称为垂直型微指令。垂直型微指令的结构类似于机器指令的结构。
有微操作码,操作数的地址,如同机器指令的操作码和操作数一般。这个微操作码经过译码得出的是微指令,
- 一般只能完成一个微操作,并行能力差
- 要经过译码,速度较慢
- 指令字较短,容易理解
垂直型微命令完成的操作较少,字长较短,在与水平型微指令执行相同操作的前提下,微指令数量较多,所以微程序呈高瘦的形状。
5.5 硬布线控制器
5.5.1 基本思想
硬布线控制器是早期设计控制器的一种方法。这种方法是把控制部件看作为产生时序控制信号的逻辑电路,这种逻辑电路是一种由门电路和触发器构成的复杂树形逻辑网络,故称之为硬布线控制器。
由于硬布线控制器采用逻辑电路来实现,一旦控制部件构成后,除非重新设计和物理上对它重新布线,否则要想增加新的控制功能是不可能的。因此在现代的控制器的设计中已经很少使用。
与微程序控制相比,硬布线控制的速度较快。原因是微程序控制中每条微指令都要从控制存储器中读取一次,影响了速度,而硬布线控制主要取决于电路延迟。
5.5.2 基本结构
上图的树形逻辑网络实际上就是一个硬布线控制器,也就是对应的CU,其信号来源如下:
- 经指令译码器译码产生的指令信息
- 时序系统产生的机器周期信号和节拍信号(节拍电位)
- 结果反馈信息(溢出、进位)
注意:控制单元还接受来自控制总线的控制信号,如中断请求、DMA请求
实际上硬布线控制器设计的核心思想类似于——“到什么时间干什么事”。因为一条指令的执行有严格的时序逻辑,所以在设计电路的时候,我们需要将节拍电位也作为输入端。
5.5.3 硬布线控制器设计
主要是要列出微操作时间表和写出微操作的逻辑表达式,跟数电一样的。PPT和书上都很详细,这部分看书就好了。虽然这部分内容很抽象,但考试不会让你自己设计和画电路的,不用紧张。
5.5.4 CPU的控制方式
确定CPU的控制方式也就是确定一个指令周期中有几个机器周期,有几个时钟周期;同步还是异步;固定字长还是可变字长。
-
同步控制方式
系统有一个统一的时钟,所有控制信号均来自这一个统一的时钟信号。优点是控制电路简单,缺点是运行速度慢
-
异步控制方式
不存在统一基准的时标信号,各部件按自己的速度工作。优点是运行速度快,缺点是电路复杂
-
联合控制方式
大部分微操作采用同步控制,小部分采用异步控制
5.5.5 硬布线与微程序控制器的对比
硬布线特点:
- 控制器的速度取决于电路延迟,速度快
- 设计完成后不方便修改
- 多应用与RISC
微程序特点:
- 规整性、灵活性、可维护性
- 执行每条指令都需要从控制存储器中读取微命令,速度较慢
- 多应用与CISC
5.6 指令流水线
5.6.1 指令流水线的概念
一条指令的执行可以分解为多个阶段,每个阶段由相应的功能部件完成。所以当一条指令执行完取指部分时,我们可以让下一条指令开始执行取指,防止取指的功能部件空闲。就好比你用洗衣机洗衣服,当你洗完一堆衣服后拿去烘干机,你肯定是让洗衣机洗另一堆衣服,而不会傻傻地等着第一堆衣服烘干后再洗吧······
5.6.2 流水CPU的时空图
设一条指令包含4个子过程:取指令(IF)、指令译码(ID)、执行指令(EX)、结果回写(WB)。下面表述了非流水时空图和流水时空图。
很明显,指令流水线可以大幅度提高CPU的利用率,实现了时间上的并行。
时间并行:我只有一个CPU,但我有多个任务,所以我只能让一个CPU轮流去执行这些任务,即时间片轮转。
空间并行:我有多个CPU,我也有多个任务,就可以让一个CPU执行一个任务啦
为了利于实现流水线技术,指令集应该有如下特征:
- 指令长度尽量一致
- 指令格式尽量规整
- 采用Load/Store指令
- 数据和指令在存储器中对其存放
假设每条指令需要4个时间单位执行完毕,如果有N条指令:
-
在非流水CPU中,N条指令执行完毕需要时间 t = N ∗ 4 t=N*4 t=N∗4。
-
在流水CPU中,N条指令执行完毕需要时间 t = 4 + ( N − 1 ) t=4+(N-1) t=4+(N−1)。
超标量流水线—Superscalar
具有两条以上的指令流水线,当流水线满载时每一个时钟周期可以执行两条以上的指令。
5.6.3 流水线的分类
-
算术流水线(部件功能级)
例如,可将浮点加法操作分成求阶差、对阶、尾数相加及结果规格化等。
-
指令流水线(处理机级)
将指令解释过程分为取指、译码、执行、访存和写回等。
-
宏流水线
每个处理机完成某一个专门任务。
5.6.4 流水线的冒险
在指令流水线中可能会遇到一些问题导致流水线无法正确执行后续指令而引起流水线阻塞或停顿,这种现象称为流水线冒险。主要有结构冒险(资源冲突)、数据冒险(数据冒险)、控制冒险(控制冲突)
结构冒险
举个例子,薄膜键盘大家可能听说过,这个键盘的多个按键会共用一根地址线,这就会导致"锁键"——当你同时按下两个键时,一根地址线不知道该输送哪个键的地址,这就会导致两个按键都失灵。
回到流水线中,也就是当流水线中同时执行到两个需要访存的指令时,地址总线不知道该输送哪个指令的地址。
数据冒险
- 写后读:确保读取数据在修改数据之后进行
- 读后写:确保修改数据在读取数据之后进行
- 写后写:确保当前的数据是最新修改的数据
控制相关
在执行转移指令中,因为不同的条件结果会导致不同的指令运行,从而导致流水线发生断流
-
延迟转移法
这种方法就是不管判断结果,接着转移指令往下执行。如果转移完应该继续往下执行,那么就赚了;否则需要将执行的结果丢弃
-
转移预测法
这是一个玄学,利用硬件方法记录指令过去的转移偏好,来预测当前的转移结果。
5.6.5 流水线的性能指标
吞吐率
吞吐率就是单位时间内完成的任务数,实际上只需要用一段时间内完成的任务书除以这一段时间即可。
设我们有n个任务,k级流水线(就是流水线有k个处理部件),t为时钟周期,则流水线的实际吞吐率为:
T
P
=
n
(
k
+
n
−
1
)
t
TP={\frac n {(k+n-1)t}}
TP=(k+n−1)tn
加速比
加速比就是让没有使用流水线的时间比上使用流水线的时间。参数继承自上面,则有:
S
=
k
n
t
(
k
+
n
−
1
)
t
=
k
n
k
+
n
−
1
S = {\frac {knt} {(k+n-1)t}} ={\frac {kn}{k+n-1}}
S=(k+n−1)tknt=k+n−1kn
总结
- CPU分为运算器和控制器。运算器负责算术逻辑运算。控制器则进行指令控制、操作控制、时间控制和中断处理
- 指令周期是指CPU取出并执行一条指令所需要的全部时间;机器周期是CPU执行指令周期一步相对完整的操作,比如取指、执行周期;时钟周期是计算机最基本的时序单位,是一个微操作的执行时间
- 微程序是微指令序列的集合,微指令是微命令序列的集合,而微命令负责控制部件进行微操作。在CPU中,一条指令对应一个微程序;一个微程序对应多个微指令;一个微指令对应多个微命令;一个微命令对应一个微操作
- 硬布线控制器设计主要是由机器信号和节拍信号、标志位、指令信息决定
- 流水线是将指令执行的过程分为多个子过程,让CPU同一时间执行多条指令。计算吞吐率和加速比