【README】
1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;
2.微指令:1条微指令就是多个bit位,如8个bit,每个bit位表示一种微操作;
一条机器指令对应一个微程序;
一个微程序由多条微指令组成;
一条微指令由多个微操作组成;
(因为微指令表示为多个bit位,如01000010,bit位=1表示微操作有效)
- 一个时钟周期或节拍执行一条微指令; 这也很好解释了执行一条机器指令需要多个时钟周期的原理;
3.微程序介绍,转自 Wikipedia
微指令(英语:microcode),又称微码,是在CISC结构下,执行一些功能复杂的指令时,所分解一系列相对简单的指令。相关的概念最早在1947年开始出现。
微指令的作用是将机器指令与相关的电路实现分离,这样一来机器指令可以更自由的进行设计与修改,而不用考虑到实际的电路架构(而组合逻辑设计就是硬件组合方式,电路复杂)。与其他方式比较起来,使用微指令架构可以在降低电路复杂度的同时,建构出复杂的多步骤机器指令。撰写微指令一般称为微程序设计(microprogramming),而特定架构下的处理器实现中,微指令有时会称为微程序(microprogram)。
现代的微指令通常由CPU工程师在设计阶段编写,并且存储在只读存储器(ROM, read-only-memory)或可编程逻辑数组(PLA, programmable logic array)中。然而有些机器会将微指令存储在静态随机存取存储器(SRAM)或是闪存(flash memory)中。它通常对普通程序员甚至是汇编语言程序员来说是不可见的,也是无法修改的。与机器指令不同的是,机器指令必须在一系列不同的处理器之间维持兼容性,而微指令只设计成在特定的电路架构下执行,成为特定处理器设计的一部分。
【1】微程序设计思想的产生
- 设计比较容易,修改也比较简单的控制器的设计方法——微程序设计;这种设计方式,非常适合指令集扩展;
【背景】
在指令执行过程中,不同节拍要发出不同的操作(或微操作);节拍间是有先后顺序的;
安排在不同的微操作,也是有先后顺序的;每个节拍发出的控制命令实际上就是一个电信号或几个电信号(如果微操作命令可以并行操作的话);由这些电信号去控制响应的部件进行操作;
1)微程序的设计思想定义(也可见本文开始部分的wikipedia内容):微操作命令组合为1条微指令,每个节拍对应一条微指令,多个节拍对应多条微指令,多条微指令就构成微程序;
【例】微指令bit位的含义:(1条微指令就是多个bit位,如8个bit,每个bit位表示一种微操作)
微指令 10100000 指的是:2个1的位置表示在这个节拍中,相对应的两个微操作,它的控制信号要在这个节拍中产生;并且由这两个1去控制相应部件去进行操作;(微指令中每个bit位表示了一种微操作命令);
微指令间也是有先后顺序的;这些微指令构成了微程序,由微程序去控制去完成一条指令的执行过程;
2)机器指令,微程序,微指令,微操作四者间的关系:一条机器指令对应一个微程序,一个微程序对应多条微指令;一条微指令包含一个或多个微操作命令(控制信号);
- 2.1)微指令间的先后顺序:就是微操作在执行过程中的先后顺序;
- 2.2)存入ROM:把这些微指令或微程序(多个bit位)存入ROM只读存储器中;执行的时候,把微指令从ROM中读出,根据读出的微指令中有效的控制信号的个数(bit=1的个数)(或有效控制信号的位置),发出相应的控制信号,让计算机执行相应的操作;这种方式称为存储逻辑的方式;把逻辑信号存储在存储器中,从存储器中读出微指令,由这些信号控制相关的部件进行操作;
【2】微程序控制单元框图及工作原理
【2.1】机器指令对应的微程序
内存地址M:保存了取指令所需要的微操作以及微操作间的先后顺序,如微指令bit位;
即取指微程序保存在以控制存储器M地址开头的存储单元中;
M,M+1,M+2 3个存储单元保存了取指微程序,因为取指周期需要3个节拍(时钟周期)来完成;每个节拍对应一条微指令,完成了那个节拍里产生控制命令的工作;
【2.2】微程序控制单元的基本框图
控制存储器:存储微指令的存储器;
CMAR:控制存储器地址寄存器,Control Memory Address Register;(区别于 MAR,存储器地址寄存器)
CMDR:控制存储器数据寄存器,Control Memory Data Register;(区别于 MDR,存储器数据寄存器)
0)微程序,微操作命令(微指令)都保存在控制存储器(非主存)中(它是一个ROM只读存储器);从控制存储器中取出微指令,就需要知道微指令的地址;微指令地址保存在CMAR寄存器中
1)微指令基本格式:操作控制bit位 + 顺序控制bit位;如:
0100 | 0010 |
操作控制 | 顺序控制 |
- 1.1)操作控制:由一系列的0和1组成;每个bit位都代表了微操作控制信号;为1,则该微操作有效,且该微操作对应的部件去做操作;
- 1.2)顺序控制:给出了下一条微指令的地址;
2)微程序执行步骤:
- 步骤1:指令寄存器IR的操作码部分(机器指令的操作码)送入微地址形成部件(进行译码);该部件形成微程序(微指令)在控制存储器的地址;
- 步骤2:微程序地址送入顺序逻辑,以便在多个微指令地址当中进行选择;选择一个正确地址送入控制存储器地址寄存器CMAR;
- 步骤3:控制存储器地址寄存器CMAR的微指令地址经过地址译码,送入控制存储器;
- 步骤4:从控制存储器中读出微指令到CMDR(控制存储器数据寄存器)中;这时CMDR就保存了一条微指令;
- 步骤5:CMDR寄存器把微指令的下一地址送入顺序逻辑;以便顺序逻辑选择下一条微指令地址;(顺序逻辑或者存储了微程序首地址,或者存储了下一条微指令地址)
- 步骤6:CMDR的操作控制部分(控制信号),送入CPU内部和系统总线;
LDA微程序:取数机器指令对应的微程序;(把数据从内存取出,送入寄存器)
STA微程序:存数机器指令对应的微程序;(把寄存器中的数据送入内存)
3)微程序中多个微指令全部的微操作执行完成后,就会完成某一个特定操作,如取指操作,间址操作,执行操作或中断周期操作;
M地址的微指令的下地址部分(顺序控制部分)是M+1;
M+1地址的微指令的下地址部分(顺序控制部分)是M+2;
M+2地址的微指令的下地址部分,情况有所不同,其下一条微指令地址未知;看下面的例子;
【例】假设取指之后,马上执行;
以上取指周期的3条微指令,完成了取指操作;但这条指令是什么指令,要经过指令译码才知道;
指令译码后才知道去执行哪一个微程序(或者加法或者写数);这个过程是由微地址形成部件来做的;
微地址形成部件根据指令的操作码,形成这条指令在执行阶段所属微程序在控制存储器中的存储单元地址;
【2.3】 微程序控制单元工作原理
【例】 假设主存中保存了4条用户程序,看下微程序如何执行?
【2.3.1】取指微程序工作原理
取指微程序(注意是取指,还没有到执行阶段) ,步骤如下:
步骤 | 取指微指令 | 描述 |
1 | M->CMAR | 取指微程序首地址地址M(第一条微指令地址)送入CMAR; |
2 | CM(CMAR)->CMDR | 从控存中CMAR指定地址上读取微指令到CMDR; 微指令bit位:100…001 对应2个微操作为:PC->MAR 和 1 -> R; |
3 | AD(CMDR) ->CMAR | 把CMDR中的下地址部分送入CMAR; 形成下一条微指令地址M+1; |
4 | CM(CMAR)->CMDR | 从控存中CMAR指定地址M+1上读取微指令到CMDR; 微指令bit位:010…010 对应2个微操作为:M(MAR)->MDR (PC)+1 -> PC; |
5 | AD(CMDR) ->CMAR | 把CMDR中的下地址部分送入CMAR; 形成下一条微指令地址M+2; |
6 | CM(CMAR)->CMDR | 从控存中CMAR指定地址M+2上读取微指令到CMDR; 微指令bit位:001…000 对应1个微操作为:M(MDR)->IR; |
7 | 由CMDR发出命令读取内地地址为XXX的指令; |
最后一条微指令的下地址部分是XXX;说明下一条微指令的地址不能由下地址给出,而是进入间址或进入执行阶段;
如果进入到执行阶段,则根据IR中的操作码opcode通过微地址形成部件来形成下一条微指令在控制存储器的地址;
【2.3.2】执行LDA微程序工作原理
LDA取数(送到ACC累加器)微程序的步骤如下:
步骤 | 微指令 | 描述 |
1 | OP(IR) -> 微地址形成部件-> CMAR | 把IR存储的指令的操作数形式地址部分送入CMAR |
2 | CM(CMAR)->CMDR | 从控存读取微指令到CMDR; 微指令bit:0001…001 对应2个微操作:Ad(IR)->MAR 1 -> R; |
3 | AD(CMDR) ->CMAR | 把CMDR中的下地址部分P+1送入CMAR; 形成下一条微指令地址; |
4 | CM(CMAR)->CMDR | 把下一条微指令取出并送入到CMDR; 微指令bit:0100…000 对应1个微操作:M(MAR)->MDR; |
5 | AD(CMDR) ->CMAR | 把CMDR中的下地址部分P+2送入CMAR; 形成下一条微指令地址; |
6 | CM(CMAR)->CMDR | 把下一条微指令取出并送入到CMDR; 微指令bit:0000001…000 对应1个微操作:MDR-> AC(acc寄存器); |
7 | AD(CMDR) ->CMAR | 把CMDR中的下地址部分M送入CMAR; 形成下一条微指令地址; 地址M是取指微程序首地址; |
【2.3.3】取指阶段:执行取指微程序
每条指令的执行过程,都需要执行取指微程序,执行微程序;循环往复;
取指微程序把微指令从控制存储器中取出;执行微程序完成了这条微指令所需要的全部微操作命令;
1)微指令的格式: 操作控制(bit位)_顺序控制;
- 微操作是由微指令的操作控制部分给定的;
- 微操作顺序是由微指令的顺序控制部分给定的(下一条微指令的地址);
2)微指令的取指过程:实际上是把这些微指令从控制存储器中读出来;
3)微程序的执行过程:根据微指令的bit位的有效微操作(bit=1),给出相应控制信号,做相应操作就可以了;
4)用微程序设计控制器有2个关键问题:
- 问题1: 微指令的操作控制字段如何形成微操作命令;
- 问题2: 微指令的后续地址(下一条微指令地址)如何形成?;
【3】微指令的编码方式(控制方式)
【3.1】直接编码方式(重点)
直接编码(直接控制)方式:在微指令的操作控制字段中,每一位都代表一个微操作命令;某位为1表示该控制信号有效;
【3.2】字段直接编码方式(显式编码)
字段直接编码方式(显式编码): 把微操作分为若干组(段),然后组内编码(每组或段译码后发出控制信号);这种方式缩短了微指令字长,但增加了译码时间;
上图有3组,组内控制信号互斥,组间不互斥,可以并行执行;
【3.3】字段间接编码方式(隐式编码)
字段间接编码方式(隐式编码):本组的控制信号还依赖于其他组的控制信号;
【4】微指令的下地址如何形成
1)微指令序列地址的形成:
- 方法1: 微指令的下地址给出;
- 方法2: 根据机器指令的操作码形成(根据操作码获取微指令);
- 方法3: 增量计数器;
- 方法4: 分支转移(微指令的转移);
- 方法5:通过测试网络;
- 方法6: 由硬件产生微程序入口地址;
【4.7】后续微指令地址形成方式及原理图
步骤1:多路选择部件选择下一条微指令地址;来源有5种,如下:
- 1)上一条微指令的下地址;
- 2)机器指令的操作码部分(注意是机器指令而不是微指令)经过微地址形成部件生成微指令地址;
- 3)CMAR加1;
- 4)硬件产生的微程序入口地址;
- 5)转移指令的分支逻辑;
步骤2:多路选择部件生成下一条微指令地址,送入CMAR;
步骤3:CMAR把微指令地址送入地址译码器;经过译码把微指令地址送入控制存储器;
步骤4:把CMAR指定的控制存储器存储单元的微指令读取到CMDR寄存器中;
步骤5:CMDR根据微指令的操作控制部分(01bit位)发出控制信号(微操作控制信号),控制计算机部件完成操作;
注意:是CMDR控制存储器数据寄存器根据微指令的操作码bit位(bit=1)发出控制信号,以完成微指令的微操作;
【5】微指令格式
微指令格式:
- 1)水平型微指令:一次能定义并执行多个并行操作(重点);
- 2)垂直型微指令:一次只能定义一个操作;由微操作地址码字段规定微指令的功能;
水平型微指令与垂直型微指令比较:
【6】静态微程序设计和动态微程序设计
【7】毫微程序设计
静态微程序设计:微程序无需改变,采用ROM随机只读存储器;(指令集无法修改);
动态微程序设计:可以修改或扩展计算机系统的指令集,如增加新指令;有利于指令仿真,采用EPROM;
【8】串行微程序控制和并行微程序控制(微指令流水线-非常重要)
串行微程序控制和并行微程序控制:
串行微程序控制: 一次只能执行一条微指令;
并行微程序控制: 微程序流水线,1个指令周期可以执行多个微指令(微指令流水线技术,非常重要);
【9】微程序设计举例
【9.1】机器指令对应的微操作
【9.1.1】取指阶段微操作分析
取指阶段的3条微指令:
时钟周期 | 微指令对应的微操作命令 |
T0 | PC->MAR 1->R |
T1 | M(MAR) -> MDR (PC)+1 -> PC |
T2 | MDR -> IR OP(IR) -> 微地址形成部件 |
【9.1.2】取指阶段微操作及节拍安排
时钟周期 | 微指令对应的微操作命令 | 微指令地址 |
T0 | PC->MAR 1->R | 微程序的首地址(微指令),由硬件PC给出; 执行微指令,即2个微操作; 在执行的同时,把下一条微指令读到CDMR; |
T1 | Ad(CDMR) -> CMAR | 把CMDR中的微指令的下地址部分送入 CMAR (先保存下一条微指令地址,然后再执行本条微指令,即T2) |
T2 | M(MAR) -> MDR (PC)+1 -> PC | 执行微指令,即2个微操作; 在执行的同时,把下一条微指令读到CDMR; |
T3 | Ad(CMDR) -> CMAR | 把CMDR中的微指令的下地址部分送入 CMAR (先保存下一条微指令地址,然后再执行本条微指令, 即T4) |
T4 | MDR -> IR OP(IR) -> 微地址形成部件 | 执行微指令,即2个微操作; 在执行的同时,把下一条微指令读到CDMR; |
T5 | OP(IR)-> 微地址形成部件 -> CMAR | 进行到执行阶段,我们要执行的微指令在控存中的地址单元是什么; IR中的指令操作码部分送给微地址形成部件,由微地址形成部件确认这条指令是微指令集的哪条指令? |
【9.1.3】执行阶段的微操作及节拍安排
需要考虑:执行阶段的微程序的最后一条微指令的下地址是M(取指微指令,或取指微程序入口地址);
Ad(CMDR) -> CMAR :是为了取下一条微指令(非常重要);
ADD :加法指令;
STA: 存数指令;
LDA: 取数指令;
小结:控制器CU在 T0 T2 T4 执行微指令(微操作)的同时在读取下一条微指令(下一条微指令地址由蓝色指令给出,T1 T3 T5);
【小结】
以上10条指令,共计20种微操作,共计有38条微指令;
如果采用水平编码,20种微操作就需要20个bit;
而微指令的地址码大小(下地址部分)需要寻址,所以与控制存储器的大小相关;我们微指令有38条,则控制存储器38个单元就够了;
【9.2】那应该如何确定微指令的格式呢?
2.1)微指令的编码方式:
- 采用直接编码;1个bit位代表一种微操作;
2.2)后续微指令的地址形成方式:
- 由机器指令的操作码通过微地址形成部件给出;
- 由微指令的下地址字段给出;
2.3)微指令字长 :
- 由20个微操作,确定操作控制字段,最少20位;因为每个bit位代表一种操作控制信号;
- 由38条微指令:需要寻址,所以微指令的下地址字段需要6位;
- 所以微指令字长为 20+6 = 26个bit位;
2.4)微指令字长的确定
38条微指令中,关于生成后续(下一条)微指令地址的微指令,即 Ad(CMDR)-> CMAR 有19条;
若把 Ad(CMDR) 直接送入控制存储器的地址线,省去了送入 CMAR的时间,省去了 CMAR ;
同理: OP(IR) -> 微地址形成部件 -> 控存地址线;
这样可以省去19条微指令,2条微操作;
所以 38-19=19条微指令(5位可以寻址) ; 20-2-=18条微操作;
虽然只有18个操作控制信号,19条微指令(5位bit寻址即可),但我们可以进行扩展;
如 18位扩展到24位操作控制信号,5位扩展到6位微指令地址寻址,共计30位;剩余的操作控制信号和微指令留给未来使用;
【9.3】 编写微指令码点
1)取指阶段各bit表示:
- 取指阶段00(第1个节拍或时钟周期):0号bit的微操作表示PC-> MAR ;1号bit的微操作表示 1 -> R ;(所以0号和1号微操作的bit位等于1)
- 取指阶段01(第2个节拍或时钟周期):2号bit的微操作表示 M(MAR) -> MDR ; 3号bit的微操作表示 (PC) + 1 -> PC ;
- 取指阶段10(第3个节拍或时钟周期):4号bit的微操作表示 MDR -> IR ;
2)执行指令:
CLA : 清零;
COM: 取反;
ADD : 加法指令包括3个微指令;
- 微指令1(2个微操作):IR的操作数有效地址送入MAR ;并发出读信号给主存(行10 1号bit和10号bit等于1);
- 微指令2(1个微操作):从MAR指定的内存单元读出操作数,并送入MDR(行11 2号bit等于1);
- 微指令3(1个微操作): 将两个操作数相加,结果存入ACC寄存器;
LDA:把数据从内存取出,送入寄存器;
- 微指令1:IR中指令的地址码部分送入MAR; 并发出读信号给主存;(行16 1号bit和10号bit等于1)
- 微指令2: 把内存单元数据取出,送入MDR;所以2号微指令的bit位等于1;(行17 1号bit等于1)
- 微指令3: 把MDR数据送入ACC寄存器; 所以某号微指令的bit位等于1;