目录
控制单元 CU 控制一条指令执行的过程,实质上就是发出控制信号、依次执行一个微操作序列的过程。很明显,不同的指令中包含的微操作数量不等,每个微操作的复杂程度也不同,所以每条指令的执行时间都是不同的。
在 CPU 内,可以通过时钟信号产生节拍,来控制每个微操作的执行。一个指令周期可以包含多个机器周期,每个机器周期又可以包含多个节拍,这样就构成了 多级时序系统。
控制不同的微操作序列,需要产生不同的时序控制信号。至于如何形成这些控制信号,可以采用不同的时序控制方式,这就被称为 CU 的 控制方式。
一、CU的控制方式
CU 的控制方式,主要有 同步控制、异步控制、联合控制 和 人工控制 四种。
1.同步控制
最常见的控制方式就是 同步控制。这种方式下 CPU 有一个统一的时钟,所有指令的每一个微操作,执行顺序都是事先确定好的,根据时钟信号在不同的时钟周期依次执行。
根据机器周期的不同设置方式,同步控制又有三种不同的方案:
(1)采用定长的机器周期
这是最简单的方式,不论指令对应的微操作有多少、也不管微操作有多复杂,一律采用统一的机器周期来执行各种不同的指令,每个机器周期包含相同的节拍数,每个节拍的宽度完全一致。
这样的话,机器周期的选择必须要以执行最慢的指令和微操作为准,对于比较简单的指令就会有时间上的浪费。
(2)采用不定长的机器周期
采用不定长的机器周期时,每个机器周期内的节拍数可以不等,这样就可以解决微操作执行时间不统一的问题了。
一般会把大多数微操作安排在一个较短的机器周期内完成,而对于比较复杂的微操作,则通过延长机器周期来解决。
(3)中央控制和局部控制相结合
这种方式相当于是定长和不定长机器周期的结合。将机器的大部分指令安排在统一的机器周期内完成,称为 中央控制,这个机器周期一般比较短;而将少数复杂指令中的一些操作,通过插入一些额外的节拍来进行处理,这称为 局部控制。
局部控制的每个节拍跟中央控制的节拍宽度相同,个数则是不确定的。
2.异步控制
异步控制方式不存在统一的时钟信号,没有固定的周期节拍和时钟同步;每条指令和每个微操作耗费的时间都以它们在电路中完成为准。
这种控制方式 CPU 没有空闲时间,利用率更高;但微操作的时序就需要有专门的 “应答线路” 来进行控制,结构会更加复杂。
3.联合控制
联合控制方式就是同步控制和异步控制的结合。这种方式下,对于指令中大部分一致的微操作,采用同步控制;而对于小部分特殊的、时间难以确定的操作,则采用异步控制。
4.人工控制
为了调试机器和软件开发的需要,可以在机器面板或者内部设置一些开关或者按键,由人工进行操作控制。例如,一些机器设有 Reset(复位)键,可以人工恢复初始状态。
确定了 CU 的控制方式,就可以设计具体的控制单元了。根据产生微操作控制信号的方式不同,控制器又可以分为 组合逻辑控制器 和 微程序控制器。
二、组合逻辑控制器
组合逻辑控制器直接通过组合逻辑电路的设计,根据当前的指令操作码、工作周期标志以及时钟信号生成对应的控制信号(微操作)序列,实现控制器的各种功能。也叫做 硬布线控制器。
1.基本原理和结构框图
组合逻辑控制器的控制信号,都是由控制单元(CU)产生的。它的输入是时钟信号、操作码译码之后的信号以及条件码标志位。
存放在 IR 中的 n 位操作码可以经过一个译码器,产生 个输出;于是每种操作码都会对应一个输出信号送至 CU。
CU 的时钟信号就是一个脉冲序列,让它通过一个节拍发生器(计数器)就可以产生一个宽度等于时钟周期的节拍序列。在每个节拍内,可以保证完成一次微操作,数据信息能够完成数据通路中的流动。这样,CU 就可以按照节拍来发出控制信号的序列了。
2.微操作的节拍安排
接下来就可以将每个工作周期中的微操作,安排到对应的节拍中了。
安排微操作的节拍应该遵循以下基本原则:
① 微操作的先后顺序不能发生改变;
② 如果是控制不同部件的微操作,可以同时执行的话,应该尽可能安排在同一个节拍内;
③ 如果有些微操作耗时不长,那可以将多个这样的微操作安排在一个节拍内完成,并且允许它们有先后次序。
现在我们假设采用定长机器周期的同步控制方式,每个机器周期包含 3 个节拍。以上一节讨论的 10 条不同指令为例,可以安排微操作的节拍如下:
(1)取指周期
(2)间址周期
(3)执行周期
同样,还是针对不同类型的指令,分别分析微操作的节拍安排。
1)非访存指令
非访存指令一般都只有很简单的操作,因此可以直接把微操作安排在一个节拍内。可以选择 T0 ~ T2 的任一节拍,其余节拍空闲。
这里以 CLA 指令为例,把它的微操作安排在 T2 节拍内:
2)访存指令
访存指令中需要进行访问主存操作,微操作的节拍安排可以跟取指、间址周期类似。
3)转移指令
同样,转移指令微操作比较简单,可以在 T~0~ ~ T~2~ 任选一个节拍进行安排。
(4)中断周期
在指令周期的最后阶段,CPU 会向所有中断源发出中断查询信号,若检测到有中断请求,在允许中断的条件下就会进入中断周期。中断周期的微操作节拍安排如下:
3.组合逻辑设计
安排好了指令微操作的节拍,接下来就可以设计组合逻辑电路,产生需要的控制信号了。
组合逻辑设计主要由三步来完成:列出所有微操作命令的操作时间表;写出每一个微操作对应控制信号的逻辑表达式;根据逻辑表达式画出组合逻辑电路图。
(1)列出微操作命令的操作时间表
根据微操作的节拍安排,可以将所有指令中每个工作周期、每个节拍需要做的微操作全部列出来,这就是 操作时间表。下表中列出了我们当前所考虑的 10 条指令,如果某条指令需要执行某个微操作,那么对应的格子填 “1”。
这样,我们就知道了对于某一条指令,在某个节拍内需要给出什么样的控制信号。
(2)写出微操作的逻辑表达式
根据操作时间表,可以对每个微操作控制信号进行真值判断,得到微操作命令的初始逻辑表达式。经过化简就可以得到最简逻辑表达式,从而可以通过电路进行实现。
例如,对于微操作 M(MAR)→ MDR,逻辑表达式为:
这里的 FE、IND、EX 是工作周期标志,T~1~ 是节拍,ADD、STA、LDA、JMP、BAN 代表对应指令,来自操作码译码器的输出选择。
(3)画出微操作命令的逻辑电路图
对于每一个微操作,有了它的逻辑表达式,就可以画出对应的组合逻辑电路图。例如,微操作 M(MAR)→ MDR 的逻辑电路图为:
组合逻辑控制器的特点是纯硬件电路实现,因此速度更快、性能更好;设计起来思路清晰、简单明了。但是由于每个微操作命令都对应着一套逻辑电路,因此结构比较复杂,也不够规范;而且逻辑线路是固定的,不易扩展和修改。
组合逻辑控制器通常应用在 RISC 架构中。
三、微程序控制器
组合逻辑控制器线路庞杂,为了克服这个缺点,可以采用类似 “存储程序” 的方法,来形成具体的微操作序列;这被叫做 “微程序”,采用这种技术的控制器就被称为 微程序控制器。
1. 基本原理和结构框图
微程序控制器的基本思想是,将每条机器指令编写成一个 微程序,每一个微程序包含若干条 微指令,每一条微指令对应一个或几个微操作命令。然后把这些微程序存入一个 控制存储器(简称控存,CM)中,用读取指令的方式将它们读出依次执行就可以了。
这样,每一条机器指令都可以对应着一个微程序。对于取指、间址、中断周期,所有指令的操作都是相同的,因此可以统一编制成一个微程序;而每条指令执行阶段的操作则单独对应一个微程序。这样,控制存储器中微程序的个数,就是机器指令的数量,再加上对应取指、间址、中断周期的 3 个微程序。
微指令的基本格式,应该包含两个字段,前面是操作控制字段,对应着微操作命令,可以发出各种控制信号;后面是顺序控制字段,可以指出下条微指令的地址(简称 下地址),从而控制微指令序列的顺序执行。
微程序控制单元的结构如下所示:
-
控制存储器:微程序控制单元的核心部件,存放着全部的微程序;显然控存可以采用 ROM 实现。
-
CMAR:控存地址寄存器,用来存放准备读取的微指令地址;
-
CMDR:控存数据寄存器,用来存放从控存读出的指令;
-
顺序逻辑:用来形成下一条微指令的地址,用来控制微指令序列的执行顺序。
2. 微程序控制器的工作过程
我们可以结合一个具体的例子,来说明微程序控制器的工作过程。假设一段用户程序,有下面的两条汇编指令:
LDA X
ADD Y
...
当执行到第一条指令 LDA X 时,PC 的值为这条指令在主存中存放的地址。控制单元 CU 将执行以下的操作。
(1)取指阶段
首先进入取指周期,微程序控制单元将执行取指阶段的每一个微操作。
① 将取指周期的微程序首地址 M 送至 CMAR:M → CMAR;
② 取微指令,将控存 M 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
③ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 (PC) → MAR,1 → R;
④ 形成下一条微指令的地址。当前微指令的顺序控制字段指出了下地址为 M + 1,所以将 M + 1 送至 CMAR:Ad (CMDR) → CMAR;
⑤ 取下一条微指令,将控存 M + 1 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
⑥ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 M (MAR) → MDR,(PC)+ 1 → PC;
⑦ 形成下一条微指令的地址。当前微指令的顺序控制字段指出了下地址为 M + 2,所以将 M + 2 送至 CMAR:Ad (CMDR) → CMAR;
⑧ 取下一条微指令,将控存 M + 2 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
⑨ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 (MDR)→ IR,
OP (IR) → CU。
至此,第一条指令 “LDA X” 已经取出并保存到了 IR 中。
(2)执行阶段
简单起见,我们假设这条指令采用了直接寻址,因此跳过间址周期,直接进入执行周期。
① 根据指令的操作码,形成取数指令的微程序首地址 Q,并送至 CMAR:OP (IR) → 微地址形成部件 → CMAR;
② 取微指令,将控存 Q 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
③ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 Ad (IR) → MAR,1 → R;
④ 形成下一条微指令的地址。当前微指令的顺序控制字段指出了下地址为 Q + 1,所以将 Q + 1 送至 CMAR:Ad (CMDR) → CMAR;
⑤ 取下一条微指令,将控存 Q + 1 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
⑥ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 M (MAR) → MDR;
⑦ 形成下一条微指令的地址。当前微指令的顺序控制字段指出了下地址为 Q + 2,所以将 Q + 2 送至 CMAR:Ad (CMDR) → CMAR;
⑧ 取下一条微指令,将控存 Q + 2 地址单元中的微指令取出,送至 CMDR:CM (CMAR) → CMDR;
⑨ 产生微操作命令,微指令的操作控制字段中为 “1” 的各位发出控制信号,执行微操作 (MDR)→ ACC。
至此,就完成了取数指令 LDA X 的全部操作。
最后一条微指令的顺序控制字段为 M,所以接下来 CPU 又将进入下一条指令 ADD Y 的取指周期,从控存中依次读出微程序的每条微指令、发出一系列的控制信号。
微程序控制单元设计的过程中,关键问题是微指令的操作控制字段怎样去发出控制信号,以及如何具体产生下一条微指令的地址。这跟 微指令的编码方式 和 微地址的形成方式 有关。
3.微指令的编码方式
微指令的编码方式,主要是指怎样对微指令的操作控制字段进行编码,进而发出对应的控制信号。所以也称为 微指令的控制方式。
微指令的编码方式主要有以下几种。
(1)直接编码(直接控制)
最简单的方案,就是让微指令的操作控制字段中,每一位都对应着一个微操作命令;这种编码方式就称为 直接编码方式。
当控制字段的某位为 “1” 时,就表示控制信号有效,进而打开对应数据通路的控制门;为 “0” 时则表示控制信号无效,控制门关闭。
这种方式实现简单、含义清晰,而且只要微指令从控存中读取出来就立刻可以发出对应的控制信号,速度非常快。不过由于微操作数量众多,因此控制字段的位数也会非常多,可能达到几百位,造成控存容量过大。
(2)字段直接编码
想要减少控制字段的位数,可以通过加一个译码器来解决。不过由于可能会有多个微操作命令同时有效(并行)的情况,因此可以根据并行发出的微命令个数将控制字段再做 “分段”,每段内分别进行译码、对应一个微操作命令。
这种方式由字段直接译码发出微命令,所以叫做 字段直接编码方式,也称为 显式编码。
这里所谓的 “微命令” 就是 CU 发出的控制信号,而 “微操作” 就是微命令生效后执行的过程,它们是一一对应的关系,所以一般我们不再过多区分。
指令执行过程中,有一些微命令可以同时产生,我们称它们是 “相容” 的;而如果一组微命令不能同时发生,则称它们是 “互斥” 的。字段直接编码时,应该将互斥的一组微命令放在一个字段内;而不同字段的微命令,则是相容的。每个字段的长度可以不同。此外,每个字段还应该留出一种状态,表示不发出这一组中的任何微命令。
例如,某机器的微指令格式中,有 8 个控制字段,每个字段可以分别发出 5、8、3、16、1、7、25、4 种控制信号。那么采用直接编码和字段直接编码方式设计微指令,需要的操作控制字段至少是多少位?
(1)直接编码
微指令操作控制字段的位数,就是总的控制信号数:
(2)字段直接编码
每个字段需要保留一个编码,表示不做任何操作;因此 8 个字段分别需要表示 6、9、4、17、2、8、26、5 种情况。对应的编码位数应该是:3、4、2、5、1、3、5、3,因此总位数为:
很明显,使用字段直接编码可以有效地减少控制字段的位数。
(3)字段间接编码
这种方式在字段直接编码的基础上,又增加了一步转换,即一个字段的某些微命令,还需要受到另一字段译码输出的控制,因此被称为 字段间接编码,也叫 隐式编码。
这种方式可以进一步减少控制字段位数,但电路更加复杂、而且削弱了微指令的并行控制能力,因此一般只是作为字段直接编码的辅助手段。
(4)混合编码
将直接编码和字段编码(直接或者间接)混合使用,就成了 混合编码方式。这种方式主要是综合考虑微指令字长、灵活性和执行速度各方面的要求。
4.微指令格式
微指令的格式跟微指令的编码方式有关,通常可以分为水平型微指令和垂直型微指令。
(1)水平型微指令
水平型微指令的主要特点,就是一次能定义并执行多个并行操作的微命令。从编码方式看,前面介绍的直接编码、字段直接编码、字段间接编码以及混合编码都属于水平型微指令。
(2)垂直型微指令
垂直型微指令不强调并行控制的功能,而是采用了类似机器指令中操作码的方式,在操作控制字段中用 “微操作码” 来规定微指令的功能。通常一条微指令中,只有 1 ~ 2 个微命令,控制 1 ~ 2 种操作。
相比而言,水平型微指令并行操作能力更强、速度更快、效率更高、灵活性强;而垂直型微指令与机器指令更加类似,语义更加清晰。水平型微指令用较长的微指令结构,换取较短的微程序;而垂直型微指令是以较长的微程序结构,换取较短的微指令结构。
5.微指令序列地址的形成
微指令执行过程中,在不同阶段,需要采用不同的方式形成后续微指令的地址。
(1)直接由当前微指令的下地址字段给出
大部分微指令都会在下地址字段直接指出下一条微指令的地址,在每一段微程序内部一般都是这种方式。也被称为 断定方式。
(2)根据指令的操作码形成
取指周期结束、机器指令被存放入 IR 后,接下来执行阶段微指令的地址,会由微地址形成部件根据操作码产生。
所谓的微地址形成部件,其实也就是一个编码器,它的输入是指令操作码,输出是对应微程序执行阶段的首地址。它可以用 PROM 来实现,以指令的操作码作为 PROM 的地址,相应的存储单元存放微程序首地址。
对于不同的方式,可以用一个 多路选择器,通过对当前一些状态标志的判断来进行选择。
除了上面最基本的两种方式,还可以采用以下方法形成微指令序列地址。
(3)增量计数器法
可以发现,大多数情况下后续微指令的地址都是连续的,所以可以借鉴 PC 的功能,采用 “增量计数法” 形成后续微指令的地址:(CMAR) + 1 → CMAR。
(4)分支转移
当遇到转移指令时,微指令也会出现分支,这时必须根据转移方式指明的判别条件,根据各种标志决定下一条微指令的地址。
(5)通过测试网络形成
这种方式微指令的地址码分两部分,高段为非测试地址,需要直接保留;低段则为测试地址,需要结合测试源的信号、通过测试网络来生成。
(6)由硬件生成微程序入口地址
电源接电后,程序第一条微指令的地址(入口地址),可以由专门的硬件电路产生。
另外,当有中断请求且条件满足时,CPU 进入中断周期,这时也可以由硬件产生中断周期微程序的入口地址。同理,当有间接寻址时,也可以由硬件产生间址周期微程序的入口地址。
6.微程序设计
设计微程序控制器,主要任务其实就是编写各条指令的微程序。
具体步骤也可以分为三步:首先写出所有指令的全部微操作以及节拍安排;其次确定微指令格式;最后编写出每条微指令的二进制代码(称为 微指令码点)。
(1)写出机器指令的微操作以及节拍安排
这里我们用跟组合逻辑设计相同的案例,只考虑 10 条机器指令。简单起见,我们这里不考虑间接寻址和中断的情况,只讨论取指和执行周期。
1)取指阶段
跟组合逻辑设计类似,取指阶段的微操作可以安排在三个节拍内:
如果一个节拍内的微操作,都对应一条微指令,那么上面的取指微程序对应着 3 条微指令。
不过我们发现,微程序控制器的所有控制信号都来自于微指令,而微指令都存放在控制存储器中。所以每条微指令执行之前,必须有一个将微指令地址送至 CMAR 的过程。或者说,每条微指令执行结束,应该形成后续地址,交给 CMAR;这必须额外耗费一个时钟周期(节拍)。
这样,取指操作就需要 6 条微指令来完成。所有微指令都会由时钟信号的上升沿打入 CMDR 中。
2)执行阶段
同样,执行阶段的微操作是由指令操作码决定的;每条微指令完成之后同样要考虑后续指令地址的形成。
a)非访存指令
b)访存指令
c)转移指令
以上总共有微指令 38 条,不同的微操作有 20 个。
(2)确定微指令格式
确定微指令格式,主要是确定微指令的编码方式、后续微指令地址的形成方式,以及微指令字长 3 个方面。
-
微指令编码方式:微操作不多,可以采用直接编码方式;
-
后续地址形成方式:根据指令操作码和微指令的下地址,确定后续微指令地址的形成;
-
微指令字长:20 个微操作,对应 20 位操作控制字段;38 条微指令,需要 6 位下地址字段。微指令字长至少取 26 位。
进一步分析可以发现,38 条微指令中,19 条都是将后续地址送入 CMAR 的操作。这不仅在微指令上有所浪费,而且相当于每两个时钟周期,才能取出并执行一条微指令。
我们可以将 CMDR 的下地址字段 Ad (CMDR) 直接接到控制存储器的地址线上,在下一个时钟信号的上升沿,就将对应地址的内容(下一条微指令)读取到 CMDR 中。这样就省去了 CMAR,直接用 Ad (CMDR) 取代,而且做到了每一个时钟周期完成一条微指令,大大提升了运行速度。
同样,指令操作码 OP (IR) 通过微地址形成部件产生的后续地址,也可以直接送到控制存储器的地址线上。
通过这样的化简,我们就省去了 19 条微指令,并同时省去了 Ad (CMDR) → CMAR 和 OP (IR) → 微地址形成部件 → CMAR 两个微操作。于是总共只需要 38 - 19 = 19 条微指令和 20 - 2 = 18 个微操作。
这样,最少只需要 18 位控制字段和 5 位地址字段。不过为了便于以后扩展,我们可以取 24 位操作控制字段和 6 位下地址字段。微指令格式如下:
操作控制字段的第 0 ~ 17 位分别控制的微操作为:
(3)编写微程序码点
根据每条微指令的操作控制字段和下地址,就可以得到每一条微指令对应的二进制代码(码点)了。这里我们省略了码点中所有的 0。
7.其他微程序技术
微程序控制器中,控制信号是以二进制代码的形式出现,因此不需要像组合逻辑那样考虑逻辑表达式的化简,因此设计更加简便,更容易调试和修改。当然,由于执行每个微操作都要访问控制存储器,所以对控制存储器的速度要求较高。微程序控制器通常应用在 CISC 架构中,目前大多数计算机都会采用微程序设计技术。
微程序设计技术也可以有其它一些方式的扩展。
(1)静态微程序设计
通常指令系统是固定的,对应每一条机器指令的微程序,都是计算机的设计者预先编写好的,这种微程序设计技术称为 静态微程序设计,其控制存储器一般采用 ROM。
(2)动态微程序设计
如果可以通过改变微指令和微程序,来改变机器的指令系统,这种微程序设计技术称为 动态微程序设计。这种方式可以在一台机器上实现不同类型的指令系统,有利于仿真和研究测试,其控制存储器需要采用 EPROM。
(3)毫微程序设计
如果采用两级微程序的设计方法,用第一级微程序来解释机器指令,再用第二级微程序(称为 “毫微程序”)来解释第一级微程序,这样的设计方式就称为 毫微程序设计。组成毫微程序的 毫微指令 是用来解释微指令的。
采用毫微程序设计计算机的优点是,可以用更少的控制存储器空间来达到高度的并行;不过同时运行速度会受到一定程度的影响。