1)内存中的数据:
将测试程序实例程序表写入用户程序文件,得到以上内存中的十六进制代码。
2)执行情况:
第一条程序执行情况(上左图):
经过了5个微指令,实现了LDA双字节指令,将0D地址中的55H送到累加器R5。
第二条程序执行情况(上右图):
经过了7个微指令,实现了ADD双字节指令,将0E地址中的内容8A与R5内容相加,结果DF存入R5。
第三条程序执行情况(上左):
经过5个微指令实现了STA双字节指令,将累加器R5的内容DFH送入地址10H单元。
第四条程序执行情况(上右):
经过5条微指令实现了双字节OUT指令,将10H地址中的内容送到数据总线上,可以看到输出的—OUT— MEM[10]:DF 的结果。
第五条程序执行情况(上左):
经过7条微指令实现了AND双字节指令,将R5的内容DFH和OFH单元的F0H相与得到D0送入R5中。
第六条程序执行情况(上中):
经过4条微指令实现了COM单字节指令,指令码80H将R5的内容D0取反得到FF2F送R5。
最后一条程序(上右):
经过4条微指令实现JMP双字节指令,将程序PC无条件转移到地址0CH中的11H,程序结束。
首先,模拟机先给出微地址为00000的微指令启动,读出微地址为00000的微指令时便给出下一条微地址为00001,这两条微指令是公用微指令。微地址为00001的微指令执行的内容是:PC地址计数器内容送地址寄存器,然后PC加1,同时给出下一条微指令地址00010。这一条微指令在T3时序信号到来时执行把RAM中存放的数据(指令)送到IR指令寄存器同时给出判别信号P以及下一条微指令地址01000,在T4有效时,根据P、IR7、IR6、IR5产生下一条微指令的地址。当执行完一条IR指令的全部微命令,即执行到每个微程序的最后一条微指令时给出下一条微指令的地址为00001,紧接着执行00001、00010的公共微指令。
A=55H→【0D】,B=8AH→【0E】,C=F0H→【FO】,实现复合运算 NOT((A加B)AND C)
1)流程图的第一张图中的第一列表示第一个程序的运行过程,首先产生主入口地址00000,经过SW传入PC,单步运行,PC的值00传入ar,pc+1,接着借助ar从ram【00】中读出20H传入IR,在LDA指令的控制下将pc传入ar,pc+1,从ram中取出01处的数据0D传入ar,再通过ar取出数据55送到r5;(取出A->r5)
2)第二列表示第二个程序ADD指令的运行过程,经过微指令的控制先将ram【02】中的C0传入IR,再进入ADD的执行分支,将ram【03】中的0E取出送入ar,借助ar将【0E】中的8A取入到dr2中,将r5中的55送入dr1,执行dr1+dr2,将结果DF送入r5;(实现A加B)
3)第三列表示第三个程序STA指令的运行过程,同样借助ar将40H传入IR,然后在指令的控制下进入STA分支,即将ram【05】中的10送入ar后借助ar将r5中的值DFH取出放入【10】中;(A加B->【10】)
4)第四列表示第四个程序OUT的运行过程,在将ram【06】中的60H送入IR中后进入OUT分支,先将pc(07)存入ar后pc+1,借助ar将ram【07】中的10H取出放入ar,再次借助ar将【10】中的DF取出到bus总线上;(观察【10】中的值)
5)第二章流程图的第一列是第五个程序AND指令的执行过程,同上将pc(08)存入ar,pc+1,借助ar将【08】中的E0存入Ir,进入AND分支,pc(09)存入ar,pc+1,借助ar将【09】中的0F存入ar,再借助ar将【0F】中的F0存入dr2,接着将r5中的DF存入dr1,进行dr1 and dr2的运算后将结果D0存入r5;(实现(A加B)AND C)
6)第二列是第六个程序COM指令的执行过程,在将【0A】中的80H取出存入Ir中后,进入COM分支,将r5中的D0存入dr1,执行not dr1后将结果2F存入r5;(实现NOT((A加B)AND C)
7)第三列是最后一个程序JMP的执行过程,将【0B】中的A0存入IR后进入JMP分支,从【0C】中取出11传送给pc
8)最后一列将11H传给ar,pc+1,接着借助ar将ram【11H】中的00传送给IR,运行结束。
JMP指令执行结束后PC变为11,PC+1后最终变为12;IR中存入了【11】中的00H,接着微地址变为01000,R5中保存着最后的运算结果2F;
可见,上述七条程序实现了取出A->r5、A加B->R5、A加B->【10】、观察【10】、(A加B)AND C->R5、NOT((A加B)AND C->R5这一系列的动作,实现了复合运算NOT((A加B)AND C,运行结果正确。
根据不同的九种种微程序(加上WE强迫RAM写、RD强迫RAM读)依次为每一条当前的微地址进行28条微指令的译码,因为图4-7-1模型机总的实验中并没有用到控制器中的信号161CLR,因此不再将161CLR译码出来,简化控制器模型。
而流程图中有多少种不同微地址就要进行多少次的微指令译码,如在OUT分支中,微地址01011、11001、11010都需要进行依次译码,操作不同控制信号不同,当前微地址不同,下一微地址也不同。
以当前地址00001为例,其所要进行的操作是PC->AR,PC+1,因此,CLR信号、LOAD信号、LDPC信号应该为111,PC_BUS为0,LDAR为1,p1应为0(顺序执行),下一地址应该为00010。
其余微地址也都是根据进行的操作来更新控制信号的状态和下一微地址。
指令周期时序分析:
T1:给出当前微地址的微命令;
T2:给出下址;
T3:取指令;
T4:译码产生下址;
最上面的3个74273:微命令寄存器:保存一条微指令的操作控制字段和判别字段信息。
中间的三个7474:微地址寄存器,决定将要访问的下一条微指令的地址。
最下面的74273:指令寄存器,用来存放由控制存储器读出了一条微指令信息。
三个三输入与非门:地址转移逻辑,假如微程序不出现分支,则下一条微指令的地址就直接有微地址寄存器给出,当微程序出现分支时,意味微程序出现条件转移。
右边的逻辑元件:时序部件,由状态图输入法实现;
为了观察当前的微地址,特意添加da4~da0五个output信号。
以LDA指令为例,分析其执行过程:
(1)T1/T2,微指令寄存器(742733)送出微命令,p1=1,绝对地址01000
(2)T2,微地址寄存器74743读取绝对地址01000
(3)T3,由数据通路的RAM读取IR[7…5]到IR74273
(4)T4,译码产生新的下址01000 -> 01001
(5)T1/T2,微指令寄存器发出微命令,p1=0,下址为10101;
(6)T1/T2,微指令寄存器发出微命令,p1=0,下址为10110;
微程序:实现一条机器指令功能的许多条微指令的组成;
如微程序流程中包括很多微指令控制,进行一些加减运算,存储数据,地址自加一等等。
微指令:在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合;
如微程序流程中包括很多微指令控制,进行一些加减运算,存储数据,地址自加一等等。
微命令:控制器通过控制线向执行部件发出的各种控制命令;
如:ALU_BUS、PC_BUS信号等。
微操作:执行部件接受微命令后所做的操作;
如:CLR、LOAD、LDPC为111,PC_BUS为0,LDAR为1时执行的PC->AR,PC+1。
① 控制程序依照正确的顺序执行指令。
② 发出控制信号控制数据通路完成相应的指令。
通过RAM存储器获取指令与数据,通过自身存储所有微指令的ROM查找并获得一条微指令。微指令包含当前操作和下条微指令的地址。
如何取指令、分析指令、执行指令?
通过下址取得指令,根据控制信号进行不同信号的开启或关闭也就是分析指令,然后再在控制信号的作用下执行指令
控制器可以通过取下地址绝对跳转得到下一条微指令,也可以通过RAM中取得指令码送IR进行映射跳转。因此,代码编辑的RAM中的数据要符合控制器取指令的规范和顺序,以便与控制器能准确的翻译和执行代码。实验中这两种方法都是用到了的。
指令码的二进制高3位为微指令地址二进制的低三位;
微序列控制器通过吧控制信号存储在一个查找Rom,(1)用水平编码生成微操作(2)用垂直编码生成微操作(3)从微代码直接产生控制信号。
使其ADD、AND指令在部分微指令中合并(如AR→RAM、RAM→DR2、R5→DR1),只对ALU部分的下址进行区分,其他部分用同样的下址即可,这样可以省去一个IR的编码状态。
将不同状态机的控制信号进行区分,在不同控制信号作用下进行多个状态机的控制