山东大学软件学院计算机组成原理课程设计整机实验

Posted 叶卡捷琳堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了山东大学软件学院计算机组成原理课程设计整机实验相关的知识,希望对你有一定的参考价值。

一、实验时间

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里的这个图
在这里插入图片描述
由于上面的图里没有状态位寄存器,而基本要求里又要求有状态位寄存器,因此除了主要参考上面这个图以外,还需要参考下面这个图,下面这个图重点关注PSW寄存器即可,其它的不用关注
在这里插入图片描述
3.在保存两数相加的结果时,也要保存相应的状态位

  • C:反映无符号数的运算是否产生进位。运算结果的最高有效位向更高位进位或者借位,C置1,否则置0
  • V:反映有符号数的运算是否溢出。运算结果超过了规定字长有符号数的表示范围,V置1,否则置0
  • N:反映运算结果的符号。运算结果为负,N置1,否则置0。
  • Z:判断结果是否为0。运算结果0,Z置1,否则置0。

4.基本要求
在这里插入图片描述
注意以下几点

  1. 要求必须使用连续脉冲,程序执行结束后自动停机
  2. 总共五条机器指令,其中LOAD和STORE指令为双字长,ADD和HALT指令为单字长
  3. LOAD指令取操作数采用的是直接寻址的方式,而不是老师示例里给的立即寻址

三、整机实验基本思路

3.1 前序知识

在进行整机实验之前,由于涉及机器指令和微指令,比较复杂,因此一开始的时候我没弄清楚思路。

这里强烈建议整机实验思路很不清晰的同学去看一下大二上计组书第10章10.2节的内容

10.2 节主要描述的是微程序设计的基本思路,在书本 P403 - P410

相信看完之后对整机实验微指令的理解会更充分一些

3.2 关于机器指令和微指令的存放,读取和跳转

首先明确以下几点

  1. 机器指令和数据存在RAM中
  2. 每条机器指令对应的一段微指令存放在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中一共存了五条机器指令
比如:
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

至于运算结果状态位的保存,在实验室测试的时侯除了进位,其他部分都是准确的,因此这一部分没有彻底解决,等我解决了之后再更新这部分的内容

四、电路图

4.1 启动电路

注意,这里最后的输出没加非门,跟上次实验不一样,在总图中,启动电路输出连uPCPC的部分加了非门,这样是为了适应时序问题
在这里插入图片描述

4.2 模8计数器

在这里插入图片描述

4.3 24和38译码器

在这里插入图片描述
在这里插入图片描述

4.4 总图

特别提醒:总图的具体管脚的绑定要根据你自己的微操作命令。此外,由于整机实验还未做完,总图中关于状态为寄存器(PSW)的保存进位的功能有问题,其它部分没有问题

在这里插入图片描述

五、实验中遇到的问题和注意事项

5.1 脉冲问题

让我觉得非常疑惑的是,在整机实验中,使用上次实验(实验四)的启动电路时会出现问题,虽然不论是更改前还是更改后,原理都是一样的,但是就是会出现问题。因此要对启动电路部分进行以下修改,修改后指令执行正确

  1. 去掉启动电路输出那里的非门
  2. 在CPuPC的输入加非门(启动电路输出加非门),uRD和CPuIR直接连启动电路的输出

具体的连线方法在上面的启动电路图和总图中有

5.2 微指令问题

在一开始设计微指令的时候,出现了一些问题,导致运行结果不正确

首先是ADD指令对应的微指令中不需要PC+1,因为ADD指令是单字长指令,之前设计了PC+1的微指令,导致PC多加了一次

另外就是ADD指令中要将R0和R1的数同时送给ALU相加,否则会出问题
一开始的时候先把R0送ALU,再把R1送ALU,相加之后结果有误

5.3 取指周期不断循环的问题

在第一次整机实验时,出现了取值周期循环的问题,无法实现正常跳转
后来发现有两个问题,第一个问题是我自己的电路图连错了,第二个问题是我的微指令写错了,导致出现无限循环无法跳转
在解决了这两个问题之后,指令正常执行跳转

六、机器指令和微指令

机器指令
在这里插入图片描述

微指令和具体的微操作

具体的二进制位在这里就不给了,因为不同人设计的微指令不同,具体的二进制也不同

取指微指令
在这里插入图片描述
LOAD1
在这里插入图片描述

LOAD2
在这里插入图片描述

ADD
在这里插入图片描述

STORE
在这里插入图片描述
HALT
在这里插入图片描述

以上是关于山东大学软件学院计算机组成原理课程设计整机实验的主要内容,如果未能解决你的问题,请参考以下文章

山东大学软件学院计算机组成原理课程设计整机实验

关于计组整机实验的补充说明

组成原理课程设计论文

《编译原理》实验教学大纲

《编译原理》实验教学大纲

个人介绍