计算机组成原理课程设计报告桂林电子科技大学Word格式文档下载.docx
《计算机组成原理课程设计报告桂林电子科技大学Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课程设计报告桂林电子科技大学Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
输入设备→Rd
JNSaddr
0100
addr
若大于,则addr→PC
JMPaddr
0110
addr→PC
OUT1Rs
1001
(Rs)→输出设备
MOV1Rs,Rd
1000
(Rs)→Rd
NOTRd
0111
Data取反
指令格式:
(1)I/O指令(单字节)
I说明:
对Rs和Rd的规定:
Rs或Rd
选定的寄存器
00
R0
01
R1
10
R2
11
R3
五.所有机器指令的微程序流程图
00
PC→ABUS(I)
RDROM
IBUS→IR
PC+1
P
(1)
MOV1
OUT1
IN1
MOV
NOT
JMP
JNS
CMP
INC
03
02
09
08
01
07
O6
05
04
Rs→X
-X→Rs
锁存CF,ZF
Rd→Y
Y+1→Rd
IR(I)→Rd
Rs→LED
X→Rd
IR(A)
→PC
SW→Rd
20
P
(2)
CF=1
ZF=1
CF=0
ZF=0
10
ROM→BUS
BUS→PC
设计操作控制器单元(即微程序控制器)
(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
后继微地址
1
000010
000000
000001
000011
000100
06
100000
010010
010100
(2)设计地址转移逻辑电路
地址转移逻辑电路是根据微程序流程图3-2中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。
由于微地址寄存器中的触发器异步置“1”端低电平有效,与µ
A4~µ
A0对应的异步置“1”控制信号SE5~SE1的逻辑表达式为:
(µ
A5的异步置“1”端SE6实际未使用)
SE5=FS·
P
(2)·
T4
SE4=I7·
P
(1)·
SE3=I6·
SE2=I5·
SE1=I4·
六.嵌入式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
八.机器语言源程序
地址(十六进制)
汇编语言源程序
机器语言源程序
代码
MOVR0,00H
0001000000000000
MOVR1,FFH
0001000111111111
11FF
MOVR2,05H
0001001000000101
1025
L0:
INCR0
0010000000000000
2000
CMPR0,R2
0011100000000000
3800
JNSL3
0100000000001100
400C
IN1R3
0101001100000000
5300
CMPR3,R1
0011110100000000
3D00
JNSL2
0100000000001010
400A
JMPL1
0110000000000011
6003
0A
L1:
MOV1R1,R3
1000110100000000
8D00
0B
JMPL0
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:
D:
CLR:
UA:
OUTSTD_LOGIC
);
ENDMMM;
ARCHITECTUREAOFMMMIS
BEGIN
PROCESS(CLR,SE,CLK)
BEGIN
IF(CLR='
0'
)THEN
UA<
='
;
ELSIF(SE='
)THEN
1'
ELSIF(CLK'
EVENTANDCLK='
=D;
ENDIF;
ENDPROCESS;
ENDA;
CROM的:
ADDR
ENTITYADDRIS
I15,I14,I13,I12:
ZF,CF,T4,P1,P2:
SE5,SE4,SE3,SE2,SE1,SE0:
OUTSTD_LOGIC
ENDADDR;
ARCHITECTUREAOFADDRIS
SE5<
--预留给JB或JAE指令使用
SE4<
=NOT((NOTZFANDCF)ANDP2ANDT4);
SE3<
=NOT(I15ANDP1ANDT4);
SE2<
=NOT(I14ANDP1ANDT4);
SE1<
=NOT(I13ANDP1ANDT4);
SE0<
=NOT(I12ANDP1ANDT4);
ENTITYF1IS
UA5,UA4,UA3,UA2,UA1,UA0:
INSTD_LOGIC;
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
ENDF1;
ARCHITECTUREAOFF1IS
D(5)<
=UA5;
D(4)<
=UA4;
D(3)<
=UA3;
D
(2)<
=UA2;
D
(1)<
=UA1;
D(0)<
=UA0;
ENTITYF2IS
INSTD_LOGIC_VECTOR(5DOWNTO0);
OUTSTD_LOGIC
);
ENDF2;
ARCHITECTUREAOFF2IS
UA5<
=D(5);
UA4<
=D(4);
UA3<
=D(3);
UA2<
=D
(2);
UA1<
=D
(1);
UA0<
=D(0);
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCONTROMIS
PORT(ADDR:
INSTD_LOGIC_VECTOR(5DOWNTO0);
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
O:
OUTSTD_LOGIC_VECTOR(19DOWNTO0)
ENDCONTROM;
ARCHITECTUREAOFCONTROMIS
SIGNALDATAOUT:
STD_LOGIC_VECTOR(25DOWNTO0);
BEGIN
PROCESS
CASEADDRIS
WHEN"
000000"
=>
DATAOUT<
="
11010010001111110110000000"
000001"
10001010001111111000000000"
000010"
10001110100111111100000000"
000011"
10000110011111111100000000"
000100"
10000010001111111001000000"
000101"
10001010001011111100000000"
000110"
01000010001111111000000000"
000111"
10001111000111111100000000"
001000"
10001011010111111100000000"
001001"
10000000001101111100000000"
010000"
WHENOTHERS=>
10000010001111111100000000"
ENDCASE;
UA(5DOWNTO0)<
=DATAOUT(5DOWNTO0);
O(19DOWNTO0)<
=DATAOUT(25DOWNTO6);
ENTITYF3IS
INSTD_LOGIC_VECTOR(3DOWNTO0);
UA3,UA2,UA1,UA0:
ENDF3;
ARCHITECTUREAOFF3IS
ENTITYMCOMMANDIS
T2,T3,T4:
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:
ENDMCOMMAND;
ARCHITECTUREAOFMCOMMANDIS
STD_LOGIC_VECTOR(19DOWNTO0);
PROCESS(T2)
IF(T2'
EVENTANDT2='
)THEN
DATAOUT(19DOWNTO0)<
=D(19DOWNTO0);
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);
Top顶层图的:
MUX3功能表
输入输出
SW-BCSID[7..0]N1[7..0]N2[7..0]EW[7..0]
0XXXXIN[7..0]
10XXXN2[7..0]
11XXXN1[7..0]
ENTITYMUX3IS
ID:
INSTD_LOGIC_VECTOR(7DOWNTO0);
SW_B,CS:
N1,N2:
EW:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
ENDMUX3;
ARCHITECTUREAOFMUX3IS
PROCESS(SW_B,CS)
BEGIN
IF(SW_B='
)THEN
EW<
=ID;
ELSIF(CS='
EW<
=N2;
ELSE
=N1;
ENDIF;
ROM功能
CS=1,不选择
CS=0,读
ENTITYROMIS
DOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
ADDR:
CS_I:
INSTD_LOGIC
ENDROM;
ARCHITECTUREAOFROMIS
DOUT<
0001000000000000"
WHENADDR="
00000000"
ANDCS_I='
"
0001000111111111"
00000001"
A