2021年4月29日星期四,第9周
2021年5月6日星期四,第10周
整机实验总共四次,由于第一次实验出现问题,没做出来,第二次实验成功了,因此这次的博客包含了第一次和第二次整机实验的内容
前两次整机实验的主要目的是完成老师要求的整机实验的基本功能
基本功能如下
1.设计基本指令系统,包含以下几个机器指令
2.模型机的基本结构为单总线,根据模型机框架图画出具体的电路图
具体的结构框架图参考老师ppt里的这个图
由于上面的图里没有状态位寄存器,而基本要求里又要求有状态位寄存器,因此除了主要参考上面这个图以外,还需要参考下面这个图,下面这个图重点关注PSW寄存器即可,其它的不用关注
3.在保存两数相加的结果时,也要保存相应的状态位
在进行整机实验之前,由于涉及机器指令和微指令,比较复杂,因此一开始的时候我没弄清楚思路。
这里强烈建议整机实验思路很不清晰的同学去看一下大二上计组书第10章10.2节的内容
10.2 节主要描述的是微程序设计的基本思路,在书本 P403 - P410
相信看完之后对整机实验微指令的理解会更充分一些
首先明确以下几点
实验思路
整机实验分为两个部分,一个是机器指令和微指令的部分,另一个是电路图的部分
(1)机器指令和微指令
机器指令按顺序存放在RAM里,微指令存放在ROM里
整机实验跟之前的第四次部件级实验很像(有uPC和PC),都涉及RAM和ROM的同时操作,上次的实验是从ROM中取微指令,而下一条微指令的地址只能是uPC+1,而这整机实验下一条微指令的地址则复杂多变,可能有三种情况(uPC+1,JP,QJP)。
在上次实验里,取出的微指令负责操控取RAM的PC,MAR,MBR等寄存器,还负责对RAM进行读写,这次实验也是一样,只不过上次实验中从RAM中取来的只是地址或数据,而这次从RAM中取来的既有机器指令,又有数据。
所以,整机实验在本质上和上次的实验有很多相似的地方,只不过功能变得更多了控制打入寄存器的方式也变多了,之前是某一位控制一个寄存器的打入脉冲,现在是三位2进制数控制好几个寄存器,使用38译码器对微指令进行译码
由于本次实验在RAM中一共存了五条机器指令
比如:
LOAD1 R0,AD1
LOAD2 R1,AD2
ADD R0,R1
STORE R1,AD3
HLAT
而我们按下脉冲的时侯,连续脉冲自动工作,如果不预设初值的话,uPC自动从ROM的0地址开始取出微指令,前几条微指令的功能就是从RAM中取出第一条机器指令(注意是双字长)
在取出第一条机器指令的第一个字长的时候,根据第一个字长中的OP,自动在OP后加上0000,形成这条机器指令要执行的微指令的地址,之后uPC的初值设为这个地址,跳转到这条机器指令对应的微指令执行
要特别注意的是这条机器指令是双字长指令,因此在这条机器指令对应的微指令里,还要再设计一个取指周期,取出第二个字长的机器指令
微指令在执行的过程中,需要指定下一条微指令的地址,共有三种方式,一种是uPC+1,另一种是JP(无条件转移,微地址由uIR23-16提供),还有一种是QJP(按照高4位操作码,第4位为0转移)。
刚刚上面说的这种转移方式就是使用QJP方式转移的
这就是取出第一条机器指令并执行的全部过程
在执行完第一条机器指令之后(即执行到第一条机器指令对应的最后一条微指令的时候),会使用JP进行无条件转移,转移到下一条机器指令的取值周期部分,取出机器指令之后,再根据这条机器指令的OP判断对应要执行的微程序的地址,然后执行,以此类推
最后一个指令是停机指令,用于终止连续脉冲
以上就是对微程序执行过程的分析,我们要做的就是明确流程,写好对应的微程序和机器指令
具体的微指令编码可以参考老师课件上的这个图,但要注意的是,老师的这个只是示例,我们最后写的跟老师的这个不一样
(2)电路图部分
电路图部分的结构框图参考上面的结构框架图,其中ALU有多种运算功能,还有A和B两个数据选择器,R0,R1和IR采用普通寄存器,PC采用之前设计的计数器,MAR和MDR采用带有三态门的寄存器,这次实验中PC不直接和RAM联系,而是通过MAR和RAM相连
特别注意的是CU部分,由于这一部分的输出和uPC相连(相当于CU部分要确定微指令的地址),所以CU部分需要连选择器,两路选择的数据分别为OP(IR)+0000和微指令的高8位,目的是给uPC设置初值(即下一条微指令的地址)
另外要注意的地方就是24位微指令的输出,在必要的地方需要使用24或38译码器,然后连接对应的寄存器的CP
至于运算结果状态位的保存,在实验室测试的时侯除了进位,其他部分都是准确的,因此这一部分没有彻底解决,等我解决了之后再更新这部分的内容
注意,这里最后的输出没加非门,跟上次实验不一样,在总图中,启动电路输出连uPCPC的部分加了非门,这样是为了适应时序问题
特别提醒:总图的具体管脚的绑定要根据你自己的微操作命令。此外,由于整机实验还未做完,总图中关于状态为寄存器(PSW)的保存进位的功能有问题,其它部分没有问题
让我觉得非常疑惑的是,在整机实验中,使用上次实验(实验四)的启动电路时会出现问题,虽然不论是更改前还是更改后,原理都是一样的,但是就是会出现问题。因此要对启动电路部分进行以下修改,修改后指令执行正确
具体的连线方法在上面的启动电路图和总图中有
在一开始设计微指令的时候,出现了一些问题,导致运行结果不正确
首先是ADD指令对应的微指令中不需要PC+1,因为ADD指令是单字长指令,之前设计了PC+1的微指令,导致PC多加了一次
另外就是ADD指令中要将R0和R1的数同时送给ALU相加,否则会出问题
一开始的时候先把R0送ALU,再把R1送ALU,相加之后结果有误
在第一次整机实验时,出现了取值周期循环的问题,无法实现正常跳转
后来发现有两个问题,第一个问题是我自己的电路图连错了,第二个问题是我的微指令写错了,导致出现无限循环无法跳转
在解决了这两个问题之后,指令正常执行跳转
微指令和具体的微操作
具体的二进制位在这里就不给了,因为不同人设计的微指令不同,具体的二进制也不同
ADD