文章目录
一、实验时间
2021年4月29日星期四,第9周
2021年5月6日星期四,第10周
整机实验总共四次,由于第一次实验出现问题,没做出来,第二次实验成功了,因此这次的博客包含了第一次和第二次整机实验的内容
二、实验要求
前两次整机实验的主要目的是完成老师要求的整机实验的基本功能
基本功能如下
1.设计基本指令系统,包含以下几个机器指令
- LOAD Ri AD:取数指令,指令长度为两字节,(AD)–> Ri,AD为操作数在内存中的地址,根据AD取得操作数,打入Ri
- STORE Ri AD:存数指令,指令长度为两字节,将Ri的值存入内存中(地址为AD)
- ADD Ri,Rj:加法指令,指令长度为一字节,Ri+Rj->Rj,将Ri和Rj中保存的数求和,存入Rj中
- HALT:停机指令,指令长度为一字节,实现停机功能
2.模型机的基本结构为单总线,根据模型机框架图画出具体的电路图
具体的结构框架图参考老师ppt里的这个图
注意,千万不要参考例子里的图
3.在保存两数相加的结果时,也要保存相应的状态位
- C:反映无符号数的运算是否产生进位。运算结果的最高有效位向更高位进位或者借位,C置1,否则置0
- V:反映有符号数的运算是否溢出。运算结果超过了规定字长有符号数的表示范围,V置1,否则置0
- N:反映运算结果的符号。运算结果为负,N置1,否则置0。
- Z:判断结果是否为0。运算结果0,Z置1,否则置0。
其实有符号数和无符号数不用区分得太清楚,可以全部当成有符号数来算
4.基本要求
注意以下几点
- 要求必须使用连续脉冲,程序执行结束后自动停机
- 总共4条机器指令,其中LOAD和STORE指令为双字长,ADD和HALT指令为单字长
- LOAD指令取操作数采用的是直接寻址的方式,而不是老师示例里给的立即寻址
三、整机实验基本思路
3.1 前序知识
在进行整机实验之前,由于涉及机器指令和微指令,比较复杂,因此一开始的时候我没弄清楚思路。
这里强烈建议整机实验思路很不清晰的同学去看一下大二上计组书第10章10.2节的内容
10.2 节主要描述的是微程序设计的基本思路,在书本 P403-P410
相信看完之后对整机实验微指令的理解会更充分一些
3.2 关于机器指令和微指令的存放,读取和跳转
首先明确以下几点
- 机器指令和数据存在RAM中
- 每条机器指令对应的一段微指令存放在ROM的相应内存中
实验思路
整机实验分为两个部分,一个是机器指令和微指令的部分,另一个是电路图的部分
(1)机器指令和微指令
机器指令按顺序存放在RAM里,微指令存放在ROM里
整机实验跟之前的第四次部件级实验很像(有uPC和PC),都涉及RAM和ROM的同时操作,上次的实验是从ROM中取微指令,而下一条微指令的地址只能是uPC+1,而这整机实验下一条微指令的地址则复杂多变,可能有三种情况(uPC+1,JP,QJP)。
在上次实验里,取出的微指令负责操控取RAM的PC,MAR,MBR等寄存器,还负责对RAM进行读写,这次实验也是一样,只不过上次实验中从RAM中取来的只是地址或数据,而这次从RAM中取来的既有机器指令,又有数据。
所以,整机实验在本质上和上次的实验有很多相似的地方,只不过功能变得更多了控制打入寄存器的方式也变多了,之前是某一位控制一个寄存器的打入脉冲,现在是三位2进制数控制好几个寄存器,使用38译码器对微指令进行译码
由于本次实验在RAM中一共有4条机器指令
注意要通过机器指令选择打入哪个寄存器
比如:
LOAD Ri Ai
ADD Ri,Rj
STORE Rj,AD3
HLAT
而我们按下脉冲的时侯,连续脉冲自动工作,如果不预设初值的话,uPC自动从ROM的0地址开始取出微指令,前几条微指令的功能就是从RAM中取出第一条机器指令(注意是双字长)
在取出第一条机器指令的第一个字长的时候,根据第一个字长中的OP,自动在OP后加上0000,形成这条机器指令要执行的微指令的地址,之后uPC的初值设为这个地址,跳转到这条机器指令对应的微指令执行
要特别注意的是这条机器指令是双字长指令,因此在这条机器指令对应的微指令里,还要再设计一个取指周期,取出第二个字长的机器指令
微指令在执行的过程中,需要指定下一条微指令的地址,共有三种方式,一种是uPC+1,另一种是JP(无条件转移,微地址由uIR23-16提供),还有一种是QJP(按照高4位操作码,第4位为0转移)。
刚刚上面说的这种转移方式就是使用QJP方式转移的
这就是取出第一条机器指令并执行的全部过程
在执行完第一条机器指令之后(即执行到第一条机器指令对应的最后一条微指令的时候),会使用JP进行无条件转移,转移到下一条机器指令的取值周期部分,取出机器指令之后,再根据这条机器指令的OP判断对应要执行的微程序的地址,然后执行,以此类推
最后一个指令是停机指令,用于终止连续脉冲
以上就是对微程序执行过程的分析,我们要做的就是明确流程,写好对应的微程序和机器指令
具体的微指令编码可以参考老师课件上的这个图,但要注意的是,老师的这个只是示例,我们最后写的跟老师的这个不一样,还是要根据具体的图来写相应的微指令
(2)电路图部分
电路图部分的结构框图参考上面的结构框架图,其中ALU有多种运算功能,R0,R1使用寄存器组封装,IR采用普通寄存器,PC采用带有三台门,可置位的PC,MDR采用带有三态门的寄存器,锁存器Z采用带三态门的寄存器,暂存器Y采用普通寄存器
特别注意的是CU部分,由于这一部分的输出和uPC相连(相当于CU部分要确定微指令的地址),所以CU部分需要连选择器,两路选择的数据分别为OP(IR)+0000和微指令的高8位,目的是给uPC设置初值(即下一条微指令的地址)
另外要注意的地方就是24位微指令的输出,在必要的地方需要使用24或38译码器,然后连接对应的寄存器的CP
特别注意MDR的部分,MDR有两路输入,两路输出,一路输入从总线中获得,另一路输入从RAM里来,需要加2路选择器进行选择。一路输出总线,另一路输出RAM,都需要加三态门
四、电路图
4.1 启动电路
注意,这里最后的输出没加非门,跟上次实验不一样,在总图中,启动电路输出连uPCPC的部分加了非门,这样是为了适应时序问题
4.2 模8计数器
4.3 24和38译码器
4.4 总图
总图里使用了寄存器组,寄存器组我只封装了两个,有的老师要求必须封装4个
总图由于太大(大于5MB),这里没法上传,我之后会上传到我的资源里
这里把MDR的连线结构展示一下,输出连了两个三态门
启动电路部分注意加非门的部分,如果不这样画,可能会出现脉冲问题
五、实验中遇到的问题和注意事项
5.1 脉冲问题
让我觉得非常疑惑的是,在整机实验中,使用上次实验(实验四)的启动电路时会出现问题,虽然不论是更改前还是更改后,原理都是一样的,但是就是会出现问题。因此要对启动电路部分进行以下修改,修改后指令执行正确
- 去掉启动电路输出那里的非门
- 在CPuPC的输入加非门(启动电路输出加非门),uRD和CPuIR直接连启动电路的输出
具体的连线方法在上面的启动电路图和总图中有
5.2 微指令问题
在一开始设计微指令的时候,出现了一些问题,导致运行结果不正确
首先是ADD指令对应的微指令中不需要PC+1,因为ADD指令是单字长指令,之前设计了PC+1的微指令,导致PC多加了一次
另外就是ADD指令中要将R0和R1的数同时送给ALU相加,否则会出问题
一开始的时候先把R0送ALU,再把R1送ALU,相加之后结果有误
5.3 取指周期不断循环的问题
在第一次整机实验时,出现了取值周期循环的问题,无法实现正常跳转
后来发现有两个问题,第一个问题是我自己的电路图连错了,第二个问题是我的微指令写错了,导致出现无限循环无法跳转
在解决了这两个问题之后,指令正常执行跳转
此外,取值周期的循环问题还可能是由上面5.1的脉冲问题导致的,我没有遇到,但是有的同学遇到过这样的情况
5.4 状态位不正确的问题
之前调试的时候,将CPPSW和CPRi两个信号放在同一条微指令里执行,理论上应该即保存状态位,又保存运算的结果,但是却出现了状态位不对,结果正确的情况
因此在之后的微指令中,我先打入状态位,再打入结果,这样状态位就正确了
六、机器指令和微指令
机器指令
微指令和具体的微操作
具体的二进制位在这里就不给了,因为不同人设计的微指令不同,具体的二进制也不同
取指微指令
LOAD
ADD
STORE
HALT