控制单元CU若想发出对应的控制信号,则需要以下信息:指令操作码,目前的机器周期,节拍信号,机器状态条件,根据这些信息,CU就能确定在这个节拍下应该发出哪些"微命令",也就是这个节拍下应该进行哪些"微操作"。
对于指令操作数,控制单元CU通过操作码译码器输出的哪一个信号有效,判断当前执行的指令是哪一条指令。
对于目前机器周期,CPU可以根据当前触发器的状态判断该指令目前处于哪一个机器周期
对于节拍信号,节拍发生器接收到时钟部件发来的脉冲信号后,会选择某一根输出线导通,控制单元就可以通过导通的信号判断当前属于机器周期的第几个节拍
对于机器状态条件,机器状态条件也称为标志,可能来自运算器的PSW、ACC的符号位等;也可能来自I/O设备、主存。例如PSW的是否溢出,是正是负等信息,可能会影响到微操作序列的执行流。
CU的每个输出的控制信号对应一个微命令,也就是对应一个微操作。如,要让C1对应微操作为(PC)--->MAR,则将其接到 PCout、MARin即可。
若所有指令的取指周期、T0节拍下一定要完成(PC)--->MAR,则可知C1=FE*T0,那么我们就可以把以下的电路设计在CU控制单元中。若FE=1,T0=1,C1就处于高电平,那么CU就会发出(PC)-->MAR这一"微操作"对应的"微命令"。
所以如果能够得出某个“微命令”对应的逻辑表达式,那么就能设计出这一“微命令”对应的电路。
但对于某些"微操作",在不同的指令周期都会被使用到,例如M(MAR)--->MDR,这类微操作对应的微命令的逻辑表达式又应该如何确定?
我们试着分析以下例子:
FE*T1:FE表示这是在取指周期,取指周期需要进行的微操作如下:
T0:(PC)--->MAR
T1:M(MAR)--->MDR
所以FE*T1表示:若处于取指阶段的T1节拍,那么就需要发出"M(MAR)--->MDR"对应的微命令。
EX*T1(ADD+LDA):EX表示指令处于执行阶段,T1表示执行阶段的T1节拍,ADD表示加法
指令,LDA是取数指令(将数据从主存取到ACC寄存器中)。
所以这整条指令可以翻译为:
若此时处于加法指令的执行阶段,并且处于T1节拍,那么就需要发出"M(MAR)--->MDR"对应的微命令。或者,
若此时处于取数指令的执行阶段,并且处于T1节拍,那么就需要发出"M(MAR)--->MDR"对应的微命令。
看了上面的例子,进一步分析,如何通过微操作得到对应的电路?
设计步骤:
1.分析每个阶段的微操作序列(取值、间址、执行、中断四个阶段)。
2.选择CPU的控制方式,也就是采用定长机器周期还是不定长机器周期?每个机器周期安排几个节拍?
3.安排微操作时序,也就是哪些微操作可以在同一个节拍执行,哪些微操作先执行,哪些微操作后执行?
4.电路设计,确定每个微命令对应的逻辑表达式,并用电路实现。
对于步骤1,2:
假设采用同步控制方式(定长机器周期)一个机器周期内安排3个节拍。
对于各条指令,取值周期的微操作相同:
PC--->MAR
1--->R
M(MAR)--->MDR
MDR-->IR
OP(IR)--->ID(Instruction Decoder,指令译码器)
(PC)+1--->PC
由于一个机器周期有三个节拍,也就是说这些微操作需要在3个节拍内完成,那么某些微操作肯定需要并行完成。
对于各条指令,间址周期的微操作也相同:
Ad(IR)--->MAR
1--->R
M(MAR)--->MDR
MDR--->Ad(IR)
对于各条指令,执行周期的微操作各不相同:
对于CLA指令,就是将ACC中的数据清零:
0--->AC(很多教材中把ACC写为AC)对于LDA X,这是一个取数指令,取出主存的数据放到ACC中。
Ad (IR)--->MAR,把地址码放到MAR中。
1--->R,控制信号设置为读信号
M(MAR)--->MDR,把主存相应地址的数据放到MDR中
MDR-->AC,把MDR的数据放到ACC中
对于JMP X,就是把该指令的地址码部分(X),放到PC中
Ad(IR)--->PC
对于BAN X,这是条件转移指令,当ACC为负时转移
A0*Ad(IR)+--->PC
A0是ACC累加寄存器中的符号位,当ACC为负时,A0=1,所以这个指令可以翻译为:
当ACC中的值为负时,就会将指令的地址部分送到PC,当ACC中的值为正时,就会把(PC)-->PC,即不进行条件转移。
所以这里执行的微操作会根据ACC的状态而改变。
这里只罗列了几条,但是需要罗列出所有指令在各个阶段的微操作序列,才总结出在什么情况下需要使用这个微操作。
对于步骤3:
安排微操作时序的原则如下
原则一:微操作的先后顺序不得随意更改
原则二:被控对象不同 的微操作,尽量安排在 一个节拍内完成
原则三:占用 时间较短 的微操作,尽量 安排在 一个节拍内完成,并允许有先后顺序
以取指周期需要用到的微操作为例:
(1)PC--->MAR
(2)1--->R
(3)M(MAR)--->MDR
(4)MDR-->IR
(5)OP(IR)--->ID(Instruction Decoder,指令译码器)
(6)(PC)+1--->PC
将以上微操作分配到3个节拍内
•(1)微操作的对象是CPU中的寄存器,(2)微操作的对象为主存,被控对象不同,符合原则二,可以安排在一个节拍内。
•(1)(3)(4)(5)指令的顺序不得随意更改
•对于(6)微操作,只需要将其放在(1)微操作之后的任意位置即可。
安排微操作时序如下:
(1)(2)被控对象不同,可以安排在同一个节拍下,(3)(6)没有前后依赖的关系,可以安排在一个节拍下完成,(4)(5)即使有先后关系,但是占用时间较短,所以也可以安排在同一节拍完成。
为什么(4)(5)占用时间短呢?
因为MDR→IR 是CPU内部寄存器的数据传送,速度很快,因此在一个时钟周期内可以紧接着完成 OP(IR)→ID。也就是可以一次同时发出两个微命令。
那为什么(3)(4)不能放在同一节拍完成呢?
因为在(3)微操作:M(MAR)--->MDR,从主存取数据,用时较长,因此必须一个时钟周期才能保证微操作的完成。
以间址周期为例:
(1)Ad(IR)--->MAR
(2)1--->R
(3)M(MAR)--->MDR
(4)MDR--->Ad(IR)
(1)(2)的被控对象不同,所以可以安排在一个节拍下完成,(3)操作涉及到访存,所以放到一个节拍下,(4)操作再占用一个节拍即可。
以执行周期为例:
(1)非访存指令
① CLA
由于其只有0--->AC这一个微操作,所以可以安排其在末尾的节拍内完成。
其他例子同理,可以参考:
(2)访存指令
(3)转移指令
对于步骤4,电路的设计,可以分为以下几个步骤:
1.列出操作时间表,列出在取指、间址、执行、中断周期,T0、T1、T2节拍内有可能用到的所有微操作
2.写出微操作命令的最简表达式
3.画出逻辑图
1.列出操作时间表
•取指阶段的操作时间表
对于公共操作,所有指令必须执行:
提示:
IND是 是否处于间址周期 的触发器,如果指令的地址码采用了间接寻址,那么CU还需要完成1-->IND中,也就是接下来会进入间址周期
若没有IND这一特征位,那么1--->EX,也就是接下来直接进入执行周期。
对于非访存指令,一定没有间址周期,而对于访存指令,可能会用到间接寻址,若这些访存指令没有用到间接寻址,也会直接进入到执行周期。
•间址阶段的操作时间表
对于非访存指令,间址周期的微操作肯定都不会执行:
提示:
当进行间接寻址时,可能是多级间接寻址,所以只有等=0时,才表示此时已经完成了最后一级的间接寻址,此时才可以进入到执行周期,即1--->EX(执行周期)
•执行阶段的操作时间表
将所有指令在T0,T1...节拍中的执行的微操作都记录下来,也就是做了整合,如图所示:
2.写出微操作命令的最简表达式
将微操作综合起来,就是将这一微操作在哪些阶段应用于哪些指令全部罗列出来
根据上图就可得出以下逻辑表达式:
简化后得到:
3.画出逻辑图
根据逻辑表达式就能画出对应的电路图了
把这一电路集成到CU内部,再把信号接到电路相应的接口,就可以通过硬件完成对微操作信号的管理。
硬布线控制器的特点:
•指令越多,设计和实现就越复杂,因此一般用于RISC(精简指令集系统)•如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令较困难。
•由于使用纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路即时产生。