精品计算机组成原理毕业论文报告40江苏大学软件工程41.docx
- 文档编号:28135972
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:28
- 大小:1.72MB
精品计算机组成原理毕业论文报告40江苏大学软件工程41.docx
《精品计算机组成原理毕业论文报告40江苏大学软件工程41.docx》由会员分享,可在线阅读,更多相关《精品计算机组成原理毕业论文报告40江苏大学软件工程41.docx(28页珍藏版)》请在冰豆网上搜索。
精品计算机组成原理毕业论文报告40江苏大学软件工程41
江苏大学
《计算机组成原理》课程设计报告
专业名称:
软件工程
班级学号:
软件1001
第一天取操作数微程序的设计和调试
1、设计目标
设计并调试取操作数的微程序
二、取操作数微流程
三、测试程序、数据及运行结果
1、
测试内容:
立即寻址,直接寻址
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
077A56780010
MOV#5678H,0010H
运行结果及分析:
从微地址可以看出,先是取指令001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->-01B>01F->024->025->026->007,是直接寻址方式,最后是执行阶段,007->044->047->072->000,将结果mov到内存里。
2、
测试内容:
立即寻址,寄存器
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
07615678
MOV#5678H,R1
运行结果及分析:
从微地址可以看出,先是取指令001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->018->007,是寄存器寻址方式,最后是执行阶段,007->044->046->000,将结果mov到寄存器里。
由GRS可以看出最终结果由0000变成了5678。
4、设计中遇到的问题及解决办法
才开始的时候,对软件的应用不是很熟悉,遇到一些麻烦,在同学的帮助下,解决了软件应用问题。
第二天运算指令的微程序设计与调试
1、设计目标
设计并调试运算指令的微程序。
二、运算指令微程序入口地址
指令助记符
指令编码
入口地址(H)
F
E
D
C
B
A
9
8
7
6
5
4
3
2
1
0
MOVsrc,dst
0
0
0
0
0
1
源地址码
目的地址码
044
ADDsrc,dst
0
0
0
0
1
0
源地址码
目的地址码
048
ADDCsrc,dst
0
0
0
0
1
1
源地址码
目的地址码
04C
SUBsrc,dst
0
0
0
1
0
0
源地址码
目的地址码
050
SUBBsrc,dst
0
0
0
1
0
1
源地址码
目的地址码
054
CMPsrc,dst
0
0
0
1
1
0
源地址码
目的地址码
058
ANDsrc,dst
0
0
0
1
1
1
源地址码
目的地址码
05C
ORsrc,dst
0
0
1
0
0
0
源地址码
目的地址码
060
XORsrc,dst
0
0
1
0
0
1
源地址码
目的地址码
064
TESTsrc,dst
0
0
1
0
1
0
源地址码
目的地址码
068
INCdst
0
0
0
0
0
0
1
0
0
0
1
目的地址码
0A4
DECdst
0
0
0
0
0
0
1
0
0
1
0
目的地址码
0A8
NOTdst
0
0
0
0
0
0
1
0
0
1
1
目的地址码
0AC
三、运算类指令微程序
微地址(H)
微指令(H)
微命令
BM
NA
注释
007
OP
4
XXX
指令执行入口
048
TRoe,ADD,Sce,PSWce
0
06F
ADD
04C
98B0006F
TRoe,ADDC,SV,PSWce
0
06F
ADDC
050
98F0006F
TRoe,SUB,SV,PSWce
0
06F
SUB
06F
00000E70
7
070
存结果
070
Soe,GRSce
0
000
ALU运算,结果送寄存器
071
Soe,DRce
0
072
结果送存储器
072
DRoe’,ARoe’,WR
0
000
四、测试程序、数据及运行结果
1、
测试内容:
ADD运算
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
0002
07615678
0B61F000
MOV#5678H,R1
ADD#F000,R1
运行结果及分析:
从微地址可以看出,第一阶段先是取第一条指令(MOV#5678H,R1)001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->018->007,是寄存器寻址方式,最后是执行阶段,007->044->046->000,将结果mov到寄存器里。
在GRS可以看出由0000变成了5678。
第二阶段先是取第二条指令(ADD#F000,R1)001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->018->007,是寄存器寻址方式,最后是执行阶段,007->048->04F->070->000,是ADD运算,结果存放在寄存器GRS中,可以看出结果为4678,并且产生进位,SZOC=0001,正确。
五、设计中遇到的问题及解决办法
指令的入口地址开始时没看懂,在同学的点拨下明白了。
再是写微程序阶段,完成微程序的输入后,输入时由于不太仔细有一些错误,经过调试发现并改正了错误。
经过对每条运算的测试,一些结果不对,在自己的一步一步的查找中,通过和同学的微程序的对照,一一弄懂并改正了。
第三天CPU硬件的初级设计与验证
一、设计目标
在运算器实验的基础上对硬件进行扩充,建立初级CPU的数据通路,构造一个只支持运算指令的初级CPU。
二、硬件设计
1、PC模块设计
(加上适当注释)
modulePC(d,q,n_reset,clk,ce,PCinc);
input[15:
0]d;
inputn_reset,clk,ce;
inputPCinc;
output[15:
0]q;
reg[15:
0]data;
always@(posedgeclkornegedgen_reset)
begin
if(!
n_reset)
data=0;
elseif(ce)
data=d;
elseif(PCinc)
data=data+1;
end
assignq=data;
endmodule
2、IR模块设计
moduleIR#(
parameterDATAWIDTH=16)
(inputwire[DATAWIDTH-1:
0]d,
inputwireclk,
inputwirece,
inputn_reset,
outputreg[DATAWIDTH-1:
0]q);
always@(posedgeclkornegedgen_reset)
begin
if(!
n_reset)
q=0;
elseif(ce)
q=d;
end
DR:
moduleDR#(
parameterDATAWIDTH=16)
(inputwire[DATAWIDTH-1:
0]data_IB,
inputwire[DATAWIDTH-1:
0]data_DB,
inputwireclk,
inputwireDRce_IB,
inputwireDRce_DB,
inputn_reset,
outputreg[DATAWIDTH-1:
0]q);
always@(posedgeclkornegedgen_reset)
begin
if(!
n_reset)
q=0;
elseif(DRce_IB)
q=data_IB;
elseif(DRce_DB)
q=data_DB;
end
endmodule
3、顶层模块设计(自己增加的设计部分)
TR
TR寄存器的实例化
R#(DATAWIDTH)TR(.q(TR_out),.d(IB),.clk(clock),.ce(TRce),.n_reset(n_reset));
buffer#(DATAWIDTH)reg_buffer(.q(IB),.d(TR_out),.oe(TRoe));
AR
AR寄存器的实例化
R#(DATAWIDTH)AR(.q(AR_out),.d(IB),.clk(clock),.ce(ARce),.n_reset(n_reset));
buffer#(ADDRWIDTH)AR_AB(.q(AB),.d(AR_out),.oe(ARoe_AB));
buffer#(ADDRWIDTH)AR_IB(.q(IB),.d(AR_out),.oe(ARoe_IB));
IR
IR寄存器的实例化
R#(DATAWIDTH)IR(.q(IR_out),.d(IB),.clk(clock),.ce(IRce),.n_reset(n_reset));
PC
PCPC(.d(IB),.q(PC_out),.n_reset(n_reset),.clk(clock),.ce(PCce),.PCinc(PCinc));
buffer#(DATAWIDTH)PC_buffer(.q(IB),.d(PC_out),.oe(PCoe));
DR
DR#(DATAWIDTH)DR(.q(DR_out),.data_IB(IB),.data_DB(DB),.clk(clock),.DRce_IB(DRce_IB),.DRce_DB(DRce_DB),.n_reset(n_reset));
buffer#(DATAWIDTH)DR_DB(.q(DB),.d(DR_out),.oe(DRoe_DB));
buffer#(DATAWIDTH)DR_IB(.q(IB),.d(DR_out),.oe(DRoe_IB));
三、验证
1、
测试内容:
ADD运算
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
0002
07615678
0B61F000
MOV#5678H,R1
ADD#F000,R1
结果和第二天的一样,说明硬件扩充正确。
四、设计中遇到的问题及解决办法
在写TR,AR,IR的实例化代码时,没注意是用寄存器模块R实例化得到的,经过报错和仔细看书后,发现了问题,成功改正过来了。
完成程序运行出了问题,经过查找发现是DR模块出了问题,if(!
n_reset)q=0;elseif(DRce_IB)q=data_IB;elseif(DRce_DB)q=data_DB;这一句被我写成了if(!
n_reset)q=0;elseif(DRce_IB)q=data_IB;elseq=data_DB。
第四天为CPU扩充转移指令
一、设计要求
在初级CPU的基础上进行功能扩充,使其支持转移类指令
二、硬件uAG模块设计
(自己修改的设计部分,加上适当注释)
3'd3:
uAGout={NA[8:
1],BM3_uAR0};3,根据条件转移指令操作码PSW的ZF,OF,SF,CF状态标志决定微地址
第四天
always@(SZOC,IR)begin
case(IR[7:
6])条件转移类指令
2'b00:
Flag_MUX<=SZOC[0];2'b01:
Flag_MUX<=SZOC[1];
2'b10:
Flag_MUX<=SZOC[2];
2'b11:
Flag_MUX<=SZOC[3];
default:
Flag_MUX<=1'b0;
endcase
end
assignBM3_uAR0=Flag_MUX^IR[5];
三、转移指令微程序的设计
四、测试程序、数据及运行结果
1、
测试内容:
JC命令
机器码:
内存地址(H)
机器码(H)
汇编指令
0000
0002
0004
07615678
0B61F000
011A0010
MOV#5678H,R1
ADD#F000,R1
JC0010H
运行数据:
运行结果及分析:
从微地址可以看出,第一阶段先是取第一条指令(MOV#5678H,R1)001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->018->007,是寄存器寻址方式,最后是执行阶段,007->044->046->000,将结果mov到寄存器里。
在GRS可以看出由0000变成了5678。
第二阶段先是取第二条指令(ADD#F000,R1)001->002->003->004,再是取源操作数,004->00B->00F->016->006,是立即数寻址方式,再是取目的操作数,006->018->007,是寄存器寻址方式,最后是执行阶段,007->048->04F->070->000,是ADD运算,结果存放在寄存器GRS中,可以看出结果为4678,并且产生进位,SZOC=0001,正确。
第三阶段,进入JC指令,因为C=1,有进位,所以条件满足,执行的是075->077->000,正确。
五、设计中遇到的问题及解决办法
程序中误将赋值符号<=写成了=,被同学发现,及时修改,并成功得到解决。
第五天为CPU扩充移位指令
一、设计目标
在前面的CPU的基础上扩充硬件,使其支持移位指令。
二、硬件设计
1、SHIFTER模块设计
(加上适当注释)
wiredata_lsb;
wiredata_data_lsb=1'b0;
assigndata_
case({SL,SR})
3'b01:
q=d0;
3'b10:
q=d15;
default:
q=Cout;
endcase
end
endmodule
3、IR_DECODE模块设计(自己增加修改的设计部分)
2'b00:
BM4_uA<={5'b01001,IR[7:
5],1'b0};
4、顶层模块设计(增加自己修改的设计部分)
wire[DATAWIDTH-1:
0]SP_out,GRS_out,TR_out,A_out,ALU_out,MUX_out,PSW_out,IR_out,shifter_out,MUX2_out,PC_out,CF_out;
CFCF(.d15(ALU_out[15]),.d0(ALU_out[0]),.Cout(Cout),.q(CF_out),.SL(SL),.SR(SR));
R#(DATAWIDTH)PSW(.q(PSW_out),.clk(clock),.n_reset(n_reset),.ce(PSWce),.d({12'b0,SF,ZF,OF,Cout}));
三、移位指令微程序的设计
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
092
0
6
0
1
0
0
0
0
0
06F
SR,PSWce
094
0
6
0
2
0
0
0
0
0
06F
SL,PSWce
096
0
6
0
1
0
0
0
0
0
06F
SR,PSWce
098
0
6
0
2
0
0
0
0
0
06F
SL,PSWce
09A
0
6
0
1
0
0
0
0
0
06F
SR,PSWce
09C
0
6
0
1
0
0
0
0
0
06F
SL,PSWce
09E
0
6
0
1
0
0
0
0
0
06F
SR,PSWce
四、测试程序、数据及运行结果
1、
测试内容:
SAR指令
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
003A0010
SAR0010H
运行结果及分析:
从微地址可以看出,第一阶段先是取指令001->002->003再是取目的操作数,006->01B->01F->024->025->026->007,是直接寻址方式,最后是执行阶段,007->092->06F->070,执行SAR指令。
由下一条指令可以看出结果变成了03B0,为右移后的结果,正确。
四、设计中遇到的问题及解决办法
在实例化两个四选一多路器时,给data_lsb,data__reset);
parameterDATAWIDTH=16;
output[DATAWIDTH-1:
0]q;
input[DATAWIDTH-1:
0]d;
inputclk,ce,n_reset;
reg[DATAWIDTH-1:
0]q;
always@(posedgeclkornegedgen_reset)
begin
if(!
n_reset)
q=16'h003F;当复位信号有效时,SP的输出为03F
elseif(ce)当使能信号有效时,输出就是输入的内容
q=d;
end
endmodule
2、顶层模块设计(自己增加修改的设计部分)
SP#(DATAWIDTH)SP(.d(IB),.q(SP_out),.clk(clock),.ce(SPce),.n_reset(n_reset));
buffer#(DATAWIDTH)SP_IB(.q(IB),.d(SP_out),.oe(SPoe));
三、PUSH、POP、CALL、RET指令微程序的设计
PUSH(堆栈指令)
微地址(H)
微指令(H)
微命令
BM
NA
注释
0C0
F43000C1
SPoe,Ace,SV
0
0C1
取sp
0C1
62B300C2
Soe,DEC,SV,DRce
0
0C2
Sp-1
0C2
7C0800C3
Soe,SPce,ARce
0
0C3
Sp-1后的地址
0C3
DRoe’,ARoe’,WR
0
000
将内容写入sp-1所指向的内存中
POP(压栈指令)
微地址(H)
微指令(H)
微命令
BM
NA
注释
0C8
B00000C9
ARoe,TRce
0
0C9
将目标地址先存放在暂存器中
0C9
F40800CA
SPoe,ARce,Ace
0
0CA
取sp
0CA
027610CB
RD,ARoe’,DRce’,INC,SV
0
0CB
读出sp所指向的内容,sp-1
0CB
800800CC
TRoe,ARce
0
0CC
取目标地址
0CC
7C052000
ARoe’,DRoe’,WR,Soe,SPce
0
000
将sp中的内容写入目标地址
CALL(子程序调用指令)
微地址(H)
微指令(H)
微命令
BM
NA
注释
0D0
F40000D1
SPoe,Ace
0
0D1
栈顶单元减一,并保存原PC内容
0D1
B2B000D2
DEC,SV,ARoe,TRce
0
0D2
0D2
7C0800D3
Soe,ARce,SPce
0
0D3
将sp-1送入SP和AR中
0D3
200300D4
PCoe,DRce
0
0D4
将PC内容放入DR
0D4
ARoe’,DRoe’,WR,TRoe,PCce
0
000
写入栈顶单元
RET(返回指令)
微地址(H)
微指令(H)
微命令
BM
NA
注释
03C
F408003D
SPoe,ARce,Ace
0
03D
03D
RD,ARoe’,DRce’,INC,SV
0
03F
03F
DRoe,PCce
0
040
040
7C000000
Soe,SPce
0
000
四、测试程序、数据及运行结果
1、
测试内容:
PUSH(堆栈指令)
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
031A0004
PUSH0004H
运行结果及分析:
从微地址可以看出,第一阶段先是取指令001->002->003再是取目的操作数,006->01B->01F->024->025->026->007,是直接寻址方式,最后是执行阶段,0C0->0C1->0C2->0C3->000,执行PUSH指令。
DR中为0004H里的内容5EE2。
同时可以看出SP始终为3F。
PUSH指令正确。
2、
测试内容:
POP(压栈指令)
运行数据:
内存地址(H)
机器码(H)
汇编指令
0002
033A0008H
POP0004H
运行结果及分析:
从微地址可以看出,第一阶段先是取指令001->002->003再是取目的操作数,006->01B->01F->024->025->026->007,是直接寻址方式,最后是执行阶段,0C8->0C9->0CA->0CB->0CC->000,执行POP指令。
SP减一变为3E。
在内存中可以看出,0008H中的内容变成了0004H中的内容5EE2。
POP指令执行正确。
3、
测试内容:
CALL(子程序调用指令)
运行数据:
内存地址(H)
机器码(H)
汇编指令
0000
0010
035A0010
076055
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 计算机 组成 原理 毕业论文 报告 40 江苏 大学 软件工程 41