计算机组成原理——CPU数据通路与控制器
数据通路
概念
数据通路,即数据在功能部件之间的传输路径。
数据通路基本结构可分为三种:
- CPU内部单总线方式
- CPU内部多总线方式
- 专用数据通路
数据的流动在之前的文章说过可以分为三类:
- 寄存器与寄存器之间的流动
- 寄存器与主存之间的流动
- 寄存器与ALU之间的流动
内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线。
系统总线是指同一台计算机系统各部件连接的总线,如CPU、内存、通道和各类IO接口之间互相连接的总线。
CPU内部单总线方式
寄存器之间的数据传送,比如把PC的内容送至MAR,实现传送操作的流程及控制信号为:
- PCout有效,PC内容送至总线。
$$ (PC) \to Bus $$
- MARin有效,总线内容送MAR。
$$ Bus\to MAR $$
主存与CPU之间的数据传送,比如CPU从主存读取指令,实现传送操作的流程及控制信号为:
- PCout和MARin有效
$$ (PC)\to Bus \to MAR $$
- CU发出读命令(通过控制总线发出)
$$ 1 \to R $$
- MARout有效,MAR通过地址线送往主存。然后MDRinE有效,主存将指定位置的数据通过数据线送往MDR。(注意,MDRinE表示外部的输入控制信号,MDRin为CPU内部总线输入MDR的控制信号)
$$ MEM(MAR)\to MDR $$
- MDRout与IRin有效
$$ MDR \to Bus \to IR $$
执行算术运算或逻辑运算的时候,数据是流行ALU的,比如执行一条加法指令,微操作序列以及控制信号为:
- MDRout和MARin有效,或者AdIRout和MARin有效
$$ Ad(IR)\to Bus \to MAR $$
- CU发出读命令
$$ 1 \to R $$
- MARout,MDRinE有效
$$ MEM(MAR) \to dataBus \to MDR $$
- 将操作数放到暂存寄存器Y中,MDRout和Yin有效
$$ MDR \to Bus \to Y $$
- ACCout和ALUin有效,CU向ALU发送加命令
$$ (ACC) + (Y) \to Z $$
- 将运算结果送回ACC,Zout和ACCin有效
$$ Z \to ACC $$
- 采用内部单总线的方式,需要将结果暂存到通用寄存器,而内部双总线就不会。
专用数据通路
如图所示,$C_i$表示相应元件的控制信号。
我们来看取指周期:
- $C_0$有效
$$ PC \to MAR $$
- $C_1$有效
$$ (MAR) \to Memory $$
- CU发出读命令
$$ 1\to R $$
- $C_2$有效,将数据送给MDR
$$ M(MAR)\to MDR $$
- 将MDR中的内容送给MDR,令$C_3$有效,PC加1
$$ (MDR) \to IR, \space (PC) + 1 \to PC $$
- IR将指令送给CU进行译码,$C_4$有效
$$ Op(IR) \to CU $$
控制器
硬布线控制器
硬布线控制器是将控制部件做成产生专门固定时序控制信号的逻辑电路,微操作控制信号由组合逻辑电路根据当前指令码、状态、时序即时产生。(时序信息包含机器周期、节拍)
这种方式需要把微操作控制信号需要哪些条件用逻辑表达式写出来,再根据逻辑表达式进行电路设计,是纯硬件思想设计的。
微程序控制器
微程序控制器是通过软件的思路来设计的。程序本质上是由指令序列组成的,某一条指令的执行又会被分为一些列微操作,由微操作序列完成一条指令的功能。因此微程序控制器模仿指令执行的方式来处理微操作序列。
我们可以把同一个时序内的微操作用一个微指令来指明,如微指令a会导致微操作1、2的完成,微指令b会导致微操作3的完成。微程序由一系列微指令组成,每一种指令对应一个微程序。
机器指令是对程序执行步骤的描述,微指令是对指令执行步骤的描述。微命令与微操作一一对应,微命令强调是要发出哪一个控制信号,而微操作是接到控制信号后进行的操作,微指令中包含多个微命令。
微程序控制器的结构如下:
- 控制存储器CM:用于存放各指令对应的微程序,CM可用只读存储器ROM构成。每一条指令对应的微程序或者说微指令序列,在一开始由CPU厂商写好。
- CMAR:别名$\mu PC$,微地址寄存器接收微地址形成部件送来的微地址,在CM中读取微指令作准备。
- 地址译码器:将地址码转换为存储单元控制信号。
- CMDR:别名$\mu IR$,用于存放从CM中取出的微指令,它的位数同微指令字长相等。
- 微地址形成部件:产生初始微地址,以保证微指令的连续执行。
- 顺序逻辑电路:用于控制微指令执行顺序,例如在有中断发生和没有中断发生的时候微指令执行顺序可能不一样。
执行一条微指令的流程如下图所示,IR将操作码送往CU的微地址形成部件,微地址形成部件产生微地址,然后送往顺序逻辑电路,顺序逻辑电路根据标志位来判断是否存在间址,如果是间址则接下来执行间址对应的微指令,如果不是则会进入执行周期的微指令,CMAR接收微地址,然后进行地址译码,转换成CM中存放微指令的地址,CMDR会取出CM的微指令,输出相应的控制信号,然后根据下地址执行下一条微指令。
所有的指令的取指周期、间址周期、中断周期所对应的微指令序列都是一样的,因此可以共享使用,只需要存一份即可;而执行周期微指令序列不同,单独存放对应的执行周期微程序。
上图中“转执行周期”意思是间址周期的最后一条微指令结束后跳转到执行周期对应的第一条微指令。“转取指周期”则是当前指令执行完毕,需要处理来自IR的下一条指令,执行下一条指令对应取指周期的第一条微指令。
我们来分析下LDA X
指令的流程:
- 取指周期阶段:执行#0、#1、#2的指令
- 顺序逻辑根据指令地址的寻址特征位来判断是否需要间接寻址,如果需要间接寻址那么执行的就是间址周期的微程序#3到#7,执行完毕后跳到执行周期的微程序#13到#15;如果不需要间接寻址,那么就直接跳到执行周期对应的微程序#13到#15。
- 是否会进入中断周期执行#8到#12则是根据顺序逻辑电路的CLK中断信号判断。
取指周期的微程序通常是公用的,也就是说某指令系统存在$n$条机器指令,则CM内中微程序段的个数至少是$(n+1)$个。这里并没有把间址周期和中断周期的微程序算进去,这是因为一些早期的CPU、物联网设备的CPU不提供间接寻址和中断功能,因此这类CPU可以不包含间址周期和中断周期的微程序段。
在某些书籍上,是将取指周期和执行周期看成一个整体,而不是看成两段微程序,因此“以一条指令对应一个微程序”的说法也是正确的。
微指令设计
原理
我们前面已经提到过微程序控制器的内部结构以及一条微指令的处理流程,但该发出什么样的控制信号,即如何根据微指令发出相应的微命令还没有说。
微命令与微操作一一对应,一个微命令对应一根输出线。比如这个信号控制$PC\to MAR$,只需要接到PCout和MARin的端口上即可。
另外有些微命令可以并行执行,因此一条微指令可以包含多个微命令。
微指令格式
首先来看两个概念。
- 相容性微命令:可以并行完成的微命令。
- 互斥性微命令:不允许并行完成的微命令。
微指令分为三种格式:水平型微指令、垂直型微指令、混合型微指令。
水平型微指令
水平型微指令一条微指令能定义多个可并行的微命令,其基本格式如下图所示:
这种格式的微指令对应的微程序通常指令条数较少,执行速度较快。但是微指令长(这也就是水平型名称的来源),编写程序较麻烦。
垂直型微指令
垂直型微指令一条微指令只能定义一个微命令,由微操作码字段规定具体功能。
垂直型微指令短、简单、规整,便于编写微程序,但是这就导致了微程序会变长,执行速度慢,工作效率低。
混合型微指令
混合型在垂直型微指令短基础上增加一系列不太复杂的并行操作。这种方案可以使微指令相对变短的同时,使微程序也变短,相对容易编写微程序,执行速度加快。
水平型微指令编码方式
微指令的编码方式又称为微指令的控制方式,它是如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长。
- 直接编码方式:在微指令的操作控制字段中,每一位代表一个微操作命令。
如图所示,假设第一位与最后一位分别对应$PC\to MAR$ 和 $1\to R$的控制信号,采用直接编码方式,直接用一根导线连接到相应的接口上,然后控制信号使这两位为1其它为0即可。
采用直接编码的方式简单、直观、执行速度快而且操作并行好,但是微指令字长过长,n个微命令要求微指令的操作控制字段有n位,所需CM容量就极大,而且导致CM占用芯片的面积变大。
- 字段直接编码方式:将微指令的控制字段分成若干段,每段经译码后发出控制信号。
微命令字段分段原则:
- 互斥性的微命令在同一段,相容性微命令在不同分段
- 每个小段包含信息位不能太多,否则会增加译码线路复杂性和译码时间。
- 一般每个小段要留出一个状态,表示本字段不发出任何微命令。因此当某字段长度为3位时,最多只能表示7个互斥的微命令。(通常
000
表示不操作)
这种方式可以缩短微指令字长,但是要通过译码电路后再发出,相对较慢。
- 字段间接编码方式:一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码。
这种方式进一步缩短了微指令字长,但是削弱了微指令并行控制能力,故常作为字段直接编码方式的一种辅助手段。
微指令地址形成方式
- 微指令的下地址字段指出:微指令格式中设置一个下地址字段,由微指令的下地址字段指出后继微指令的地址,这种方式又称为断定方式。
- 根据机器指令的操作码形成:当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。
- 增量计数法:$(CMAR) + 1 \to CMAR$
- 分支转移:如下图所示,转移方式指明判别条件,转移地址指明成功后的去向。
- 通过测试网络:顺序逻辑电路会根据标志信息,结合当前微指令的某些比特信息,指明接下来微指令存放地址。下图中的测试网络就是顺序逻辑的内部电路。
- 由硬件产生微程序入口地址:第一条微指令地址由专门硬件产生(用专门硬件记录取之周期微程序段的首地址)。中断周期由硬件产生中断周期微程序段首地址(用专门的硬件记录)。
微程序控制单元的设计
设计步骤
- 分析每个阶段的微操作序列
- 写出对应机器指令的微操作命令及节拍安排:写出每个周期所需要的微操作(参照硬布线控制器)。补充微程序控制器特有的微操作,即取指周期$Ad(CMDR)\to CMAR, \space OP(IR)\to CMAR$,执行周期$Ad(CMDR)\to CMAR$
- 确定微指令编码格式,根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数,根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数,最后按操作控制字段位数和顺序控制字段位数就可以确定微指令字长。
- 编写微指令编码,根据操作控制字段每一位代表的微操作指令,编写每一条微指令的码点。
硬布线控制器与微程序控制器节拍安排对比如下:
对于微程序控制器可以分为以下微指令,其中微指令a作为取指周期的第一条微指令由硬件产生。指令a执行完毕后,将下地址又放入CMAR,指令b也是同理,各消耗一个节拍。当微指令c结束后,还需要加一个节拍,来将微地址形成部件形成的地址放入CMAR,来确定下一阶段的首地址。
设计分类
- 静态微程序设计和动态微程序设计
静态微程序无需改变,采用ROM。而动态微程序设计通过改变微指令和微程序改变机器指令,有利于仿真,采用EPROM。
- 豪微程序设计
微程序设计的思想是用微程序解释机器指令,而豪微程序设计用豪微程序解释微程序。