发出各种控制命令或者是微指令,控制整个计算机系统,包括CPU内部的各个部件能够协调,稳定,正确,连续的运行。
(1)指令寄存器。
来自于指令寄存器的指令的操作码部分。控制单元要对操作码部分进行译码。指出这条指令要做什么操作,以便在指令的执行阶段对不同的指令发出不同的控制信号。
(2)时钟信号。
控制单元在时钟信号的控制下进行工作。各种微操作命令在时钟信号控制下,在指定的时间点被发出,一个时钟脉冲,可以发出一个或者是一组可以并行执行的微操作命令。
(3)各种标志,
如条件转移指令中上一条指令运行结果的标志,就是本条指令是否发生跳转的依据。
(4)外来信号,通过系统总线,CPU外部的控制信号可以进入到控制单元。如中断请求信号和总线请求信号。
输出信号:
(1)CPU内部控制信号,控制CPU内部部件执行,如在寄存器和寄存器间数据传输,对PC值进行修改,运算完成各种运算的控制信号。
(2)送到系统总线上的控制信号,如,控制总线,存储器,外部IO设备的操作。
不采用CPU内部总线的方式:
不采用CPU内部总线,也就是CPU中各个部件分散连接。下面以ADD @X为例,这个加法指令采用的是间接寻址。
(1)取值周期
C1: 将MAR中内容送出,送给地址线,同时CU发出读命令,高速CPU进行读操作
C2: 取回来的指令经过C2控制电路放回MDR
C3: 由MDR把取出的指令经过C3送入IR
C4: 将指令的操作码部分通过C4送给CU进行译码
最后进行PC+1,C0-C4 五个控制信号都是由CU产生的。
(2)间址周期
因为采用的是间址寻址,所以X并不是操作数的地址,操作的地址目前还在内存中,保存在地址为X的单元中。
指令已经被取回,在MDR和IR都保存了刚刚取回的指令,假设为了获得操作数地址,形式地址从MDR中获得,当然也可以从IR中取得。
C5: 控制MDR将MDR中指令的地址码部分送给MAR
C1: 再将MDR内容送给地址线。
C2: 控制单元发出读命令,读出操作数的物理地址,将读出的操作数地址送入MDR。此时MDR中保存了操作数地址
C3: 将MDR中保存的地址送入IR的地址码部分。
(3)执行周期
C1: 将MAR内容送给地址总线,同时CU发出读命令
C3: 将取回的操作数送给MDR。
C7,C6: 将取回的操作数和ACC中的被加数送入ALU。同时CU发出加法控制信号
C8: 将加法的结果保存到ACC。
采用CPU内部总线方式:
ALU是一个组合电路,为了能够保存参加运算的两个操作数和输出的运算结果,在ALU两个输入端要加上寄存器,在他的输出端也要加上寄存器,以对输入输出的数据进行保存。输入可以使用AC作为一位寄存器,所以上图中增加了Y作为另一个输入寄存器和Z作为输出寄存器。
下面继续以ADD @X为例,分析这种采用内部总线的CPU中,间址加法的各个周期CU需要产生哪些控制信号。
取指周期:
(1) PC将通过控制信号将PC中的值送给CPU内部总线。
(2) 通过MAR输入控制信号,把PC值送给MAR,此时MAR中保存的就是下一条要执行的指令的地址。
(3) MAR将地址送给外部地址线。
(4) CU发出读命令,读命令送给存储器。
(5) 读出的指令通过数据线送到MDR,此时MDR保存的就是这条间接寻址的加法指令。
(6) 将MDR中的指令送到CPU内部总线。
(7) 通过CPU内部总线将MDR内容送给IR。
(8) 将IR中的指令的操作码部分通过CPU内部总线送给CU进行译码。
(9) 将PC值加1,指出下一条要取出的指令的地址。
间址周期:
(1) 把MDR中指令的形式地址通过CPU内部总线送给MAR。
(2) MAR把地址送给外部地址线访问内存。同时CU发出读操作给主存。
(3) 将读出的操作数的物理地址通过数据线送给MDR中。
(4) 把MDR中的数据通过CPU内部总线送给IR的地址码部分。此时IR地址码部分就是参加运算的操作数的物理地址。
执行周期:
(1) 把MDR中的操作数物理地址通过CPU内部总线送给MAR。
(2) 把MAR中的地址送给外部地址总线,同时CU发出读信号。
(3) 通过数据线把读出的操作数送给MDR。
(4) 把操作数MDR通过CPU内部总线送给Y。
(5) 把Y中的数据通过CPU内部总线送给ALU。
(6) 把AC中的数据通过CPU内部总线送给ALU。
(7) CU发出控制信号,控制ALU做加法操作
(8) 把加法结果送入寄存器Z中。
(9) 把Z中的结果通过CPU内部总线送给ACC寄存器。
机器周期:
(1) 机器周期的概念:
所有指令执行过程中的一个基准时间。
(2) 确定机器周期需要考虑的因素
每条执行执行的步骤,每个步骤需要多长时间,然后将各个步骤进行划分,放到不同的机器周期中。
(3) 基准时间的确定
以完成最复杂指令功能的时间为准,也就是在指令执行过程中,从取指,间址,执行,到中断,这里面涉及的微操作中最复杂的微操作所需要的时间作为基准。实际上在指令解释过程中,最复杂的微操作通常都是访存操作,所以通常以访问一次存储器的时间为准。
如果指令字长 = 机器存储字长,则取值周期 = 机器周期。
时钟周期(节拍):
一个机器周期中完成若干个微操作,每个微操作都需要一定的时间,有的微操作是在一个时钟周期中完成的,有的时钟周期会花费多个微操作,如,对内存的访问。所以把一个机器周期可以划分为多个时钟周期,由这些时钟周期控制在一个机器周期中的微操作之间在时间上的先后顺序。所以始终周期是控制计算机操作的最小时间单位,所以在计算机中时间并不是连续的,而是离散的。用时钟周期控制产生一个或者多个微操作命令
如上图 ,一个大的指令周期被划分为多个机器周期,一个机器周期又分成了多个时钟周期,时钟周期是最小时间单位,一个时钟周期可以发出一个或几个微操作命令。
多个时序系统:
指令周期,机器周期,时钟周期(节拍),构成多级时序系统。一个指令周期包含若干个机器周期,一个机器周期包含若干个时钟周期。
一个指令周期中的机器周期可以包含相同数量的时钟周期,也可以是不同数量的时钟周期。
机器主频f越快机器的速度也越快,这个判断方法是由前提条件的:在一个指令周期中包含相同多个机器周期,机器周期所含时钟周期数相同的情况下,两台机器的平均指令执行速度之比等于机器主频比:
机器执行速度不仅和主频有关,还与一个指令周期中包含了多少个机器周期有关,一个机器周期中包含了多少个时钟周期有关。
同步控制方式:
这种方式使用的比较多,任意一个微操作均由统计基准时标的时序信号控制,在指令的节拍下产生。
(1) 采用定长的机器周期
每个机器周期中含有相同数量的节拍数,所以以最长的微操作序列和最复杂的微操作作为标准。
这种划分方式在某些阶段会造成时间的浪费,如在取址时需要4个节拍,但是在操作阶段一个节拍就可以结束。如果采用这种方式,执行阶段就会有3个节拍被浪费。
(2) 采用不定长的机器周期
如果指令的指令执行过程比较复杂,执行时间比较长,那么执行指令阶段包含的节拍数也可以比较多:
(3) 采用中央控制和局部控制相结合的方式
如果执行周期比较长,我们再进行机器周期设定的时候,如果按照执行周期的长度进行设置,就会有大量的时间被浪费。我们可以把中央控制和局部控制相结合,一部分操作由中央控制节拍进行控制,延长的部分由局部控制节拍进行控制。中央控制和局部控制的节拍宽度相等。
这种方式没有基准时标信号,没有固定的周期节拍和严格的时钟周期同步,采用应答方式。一个微操作完成后会给出应答信号,告诉下一个微操作可以开始。
联合控制:
同步控制和异步控制相结合,把不同的指令的微操作大部分采用同步控制方式,在特殊情况下,即有些微操作完成时间很难确定,这种情况下可以采用异步控制。如执行IO指令很难确定完成时间。
人工控制方式:
为了调试方便设置的,如Reset,连续单条指令执行转换开关,符合条件停机开关等
(1)CU外特:
CLK(机器主频),节拍发生器:CU要发出各种控制命令,控制信号,这些控制信号之间是有先后关系的,每一个控制信号他的发出都是有给定的时间点,这种先后关系和时间点的确定,是由节拍信号控制的,因此,一定有一个节拍发生器,产生的节拍作为CU的输入,节拍发生器外端接的是计算机的主频(主时钟),输出的是T0……Tm个节拍信号。在每个节拍信号的起始端,CU产生给定的命令。
操作译码器: CU到底要产生什么命令,和现在正在执行的命令有直接关系,指令保存在IR寄存器中,IR的操作码部分要经过译码以后才能够确定当前正在执行的是那条指令,假设指令很规格,操作码为n位,经过操作码译码以后,n位操作码可以译出2n个结果,操作码的输出端(0-2-1)针对每一条指令译码结果只有一条线有效,这条线就指示了这条命令要做什么操作。
标志: CU要发出什么控制信号还和状态标志有关,如条件跳转指令,就和跳转条件有关。
C0-Ck: 在一系列的输入的作用下,CU在给定的时钟周期就会给出指定的控制信号,在每一个时钟周期(节拍),C0-Ck控制信号就会有一个或者几个有效,如果是几个同时有效,表示在这一个节拍中,这几个控制信号可以并行进行操作,他们之间没有时间的先后顺序,或者是几个信号的操作时间都非常短,有一定的现有顺序,但是在一个节拍中能够实现。
节拍信号: 下面再看一下节拍信号:
CLK是系统时钟,是计算机中最基本的时间单位。节拍信号就是在时钟的控制下产生的。节拍信号的宽度(高电平)就是一个时钟周期。上图中,在第1,2,3,4时钟周期处分别产生。
T0,T1,T2,T3节拍,由这些节拍信号控制每一个微操作命令发出的时间。如果一个指令周期包含了两个机器周期(取值周期,执行周期),我们给出的图中,一个机器周期包括了四个节拍。
一个机器周期包含多少节拍与这个机器周期中需要产生的控制信号的数量以及控制信号的复杂程度、控制信号之间是否能够并行有直接关系。
(2)微操作的节拍安排
已经有了机器周期和节拍,我们要把微操作按照执行的时间先后顺序安排在给定的节拍中,由这些控制命令控制计算机各个组成部分能够协调、稳定、正确的执行。
下面假设采用同步控制,即由一个统一的时钟信号控制各个部件之间的交互和各个控制信号的产生,并且假设在下面要设计的机器中,一个机器周期包含3个节拍。假设CPU内部采用的是非总线的方式。
上图中给出了CPU的结构,并且给出了若干个控制信号,如蓝色部分C0-C12共13个控制信号,在这里,所有的控制信号都是由CU在时钟、指令操作码、标志作为输入的情况下,在给定的节拍产生的,不仅仅C0-C12是由CU产生,CU也产生了ALU右侧的控制信号,由CU产生的信号控制ALU做相应的算数运算或者是逻辑运算操作。另外CU还会对标志位进行修改,根据运算结果修改控制标志位。
我们现在要把指令执行过程中,也就是寻址周期、间址周期,执行周期和中断周期,控制器需要发出的各种控制命令安排到不同周期 中的各个节拍上,某一个控制命令到底要安排到哪一个节拍上,下面看看如何解决?
安排微操作时序的原则:
原则1:微操作的先后顺序不得随意修改,如:只有把指令取到IR后,才能把指令操作码部分送给CU进行译码。
原则2:被控对象(微操作命令要控制的部件)如果是不同的,尽量安排在一个节拍内,实际上这个原则可以理解为:可以并行的微操作,微操作之间没有先后顺序,这样的微操作就尽可能安排在同一个节拍中。
原则3:如果微操作占用的时间非常短,就尽可能安排在一个节拍中,并且允许有先后顺序,如 一个微操作在节拍的上升点进行操作,另一个微操作在节拍的下降点进行操作。
取值周期微操作的节拍安排:
上面提到过,假设在我们的机器中,每个机器周期包含了三个节拍。
周期 | 操作 | 根据原则 |
---|---|---|
T0 | PC——>MAR, 1——>R:发出读内存命令 | 原则2 |
T1 | M——>MDR:取数据,PC + 1 ——> PC | 原则2 |
T2 | MDR ——> IR,OP(IR) ——> ID:将操作码送到译码器 | 原则3 |
间址周期微操作的节拍安排:
周期 | 操作 |
---|---|
T0 | Ad(IR)——>MAR:将IR的地址码部分送给MAR, 1——>IR:发出读命令 |
T1 | M——>MDR:讲数据从内存中取出 |
T2 | MDR ——> Ad(IR):将MDR中的数据送到IR地址码部分 |
执行周期微操作的节拍安排:
执行周期,不同的指令要做的微操作是不一样的,下面对十条指令分别进行分析。
CLA:对累加器进行清零,这个操作非常简单,使用一个节拍就能够完成。即,把0送入到累加器,但是执行周期给了三个节拍,可以把这个操作安排在三个节拍中的任意一个,这里假设安排在T2.
周期 | 操作 |
---|---|
T0 | 什么都不做(下面什么都不做,空白给出) |
T1 | 什么都不做 |
T2 | 0——>ACC:把0送入累加器 |
COM:把ACC中的内容按位取反,再把结果存放到ACC
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | 累加器的非——>累加器 |
SHR:算数右移操作,把ACC中保存的内容右移,符号位保留(写回即可)。
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | L(ACC)——>R(ACC):把ACC左侧内容写到右侧, AC0——>AC0:符号位写回 |
CSL:循环左移
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | R(ACC)——>L(ACC):把ACC右侧内容写到左侧, AC0——>ACn |
STP:停机指令
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | 0——>G:停机标志置0 |
ADD X:把X内存单元中保存的内容和累加器中的内容相加,结果保存到累加器中。
周期 | 操作 |
---|---|
T0 | Ad(IR)——>MAR:把IR地址码部分送给MAR, 1——>R:发出读命令告知存储器要做读操作。 |
T1 | M——>MDR:将数据从内存中取出送入MDR |
T2 | (AC)+ (MDR)——>AC:AC内容和MDR内容相加,结果送入AC |
STA X:把累加器中的数据存储到给定的存储单元
周期 | 操作 |
---|---|
T0 | Ad(IR)——>MAR:把IR地址码部分送给MAR, 1——>W:发出写命令告知存储器要做写操作 |
T1 | AC——>MDR:为了将数据送给存储器,AC中数据要先送给MDR |
T2 | MDR——>M:将数据写入存储器 |
LDA X:把地址为X的内存单元中的内容取出保存在累加器中
周期 | 操作 |
---|---|
T0 | Ad(IR)——>MAR:把IR地址码部分送给MAR,1——>R:发出读命令告知存储器要做读操作。 |
T1 | M——>MDR:将数据从内存中取出送入MDR |
T2 | MDR——>ACC:MDR内容送入到累加器 |
JMP:跳转到给定的地址,不需要访存,地址就是X。
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | Ad(IR)——> PC:把指令的地址码部分送给PC |
BAN X:条件转移指令,如果上一条指令计算结果是小于0的,就跳转,大于继续顺序执行。这里假设上一条指令的结果保存在累加器中。
周期 | 操作 |
---|---|
T0 | |
T1 | |
T2 | 如果A0为1表示计算结果为负,要指令的地址码送给PC,如果A0为0则不发生跳转。 |
中断周期微操作的节拍安排:
中断周期需要做三件事,一保存断点,二形成中断服务程序的入口地址,三关中断为保护现场做准备。这些操作都是由中断隐指令完成的,中断隐指令并不是真正的指令,他是硬件要做的操作,中断隐指令只完成了中断周期中的若干操作。
周期 | 操作 |
---|---|
T0 | 0 ——> MAR:把断点要保存的地址写入MAR ,1——>W:发出写命令告知存储器要做写操作,硬件关中断:将允许中断触发器置0 |
T1 | PC——>MDR |
T2 | MDR——>M:MDR中内存保存到内存,向量地址——>PC:将硬件形成的向量地址送给PC,这个操作不能安排在T0和T1,因为只有把PC中的值保存MDR,PC中的值才能被替换。 |
(3)组合逻辑设计的步骤
要产生控制信号,只要用逻辑表达式能够写出任何一个控制信号产生的条件,然后进行硬件实现,组合逻辑设计也就完成了。
列出操作时间表:
上表中,指令中间址标志I有效,则下一步进行间址操作,无效则执行指令。
上表中,一次间址结束后,需要使用间址周期标志IND判断是否还需要再次间址。
写出微操作命令的最简单表达式:
画出逻辑图:
(4)对于组合逻辑设计:
思路清晰,只要知道每一个控制信号产生的条件,然后写出逻辑表达式,画出逻辑框图就可以。
设计庞杂,调试困难,修改困难。上面给出的逻辑框图只是一个逻辑信号的逻辑框图,如果有几十个 ,逻辑框图会非常复杂。
速度快,因为这种方式都是采用硬连方式实现。
对于精简指令集计算机,采用的就是这种设计方式,甚至在现在的处理器中,把处理单元分成了两类,一类是整形数处理单元,做整形数的运算,做控制类的操作,另一类是浮点处理单元,做浮点数的运算,通常情况下,整形单元部分采用的就是这种方式实现的,使速度更快。
采用微程序设计的方法,来实现计算机系统的控制器。前面已经讲过使用组合逻辑方式实现控制器,对于组合逻辑方式,思路清晰,简单明了,但是电路庞杂,每一个控制信号都需要单独的电路来完成这个控制信号的生成,修改困难,如:要进行指令集的扩展,在指令集中引入新的指令,这条指令相关的微操作,或者是控制命令的逻辑电路都需要进行修改,对控制器修改的工作量非常大。这里讲解的微程序设计,设计比较容易,修改也比较容易的控制器的设计方法,非常适合指令集的扩展。
(1)微程序设计思想的产生
由英国剑桥大学教授Wilkes于1951年提出,在指令执行的过程中,我们知道,不同的节拍要发出不同的操作,节拍之间是有先后顺序的,安排在不同节拍的微操作也是有先后顺序的,每个节拍发出的控制命令实际上就是一个或者几个电信号,由这些电信号控制相应的部件进行操作。微程序设计的思想就是把这些控制信号给他存储起来,我们知道,在存储器中,我们经常讲存储单元存储了一串0,1代码,实际上在硬件上存储的并不是真正的0或者1,而是高电平或者是低电平,我们就可以利用高电平,低电平这些控制信号来控制每一个节拍我们要发出的微操作命令,这就是微程序。
上图中,要完成一条机器指令(对应于前面讲过的一个机器周期),我们在不同的节拍中要安排很多微操作命令,一个节拍中可以有一个或者两个微操作命令产生,或者是多个(多个微操作命令可以并行情况下),那么,这些微操作命令,我们可以将其存储起来,变成一条微指令,每个节拍对应一条微指令,那么多个节拍对应的多条微指令就构成了一个微程序。微指令的格式非常简单,如果在某个节拍中,我们要发出一个或者是几个控制信号,我们假设控制信号是高电平有效,我们用1来进行表示,上图中微指令1是10100000,两个1的位置表示,在这个节拍中,相对应的两个微操作他的控制信号要在这个节拍中产生,并且由这两个1控制相应的部件进行操作,所以微指令的每一个位置表示了某一种微操作命令。微指令也是有先后顺序的,这个先后顺序和组合逻辑电路设计中看到的微指令的先后顺序是一致的,这些微指令就构成了一个微程序,由这个微程序控制完成一条指令的执行过程。
一条机器指令对应了一个微程序,一个微程序中包含了若干条微指令,每一条微指令包含了一个或者是多个微操作命令控制信号,微指令间的先后顺序就是微操作在执行过程中的先后顺序。我们把这个由微指令构成的微程序保存在只读存储器ROM中,执行的时候,把微指令一条一条的从只读存储器中读出,根据读出的微指令中有效控制信号的个数和位置,发出相应的控制信号,让计算机去执行相应的操作。这种方式称为存储逻辑的方式。
(2)微程序控制单元框图及工作原理
1、机器指令对应的微程序
上图中,M保存了取指令需要的全部微操作,以及微操作之间的先后顺序,即:M,M+1, M+2三个单元保存了取值微程序,因为前面讲过取值周期需要三个节拍完成,每个节拍对应一条微指令,完成了那个节拍里面产生控制命令的工作。
另外在控制存储器中还保存了指令执行阶段所需要的微操作,如上图中,P,P+1,P+2三个单元中保存了LDA指令执行阶段对应的微程序,同样,K,K+1,K+2保存了STA指令执行阶段对应的微程序。
另外还有间址周期,中断周期,所有的指令的间址周期和中断周期都是类似的,所以间址周期和中断周期单独编写微程序。
2、微程序控制单元基本框图
控制存储器:微程序,微指令都保存在控制存储器,只读的。
CMAR:控制存储器地址寄存器,要从控制存储器中一条一条读微指令,就要知道微指令的地址,微指令的地址就保存在CMAR中。
地址译码:保存在CMAR中的地址经过译码,把他送入到控制存储器中,把相应的微指令读出。
CMDR:控制存储器数据寄存器,把从控制存储器中读出的微指令放置在CMDR中。
微地址形成部件:一条指令执行阶段要做的微操作是不一样的,那么他所对应的微程序首地址也是不一样的,也就是说在执行阶段,我们要根据我们要执行的指令来确定这条指令所对应的微程序在控制存储器中的首地址,所以我们还需要微地址形成部件。这个部件要接受从指令寄存器IR中操作码部分送来的信号。
顺序逻辑:安排顺序逻辑是因为CMAR当中的地址有多种来源,我们会利用顺序逻辑从多个来源中选择一个正确的来源送入到CMAR中,顺序逻辑实际上是一个多路,这个多路控制信号包括了标志,时钟。
这个结构数据流:从OP开始,也就是从指令寄存器的地址码开始,操作码送入到微地址形成部件,由微地址形成部件形成这条指令执行阶段所对应的微程序在控制存储器中的地址是什么。然后再送给顺序逻辑,由顺序逻辑在多个地址中进行选择,选择一个正确的地址,把他送入到CMAR,这个地址经过译码送入到控制存储器地址线,从给定的地址中读出一条微指令,并且把微指令送入到CMDR,这样,在CMDR中就包含了一条微指令,微指令的格式包括了两部分:
操作控制:由一系列的0和1组成,我们可以假定1表示控制器要发出某一个控制信号,所以操作控制这部分内容每一个位置都代表了一个微操作控制信号,如果是1,表示这个操作命令是有效的,要由这条微操作命令控制相应的部件做一个特定的操作。
顺序控制:给出了下一条微指令的地址。下地址可以送入到顺序逻辑。
这样至少顺序逻辑要从两个输入中取一个,如,在刚刚进入到一条指令的执行阶段的时候,我们要找到这条指令所对应的微程序在控制存储器中的首地址,那我们可以根据IR地址部分信号输入给出。在微指令执行过程中,一条一条按顺序执行,我们就可以根据下地址给出下一条微指令的地址是什么。
CMDR操作控制字段会直接给出控制信号,由这些控制信号控制CPU或者是计算机系统的其他部分去做相应的操作,每条微指令都会做若干个操作,微程序中全部的微指令执行完之后就会完成某一个特定的操作,如取指操作,间址操作,执行操作或者是中断操作。
3、工作原理
如上图为控制存储器,M,M+1,M+2保存的是取指微程序,右侧部分是下地址部分,取指微程序第一条微程序执行完以后,要通过下地址指出下一条微指令的地址,对M单元来说,下一条微指令的地址就为M+1,同样,M+1对应的下一条微指令地址为M+2。对于M+2,情况会有差异,他执行的下一条微指令并不是M+3,我们现在假设没有间址,取指之后马上进行执行。M,M+1,M+2三条微指令完成了把指令取出的操作。至于这条指令是什么指令,要经过指令的译码才能知道具体的是什么指令,那么经过指令的译码,我们才能知道去执行周期去执行哪一个微程序,这个过程就是通过微地址形成部件完成的。微地址形成部件根据取来的地址的操作码 ,形成这条指令在执行阶段的微程序在控制存储器中到底保存在什么地方,所以M+2,写的是XXX,表示不能由下地址直接标识出来,而是由硬件电路形成。
对于P来说,他的下地址就是P+1,P+1的下地址就是P+2,P+2这条微指令执行完以后LDA就操作结束了,如果没有中断,他应该直接再去取下一条指令,所以P+2的下地址为M,回到取指微程序。同样STA操作的微程序也是如此。
对于间址周期,也有微指令,间址周期结束以后,要转入执行周期,间址周期最后一条微指令的下地址依然是XXX形式,还是由微地址形成部件形成微程序所在的地址。
中断周期,结束以后要转入到取指 周期,所以中断周期最后一条微指令的下地址为M。
下面,对其工作原理做更进一步的分析:
首先编写一个程序,保存在主存中,程序包含很多条指令,这里只以四条执行为例分析程序是如何执行的。
下面是在控制存储器中保存的微程序,包括了取指周期的微程序,间址周期微程序,中断周期微程序,以及对应每一条指令他的执行过程的微程序。
操作过程如下:
取指阶段:执行取指微程序。
M——>CMAR:把控制存储器中M的内容送给CMAR寄存器,由这个寄存器指出第一条微指令在控制存储器的首地址。
CM(CMAR)——> CMDR:把控制存储器中保存的微指令取出送给CMDR寄存器,CMDR中就保存了要执行的控制信号。此时,CMDR中保存的数据如下:
这里面有1和0,1表示相应位置控制的微操作需要发出控制信号,在取址周期需要发出的微操作如下:
Ad(CMDR)——> CMAR:形成下一条微指令的地址,将CMDR的下地址送给顺序逻辑,经过顺序逻辑的选择,把M+1送给CMAR。为取下一条微指令做准备。
CM(CMAR)——> CMDR:取下一条微指令。控制存储器中,地址为CMAR中地址位置的微指令取出,放到CMDR。此时取出的微指令,以及对应的两个微操作如下:
Ad(CMDR)——> CMAR:形成下一条微指令的地址,将M+2送入到CMAR。
CM(CMAR)——> CMDR:取下一条微指令。这条微指令只包括了一个微操作:
这条指令的下地址为XXX,表示下一条微指令的地址不能由微地址指出,而是要进入到间址阶段或者是执行阶段,如果是进入到执行阶段,就是根据操作码由微地址形成部件形成要执行的指令的执行阶段对应的微程序所在的地址。
执行阶段:
执行LDA微程序:
OP(IR)——> 微地址形成部件——>CMAR:把指令的操作码字段送入到微地址形成部件,由微地址形成部件形成下一条微操作命令的地址,实际上就是把P——>MAR。
CM(CMAR)——> CMDR:取执行阶段的第一条微指令,送给CMDR,这条微指令如下:
Ad(CMDR)——> CMAR:形成下一条微指令的地址,把P+1送给MAR。
CM(CMAR)——> CMDR:取出一条微指令,如下:
Ad(CMDR)——> CMAR:形成下一条微指令的地址,把P+2送给MAR。
CM(CMAR)——> CMDR:取出一条微指令,如下:
执行阶段结束后,没有中断,下地址就直接指向了取值微程序首地址,用于取下一条取值微程序首地址。下面就又回到了取值阶段,如果不考虑间址和中断,每条指令都要执行取值微程序,执行执行微程序。以此循环执行完所有的程序。
全部的微指令都存储在控制存储器CM中, 操作之间的先后顺序由微指令执行的先后顺序来确定的,这样,指令的执行过程就是把这些微指令从控制存储器中读出。
从上面可以看出,用微程序的方式设计控制器有两个关键问题:
1、 微指令的操作控制字段如何设计,如何形成微操作命令,哪些微操作放在同一条微指令中,操作控制字段有多位,每一位到底表示什么含义,给出的是什么控制信号。
2、 微指令的后续地址如何形成
(3)微指令的编码方式(控制方式)
1、直接编码(直接控制)方式
这种编码方式实际上就是前面讲解微程序控制方式举的例子,这种方式非常简单,在微指令的控制字段中,每一位都代表一个微操作命令,在所有指令的执行过程中,一共需要多少微操作命令,那么他的操作控制字段就可以设置为多少位。具体格式如下:
微指令取出后,就用微指令操作控制字段中的0和1来控制计算机中相应的部件完成给定的操作。如前面讲过的例子:
上面的微指令有两个控制信号为1有效,分别代表吧PC值送给MAR和把读信号送给主存。
这种方式控制信号由某一位直接给出,不需要译码,所以速度最快。
2、字段直接编码方式
先将微指令控制字段分成若干段,每段经过译码后发出控制信号。具体如下:
上图中,把控制字段分成若干段,每段经过译码以后再发出控制信号,控制去完成相应的操作,在这里要注意的是,每个段经过译码器译码输出后,在译码器的输出端只有一位是有效信号,每一位都表示了在这组或者这段中,对应的一个微操作。也就是,分到这一组中的微操作应该是互斥的,其中一个发出控制命令,另一个就不能再发出控制命令。不同组发出的控制命令是可能并行执行的。这种方式称之为显示编码。
采用这种方式,如果每一小段中包含了2n个微操作,采用这种编码方式,这一段的长度只需要n位即可,如果采用第一种直接编码方式,这一段的长度就需要2n。所以这种方式,缩短了微指令的字长,但是要经过译码阶段要增加译码时间,微程序执行速度会比较慢。
3、字段之间的间接编码
这种编码方式,每个字段他的译码结果不仅和本字段的输入有关,而且和其他字段的译码结果是相关的,这种方式称之为隐式编码
4、混合编码
把直接编码,字段编码等几种方式结合起来,比如:在各个阶段或者各个微指令中,最常用的哪些操作命令,我们可以采用直接编码的方式,不常用的微操作命令采用字段间直接编码,这样可以压缩微指令的字长。
(4)微指令序列地址的形成
1、微指令的下地址字段指出
如,取指阶段,我们执行了第一条微指令之后,下一条微指令就是由下地址直接给出的。如下:
2、根据机器指令的操作码形成
当执行完取指的最后一条微指令后,就没有办法再根据下地址继续指出下一条微指令的地址,此时就需要通过对机器指令的操作码进行译码得到机器指令具体要进行的操作的微指令程序的首地址。
3、增量计数器
如,在我们取值阶段,下地址很多情况下都是顺序加1,在执行阶段,很多微指令包含的下地址也是顺序加1,这时候就可以采用增量计数器来做。如果用增量计数器,部分微指令的下地址字段就可以省略。
4、分支转移
如果微指令中涉及到分支,如,如果没有跳转,我们再控制存储器中继续执行下一条微指令,如果发生跳转,就给出下一条微指令的地址。
所以,分支转移微指令的格式如下:
转移方式:指明判断条件
转移地址:执行转移成功后的去向。
5、通过测试网络
如上图,我们把顺序控制,也就是下地址部分分成两段,高位字段不动,低位字段通过测试网络,由测试源(状态和条件)对低位的地址就行变换,变换之后和原来的高位地址合在一起形成新的地址,送入到CMAR中,取出新的微指令。这种方式可以用于微程序在小范围内的跳转及条件转移操作。
6、由硬件产生微程序入口地址
如,计算机一开机就要开始执行,要执行指令,就要取指令,取指微程序所在控制存储单元的首地址为M,所以要先把M送入到CMAR中,那么M的产生就由硬件直接产生。即,第一条微指令的地址由专门的硬件产生。如果在执行过程中发生中断,那么中断所对应的微程序在控制存储器中的地址是固定的,也可以由硬件产生中断周期微程序的首地址。同样,如果有间址阶段,间址阶段在控制存储器的位置也是固定的,所以也可以由硬件直接产生。
7、微指令地址形成方式原理图
上面讲了多种地址的形成方式,下面把多种方式结合起来看一下。
ADD X
上图中的多路选择器,从多个来源中进行选择,来源如下:
(1)通过下地址,由微指令顺序控制字段给出下地址 。
(2)由OP,指令的操作码字段给出对应的指令执行阶段所对应的微程序在控制存储器中的地址。
(3)如果是顺序执行,可以通过吧CMAR中的内容进行+1.
(4)第一条微指令的地址M可以通过硬件方式完成,中断周期,间址周期对应的微程序首地址也可以通过硬件产生。
(5)通过转移方式经过分支逻辑确定。
(5)微指令的格式
1、水平型微指令
之前讲过的几种微指令形式都是水平型微指令,这种方式一次可以定义多个并行操作,如采用直接编码,字段直接编码,字段间接编码,混合编码,都可以一次定义多个可以并行执行的操作。
2、垂直型的微指令
这种方式类似指令操作码的方式,一次只能定义一个操作,当然这个操作可能很复杂,他在控制执行中,可能控制硬件完成一个复杂的操作,这些操作之间可能还有先后顺序。
他是由微操作地址码字段来规定微操作的功能。
3、两种微指令格式比较
水平型的微指令比垂直型微指令并行操作能力更强,更灵活。因为水平型可以有多个信号并行进行操作,垂直型的微指令不可以
水平型微指令由于每一条微指令中控制信号比较多,指令就会比较长,微指令的数目比较少。不需要进行译码或者是进行简单的译码,速度快。
水平型的微指令,用较短的微程序结构换取较长的微指令结构 。
水平型的微指令和机器指令差别比较大。
(6)静态微程序设计和动态微程序设计
静态微程序设计,是指微程序不再需要任何改变,也就是意味着计算机系统CPU指令集不再改变,在这种情况下,就可以把微程序保存到ROM中,不再进行修改。
动态微程序设计,我们可以修改或者是扩展计算机系统的指令集,增加指令集中的指令。通过修改微程序的方式,在控制存储器中写入新的指令所对应的执行阶段的微程序,从而对指令集进行扩展。这种方式有利于指令仿真,也就是在系统中增加一条新指令或者是改变计算机的指令系统 ,看一下改变之后的指令结构运行某一种或者某一类应用程序的时候,他的性能是否会得到较大的提升,如果能得到较大的提升,那么在生产下一款处理器的时候,就可以把指令加入到新的处理器指令集中,或者是对原有的指令集进行适当的修改。但是,通常情况下,很少会对指令集进行修改。
(7)毫微程序设计
1、指的是微指令中给出的操作如果比较复杂,并且这个操作内部的毫微操作也有一定的时间先后顺序,那么我们就可以使用一个毫微程序来解释这条微指令。所以,微程序设计是用微程序来解释机器指令,毫微程序设计是用毫微程序解释微指令。
2、毫微程序控制器的基本组成
左边是微程序的原理图,前面已经讲过,但是这里从控制存储器中取出的微指令和前面讲过水平型的微指令是不一样的,这个微指令,一般采用的是垂直型的微指令,也就是说他的控制编码部分编码方式和指令的操作码编码方式是类似的,每一个操作可能是一个复杂的操作,为了对这个复杂的操作进一步的分解,我们就要用毫微程序来做。通过微程序的地址码部分,可以得到毫微程序的地址,把这个地址送入到CMAR2中,通过这个地址找到这条微指令所对应的毫微程序他的首地址,然后把毫微程序中的毫微指令一条条取出,毫微指令采用的是水平型编码,可以把控制信号直接送到计算机系统的各个控制部件来控制各个相应的部件能够协调操作,来完成这条微指令所要求的复杂的操作。
(8)串行微程序控制和并行微程序控制
这种情况下,微指令的取指执行是串行的
这种方式是采用流水方式进行控制,第i条的微指令在执行的时候,就可以利用取微指令的部件的空闲时间去取i+1条指令。
(9)微程序设计举例
1、写出对应机器指令的微操作及节拍安排:
下面,举例说明微程序设计的过程,以便更好的理解微程序设计是怎么做的,要想设计微程序,微指令。同样要写出对应每一条机器指令的微操作和节拍安排,因为这些微操作我们要把他放在微指令的控制字段,节拍安排决定了微指令的先后顺序,这里假设CPU和讲组合逻辑时是相同的,都采用非总线的方式进行控制。
由上面可以看出,取指阶段包含三条微指令。现在还要考虑这三条微指令如何从控制存储器中取出?
在顺序执行阶段:
如果取指阶段结束之后,我们要进入到执行阶段,我们要把指令的操作码部分送给微地址形成部件,由微地址形成部件确定这条指令在控制存储器中微地址的首地址。
(2) 取值阶段微操作及节拍安排
这里考虑了形成后续微指令地址的步骤:
(3) 执行阶段的微操作及节拍安排
这里还是要考虑要形成后续的微指令地址。执行阶段结束后,要进行取指操作,这里取指的微指令地址我们通过下地址M给出。
CSL,循环左移:
STP,停机:
BAN指令,条件转移指令:
上面一共列出了20种微操作,这20中微操作,合在一起,一共有38条微指令,每一种微操作,如果采用水平型的直接编码,每一个微操作在操作控制字段都需要一位进行表示,地址码字段是要在控制存储器内部进行寻址,所以地址码字段长度和控制存储器的地址长度是直接相关的。
2、确定微指令格式:
(1)微指令的编码方式
采用水平型的直接控制
(2)后续微指令的地址形成方式
由机器指令操作码通过微地址形成部件形成,和微指令的下地址字段直接给出。
(3)微指令的字长
前面分析公有20个微操作,所以操作控制字段至少为20位。
所有的微指令放在一起,公有38条微指令构成,所以控制存储器至少也要有38个存储位置,下地址要能够对这38个位置进行寻址,所以下地址字段最少为6位。
所以,微指令字长 = 20 + 6 = 26位
下面,对上面计算出来的微指令字长进行简化。
上面的38条微指令中,其中有19条是用于形成后续地址的,即把后续地址送到CMAR。这19条中:
如果在设计控制器过程中,每一条微指令的下地址字段直接送给CMAR,则省去了把下地址送给CMAR时间。按照这样的思路,OP(IR)——>微地址形成部件——>CMAR命令也可以省略掉。这样,可以省去19条微指令,2个微操作,所以,控制存储器只需要存储19条微指令,下地址字段取5位即可。微操作省去了2个,操作字段为18位。这样,如果不需要将地址送给CMAR进行锁存,还可以省去一个CMAR寄存器,地址可直接由多路选择直接送给控制存储器,如下图:
设计中,要考虑一定的余量,操作控制字段现在是18位,可以扩展到24位,下地址字段,现在有19个微指令存储在控制存储器中,后续可能会扩展,寻址范围会进一步扩大,所以寻址由5位扩展到6位。
这样,微指令长度为24 + 6,共30位。
(4)定义微操作控制字段每一位的微操作。
(5)编写微指令码点
上图中,是对码点的定义,即每一位对应什么样的微操作。如,第0位对应的是PC——>MAR,第1为是1——>R等。
下面编写微指令的码点: