计算机组成原理课程设计桂林电子科技大学.docx
《计算机组成原理课程设计桂林电子科技大学.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课程设计桂林电子科技大学.docx(34页珍藏版)》请在冰豆网上搜索。
![计算机组成原理课程设计桂林电子科技大学.docx](https://file1.bdocx.com/fileroot1/2023-6/3/0d112bad-5786-47a9-9e2e-3013dda43e56/0d112bad-5786-47a9-9e2e-3013dda43e561.gif)
计算机组成原理课程设计桂林电子科技大学
计算机组成原理课程设计说明书
题目:
设计一台嵌入式CISC模型计算机
院(系):
计算机科学与工程学院
专业:
网络工程
学生姓名:
唐波
学号:
1100380219
指导教师:
陈智勇
一、课设题目:
设计一台嵌入式CISC模型计算机(采用定长CPU周期、联合控制方式),并运行能完成一定功能的机器语言程序进行验证,实现方法可从以下4类中任选一个:
●连续输入5个有符号整数(8位二进制补码表示,用十六进制数输入),求最小的负数的绝对值并输出显示。
说明:
①5个有符号数从外部输入;
②一定要使用符号标志位(比如说SF),并且要使用为负的时候转移(比如JS)或不为负的时候转移(比如JNS)指令。
二.CISC模型机系统总体设计
三.操作控制器的逻辑框图
说明:
在T4内形成微指令的微地址,并访问控制存储器,在T2的上边沿到来时,将读出的微指令打入微指令寄存器,即图中的微命令寄存器和微地址寄存器。
四.模型机的指令系统和所有指令的指令格式
由此可见,本模型机中的指令系统中共有8条基本指令,下表9列出了每条指令的格式、汇编符号和指令功能。
指令助记符
指令格式
功能
15--12
1110
98
7-----------0
IN1Rd
0101
××
Rd
××××××××
(Rd)+1→Rd,锁存标志位
MOVRd,im
0001
××
Rd
im
立即数→Rd
CMPRs,Rd
0011
Rs
Rd
××××××××
Rs,Rd比较,
INCRd
0010
××
Rd
××××××××
输入设备→Rd
JNSaddr
0100
××
××
addr
若大于,则addr→PC
JMPaddr
0110
××
××
addr
addr→PC
OUT1Rs
1001
Rs
××
××××××××
(Rs)→输出设备
MOV1Rs,Rd
1000
Rs
Rd
××××××××
(Rs)→Rd
NOTRd
0111
××
Rd
××××××××
Data取反
指令格式:
(1)I/O指令(单字节)
I说明:
对Rs和Rd的规定:
Rs或Rd
选定的寄存器
00
R0
01
R1
10
R2
11
R3
五.所有机器指令的微程序流程图
设计操作控制器单元(即微程序控制器)
(1)设计微指令格式和微指令代码表
CISC模型机系统使用的微指令采用全水平型微指令,字长为25位,其中微命令字段为17位,P字段为2位,后继微地址为6位,其格式如下:
252423222120191817161514131211109876543210
LOADLDPCLDARLDIRLDRiRD_BRS_BS2S1S0ALU_BSW_BLED_BRD_DCS_DRAM_BCS_IADDR_BP1P2后继微地址
由微指令格式和微程序流程图编写的微指令代码表如下所示,在微指令的代码表中微命令字段从左边到右代表的微命令信号依次为:
LOADLDPCLDARLDIRLDRiRD_BRS_BS2S1S0ALU_BSW_BLED_BRD_DCS_DRAM_BCS_IADDR_B
微地址
微命令字段
P1
P2
后继微地址
00
1
1
0
1
0
0
1
0
0
0
1
1
1
1
1
1
0
1
1
0
000010
01
1
0
0
0
1
0
1
0
0
0
1
1
1
1
1
1
1
0
0
0
000000
02
1
0
0
0
1
1
1
0
1
0
0
1
1
1
1
1
1
1
0
0
000001
03
1
0
0
0
0
1
1
0
0
1
1
1
1
1
1
1
1
1
0
0
000000
04
1
0
0
0
0
0
1
0
0
0
1
1
0
1
1
1
1
1
0
1
000011
05
1
0
0
0
1
0
1
0
0
0
1
0
1
1
1
1
1
1
0
0
000100
06
0
1
0
0
0
0
1
0
0
0
1
1
1
1
1
1
1
0
0
0
100000
07
1
0
0
0
1
1
1
1
0
0
0
1
1
1
1
1
1
1
0
0
000000
08
1
0
0
0
1
0
1
1
0
1
0
1
1
1
1
1
1
1
0
0
010010
09
1
0
0
0
0
0
0
0
0
0
1
1
0
1
1
1
1
1
0
0
010100
10
0
1
0
0
0
0
1
0
0
0
1
1
1
1
1
1
1
0
0
0
000000
(2)设计地址转移逻辑电路
地址转移逻辑电路是根据微程序流程图3-2中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。
由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA4~µA0对应的异步置“1”控制信号SE5~SE1的逻辑表达式为:
(µA5的异步置“1”端SE6实际未使用)
SE5=FS·P
(2)·T4
SE4=I7·P
(1)·T4
SE3=I6·P
(1)·T4
SE2=I5·P
(1)·T4
SE1=I4·P
(1)·T4
六.嵌入式CISC模型计算机的顶层电路图
CROM:
AA;
七.汇编代码:
MOVR0,00H功能:
将0赋给R0
MOVR1,FFH将FF赋给R1
MOVR2,05H将05赋给R2
L0:
INCR0计数加1
CMPR0,R2R0与R2比较,是否输入五个数
JNSL3是跳转L2输出
IN1R3输入一个数到R3
CMPR3,R1R3和R1比较,锁存CF,ZF
JNSL2跳转L2输出
JMPL1跳转L1
L1:
MOV1R1,R3(R3)→(R1)
JMPL0跳转L0
L2:
NOTR1R1取反
INCR1R1加1
OUT1R1输出R1
八.机器语言源程序
地址(十六进制)
汇编语言源程序
机器语言源程序
代码
00
MOVR0,00H
0001000000000000
1000
01
MOVR1,FFH
0001000111111111
11FF
02
MOVR2,05H
0001001000000101
1025
03
L0:
INCR0
0010000000000000
2000
04
CMPR0,R2
0011100000000000
3800
05
JNSL3
0100000000001100
400C
06
IN1R3
0101001100000000
5300
07
CMPR3,R1
0011110100000000
3D00
08
JNSL2
0100000000001010
400A
09
JMPL1
0110000000000011
6003
0A
L1:
MOV1R1,R3
1000110100000000
8D00
0B
JMPL0
0110000000000011
6003
0C
L2:
NOTR1
0111000100000000
7100
0D
INCR1
0010000100000000
2100
0E
OUT1R1
1001010000000000
9400
九.机器语言源程序的功能仿真波形图及结果分析
1.MOVR0,00H2.MOVR1,FFH3.MOVR2,05H4.CMPR2,R05.IN1R3(F4存到R3)
6.MOV1R3,R1(F4存入R1)
7.IN1R3(02存到R3)8.02是大于F4的正数,不跳到L1存R1,直接跳回L0。
9.IN1R3(F1存到R3)。
10.F1是小于于F4的负数,跳到L1,MOV1R3,R1(F1存入R1)
11.FNOTR1,INCR1(F1取反加1存入R1)。
12。
OUT1R1(输出R1,最终结果是0F)
十.故障现象和故障分析
故障一:
在进行仿真的时候,当输入一个正数存进R3之后,执行CMPR3,R1之后,没有执行JNSL0,而是错将正数也存入R1。
查看之后发现是ALU里“CMP”运算代码有问题。
故障二:
计数(R0)一直加,到5时不会跳转输出,检查机器指令发现JNSL2的地址写成了06
故障三:
,输出结果时,取反都变成FB,检查很久之后发现原本应该对AC里的数取反的,结果弄成了DR的.
故障N:
汇编程序出错、连线错误、微指令错误、修改器件没有重新编译等。
十一.心得体会
刚开始去上老师的课时,听得一头雾水,因为发现好多地方自己同不懂。
然后我就去看课本,同时问老师一些问题,当看到其他同学也问老师问题时,自己也跑过去凑热闹,因为这样可以了解更多的知识。
直到后来才发现,原来除了设计自己的指令外,我们需要写MCOMMAND,写CONTROM来解析我们写的指令,这或许可以算得上一个极简单的CPU模型了吧。
就是有了微程序控制器,计算机才认识我们自己设计的指令,才知道当读取到什么指令时该执行什么操作。
听得多了,看得多了,就渐渐的明白了一些课设的相关知识,然后画指令流程图,设计指令,写程序完成任务,这些几乎都是水到渠成的工作了,很多都可以依葫芦画瓢来完成。
本次课设,由于汇编学的很差,期汇编代码是和班级同学的相同,但是自己重新设计了指令周期流程图,经过调试得出的结果
其实只要把最基本的原理搞明白了,后续工作开展是非常快的。
但在没明白原理前,千万不要畏惧困难,慢慢的一点一点学习,特别是仿真软件的学习和使用,需要花费相当的时间。
只要认真了,就有可能实现。
十二.软件清单
AA里的MMM:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMMMIS
PORT(
SE:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
UA:
OUTSTD_LOGIC
);
ENDMMM;
ARCHITECTUREAOFMMMIS
BEGIN
PROCESS(CLR,SE,CLK)
BEGIN
IF(CLR='0')THEN
UA<='0';
ELSIF(SE='0')THEN
UA<='1';
ELSIF(CLK'EVENTANDCLK='1')THEN
UA<=D;
ENDIF;
ENDPROCESS;
ENDA;
CROM的:
ADDR
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYADDRIS
PORT(
I15,I14,I13,I12:
INSTD_LOGIC;
ZF,CF,T4,P1,P2:
INSTD_LOGIC;
SE5,SE4,SE3,SE2,SE1,SE0:
OUTSTD_LOGIC
);
ENDADDR;
ARCHITECTUREAOFADDRIS
BEGIN
SE5<='1';--预留给JB或JAE指令使用
SE4<=NOT((NOTZFANDCF)ANDP2ANDT4);
SE3<=NOT(I15ANDP1ANDT4);
SE2<=NOT(I14ANDP1ANDT4);
SE1<=NOT(I13ANDP1ANDT4);
SE0<=NOT(I12ANDP1ANDT4);
ENDA;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYF1IS
PORT(
UA5,UA4,UA3,UA2,UA1,UA0:
INSTD_LOGIC;
D:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);
ENDF1;
ARCHITECTUREAOFF1IS
BEGIN
D(5)<=UA5;
D(4)<=UA4;
D(3)<=UA3;
D
(2)<=UA2;
D
(1)<=UA1;
D(0)<=UA0;
ENDA;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYF2IS
PORT(
D:
INSTD_LOGIC_VECTOR(5DOWNTO0);
UA5,UA4,UA3,UA2,UA1,UA0:
OUTSTD_LOGIC
);
ENDF2;
ARCHITECTUREAOFF2IS
BEGIN
UA5<=D(5);
UA4<=D(4);
UA3<=D(3);
UA2<=D
(2);
UA1<=D
(1);
UA0<=D(0);
ENDA;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCONTROMIS
PORT(ADDR:
INSTD_LOGIC_VECTOR(5DOWNTO0);
UA:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
O:
OUTSTD_LOGIC_VECTOR(19DOWNTO0)
);
ENDCONTROM;
ARCHITECTUREAOFCONTROMIS
SIGNALDATAOUT:
STD_LOGIC_VECTOR(25DOWNTO0);
BEGIN
PROCESS
BEGIN
CASEADDRIS
WHEN"000000"=>DATAOUT<="11010010001111110110000000";
WHEN"000001"=>DATAOUT<="10001010001111111000000000";
WHEN"000010"=>DATAOUT<="10001110100111111100000000";
WHEN"000011"=>DATAOUT<="10000110011111111100000000";
WHEN"000100"=>DATAOUT<="10000010001111111001000000";
WHEN"000101"=>DATAOUT<="10001010001011111100000000";
WHEN"000110"=>DATAOUT<="01000010001111111000000000";
WHEN"000111"=>DATAOUT<="10001111000111111100000000";
WHEN"001000"=>DATAOUT<="10001011010111111100000000";
WHEN"001001"=>DATAOUT<="10000000001101111100000000";
WHEN"010000"=>DATAOUT<="01000010001111111000000000";
WHENOTHERS=>DATAOUT<="10000010001111111100000000";
ENDCASE;
UA(5DOWNTO0)<=DATAOUT(5DOWNTO0);
O(19DOWNTO0)<=DATAOUT(25DOWNTO6);
ENDPROCESS;
ENDA;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYF3IS
PORT(
D:
INSTD_LOGIC_VECTOR(3DOWNTO0);
UA3,UA2,UA1,UA0:
OUTSTD_LOGIC
);
ENDF3;
ARCHITECTUREAOFF3IS
BEGIN
UA3<=D(3);
UA2<=D
(2);
UA1<=D
(1);
UA0<=D(0);
ENDA;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYMCOMMANDIS
PORT(
T2,T3,T4:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(19DOWNTO0);
LOAD,LDPC,LDAR,LDIR,LDRI,LDPSW,RS_B,S2,S1,S0:
OUTSTD_LOGIC;
ALU_B,SW_B,LED_B,RD_D,CS_D,RAM_B,CS_I,ADDR_B,P1,P2:
OUTSTD_LOGIC
);
ENDMCOMMAND;
ARCHITECTUREAOFMCOMMANDIS
SIGNALDATAOUT:
STD_LOGIC_VECTOR(19DOWNTO0);
BEGIN
PROCESS(T2)
BEGIN
IF(T2'EVENTANDT2='1')THEN
DATAOUT(19DOWNTO0)<=D(19DOWNTO0);
ENDIF;
LOAD<=DATAOUT(19);
LDPC<=DATAOUT(18)ANDT4;
LDAR<=DATAOUT(17)ANDT3;
LDIR<=DATAOUT(16)ANDT3;
LDRI<=DATAOUT(15)ANDT4;
LDPSW<=DATAOUT(14)ANDT4;
RS_B<=DATAOUT(13);
S2<=DATAOUT(12);
S1<=DATAOUT(11);
S0<=DATAOUT(10);
ALU_B<=DATAOUT(9);
SW_B<=DATAOUT(8);
LED_B<=DATAOUT(7);
RD_D<=NOT(NOTDATAOUT(6)AND(T2ORT3));
CS_D<=NOT(NOTDATAOUT(5)ANDT3);
RAM_B<=DATAOUT(4);
CS_I<=DATAOUT(3);
ADDR_B<=DATAOUT
(2);
P1<=DATAOUT
(1);
P2<=DATAOUT(0);
ENDPROCESS;
ENDA;
Top顶层图的:
MUX3功能表
输入输出
SW-BCSID[7..0]N1[7..0]N2[7..0]EW[7..0]
0XXXXIN[7..0]
10XXXN2[7..0]
11XXXN1[7..0]
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX3IS
PORT(
ID:
INSTD_LOGIC_VECTOR(7DOWNTO0);
SW_B,CS:
INSTD_LOGIC;
N1,N2:
INSTD_LOGIC_VECTOR(7DOWNTO0);
EW:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDMUX3;
ARCHITECTUREAOFMUX3IS
BEGIN
PROCESS(SW_B,CS)
BEGIN
IF(SW_B='0')THEN
EW<=ID;
ELSIF(CS='0')THEN
EW<=N2;
ELSE
EW<=N1;
ENDIF;
ENDPROCESS;
ENDA;
ROM功能
CS=1,不选择
CS=0,读
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYROMIS
PORT(
DOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
ADDR:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CS_I:
INSTD_LOGIC
);
ENDROM;
ARCHITECTUREAOFROMIS
BEGIN
DOUT<="0001000000000000"WHENADDR="00000000"ANDCS_I='0'ELSE
"0001000111111111"WHENADDR="00000001"ANDCS_I='0'ELSE
"0001001000000101"WHENADDR="00000010"ANDCS_I='0'ELSE
"0010000000000000"WHENADDR="00000011"ANDCS_I='0'ELSE
"0011100000000000"WHENADDR="00000100"ANDCS_I='0'ELSE
"0100000000001100"WHENADDR="00000101"ANDCS_I='0'ELSE
"0101001100000000"WHENADDR="00000110"ANDCS_I='0'ELSE
"0011110100000000"