微程序控制器
废话
CPU执行一条机器指令(比如
ADD R1, R2
)是一个非常复杂的过程,包含多个小步骤(微操作)。硬布线控制器像是现场即兴发挥,靠一堆复杂的电路逻辑来实时决定下一步干嘛;而微程序控制器则是严格按照剧本拍戏,这个剧本就是微程序。
基本概念(假的):
机器指令 | 一场戏 | 比如“打斗戏”、“文戏”。这就是我们写的程序(如 ADD , MOV )。 |
微操作 | 一个具体的武打动作 | 比如“出拳”、“踢腿”。这是CPU最基本的操作,如“打开PC到MAR的门”、“内存读信号”。 |
微命令 | 动作指令 | 导演喊“出拳!”,这个口令就是微命令,它导致演员做出“出拳”的微操作。一一对应,可以理解为同一个事物的两种表述(信号 vs 动作)。 |
微指令 | 一个分镜头剧本 | 一个分镜头里可能同时要求好几个动作,比如“演员A出拳,演员B后仰”。一条微指令包含多个可以同时执行的微命令(并行)。 |
微程序 | 整场戏的完整剧本 | 由一连串的分镜头剧本(微指令)组成。一条机器指令(一场戏)对应一个微程序(一个完整剧本)。 |
控制存储器(CM) | 剧本库 | 一个存放所有戏(所有机器指令)的完整剧本(微程序)的仓库。CPU出厂前就写好了(ROM)。 |
微地址寄存器(CMAR) | 当前镜头编号 | 指示现在要拍的是剧本库里的第几个分镜头。 |
微指令寄存器(CMDR) | 当前正在拍的分镜头剧本 | 从剧本库(CM)里根据编号(CMAR)取出来的具体内容。 |
顺序逻辑/地址形成 | 导演和场记 | 负责决定下一个要拍哪个分镜头。根据当前镜头的结果、演员状态(标志位)等来决定。 |
注:指令 > 微程序 > 微指令 > 微命令(微操作)
基本结构(真的):
工作流程(真的假的):
- 执行取指令的公共操作(机器运行时自动将CM中的取指微程序入口地址送到CMAR,并从CM中读出下相应微指令送入CMDR,CMDR的控制字段产生有关微命令执行取指公共操作。取指微程序执行完后,主存中取出的机器指令已存入IR。)
- 导演行动:开机!所有戏的开头都一样。导演大喊:"场记,准备拍通用开场镜头!" 于是,CMAR(当前镜头编号)被设置为 0(通用开场剧本的起始位置)。
- 场记行动:场记跑到剧本库(CM)的0号位置,取出第一个分镜头剧本(微指令),递给演员们(放入CMDR)。
- 演员表演:所有演员按照这个分镜头剧本里的指示,并行地执行一系列基础动作(微命令)
- 机器指令的OP字段经微地址形成部件,产生该机器指令地址对应的入口地址并送入CMAR。
- 导演研判:主演(IR)拿到了剧本《ADD R1, R2》。导演一看剧本封面上的类型码(操作码OP),发现是"武打戏(ADD指令)"。
- 查找剧本:导演(微地址形成部件)翻看总目录,迅速找到"武打戏专用完整剧本(ADD指令的微程序)"存放在剧本库(CM)里的起始地址,比如50号位置。
- 下达指令:导演对场记说:"开场拍完了,现在转场,去拍50号位置的武打戏!" 于是,CMAR(当前镜头编号)被更新为 50。
- 根据地址从控制存储器中逐条取出微指令并执行,每条微指令都可以产生下一条微指令地址。
- 正式开拍:场记根据新的镜头编号(CMAR=50),从剧本库(CM)中取出"武打戏"的第一个分镜头剧本(微指令),交给演员(放入CMDR)。
- 精彩表演:演员们执行这个分镜头里的所有武打动作(微命令)。
- 决定下一镜:每个分镜头剧本的最后,都会写明下一个镜头怎么拍(下地址形成方式)
- 一条机器指令对应的微程序执行完成后,下一条微指令又回到取值微程序地址入口,重复第一步。
- 杀青转场:这条"武打戏"(ADD指令)的最后一个分镜头拍完。在这个镜头的剧本里写着:"本戏杀青,所有人员回到0号场地,准备下一场戏的通用开场。"
- 循环开始:CMAR(镜头编号)被重置为 0。
- 流程重启:控制器立刻回到步骤①,开始为执行下一条机器指令(下一场戏)拍摄"通用开场镜头"。
下地址形成方式
1. 断定方式(下地址字段直接指出)
在当前微指令中,专门设置一个 下地址
字段,这个字段的值直接就是下一条要执行的微指令的地址。
2. 增量计数器法(CMAR + 1 -> CMAR)
默认情况下,微指令在控制存储器(CM)中是顺序存放的。执行完一条微指令后,让微地址寄存器(CMAR)自动加1,指向下一条相邻的微指令。
3. 分支转移(条件转移)
根据某个条件(如运算结果是否为0、是否有溢出等)来决定下一条微指令的地址。
4. 由机器指令的操作码形成
在取指周期结束后,机器指令的操作码(OP)被送入一个叫做 “微地址形成部件” 的电路。这个电路实际上是一个译码器,它将操作码翻译成对应指令的微程序在CM中的起始地址(入口地址)。
5. 由硬件产生微程序入口地址
在CPU启动或响应外部紧急事件时,由专门的硬件电路直接产生一个固定的微程序入口地址。
微指令的格式
1. 水平型微指令
一条微指令能定义多个可【并行】的微命令(一对多)
- 优点:微程序短,执行速度快
- 缺点:微指令长,编写微程序较麻烦
1.1. 直接编码(直接控制)方式
无须进行译码,微指令的操作控制字段中每一位都代表一个微命令。(不用附加1位空操作,全0时即为空操作)
- 优点:简单、直观,执行速度快,操作并行性好(无需译码,效率最高)
- 缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大
1.2. 字段直接编码方式
将微指令的控制字段分成若干 “段”,每段经译码后发出控制信号。
分段原则:
- 互斥性微命令分在同一段内,相容性微命令分在不同段内
- 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间
- 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。(因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作)
1.3. 字段间接编码方式
一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码
- 优点:可进一步缩短微指令字长
- 缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段
2. 垂直型微指令
一条微指令只能定义【一个】微命令,由微操作码字段规定具体功能(一对一)
- 优点:微指令短、简单、规整,便于编写微程序
- 缺点:微程序长,执行速度慢,工作效率低
3. 混合型微指令
在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。