计组第十章 控制单元的设计
第十章 控制单元的设计
以十条指令作为例子,介绍控制单元设计的两种主要方法,对应了本章的两节
也就是说,本章的两节都是控制单元设计的两种方法
10.1 组合逻辑设计
10.1.1. 组合逻辑控制单元框图
(1) CU外特性

| 输入/输出 | 说明 | |
|---|---|---|
| 输入 | IR中的操作码 | IR中的操作码部分要经过译码,才能被CU解析 对于每一个指令,译码之后,只有一条线是高电平,也就是在0—2n - 1条线中,只有一条是高电平,这条线就标志了执行哪个操作  | 
| 标志 | 输出什么控制信号,还和状态标志有关,比如条件跳转指令 | |
| CLK | CLK生成了m个节拍 | |
| 输出 | 控制信号 | 在上述输入的作用下,CU在给定的时钟周期就会给出控制信号,如图中的C0—Ck的k+1条控制信号 在每一个节拍,Ci这些控制信号就会有一个或者多个有效,多个同时有效表示在一个节拍中,这些操作是可以同时进行的,没有时间顺序,或者是两个微操作有先后顺序,但是时间都非常短,在一个节拍中能够实现  | 
(2) 节拍信号

10.1.2. 微操作的节拍安排
已经有了节拍,有了机器周期,要将微操作按照执行的时间顺序,将微操作安排在特定的节拍,CU控制
假设:
- 假设我们采用同步控制方式
 - 一个 机器周期 内有 3 个节拍(时钟周期)(实际上是不确定的)
 - CPU 内部结构采用非总线方式
 
以下是CPU的结构图

- 其中C0到C12一共是13个控制信号
 - 所有的控制信号都是CU在给定的输入和时钟信号的控制下发出的
 - CU还产生了ALU右侧的控制信号
 
对于每一个机器周期,某一个控制命令到底安排在这个周期的哪一个节拍上,这是这节要解决的问题
(1) 安排微操作时序的原则
- 
微操作的 先后顺序不得 随意 更改
 - 
被控对象不同 的微操作尽量安排在 一个节拍 内完成
也就是说可以并行执行的操作安排在一个节拍
 - 
占用 时间较短 的微操作尽量 安排在 一个节拍 内完成,并允许有先后顺序
比如一个微操作安排在节拍的上升沿,另一个操作安排在下降沿
 
(2) 各个机器周期微操作的节拍安排
① 取指周期微操作的节拍安排
取指周期是将指令从PC中地址的内存单元中传到CU
| 节拍 | 微操作 | 体现原则 | 指令说明 | 
|---|---|---|---|
| T0 | PC→MAR | ||
| 1 → R | 原则二 | ||
| T1 | M(MAR)→MDR | 这个微操作是从内存中取数据存放到CPU的寄存器中,花费时间比较长 | |
| (PC) + 1 → PC | 原则二 | ||
| T2 | MDR→IR | ||
| OP(IR)→ID | 原则三 | 这两个微操作是CPU内部寄存器的数据传输,花费时间比较少 ID是指令的译码单元  | 
② 间址周期微操作的节拍安排
| 节拍 | 微操作 | 体现原则 | 指令说明 | 
|---|---|---|---|
| T0 | AD(IR)→MAR 或者 MDR→MAR  | 
||
| 1 → R | 原则二 | ||
| T1 | M(MAR)→MDR | 这个微操作是从内存中取数据存放到CPU的寄存器中,花费时间比较长 | |
| T2 | MDR→Ad(IR) | 
③ 执行周期微操作的节拍安排
不同指令的执行周期做的事是不一样的,我们假设执行周期相同,以10条指令为例
(根据假设机器周期的节拍数一样为3个)
| 指令/指令说明 | 节拍 | 微操作 | 微操作说明 | 
|---|---|---|---|
| CLA | T0 | ||
| 将ACC中的数清0 | T1 | ||
| T2 | 0→AC | 这个微操作可以放在三个节拍中的任意一个 | |
| COM | T0 | ||
| ACC中的数据取反 | T1 | ||
| T2 | AC非→AC | 一个指令就能完成 | |
| SHR | T0 | ||
| 算数右移 | T1 | ||
| T2 | L(AC)→R(AC) | ||
| AC0→AC0 | 在数字逻辑电路中,这两个是可以一起实现的 | ||
| CLS | T0 | ||
| 循环左移 | T1 | ||
| T2 | R(AC)→L(AC) | ||
| AC0→ACn | |||
| STP | T0 | ||
| 停机指令 | T1 | ||
| T2 | 0→G | ||
| 上面的都是不访存的指令 | |||
| ADD X | T0 | Ad(IR)→MAR | |
| X内存单元的数据与ACC的相加保存到ACC中 | 1 → R | ||
| T1 | M(MAR)→MDR | ||
| T2 | (AC)+(MDR)→AC | 在这个之前,CU要发出控制信号给ALU | |
| STA X | T0 | Ad(IR)→MAR | |
| ACC的数据送到X存储单元 | 1 → W | ||
| T1 | AC→MDR | ||
| T2 | MDR→M(MDR) | ||
| LDA X | T0 | Ad(IR)→MAR 或者 MDR→MAR  | 
IR和MDR都有指令 | 
| X存储单元送到ACC中 | 1 → R | ||
| T1 | M(MAR)→MDR | ||
| T2 | MDR→AC | ||
| JMP X | T0 | ||
| 跳转到X地址的指令 | T1 | ||
| T2 | Ad(IR)→PC | X是存放在IR中的 | |
| BAN X | T0 | ||
| 看上一个结果是否是负数决定是否跳转 | T1 | ||
| T2 | A0·Ad(IR) + A0非·PC→PC | 这里假设保存结果在AC中,实际上是在标志寄存器中保存着正负的 | 
④ 中断周期微操作的节拍安排
中断周期要做三件事:保护断点,形成中断服务程序入口地址,关中断
| 节拍 | 微操作 | 说明 | 
|---|---|---|
| T0 | 0→MAR | 这是断点的保存地址,假设保存到0处 | 
| 1→W | 写指令送入内存 | |
| 0→EINT | 硬件关中断 | |
| T1 | PC→MDR | PC保存着断点 | 
| T2 | MDR→M(MAR) | 断点送入内存中 | 
| 向量地址→PC | 形成中断服务程序入口地址,这里采用硬件向量法,得先将PC的送入到MDR,才能将向量地址送到PC | 
由此可见,三个步骤是在中断周期完成即可,并没有严格意义的顺序
10.1.3. 组合逻辑设计步骤
很简单,要产生控制信号,只要用组合逻辑的方法,用逻辑表达式,能够写出任何一个控制信号产生的条件,然后用硬件实现
书:组合逻辑设计控制单元时,首先根据上述微操作的节拍安排,列出微操作命令的操作时间表,然后写出每一个微操作命令(控制信号)的逻辑表达式,最后根据逻辑表达式画出相应的组合逻辑电路图。
- 实际上,这个就是为每个指令的微操作设计安排所处的节拍
 - 因此要将每个机器周期所有的微操作都列出来,看指令涉及到哪个微操作
 - 每个指令的中断周期的操作是由隐指令完成的,都是一样的,故不需要考虑
 
(1) 列出操作时间表
| 工作周期标记 | 节拍 | 状态条件 | 微操作 | CLA | COM | ADD | STA | LDA | JMP | 
|---|---|---|---|---|---|---|---|---|---|
| FE取指 | T0 | PC→MAR | 1 | 1 | 1 | 1 | 1 | 1 | |
| 1 → R | 1 | 1 | 1 | 1 | 1 | 1 | |||
| T1 | M(MAR)→MDR | 1 | 1 | 1 | 1 | 1 | 1 | ||
| (PC) + 1 → PC | 1 | 1 | 1 | 1 | 1 | 1 | |||
| T2 | MDR→IR | 1 | 1 | 1 | 1 | 1 | 1 | ||
| OP(IR)→ID | 1 | 1 | 1 | 1 | 1 | 1 | |||
| I(这是间址特征,也就是I是有效时,说明有间址周期) | 1→IND(表示进入间址周期) | 清0和取反不会有间址操作 | 1 | 1 | 1 | 1 | |||
| I非(I无效,没有间址周期) | 1→EX(进入执行周期) | 1 | 1 | 1 | 1 | 1 | 1 | ||
| IND间址 | T0 | AD(IR)→MAR 或者 MDR→MAR  | 
1 | 1 | 1 | 1 | |||
| 1 → R | 1 | 1 | 1 | 1 | |||||
| T1 | M(MAR)→MDR | 1 | 1 | 1 | 1 | ||||
| T2 | MDR→Ad(IR) | 1 | 1 | 1 | 1 | ||||
| IND非(间址周期可能不止一个,我们假设只有一个间址,此时IND=0,进入执行周期) | 1→EX | 取址阶段CLA和COM已经完成这个操作了 | 1 | 1 | 1 | 1 | |||
| EX执行 | T0 | AD(IR)→MAR 访存操作 | 1 | 1 | 1 | ||||
| 这里将执行周期所有可能出现的微操作都列出来了 | 1→R 读操作 | 1 | 1 | ||||||
| 1→W 写操作 | 1 | ||||||||
| T1 | M(MAR)→MDR 读操作 | 1 | 1 | ||||||
| AC→MDR 写数据操作 | 1 | ||||||||
| T2 | (AC)+(MDR)→AC 加法操作 | 1 | |||||||
| MDR→M(MAR) 写操作 | 1 | ||||||||
| MDR→AC 取数操作 | 1 | ||||||||
| 0→AC 清0操作 | 1 | 
(2) 写出微操作命令的最简表达式
自变量就是 机器周期、节拍、指令,因变量是微操作
M(MAR)→MDR
= FE · T1 + IND ·T1 ( ADD + STA + LDA + JMP + BAN ) + EX ·T1 ( ADD +LDA )
=== T1==
最后要化简
(3) 画出逻辑图

由这个图我们就可以很清楚地知道为什么要划分机器周期,因为处于什么机器周期也是一个标志,最终控制着微操作
CU内部特性
下来我们回顾一下外特性

可以看到输入输出的对应
| 具体输入/输出 | 外特性输入 | 说明 | 
|---|---|---|
| FE、IND、EX | 标志 | 这几个标志表示着处于哪个机器周期 | 
| T1 | 节拍 | |
| 最终微操作的产生与机器周期和时钟周期都有关的 | ||
| JMP、BAN、LDA、ADD、STA | 操作码译码 | 在外特性中操作码译码为2n-1条输入,其中每条输入都表示着一个指令,可能第1条就表示着LDA,然后这些输入都送到微操作的输入中 | 
| M(MAR)→MDR | Ci | 一个Ci就表示着一个微操作 | 
可以看出,CU内部是如何将指令转换为微操作的
- 将指令(指令码译码后的结果,一根输入表示一种指令)、机器周期以及时钟周期都作为CU的输入
 - CU内部是每个微操作的逻辑电路的集合,也就是所有的微操作电路都集合在了CU内部
 - 最终是否进行微操作就是CU的输出,一种微操作表示一根输出位
 
10.1.4. 特点
| 特点 | 说明 | |
|---|---|---|
| 优点 | 思路清晰,简单明了 | 只需要知道每一个控制信号产生的条件 | 
| 速度特别快 | 采用硬件制作的,速度非常快,RISC就是采用这种 甚至在现代处理器当中,将处理单元分为两类,一类是整形数的处理单元,做整形数的运算,控制操作;一类是浮点数的运算 通常情况下,整形单元也是采用这种硬件连接的方式  | 
|
| 缺点 | 庞杂,调试困难 | 上述图只是一个微操作,每一个控制信号要单独的电路 | 
| 修改困难,不易扩展 | 需要修改整个控制电路 | 
10.2 微程序设计
采用微程序设计的方法来设计控制器,修改简便,易于扩展
10.2.1. 微程序设计思想及产生
| 项目 | 说明 | 
|---|---|
| 提出 | 英国剑桥大学教授M.V.Wilkes在1951年首先提出 | 
| 思想 | 采用与存储程序相类似的办法,来解决徼操作命令序列的形成。 | 
| Wilkes提出,将一条机器指令编写成一个微程序,每一个微程序包含若干条微指令,每一条微指令对应一个或几个微操作命令。 然后把这些微程序存到一个控制存储器(这是一种存储器)中, 用寻找用户程序机器指令的办法来寻找每个微程序中的微指令。 由于这些微指令是以二进制代码形式表示的,每位代表一个控制信号(微操作)(若该位为1,表示该控制信号有效;若该位为0,表示此控制信号无效),因此,逐条执行每一条微指令,也就相应地完成了一条机器指令的全部操作  | 
|
| 核心 | 微程序控制单元的核心部件是一个控制存储器,简称控存 | 
| 当时的瓶颈 | 由于执行一条机器指令必须多次访问控制存储器,以取出多条微指令来控制执行各个微操作,因此要求控存的速度较高。可惜在Wilkes那个年代电子器件生产水平有限,因此微程序设计思想并未实现。 | 
| 实现 | 直到60年代出现了半导体存储器,才使这个设计思想成为现实。1964年4月,世界上第一台微程序设计的机器IBM 360研制成功。 | 
我们来看示意图

- 每个节拍对应一条微指令,多个节拍就对应多条微指令,就构成了一个微程序,表示一个指令
 - 微指令就是一个节拍中要做的微操作的组合,一个微指令中的所有微操作是可以在一个节拍中实现的。微指令之间的顺序就是一个机器周期中节拍之间的顺序
 - 比如说上面的微指令1,有两个1,代表两个微操作在微指令1表示的节拍中同时进行
 
下面列出对应关系
| 指令 | 周期 | 微程序概念 | 存储 | 
|---|---|---|---|
| 机器指令 | 指令周期 | 微程序 | 多个字按顺序组成的程序 | 
| 一个机器指令要做的所有微操作 | 机器周期 | 微指令 | 一个存储单元(一个字) | 
| 微操作 | 时钟周期 | 微操作命令 | 一个位 | 
我们将这些微指令保存在只读存储器ROM中,执行的时候将微指令一条一条地按顺序读出,根据微指令中的有效控制信号,发出相应的微操作命令
这种方式称为存储逻辑,把逻辑信号存储在存储体当中
10.2.2. 微程序控制单元框图及工作原理
(1) 机器指令对应的微程序

- 首先是一个大的表格,这个表格对应着各种指令对应着的微程序
 - 每个指令的取指,间址,中断周期干的事情都一样,因此抽取出来
 - 然后执行周期的操作再独立出来
 
很奇怪,微程序对应的不是机器指令吗,怎么还有取指周期微程序?
机器指令(Machine Instructions)是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。
——百度百科
不用计较这个,只是单独写了取指周期的微程序
分析图:
- 
我们假设开始地址是M地址,这个地址保存了取指令所需要的全部的微操作以及微操作之间的先后顺序
也就是取值微程序保存在从M开始的存储单元当中
M,M+1,M+2保存了取值微程序,取值周期有三个节拍么,就有三个微指令
 - 
从P开始保存着LDA的执行阶段的微程序
 - 
STA也是如此
 
(2) 微程序控制单元的基本框图
这就是微程序方法下 CU 的结构图

| 部件 | 说明 | 
|---|---|
| 控制存储器 CM(简称控存) | 是微程序控制单元的核心部件,用来存放全部微程序;只读 | 
| CMAR是控存地址寄存器(Control MAR) | 用来存放欲读出的微指令地址 | 
| 地址译码 | 微指令地址要经过译码之后才能给控制存储器 | 
| CMDR是控存数据寄存器 | 用来存放从控存读出的微指令,存放微指令 | 
| 微地址形成部件 | 一条指令的执行阶段所做的微操作是不一样的,其对应的微程序的首地址是不一样的 微地址形成部件接受指令操作码来获得这条指令对应的微程序在控存中的首地址  | 
| 顺序逻辑 | 控制微指令序列的,具体就是控制形成下一条微指令(即后继微指令)的地址,其输入与微地址形成部件(与指令寄存器相连)、微指令的下地址字段以及外来的标志有关 简单来说,是因为CMAR当中的地址有多种来源(图中两个,一个是微地址形成部件的地址,一个是微指令的顺序控制部分),利用顺序逻辑从多个来源中选择一个正确的来源送入到CMAR中 比如刚刚执行一个指令的执行周期的时候,可以使用来自微地址形成部件的首地址;执行中间的微指令的时候,使用该微指令的顺序控制,即下一条微指令的地址 顺序逻辑是一个多路,这个多路的控制信号包括了标志和时钟CLK  | 
| 微指令基本格式 | 包括操作控制和顺序控制 操作控制:由一系列的0构成,可以假定1表示控制器要发出某一个控制信号,所以操作控制中每一位都代表了一个微操作控制信号,1表示有效;控制信号直接给出,控制CPU或者计算机其他组件的任务执行 顺序控制:给出了下一条微指令的地址,这个地址要送到顺序逻辑,顺序逻辑要从两个地址中选一个  | 
接下来哦们对微指令进行进一步划分,将顺序控制给展示出来

- 
取指微程序
三个微指令保存在M,M+1,M+2中
M,M+1的下地址很明朗,都是执行下一条微指令M+1和M+2
但是M+2的下地址是不确定的,我们假设这条指令没有间址,没有中断,取指之后直接执行
但是这是个什么指令,执行周期要执行哪个微程序,也就是M+2的下地址是什么,要经过指令的译码才能确定,这个就是由微地址形成部件做的
微地址形成部件就是形成这条指令在执行阶段所在的微程序在控存中的地址
 - 
执行微程序
像P,K就是指令的执行阶段对应的微程序的首地址,注意,P+2,K+2的下一个地址是确定的,如果没有中断周期,就直接进入取指周期,顺序地取下一条指令
 
(3) 工作原理/流程
我们以下面的图为例
![]()  | 
![]()  | 
|---|
在主存中存放着用户写的程序,这个程序就是高级语言编译之后得到的汇编语言,我们来看看执行流程
| 阶段 | 记作/步骤 | 说明 | 
|---|---|---|
| 取址阶段 | M→CMAR | 将取指周期微程序首地址M送到CMAR | 
| CM(CMAR)→CMDR | 取微指令,将对应控存M地址单元中的第一条微指令读到控存数据寄存器CMDR中 | |
| CMDR 发命令 | 假设取出的指令是![]() 在操作控制那一栏的两个1,代表着PC→MAR,1→R这两个操作,CMDR给发出去  | 
|
| Ad(CMDR)→CMAR | 形成下条微指令地址M+1,此徼指令的顺序控制字段指出了下一条微指令的地址为M+1,将M+1送至CMAR。 | |
| CM(CMAR)→CMDR | 取下一条微指令 | |
| CMDR 发命令 | ![]()  | 
|
| Ad(CMDR )→CMAR | 形成下条微指令地址M+2 | |
| CM(CMAR)→CMDR | 取下一条微指令 | |
| 产生微指令操作命令,由 CMDR 发命令 | ![]() 在这个微指令之后,第一条指令LDA的指令已经送到了IR中了  | 
|
| LDA执行阶段 | OP(IR)→微地址形成部件→CMAR | 当取数指令存入R后,其操作码OP(IR)直接送到微地址形成部件,该部件的输出即为取数指令微程序的首地址P,且将Р送至CMAR | 
| CM(CMAR)→CMDR | 取微指令,将对应控存Р地址单元中的微指令读到CMDR中 | |
| 产生微指令操作命令 | ![]()  | 
|
| Ad(CMDR )→CMAR | 形成下条微指令地址P+1 | |
| CM(CMAR)→CMDR | 取微指令 | |
| 产生微指令操作命令 | ![]()  | 
|
| Ad(CMDR)→CMAR | 形成下条微指令地址P+2 | |
| CM(CMAR)→CMDR | 取微指令 | |
| 产生微指令操作命令 | ![]()  | 
|
| Ad(CMDR)→CMAR | 形成下条微指令地址M,这里是假设LDA没有中断周期,执行周期结束之后直接进入取指周期取下一条指令 | |
| 取址阶段 | M→CMAR | 将取指周期微程序首地址M送到CMAR | 
| CM(CMAR)→CMDR | 取微指令,将对应控存M地址单元中的第一条微指令读到控存数据寄存器CMDR中 | |
| CMDR 发命令 | ![]()  | 
|
| …… | 如此循环 | 
如果没有间址周期和中断周期,每一条指令都要经过取指周期和执行周期,执行取指微指令和执行微指令
有如下的转换
- 
全部微指令存在 CM 中
 - 
指令的执行过程就是将微指令从CM中读出来
 - 
程序的执行过程就是每一条指令反复执行取指微程序,执行微程序……
微程序控制单元就是这样,通过逐条取出微指令,发出各种微命令,从而实现从主存逐条取出、分析并执行机器指令,以达到运行程序的目的。
由此可见,对微程序控制单元的控存而言,内部信息一旦按所设计的微程序被灌注后,在机器运行过程中,只须具有读出的性能即可,故可采用ROM.
此外,在微程序的执行过程中,关健问题是
 如何由微指令的操作控制字段形成微操作命令
 如何形成下一条微指令的地址
这是微程序设计必须解决的问题,它们与微指令的编码方式和微地址的形成方式有关。
 
10.2.3. 微指令的编码方式
就是操作控制字段如何形成微操作命令
(1) 直接编码(直接控制)方式
在微指令的操作控制字段中,每一位代表一个微操作命令
- 在所有的指令执行过程当中,一共需要多少微操作命令,操作控制字段就有多少位
 

某位为 “1” 表示该控制信号有效,看下面的例子(上面说的流程中就是用的这种方式)


| 特点 | 说明 | 
|---|---|
| 优点 | 速度最快,因为控制信号由操作控制字段直接给出,不需要译码 | 
| 含义清晰 | |
| 缺点 | 由于机器中微命令甚多,可能使微指令操作控制字段达几百位,造成控存容量极大 | 
(2) 字段直接编码方式
这种方式就是将微指令的操作控制字段分成若干段,将一组互斥的微命令放在一个字段内,通过对这个字段译码,便可对应每个微命令

- 
每个译码器的输出端只有一位是有效信号,如果1是有效的,那么第一个译码器输出端只有一个是1
也就是分到这一组(段)的微操作是互斥的,其中的一个发出控制命令,另外的一个就不能发出控制命令
 - 
不同组发出的微操作命令可能是并行执行的
 
缩短 了微指令 字长,增加 了译码 时间
采用字段直接编码方法可用较少的二进制信息表示较多的微命令信号,例如3位二进制代码译码后可表示7个互斥的微命令,留出一种状态表示不发微命令,与直接编码用7位表示7个微命令相比,减少了4位,缩短了微指令的长度。但由于增加了译码电路,使微程序的执行速度稍徼减慢。
至于操作控制字段应分几段,与需要并行发出的微命令个数有关,若需并行发出8个微命令,就可分8段。
每段的长度可以不等,与具体要求互斥的微命令个数有关,如某类操作要求互斥的微命令仅有6个,则字段只需安排3位即可。
(3) 字段间接编码方式
- 这种方式一个字段的某些微命令还需由另一个字段中的某些徼命令来解释,如图所示。图中字段1译码的某些输出受字段2译码输出的控制,由于不是靠字段直接译码发出微命令,故称为字段间接编码,又称隐式编码。
 - 这种方法虽然可以进一步缩短微指令字长,但因削弱了微指令的并行控制能力,因此通常用作字段直接编码法的一种辅助手段。
 

(4) 混合编码
这种方法是把直接编码和字段编码(直接或间接)混合使用,以便能综合考虑微指令的字长、灵活性和执行微程序的速度等方面的要求。
(5) 其他
- 
微指令中还可设置常数字段,用来提供常数、计数器初值等。
常数字段还可以和某些解释位配合,如解释位为0,表示该字段提供常数;解释位为1,表示该字段提供某种命令,使徼指令更灵活。
此外﹐微指令还可用类似机器指令操作码的方式编码,详细课件后面的微指令格式一节的内容
 
10.2.4. 微指令序列地址的形成
(1) 微指令的下地址字段指出

- 就是直接由每个微指令的下地址给出么
 - 但是有的微指令无法给出下地址,比如取指微程序的第三条微指令,就没法给出下地址,这个时候采用第二种方法
 
(2) 根据机器指令的操作码形成
事实上,在微程序方法下,机器指令的操作码就是为了给出执行阶段微程序的首地址
- 
当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。
 - 
微地址形成部件实际是一个编码器,其输入为指令操作码,输出就是对应该机器指令微程序的首地址。
它可采用PROM 实现,以指令的操作码作为PROM 的地址,而相应的存储单元内容就是对应该指令微程序的首地址。
 
实际上微指令序列地址的形成方式还有:
(3) 增量计数器法
- 仔细分析发现,在很多情况下,后继微指令的地址是连续的
 - 因此对于顺序地址,微指令可采用增量计数方法,即(CMAR)+1→CMAR来形成后继微指合的地址
 
(4) 分支转移法
当遇到条件转移指令时,微指令出现了分支,必须根据各种标志来决定下一条微指令的地址。微指令的格式为:

- 转移方式是指明判别条件
 - 转移地址是指明转移成功后的去向,若不成功则顺序执行。
 - 也有的转移微指令中设两个转移地址,条件满足时选择箕中一个转移地址;条件不满足时选择另一个转移地址。
 
(5) 通过测试网络形成
微指令的地址还可通过测试网络形成,如图所示。
- 微指令的地址分两部分
 - 高段h为非测试地址,由微指令的H段地址码直接形成
 - 低段l为测试地址,由微指令的L段地址码通过测试网络形成
 - h和l组合成为后续地址送到CMAR中
 

- 
这个用于微程序在小范围内的跳转和条件转移操作
因为高位不变,低位根据测试员来进行改变,实际上也就是跳转了
 
(6) 由硬件产生微程序入口地址
- 当电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向 CMAR输入微指令的地址,这个地址即为取指周期微程序的入口地址。
 - 当有中断请求时,若条件满足,CPU 响应中断进入中断周期,此时需中断现行程序,转至对应中断周期的微程序。由于设计控制单元时已安排好中断周期微程序的入口地址,故响应中断时,可由硬件产生中断周期微程序的入口地址。
 - 同理当出现间接寻址时,也可由硬件产生间址周期微程序的入口地址。
 
总的来说就是开机后执行的首地址和响应中断的中断服务程序的首地址和间址周期的首地址的时候使用这个方法
(7) 后续微指令地址形成方式原理冬

图中多路选择器可选择四路地址
- (CMAR) + 1→CMAR
 - 微指令的下地址字段
 - 指令寄存(通过微地址形成部件产生的地址)
 - 微程序入口地址,这是由硬件产生的地址
 
标志和转移方式经过分支逻辑产生地址选择信号,从而帮助多路选择器选择合适的地址
10.2.5. 微指令格式
微指令格式与微指令的编码方式有关,通常分为水平型微指令和垂直型微指令两种
(1) 水平型微指令
特点:一次能定义并执行多个并行操作
前面使用的都是水平型的微指令,如 直接编码、字段直接编码、字段间接编码、直接和字段混合编码
(2) 垂直型微指令
类似机器指令操作码 的方式,一次只能定义一个操作,当然这个操作可能是很复杂的操作,在执行过程过程中可能控制复杂的操作,操作之间有先后关系
通常一条徼指令有1~2个微命令,控制1~2种操作。这种微指令不强调其并行控制功能。
机器指令操作码的编码方式就是分段,每段都有一定的意义
下表列出了一种垂直型微指令的格式,其中
- 微操作码3位,共分六类操作
 - 地址码字段共10位,对不同的操作有不同的含义
 - 其他字段3位,可协助本条微指令完成其他控制功能。
 

(3) 两种微指令格式的比较
- 
水平型微指令比垂直型微指令 并行操作能力强 ,灵活性强
 - 
水平型微指令执行一条机器指令所要的微指令 数目少,速度快
因为一条水平型微指令控制的微操作比较多,所以数目少
而且不需要译码或者简单的译码即可,所以速度快
 - 
水平型微指令用较短的微程序结构换取较长的微指令结构
垂直型的相反,微指令较长,但是微程序较短
 - 
水平型微指令与机器指令 差别大
 
10.2.6. 静态微程序设计和动态微程序设计
- 
通常指令系统是固定的,对应每一条机器指令的微程序是计算机设计者事先编好的,因此-一般微程序无需改变,这种微程序设计技术即称为静态微程序设计,其控存采用ROM。前面讲述的内容基本上属于这一类。
 - 
如果采用EPROM 作为控制存储器,人们可以通过改变微指令和微程序来改变机器的指令系统,这种微程序设计技术称为动态微程序设计。
动态微程序设计由于可以根据需要改变微指令和微程序,因此可以在一台机器上实现不同类型的指令系统,有利于仿真,比如添加新程序,或者改变或添加指令,看计算机性能能否提升。
但是这种设计对用户的要求很高,目前难以推广
 
10.2.7. 毫微程序设计
(1) 毫微程序概念
- 
微程序可看作是解释机器指令的,毫微程序可看作是解释微程序的,而组成毫微程序的毫微指令则是用来解释微指令的。
 - 
优点:用少量的控存空间来达到高度的并行。
缺点:因有时一条微指令要访问两次控存,影响了速度。
 - 
微程序设计 用 微程序解释机器指令
毫微程序设计 用 毫微程序解释微指令
毫微指令与微指令 的关系好比 微指令与机器指令 的关系 
| 程序 | 解释什么 | 
|---|---|
| 微程序 | 解释机器指令 | 
| 毫微程序 | 解释微程序 | 
| 组成毫微程序的毫微指令 | 解释微指令 | 
(2) 毫微程序控制存储器的基本组成
毫微程序设计采用两级微程序的设计方法。
- 第一级微程序为垂直型微指令,并行功能不强,但有严格的顺序结构,由它确定后继微指令的地址,当需要时可调用第二级。
 - 第二级微程序为水平型微指令,具有很强的并行操作能力,但不包含后继微指令的地址
 - 第二级微程序执行完毕后又返回到第一级微程序。两级微程序分别放在两级控制存储器内。下图示意了毫微程序控制存储器的基本组成。
 

- 
图中CMAR1为第一级控存地址寄存器,CMDR1存放从第一级控存中读出的微指令
如果该微指令只产生一些简单的控制信号,则可以通过译码,直接形成微操作命令,不必调用第二级。
 - 
如果需调用第二级控存时,则将毫微程序的地址送至CMAR2,然后由从第二级控存中读出的微指令去直接控制硬件。
 - 
值得注意的是垂直型微指令不是和水平型微指令一条一条地对应,而是由水平型微指令(称作毫微指令)组成的毫徼程序去执行垂直型微指令的操作。
 - 
毫微指令与微指令的关系就好比微指令与机器指令的关系一样。
 
10.2.8. 串行微程序控制和并行微程序控制
与机器指令一样,完成一条微指令也分两个阶段:取微指令和执行微指令。
由于取微指令和执行微指令的操作是在两个完全不同的部件中完成的,因此可将这两部分操作采用流水的方式并行进行,以缩短微指令周期,这就是并行微程序控制
- 
串行微程序控制

 - 
并行微程序控制

 
10.2.9. 微程序设计举例
通过举例来看看如何设计微指令和微程序的,就和组合逻辑生成微操作的电路图一样的任务
假设 CPU 结构与组合逻辑相同,都采用非总线的方式控制
(1) 写出对应机器指令的微操作及节拍安排
① 取指阶段的微操作及节拍安排
| 节拍 | 微操作 | 
|---|---|
| T0 | PC→MAR | 
| 1→R | |
| T1 | M(MAR)→MDR | 
| (PC)+1→PC | |
| T2 | MDR→IR | 
| OP(IR) →微地址形成部件 | 
若一个T内安排一条微指令,则取指操作需3条微指令
但是还需考虑如何读出这3条微指令?
- Ad(CMDR)→CMAR 采用下地址获得下一条微指令
 - OP(IR)→微地址形成部件→CMAR,当进入下一阶段,如执行阶段的时候,采用这个方法获得执行微程序的首地址
 
考虑到这个点,取指阶段就可以按照下面的方式划分
| 节拍 | 微操作 | 说明 | 
|---|---|---|
| T0 | PC→MAR | 这个微指令的地址可以由上一个微程序的最后一条微指令的下地址给出; 当这是执行第一条指令的时候,可以由硬件给出  | 
| 1→R | ||
| T1 | Ad(CMDR)→CMAR | 这里是将CMDR中的下地址也送入到CMAR,这是为了取出下一条指令 | 
| T2 | M(MAR)→MDR | 通过上一条微指令取出该条微指令 | 
| (PC)+1→PC | ||
| T3 | Ad(CMDR)→CMAR | |
| T4 | MDR→IR | |
| OP(IR) →微地址形成部件 | ||
| T5 | OP(IR) →微地址形成部件→CMAR | 这个指出了进入到执行阶段的微程序的第一条微指令在控存中的地址 | 
- 总之就是在三条指令中间插入一条Ad(CMDR)→CMAR以取出下一条微指令
 - 在最后也插入一条OP(IR) →微地址形成部件→CMAR以便于下一个周期程序的取出
 - 意思就是,你不能光顾着指令干嘛,你还要注意怎么取出这条指令
 
② 执行阶段的微操作及节拍安排
与取值一样,要考虑需形成后续微指令的地址,而且执行阶段最后一个微指令的下地址,应该为取指微程序的入口地址 M
注意,与组合逻辑执行阶段的微操作的节拍安排不同
组合逻辑执行阶段的微操作的节拍安排,如果要求每个机器周期的节拍数一样的话,那么即使只有一个微操作,也必须等待机器周期走完,也就是说,会有时钟周期什么也不干,浪费时间,如CLA指令,只有一个微操作,却要等三个节拍
指令 节拍 微操作 CLA T0 T1 T2 0→AC 但是微程序设计方式的节拍安排就不一样了,不需要等待时钟周期,直接取出指令就能做
事实上,
微程序设计方式就没有时钟周期CLK控制,完全是程序控制走的微程序是有CLK控制的,但是好像不需要机器周期标志位,比如FE,EX这样的标志位,微指令就自动决定下来怎么走了只是在组合逻辑设计方式中,微操作的执行与机器周期有关,所以设置了标志位
| 指令类型 | 指令 | 节拍 | 微操作 | 说明 | 
|---|---|---|---|---|
| 非访存指令 | CLA | T0 | 0→AC | |
| T1 | Ad(CMDR)→CMAR | |||
| COM | T0 | AC非→AC | ||
| T1 | Ad(CMDR)→CMAR | 实际上,非访存指令只要一个微操作就能解决了,但是要添加取下一个微指令的微指令 | ||
| SHR | T0 | L(AC)→R(AC) | ||
| AC0→AC0 | ||||
| T1 | Ad(CMDR)→CMAR | |||
| CSL | T0 | R(AC)→L(AC) | ||
| AC0→ACn | ||||
| T1 | Ad(CMDR)→CMAR | |||
| STP | T0 | 0→G | ||
| T1 | Ad(CMDR)→CMAR | |||
| 访存指令 | ADD | T0 | Ad(IR)→MAR | |
| 1→R | ||||
| T1 | Ad(CMDR)→CMAR | 总之就是在原先的微指令基础上,每一个的后面都加一个这个以取出下一条微指令 | ||
| T2 | M(MAR)→MDR | |||
| T3 | Ad(CMDR)→CMAR | |||
| T4 | (AC)+(MDR)→AC | |||
| T5 | Ad(CMDR)→CMAR | |||
| STA | T0 | Ad(IR)→MAR | ||
| 1→W | ||||
| T1 | Ad(CMDR)→CMAR | |||
| T2 | AC→MDR | |||
| T3 | Ad(CMDR)→CMAR | |||
| T4 | MDR→M(MAR) | |||
| T5 | Ad(CMDR)→CMAR | |||
| LDA | T0 | M(MAR)→MDR | ||
| 1→R | ||||
| T1 | Ad(CMDR)→CMAR | |||
| T2 | M(MAR)→MDR | |||
| T3 | Ad(CMDR)→CMAR | |||
| T4 | MDR→AC | |||
| T5 | Ad(CMDR)→CMAR | |||
| 转移类指令 | JMP | T0 | Ad(IR)→PC | |
| T1 | Ad(CMDR)→CMAR | |||
| BAN | T0 | A0·Ad(IR)+A0非·(PC)→PC | 这里仍是假设正负结果保存在ACC中了,实际上有专门的标志寄存器 | |
| T1 | Ad(CMDR)→CMAR | 
- 在上面的指令中,有20种微操作,38条微指令,不是38种,是取指阶段和执行阶段加起来的数目
 - 每种微操作采用水平型编码,每一种操作都是一位
 - 地址码是为了在控存内部寻址,因此地址码长度和控存的大小有关,如果只有38个微指令,那么地址码应该能表示这38个
 
(2) 确定微指令格式
① 微指令的编码方式
这里就是采用水平型的直接控制方式,就是操作码部分一位表示一个微操作
当然可以用其他办法
② 后续微指令的地址形成方式
- 由机器指令的操作码通过微地址形成部件形成,送到顺序逻辑
 - 由微指令的下地址字段直接给出,送到顺序逻辑
 
③ 微指令字长的确定
a. 初步确定
要确定控制字段和下地址字段分别多少位
- 由 20 个微操作,确定 操作控制字段 最少 20 位
 - 由 38 条微指令,确定微指令的 下地址字段至少为 6 位(25 = 32, 26 = 64)
 - 微指令字长 可取 20 + 6 = 26 位
 
微操作个数决定操作控制字段的长度,微指令的个数决定下地址的长度;但是微操作的个数和微指令的个数并没有严格的关系
这仅仅是一个简单的设计
Ad(CMDR)→CMAR的重复性问题
这里要注意,上面两个阶段总共有38条微指令,不是38种,是取指阶段和执行阶段加起来的数目
但是很多微指令的操作都是Ad(CMDR)→CMAR,但是不能将这些微指令都视为是一种微指令,因为微指令不仅仅包括操作控制部分,还包括下地址部分
有的Ad(CMDR)→CMAR的下地址是M,即取指阶段的首地址,比如说指令执行阶段的最后一条微指令的下地址就是M
有的下地址就是执行阶段的下一条,比如在LDA的执行阶段,T2的M(MAR)→MDR的下地址指向的就是T3的Ad(CMDR)→CMAR,而T3的Ad(CMDR)→CMAR的下地址指向的就是T4的MDR→M(MAR)
但还是有问题啊,每个机器指令的执行阶段的最后一个Ad(CMDR)→CMAR的下地址就是M呀,是完全一样的啊
我想了想,应该是这样,这些指令即使一样,但是也是在不同的位置存储的,看下面的图
可以看到,每个指令的执行微程序的最后一条都是这个Ad(CMDR)→CMAR,且下地址都是M
一个微程序都是存到一块的
这里联想到如何找到下一条微指令中有个 (CMAR)+1→CMAR 增亮器计数法,可能这种方法比较快吧
b. 简化
38 条微指令中有 19 条是关于后续微指令地址→CMAR
其中
- 有1条是 OP(IR)→微地址形成部件→CMAR,这是在取指阶段的最后一条微指令,因为要找到执行阶段微程序的首地址
 - 18条是Ad(CMDR)→CMAR
 
如果将Ad(CMDR)直接送到 控存的地址线,不经过CMAR,则省去了输至 CMAR 的时间,省去了 CMAR
同理,OP(IR)→微地址形成部件→CMAR也改为OP(IR)→微地址形成部件→控存地址线,可以省去19条微指令,2个微操作
则:
- 38 - 19 = 19,下地址字段最少取 5 位
 - 20 - 2 = 18,操作控制字段最少取 18 位
 
考虑留有一定的余量,取
- 操作控制字段为 18 → 24位
 - 下地址字段为 5 → 6位
 - 总共有30位
 
④ 省去了CMAR的控制单元结构

⑤ 定义微指令操作控制字段每一位的微操作

就是确定每一位对应什么操作,用表格的形式写出来,比如下面的例子
| 操作控制字段的位 | 微操作 | 
|---|---|
| 0 | PC→MAR | 
| 1 | 1→R | 
| 2 | M(MAR)→MDR | 
| 3 | (PC)+1→PC | 
| 4 | MDR→IR | 
| 10 | Ad(IR)→MAR | 
(3) 编写微指令码点

注意下地址的确定
                    
                




                
            
        
浙公网安备 33010602011771号