《计算机组成原理》
课程设计报告
微指令模型机实现
班级:
姓名:
学号:
小组成员:
完成日期:2020.10.16
一、计算机的功能和用途
通过该课程设计的学习,我们设计一台模型机,该模型机运行在FPGA平台上,可以模拟真正的计算机设备的一部分功能,通过微指令进行实现,使其可以完成一些基本操作,包括:加法、自增、减法、判断全0和判断进位,还有包括存储器读取写入等操作。具体实现了(1)(A1)+(A2)->A3。将A1、A2地址的数分别存到R0、R1寄存器,再通过ALU将加法结果存到寄存器R0,同时将结果状态cvnz存入寄存器STATE,将状态存入内存,再将寄存器R0的值存入内存。(2)数组累加。取出数组首地址放入地址累加器D,取出数组的数进行累加,使内存中的累加次数X+1,使D中地址+1,接着判断累加次数X是否等于N,若X与N不相等,则跳转到累加指令,否则结束循环,将累加结果存入内存。调试过程中通过平台指示灯观察内部的数据流动情况,了解计算机的运行、计算过程和内部的时序问题并辅助修改。
二、指令系统
1.指令格式
1.1基本字长:8位
1.2单字长指令:指令由高4位操作码、低4位全0构成。
7 4 3 2 1 0
| 操作码OP |
0 |
0 |
0 |
0
|
1.3双字长指令:指令由第一字节高4位操作码、低4位全0;第二字节操作数或操作数地址构成。
7 4 3 2 1 0
| 操作码OP |
0 |
0 |
0 |
0
|
|
操作数/操作数地址
| ||||
两种指令格式的高四位为操作码,支持16种不同的指令。使用10、20...90作为九条指令以及F0停机指令。
2.寻址方式:
2.1:立即数寻址:操作数在指令的第二个字节
2.2:直接寻址:操作数的地址在指令的第二个字节。
3.指令功能
| 指令 |
指令功能 |
| LDR0 A |
读内存将A地址的数存入寄存器R0 |
| LDR1 A |
读内存将A地址的数存入寄存器R1 |
| LDD A |
读内存将A地址的数存入地址累加器D |
| ADD1 S |
将寄存器R0、R1中的数相加,结果存入R0,加法结果状态从寄存器STATE写入内存地址S |
| ADD2 |
读内存将地址累加器D中地址的数与寄存器R0中的数相加,结果存入R0 |
| STA A |
将寄存器R0中的数写入内存地址A |
| INX #X |
将内存中的累加次数X取出、+1再写回内存 |
| CPX #N |
累加次数X与N比较,若相等则跳出循环,否则继续循环累加 |
| BNE #M |
跳转回加法指令 |
| HALT |
停机 |
三、总体结构与数据通路
3.1总体结构
总体结构的设计参考课件中的设计方案。下面简要介绍一下各个部分:
1.寄存器
根据功能的需要,共设计了8个8位寄存器,其中R0、R1为通用寄存器。PC为程序计数器,存储下一条将要执行的指令的地址。IR为指令寄存器,用来存储从RAM中取出的指令。MAR为地址寄存器,该寄存器提供对RAM进行读写的地址。MBR为三态门寄存器,隔离RAM读写冲突,数据通过MBR写入RAM。状态寄存器为三态门寄存器,保存ALU的计算结果状态,并可以直接写入RAM。地址累加器寄存器,提供自增的RAM数组地址。
2.ALU
ALU为组合74181和74182的算术运算器,接收从A和B两个端口传来的数据进行相应的运算并输出,可以提供的加法、直传、减法、判断全0、判断进位的操作。
3.选择器
因为我们的算术运算器的数据来源有很多,所以需要设计数据选择器。
- 连接算术运算器的两个选择器,左边的是数据选择器A,选择RAM或R0的数据。右边的是数据选择器B,选择R1或PC的数据。
- 连接uPC的选择器,选择无条件跳转或按操作码散转。
- 连接MAR的选择器,选择总线或地址累加器的数据。
3.2数据通路
模型机的数据通路是以总线为基础
下面就几个基本的操作分析其数据通路:
1)取指令
RAM → 选择器A →ALU → Bus → IR
2)送指令地址
PC → 选择器B →ALU → Bus → 选择器C → MAR
3)程序计数器加一
(PC)+1 → PC
4)(R0)->RAM
R0 → 选择器A →ALU → Bus → MBR → RAM
5)(R0)+(R1)->RAM
R0 → 选择器A →ALU ,R1 → 选择器B →ALU,
ALU→ Bus → MBR → RAM
四、指令执行流程
五、微程序执行流程
1.取指周期
| 00 |
M(MAR)->IR |
| 01 |
(PC)+1->PC |
| 02 |
QJP |
2.LDR0 A1
| 10 |
(PC)->MAR |
| 11 |
(PC)+1->PC |
| 12 |
M(MAR)->MAR |
| 13 |
M(MAR)->R0 |
| 14 |
(PC)->MAR |
| 15 |
JP |
3.LDR1 A2
| 20 |
(PC)->MAR |
| 21 |
(PC)+1->PC |
| 22 |
M(MAR)->MAR |
| 23 |
M(MAR)->R1 |
| 24 |
(PC)->MAR |
| 25 |
JP |
4.ADD1 S
| 30 |
(R0)+(R1)->R0 |
| 31 |
(PC)->MAR |
| 32 |
M(MAR)->MAR |
| 33 |
状态->M(MAR) |
| 34 |
(PC)+1->PC |
| 35 |
(PC)->MAR |
| 36 |
JP |
5.STA
| 40 |
(PC)->MAR |
| 41 |
(PC)+1->PC |
| 42 |
M(MAR)->MAR |
| 43 |
****R0->M(MAR) |
| 44 |
(PC)->MAR |
| 45 |
JP |
6.LDD D
| 50 |
(PC)->MAR |
| 51 |
M(MAR)->D |
| 52 |
(PC)+1->PC |
| 53 |
(PC)->MAR |
| 54 |
JP |
7.INX #X
| 60 |
(PC)->MAR |
| 61 |
M(MAR)->R1 |
| 62 |
(R1)+1->R1 |
| 63 |
R1->M(MAR) |
| 64 |
(PC)+1->PC |
| 65 |
(PC)->MAR |
| 66 |
JP |
8.CPX #N
| 70 |
PC ->MAR |
| 71 |
N==X? M(MAR)-(R1) |
| 72 |
特殊(PC)+1->PC |
| 73 |
特殊(PC)+1->PC |
| 74 |
(PC)+1->PC |
| 75 |
(PC)->MAR |
| 76 |
JP |
9.BNE #M
| 80 |
(PC)->MAR |
| 81 |
(PC) + M(MAR)->PC |
| 82 |
(PC)->MAR |
| 83 |
JP |
10.ADD2
| 90 |
(D)->MAR |
| 91 |
(D)+1->D |
| 92 |
M(MAR)->R1 |
| 93 |
(R0)+(R1)->R0 |
| 94 |
(PC)->MAR |
| 95 |
JP |
六、微程序设计
- 微操作字段定义
23-20:
20控制AB累加
0:不选中累加
1:选中累加
21:是否特殊PC+1
22:en_MBR:1为写
19-16:S3210
15:PC_LD
计数1
置数0
14-12:
ALU_AB选择
R0:001
R1:010
PC:011
RAM:100
R0R1:101
RAPC:110
RAR1:111
11-9:寄存器
R0:001
R1:010
PC:011
IR:100
MAR:101
MBR:110
地址累加器D:111
8:停机
7:ALU_CN
6:en
状态寄存器:1为写
5:RAM读
4:RAM写
3:地址累加器D_LD
2-0:跳转
upc+1:001
JP:010
QJP:011
2.特殊规定
1.ALU直传状态寄存器不计状态
2.s3210、cn:00001表示直传
3.只能通过R0存回RAM
4.直传B(PC)用加法
S1001 CN1
状态寄存器控制:1.脉冲2.A的AY、BY有选中即A中有传数3.s3210非全零,即非A直传。实现了A+B和A-B时存状态
七、系统的调试、测试方法:
7.1单元测试部分
ALU测试:
a输入、b输入、s0-s3、cn接开关
输出、进位接指示灯
通过控制开关查看指示灯的方式验证ALU加法、减法、直传、进位功能
累加器测试(PC、地址累加器、uPC):
输入、LD、CLR接开关,CP接单脉冲
输出接指示灯
通过控制开关和单脉冲查看指示灯的方式验证累加器置数、计数功能
7.2整机测试部分:
①微程序经过检查无误后通过软件以十六进制写入ROM的相应单元。
②指令经过检查无误后通过软件以十六进制写入RAM的相应单元。
③拨清零开关使所有寄存器、累加器清零,按复位键。
④按一次脉冲键发单脉冲使启动器发送连续脉冲,开始运行程序。
⑤根据指示灯观察R0、R1、总线、MAR、PC、uPC的值。
⑥等到程序运行结束后通过软件读取RAM的值。
八、课程设计总结
8.1遇到的问题
三态门:起初由于不理解RAM的单数据通路而发生读写冲突报错,后来通过使用带有三态门的寄存器MBR调控总线与RAM的数据线连接解决问题。
时序问题:由于把握不好读取ROM微操作和寄存器打入脉冲的顺序,导致数据未在正确时机打入寄存器和RAM读写混乱,经过加灯观测调试和询问老师,最终解决时序问题。uRD和CPuIR是下降沿有效,而各个寄存器CP是上升沿有效,而单脉冲为负脉冲,因此在各个寄存器CP脉冲之前都要加上一个非门。
ALU直传:ALU器件设计功能只能直传A输入端的数据,无法直传B输入端的数据,通过使用加法0+B输入端数据实现B输入端数据的直传。
ALU输入组合问题:我们设计的电路中RAM和R1接入ALU的A输入端,pc和R0接入ALU的B输入端。因而无法做到RAM与R1相加,解决方案是将R1的值写入R0中,接着从RAM中取出相应的值放入R1寄存器实现R1寄存器中的值与RAM相加。
如何判断累加次数x和数组大小n是否相等:起初尝试各种简单电路发现难以完成该功能,接着按照真值表转换逻辑电路的方法成功实现该功能。
连续脉冲下不能正常工作:单步执行时程序没有出现问题,当处于连续脉冲自动执行时会发生跳过某条指令、循环指令等问题,最终发现与实验台有关,更换实验台解决问题。
8.2收获和体会
回顾这次实验,自己收获还是挺多的,加深了对课本知识的认知,也增强了动手能力。
1. 经过这次实验加深了对CPU工作原理的认识,对于CPU的数据传输以及工作方式有了更进一步的了解。学会了简单指令系统的设计以及微程序工作原理。
2.通过课程设计掌握了模型机的设计流程。并从模型及设计流程中学会了解决实际问题,体会到了设计与实际实现之间的不同。
3. 通过实验过程更加熟悉了实验平台的使用,以及模型及设计流程。同时也锻炼了在实验中锻炼自己的动手能力和解决问题的能力。
4.总线结构有利也有弊,好处在于电路结构清晰、数据通路简单、组合多样,弊端在于容易发生读写冲突、总线上只能传输一组数据。
九、小组成员各自的任务和完成情况
1.小组分工
各部件设计、整机实验中,两人共同设计电路框架、画电路图、测试部件、指令和微程序的编写。曾尝试过分工,在检查时发现单独完成部分效果不佳,出现器件连线出错、设计理念不一致、编码不完善的问题,因而选择两人一起边讨论边思考完成实验。
2.完成情况
基础实验和拓展数组累加实验最终均实现,各个指令的实验结果均正确,完成了预期的功能。
附录1:逻辑图
一、总图
二、各部件图
2.1ALU
2.2 8位2选1选择器
2.3 8位寄存器
2.4 8位进制计数器
2.5 连续脉冲启动器
附录2.1:微程序编码
附录2.2:指令编码