- 指令执行的过程中,在一个机器周期内我们需要通过若干个【微操作序列】来完成,那一个机器周期又会有若干个【时钟周期】组成,每个时钟周期又可以称为一个【节拍】,会在每一个节拍内发出一个所谓的【微命令】,用来完成对应的微操作。
- 所谓的微命令指的就是与这个微操作所对应的控制信号。
- 取指周期、间址周期、中断周期内所需要做的这些微操作,所有的指令都是一样的。
只有执行期内所需要做的这些微操作序列可能会出现一些区别- 设计控制器的核心思想
但是只要我们能够知道指令的【操作码】能够判断这条指令的具体类型,那么我们也能够确定这条指令的执行周期内每个节拍需要完成哪些微操作,因此只要我们能够确定指令的操作码,并且再根据这几个【触发器】的信息来判断当前到底处于哪一个机器周期,另外再结合上【节拍信号】就是T0,T1,T2,也就是目前我们处于这个机器周期内的第几个节拍。最后再结合上【机器状态条件】,就比如说psw里边记录的什么溢出等这些状态条件结合这四个维度的信息,我们就可以确定现在所处的这个节拍下应该发出哪些命令,因为每个命令都是和微操作一 一对应的。
- 指令执行的过程中,在一个机器周期内我们需要通过若干个【微操作序列】来完成,那一个机器周期又会有若干个【时钟周期】组成,每个时钟周期又可以称为一个【节拍】,会在每一个节拍内发出一个所谓的【微命令】,用来完成对应的微操作。
- 所谓的微命令指的就是与这个微操作所对应的控制信号。
- 取指周期、间址周期、中断周期内所需要做的这些微操作,所有的指令都是一样的。
只有执行期内所需要做的这些微操作序列可能会出现一些区别- 设计控制器的核心思想
但是只要我们能够知道指令的【操作码】能够判断这条指令的具体类型,那么我们也能够确定这条指令的执行周期内每个节拍需要完成哪些微操作,因此只要我们能够确定指令的操作码,并且再根据这几个【触发器】的信息来判断当前到底处于哪一个机器周期,另外再结合上【节拍信号】就是T0,T1,T2,也就是目前我们处于这个机器周期内的第几个节拍。最后再结合上【机器状态条件】,就比如说psw里边记录的什么溢出等这些状态条件结合这四个维度的信息,我们就可以确定现在所处的这个节拍下应该发出哪些命令,因为每个命令都是和微操作一 一对应的。
- 我们想要确定当前这个节拍下控制单元CU应该发出什么样的微命令,那么我们首先需要参考的是【指令的操作码】,因为不同的指令在执行阶段所需要做的微操作序列是不一样的好,所以我们首先需要把【指令寄存器IR】的操作码,送给【操作码译码器】。
- 还需要知道当前这个指令的【目前机器周期】,因此我们还需要把四个【触发器】的二进制信息把它送给CU,CU可以根据当前这几个触发器的值哪一个值为1,用这样的方式来判断目前处于哪个机器周期好,所以这样我们就得到了第二个需要的信息。
- 我们还需要让cu能够判断出当前处于这个机器周期内的【第几个节拍】,所以我们还需要给CU输入一个【节拍信号】,那节拍信号是通过一个所谓的【节拍发生器】来给出的。看这个图不难理解,就是我们的时钟部件会有规律的发出这种脉冲信号,每个【脉冲信号】就是一个【时钟周期】,那么这个节拍发生器接收到时钟部件发来的脉冲信号之后,他都会选择让其中的某一根输出线让它导通,比如一个脉冲让T0输出一个高电平,然后第二个脉冲让T2输出一个高电平,然后第三个,第四个以此类推,那这样的话CU就可以根据这些线每根线输入了高电平信号,用这个信息来判断当前是处于第几个节拍。那之前我们是规定了我们要采用定长机器周期,一个机器周期所包含的节拍数都是相等的,那对于这个图来说,相当于每一个机器周期会包含m+1个节拍,从T0到Tm总共m+1个节拍,那这些节拍信号是循环的发出的,也就是说如果此时已经到达了当前这个机器周期的最后一个节拍,发出这个节拍信号,接下来如果再接收到下一个脉冲信号,那么下一个节拍信号又会回到t0,那这也就意味着我们进入了下一个机器周期,所以这就是用节拍发生器来表示目前的节拍信号的一个原理。
- 最后我们还需要给CU提供一个输入的信息,也就是【机器的状态条件】。我们把所有的这些标志来自于执行单元,比如说我们之前说过的运算器里边会包含PSW还有ACC,那PSW里边会包含某一些很关键的信息位,比如说是否有溢出或者运算结果为正还是为负,有可能会影响到接下来的这个微操作序列的一个执行,那除了PSW之外,有可能会需要根据ACC累加寄存器里边存放的这个数的符号就是正负性之类的,这个信息也有可能会影响到接下来的操作序列的一个执行流。那除了来自运算器之外,也有可能会有来自io设备,还有来自于储存的一些反馈信号,也可能会影响到接下来的一个微操作执行流,所以这些标志信息也需要输入给控制单元。
- 那接下来就可以根据这四组的信息来决定当前这个节拍下。
所以控制单元CU它的输出就是对应一系列的微命令,那么每一条输出线就对应着一个微命令,也就是对应着一个微操作,比如说如果我们想要让C1这个输出让他对应PC传到要对用这样的一个为操作那么我们只需要把C1这边输出线把它接到PCout和MARin就可以。
- 对于PC+1这个微操作,,只要我们把PC的值放入MAR,那么我们就可以让pc的值加一了,所以这种微操作,我们只需要让他在第一个微操作之后就可以。不一定把它放到最后面,好,那我们可以把它放到三这类的操作的后面。
- 第二个微操作它的控制对象是主储存器,而第一个被操作,它的控制对象是两个具体的CPU内部的寄存器,所以这两个微操作中显然可以把他们安排在同一个节拍上完成,只要存储器此时空闲,那么就可以发出与第二个的操作所对应的微指令
4和5这两个微操作,由于这两个微操作他们执行时间都很短,所以在一个时钟周期内,我们能够保证这两个微操作,所以虽然他们之间有前后的依赖关系,但是我们同样可以把他们安排在一个节拍的完成,因此在t2这一节拍拍可以完成4和5这两个微操作。- 3和4【不可以】在一个节拍内完成
原因在于3这个操作我们需要从主储存器当中读取数据,而从储存器中取得一个数据的用时是比较长的,因此我们必须使用一个时钟周期才可以保证我们能够从储存器当中读到这个数据,因此我们不能把3和4这两步安排在同一个节拍内
1和2被控对象不同,所以可以安排在一个节拍内
3需要访存,需要单独的一个节拍
4再用一个节拍
非访存指令:一定没有间址周期
访存指令:可能有间址周期
- 填上1,表示这条指在取址阶段的T0节拍内是需要进行这两个微操作的
- T2节拍的后两行,I(爱)与I取反,当状态为I时,就需要把1放入IND这个触发器中,表示接下来要进入间址周期。
当状态为I取反时,就把1传入EX这个触发器中,表示接下来直接进入执行周期
- 对于这些非访存指令,他们都不会进入间址周期
- 当我们进行间接寻址的时候,有可能进行多级的间接寻址。
所以只有当IND取反等于1的时候,说明间址周期已经完毕,所以把1传递给触发器EX,接着才可以进入执行周期,
将各种指令分别在每一个节拍内执行的微操作都整合在对应的节拍内
- 加号(+)表示或
IND·T 1 (ADD+STA+LDA+JMP+BAN):表示此时执行的是间址周期的第一个节拍,并且是括号中这几种指令的其中一种就执行M(MAR)→MDR这个一个特点微操作命令
- 我们用高级语言写的代码,会被翻译成一系列与之对等的机器指令,每一条机器指令又会被翻译成几条微操作,由微操作序列来完成这条指令的具体功能
- 微命令、微操作、微指令的区别:
微命令和微操作是一 一对应的,微操作是强调我们要做什么,
而微命令是强调我们要完成这一波操作需要发出哪一个控制信号,
所以他们俩是一一对应的,
一条微指令的执行其实有可能会包含多个微命令,也就是说一条微指令有可能会并行的完成两个或者更多个微操作。- CPU在执行一条机器指令的时候,其实就是要执行这一条机器指令所对应的这个微程序。那我们可以借鉴之前提到过的存储程序的思想,就是可以在CPU出厂之前把所有的机器指令所对应的微程序都存放到控制里边的一个特殊的存储器,然后CPU可以根据当前要执行的这个机器指令的类型去找到与这条机器指令所对应的微程序,然后来一条一条的执行这个微程序当中所包含的微指令序列。
- 控制存储器是用只读存储器ROM芯片来构成的,
首先rom的读取的速度会非常快,要比RAM更快。
另外一点ROM是一种非易失性的存储芯片,那么这就意味着CPU断电之后,这个rom芯片当中存储的这些微程序是不会丢失的。- 每一条机器指令对应的这个微程序,应该是由CPU的厂商负责设计,并且需要在CPU出厂之前把这个rom里边的微程序数据全部把它给写好。
微指令序列一条一条往下执行的一个原理:
首先,我们需要根据这条【机器指令的操作码】来确定它所对应的微程序的起始地址到底是什么,所以这就【微地址形成部件】的一个作用。根据机器指令的操作码来确定这个机器指令它所对应的微指令序列的一个首地址,之后我们还需要引入一个逻辑电路,叫做【顺序逻辑】,顾名思义就是用于控制微指令的,因为我们的位置序列不一定是你调一调顺序的往下执行,如果说有中断发生或者没有中断发生的时候,这个微指令序列的执行次序肯定需要进行一些调整,所以这就是数据逻辑的一个作用,
所以当CPU取到了一条指令之后,执行这条指令的过程就是首先把指令的操作码送给【微地址值形成部件】,用来确定这条指令所对应的微指令序列的一个起始地址。然后接下来再根据顺序逻辑的标志这一类的信息确定接下来我们要执行的这一条微指令的一个存放地址。把微指令地址放到CMAR当中,然后经过【地址译码器】的译码之后,就可以选中cm所指向的那一条微指令,然后取出这条微指令,把它放到CMDR当中,那刚才我们说过一条微指令需要包含两个部分的信息,第一个部分的用来描述这条微指令所对应的控制信号,然后第二个部分是用来描述接下来要执行的一条微指令的一个地址。我把称为【下地址】,所以执行完这条微指令之后,需要把下地址的信息送给顺序逻辑,然后顺序逻辑再结合某一些机器标志的信息,再来决定下一条应该执行的微指令的存放地址,然后再把下一条微指令的地址送给CMAR,那这就是微指令序列一条一条往下执行的一个原理。
那回到现在我们要执行的这条微指令,它被放到CMDR当中,然后硬件电路需要根据这个微指令的控制码部分,像CPU内部的其他部件或者向系统总线来发出某一些控制信号,就比如说PCin,还有就是通过系统总线可以向储存器发送【读信号】,那到底要发出什么控制信号?就是根据当前这条微指令,这就是微程序控制器的一个基本结构
- 程序由一系列的机器指令组成
微程序由一系列的微指令组成- 微指令序列是对指定具体功能的描述,每一条微指令可能会对应一个或者多个微操作。所以我们可以用微指令来描述指令执行的各个阶段需要完成哪些微操作。
- 另外主存储器是用来存放机器指令的,而控制器存储器,也就是控存是用来存放微指令序列的。他被集成在控制单元的内部,并且需要注意控存通常是用任务来实现的,可以实现按地址释放。
- 你在QQ出厂的时候,厂家会把这个CPU所支持的所有的指令对应的微程序都给写入到这个rom芯片当中,也就写入到控存里面。
- uPC=CMAR
uIR=CMDR
唯一有一点区别就是最后这一步:
对于硬部线控制器来说,我们是把那个指令的操作码部分送给了指令译码器ID,然后这个指令译码器会发出与这个操作码相对应的那一根线的选通信号,这是硬部线控制器,
而对于微程序控制器来说,我们是要把指令操作码送给【微地址形成部件】。然后由微地址形成部件来指明这条指令在接下来的执行周期所对应的微程序的起始地址,那这是微程序控制器在取指阶段要做的一些事情,
- 考虑如何转入下一条微指令
例如在取指周期,除了最后一条微指令之外,每次执行完一条微指令之后,还需要穿插一个【微操作】,就是要把当前执行的微指令,他的【下地址】信息送给CMAR。用于指明接下来要执行的微指令的地址,这个微操作的执行也需要消耗一个节拍- 考虑如何转入下一格微程序(机器周期)
比如取指周期,在执行完最后一条微指令c之后,还需要加一个节拍,需要将微地址形成部件传入CMAR- 在取指周期
硬布线控制器需要3个节拍
微程序控制器需要5个节拍