《3774.计算机组成原理课程设计报告》由会员分享,可在线阅读,更多相关《3774.计算机组成原理课程设计报告(33页珍藏版)》请在人人文库网上搜索。
1、计算机组成原理课程设计报告专业名称: 计算机科学与技术班级学号: 计算机0802学生姓名: 指导教师:设计时间: 2010年 06 月 28 日2010年 07 月 01 日2010年 07 月第一天 取操作数微程序的设计和调试一、设计目标设计并调试取操作数的微程序二、取操作数微流程三、测试程序、数据及运行结果格式如下:1、测试内容:立即数寻址、直接寻址、间接寻址、相对寻址、寄存器寻址立即寻址测试指令(或程序):MOV #1234H,R1机器码: 内存地址(H)机器码(H)汇编指令00000761 1234MOV #1234H,R1运行结果及分析:为了分析微程序是否正确,首先通过查看微指令流程。
2、判断BM和NC是设置是否正确,如果执行的微指令依次是:00100200300400B00F016006018007。(后面的MOV指令的EXE微指令是由老师提供的),根据前面指令微流程的设计,所执行的微指令次序是正确的。在上图中,测试指令微程序最后一条微指令的地址为046,微指令是88000000,所代表的微操作应该是TRoe,GRSce。执行后CRS=0000,好像出错了。但是我们看到在下一条微指令时GRS=1234,赵老师在上实验课的时候曾经讲过这个问题,这是因为GRS的装入使能信号GRSce受时钟信号的影响,内容在微指令周期结束时才被保存,所以观察到的数据慢了一步。直接寻址测试指令(或程。
3、序):MOV 0014H,R1机器码: 内存地址(H)机器码(H)汇编指令00000761 1234MOV 0014H,R1运行结果及分析:为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确,如果执行的微指令依次是:00100200300400B00F014015016006018007。根据前面指令微流程的设计,所执行的微指令次序是正确的。间接寻址测试指令(或程序):MOV( 0014),R1机器码: 内存地址(H)机器码(H)汇编指令00000721 1234MOV (0014),R1运行结果及分析:为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置。
4、是否正确,如果执行的微指令依次是:00100200300400B00F0120013014015016006018007。根据前面指令微流程的设计,所执行的微指令次序是正确的。测试指令(或程序):MOV disp(0014),R1机器码: 内存地址(H)机器码(H)汇编指令00000701 1234MOV +disp,R1运行结果及分析:为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确,如果执行的微指令依次是:00100200300400B00F010011017015016006018007。根据前面指令微流程的设计,所执行的微指令次序是正确的。由于时间关系,今天只。
5、验证了5种寻址方式。后面两种寻址方式的指令和编码如下所示:寄存器间接寻址MOV #1234H,(R1) 指令编码为0769 1234寄存器变址寻址MOV #1234H,disp(R1) 指令编码为0771 1234四、设计中遇到的问题及解决办法遇到的问题:1. 搞不清楚取操作数入口的微程序是由什么组成。2. 对软件UniDebugger的操作不太熟悉。3. 以为只需要将取源操作数的微程序输入到micro中就行了。解决的办法:1:一时搞不清楚去源操作数的入口的微程序究竟是要填什么,便不和它纠缠,往下看的时候,看到图中的都填满了微命令,便知道了,原来取操作数的入口的微命令是空的(NOP)。2:认真。
6、地回忆了做实验的时候的上机步骤后,对该软件的基本操作基本熟悉,然后按照课程设计指导书上的要求便能更好地运用该软件。3:MOV指令为双操作数指令。原本以为该指令虽然是双操作数指令,但应该只涉及到取源操作数,至于目的操作数,该指令应该只是将源操作数输送到目的地址中,取不取目的操作数不影响问题的。但是很快,我就意识到这个认识是错误的了。因为在我执行该MOV指令的时候,程序竟然运行到0018处。这个微指令地址应该出现在取目的操作数阶段,但是我却没有将取目的操作数的微指令编码输入micro中,导致程序运行到该行后输出地微指令编码是00000000。当然运行结果肯定是错误的。于是我毫不犹豫地将取目的操作数。
7、的微指令编码全都输入到micro中,然后再次运行MOV指令,这一次运行结果就正确了。第二天 运算指令的微程序设计与调试一、设计目标设计并调试运算指令的微指令二、运算指令微程序入口地址指令助记符指 令 编 码入口地址(H)FEDCBA9876543210MOVsrc, dst000001源地址码目的地址码044ADDsrc, dst000010源地址码目的地址码048ADDCsrc, dst000011源地址码目的地址码04cSUB src, dst000100源地址码目的地址码050SUBBsrc, dst000101源地址码目的地址码054CMPsrc, dst000110源地址码目的地址码。
8、058ANDsrc, dst000111源地址码目的地址码05cOR src, dst001000源地址码目的地址码060XOR src, dst001001源地址码目的地址码064TESTsrc, dst001010源地址码目的地址码068INC dst00000010001目的地址码0A4DEC dst00000010010目的地址码0A8NOT dst00000010011目的地址码0AC三、运算类指令微程序(参照指导书图26的形式)ADDC:04C98B0 006FTRoe,ADDC,SV,PSWce0:NA-uAR06FSUB: 05098F0 006FTRoe,SUB,SV,PSW。
9、ce0:NA-uAR06FSUBB: 0549930 006FTRoe,SUBB,SV,PSWce0:NA-uAR06FCMP: 05898C0 006FTRoe,SUB,PSWce0:NA-uAR000AND: 05C9970 006FTRoe,AND,SV,PSWce0:NA-uAR06FOR: 060 99B0 006FTRoe,OR,SV,PSWce0:NA-uAR06FXOR: 0649A30 006FTRoe,XOR,SV,PSWce0:NA-uAR06FDEC: 0A81AB0 006FTRoe,DEC,SV,PSWce0:NA-uAR06FNOT: 0AC19F0 006FTR。
10、oe,NOT,SV,PSWce0:NA-uAR06F四、测试程序、数据及运行结果1、测试内容:1:将数据移动到寄存器中;2:将存储数据单元的内容加1;3:将寄存器中的数据和地址单元里的数据进行比较;4:将寄存器做为变址寄存器,将其与1111进行逻辑与运算运行数据:0760 0000MOV #0000H,R1;077A 1101MOV #1101,0010;023A 0011INC (0011);1B2A 0015CMP (0015),(R1);1F71 1111AND #1111,DISP(R1);运行结果:对于MOV指令而言,在第一天的课程设计的时候已经得到了验证,结果是正确的,这里就不在重。
11、复了。加一指令INC,为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确,如果执行的微指令依次是:00100200300600B00F02200230240250260070A406F071072000。根据前面指令微流程的设计,所执行的微指令次序是正确的,而且,通过ALU运算后,输出结果加1,说明运算是正确的。对于CMP指令的执行出现了问题,没将图片拷下来。为了验证指令的正确性,我重新编写了MOV指令,并用了比较简单的寻址方式,以便快速查处问题所在。之后就是所遇到的问题。五、设计中遇到的问题及解决办法对于CMP指令的执行出现了问题,没将出问题的图片拷下来。但为了验证指。
12、令的正确性,我重新编写了MOV指令,并用了比较简单的寻址方式。1B7A FFFD 0008MOV #FFFD,0008H并对RAM中的0008单元做了设置,将其中的内容改成了FFFD,根据CMP指令的工作原理,比较两个相同的数据的时候(两个数据都是FFFD),输出地PSW的标志位中的ZF应该为1,其他结果应该是0的。但是运行的结果与想象中的有很大差别。运行结果如下:仔细看图片中的数据:00100200300600B00F01600601B01F024025026007058000 指令的运行顺序没出现问题。但是结果出现了问题。SZOC为8,说明标志位SF为1,结果竟然是负的。再看看ALU中的运。
13、行结果,竟然不是0000,而是FFFD,由此可知,并不是我的CMP指令出现了错误,而是ALU运算器出现了一点小小的错误(SUB指令的编写出了点问题)。第三天 CPU硬件的初级设计与验证一、设计目标在运算器实验的基础上对硬件进行扩充,建立初级CPU的数据通路,构造一个只支持运算指令的初级CPU。二、硬件设计1、PC模块设计(加上适当注释)/*程序计数器PC与R模块一样采用异步复位,当n_reset有效时,PC清0,否则在时钟信号clk的上升沿如果数据装入使能ce有效则dq,如果自加信号PCinc有效则q+1q。PC通过三态门与IB相连。*/timescale 1ns / 1psmodule PC。
14、(d,q,n_reset,clk,ce,PCinc);input 15:0 d;input n_reset,clk,ce;input PCinc;output 15:0 q;reg 15:0 data;always (posedge clk or negedge n_reset)beginif(!n_reset)/当n_reset有效时,PC清0data = 0;else if(ce)/ce有效则dqdata = d;else if( PCinc )/PCinc有效则q+1qdata = data+1;endassign q = data;endmodule2、IR模块设计timescale 。
15、1ns / 1ps/* DR连接内部总线IB和系统总线的DB;DR有两路数据输入data_IB、data_DB,分别来自IB、DB,相应的有两个装入使能信号DRce_IB、DRce_DB,输出端q分别通过两个三态门连到IB、DB。DR采用异步复位,复位时DR清0,否则在时钟信号的上升沿,当DRce_IB有效时则data_IBq,当DRce_DB有效时则data_DBq。*/module DR #(parameter DATAWIDTH=16)(input wire DATAWIDTH-1:0 data_IB,input wire DATAWIDTH-1:0 data_DB,input wire。
16、 clk,input wire DRce_IB,input wire DRce_DB,input n_reset,output reg DATAWIDTH-1:0 q);always(posedge clk or negedge n_reset) beginif(!n_reset)/ DR采用异步复位,复位时DR清0q = 0;else if(DRce_IB)/DRce_IB有效时则data_IBqq = data_IB;else if(DRce_DB)/DRce_DB有效时则data_DBqq = data_DB;endendmodule3、顶层模块设计(自己增加的设计部分)/TR寄存器的实。
17、例化R #(DATAWIDTH) TR(.q(TR_out), .d(IB), .clk(clock), .ce(TRce), .n_reset(n_reset);/AR寄存器的实例化R #(DATAWIDTH) AR(.q(AR_out), .d(IB), .clk(clock), .ce(ARce), .n_reset(n_reset);/IR寄存器的实例化R #(DATAWIDTH) IR(.q(IR_out), .d(IB), .clk(clock), .ce(IRce), .n_reset(n_reset);三、验证0762 0014 MOV #0000H,R1;023A 0014 。
18、INC 0014H;1B2A 0015CMP (0015),(R2);0762 0001 MOV #0001,R2;1F72 1010 AND #1010,DISP(R2);运行结果:结果分析:为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确,如果执行的微指令依次是:00100200300400B00F016006018007044046000根据前面指令微流程的设计,所执行的微指令次序是正确的,而且GRS里的数据内容为:0014,所以执行的结果是正确的。INC指令的执行的微指令依次是:00100200300601B01F0240250260070A406F07107。
19、2000根据前面指令过程微流程的设计,所执行的微指令次序是正确的。INC指令执行后,ALU中内容是FFFD(原来0014单元内容为FFFC),所以执行结果是正确的。CMP指令:为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确。执行的微指令依次是:00100200300400B00F012013014015016006019025026007058000根据执行结果看:ALU中运行结果是0000,而且标志位为。说明结果为,且没有借位。执行结果正确。MOV+AND指令指令的执行是没问题的。为了分析微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确。执行的微。
20、指令依次是:00100200300400B00F01600601A01C01D01E02702502600705C06F071072000根据执行结果看:ALU中运行结果是0000,而且标志位为。说明结果为,且没有借位。执行结果正确。四、设计中遇到的问题及解决办法问题:INC指令在结果执行过程中仔细看程序执行的过程可知:INC指令应该在取完目的操作数之后(026)就转到EXE执行007,但是程序中却是直接返回取指令入口。这个问题应该出在微指令设计的正确性上,果然,查看micro中的微指令(026)单元,竟然是00000000,问题出现在这里。但是这个确实很奇怪,在第二天的时候我已经将所有微指令。
21、都保存好了,但现在下载的微指令却和第二天的微指令不一样,很可能是软件设计上的缺陷吧。将正确的微指令输入后,问题也就解决了。同样的问题出现在AND指令上。一下就是AND指令运行的结果。从程序运行的流程上看:正确的AND指令应该在执行完01A后执行的01C的。但是这里却出现了错误。经检查,同样的问题出现了,micro了的微指令已经和第二天设计的微指令不一样了,由此可见该软件还存在一些缺陷。第四天 为CPU扩充转移指令一、设计要求在初级CPU的基础上进行功能扩充,使其支持转移类指令二、硬件uAG模块设计(自己修改的设计部分,加上适当注释)3d3: uAGout=NA8:1,BM3_uAR0;case。
22、(IR7:6)/ 条件转移类指令 * 2b00: Flag_MUX=1b0; 2b01:Flag_MUX=1b0; / 添加第四天的代码,参照指导书图210 2b10: Flag_MUX=1b0; / 根据标志位正确生成BM3_uAR0 2b11: Flag_MUX=1b0; default:Flag_MUX=1b0; endcase三、转移指令微程序的设计四、测试程序、数据及运行结果1、测试内容(1):通过比较指令,将PSW标志位设置为5,然后测试转移指令是否能正确执行。运行数据:(0010单元设置为1111,如下图)1B7A 1111 0010CMP #1111,0010;019A 000。
23、BJZ 000B;运行结果及分析:为了分析CMP+JZ微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,CMP执行的微指令依次是:00100200300400B00F01600601B01F024025026007058000根据执行结果看:ALU中运行结果是0000,而且标志位为。说明结果为,且没有借位。执行结果正确。接下来验证JZ指令执行是否正确:00100200300601B01F024025026007075077000,程序正常跳转,执行结果正确。测试内容(2):通过比较指令,将PSW标志位设置为9,然后测试转移指令是否能正确执行。运行数据:(0010单元设置。
24、为FFEF,如下图)1B7A 1111 0010CMP #1111,0010;019A 000BJZ 000B;运行结果及分析:为了分析CMP+JZ微程序是否正确,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,CMP执行的微指令依次是:00100200300400B00F01600601B01F024025026007058000根据执行结果看:ALU中运行结果是EEDE,而且标志位为9。说明结果为负,且有借位。执行结果正确。接下来验证JZ指令执行是否正确:00100200300601B01F024025026007075076000,程序正常跳转,执行结果正确。五、设计中遇到的问。
25、题及解决办法出现的问题:在程序编写完成后,开始验证。但是指令运行顺序出现了问题。如图所示:(程序没有跳转到075的位置)微指令运行的顺序出现了问题,首先考虑微指令编码有没有出现错误。经仔细检测,指令编码没有出现问题。接下来很可能是程序出现了问题。果然,在转移指令的入口的地方,原本要设置为075H,但是我在编写代码的时候写成了 4b0011 IR7:5 1b01;这样子虽然能运行程序,但是却将程序复杂化,本来只需要一个模式来执行转移程序的,现在却必须为8个转移指令准备8个转移条件。为了使程序运行,将代码改成 h075 后,程序只需要一个入口来为8个转移指令服务。第五天 为CPU扩充移位指令一、设。
26、计目标在前面CPU的就出上扩充硬件,使其支持移位指令。二、硬件设计1、SHIFTER模块设计(加上适当注释)mux mux_lsb(.addr(IR76),.q(data_lsb),.d1(1b0),.d2(1b0),.d3(dDATAWIDTH-1),.d4(CF);mux mux_hsb(.addr(IR76),.q(data_hsb),.d1(dDATAWIDTH-1),.d2(1b0),.d3(d0),.d4(CF);2、CF模块设计timescale 1ns / 1psmodule CF_MUX(d15, d0, Cout, q, SL, SR);input d15, d0, Cou。
27、t;input SL, SR;output q;reg q;always (*)begincase (SL, SR)3b01: q = d0;3b10: q = d15;default:q = Cout;endcaseendendmodule3、IR_DECODE模块设计(自己增加修改的设计部分)2b00: BM4_uA= 5b01001,IR7:5,1b0;4、顶层模块设计(增加自己修改的设计部分)wire CF;CF_MUX CFM(.d15(ALU_outDATAWIDTH-1),.d0(ALU_out0),.Cout(Cout),.q(CF),.SL(SL),.SR(SR);三、移位指。
28、令微程序的设计微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F9092SAR06010000006F1810 006F094SHL06020000006F1820 006F096SHR06010000006F1810 006F098ROL06020000006F1820 006F09AROR06010000006F1810 006F09CRCL06020000006F1820 006F09ERCR06010000006F1810 006F四、测试程序、数据及运行结果1、测试内容:测试7中移位指令是否能正确执行。运行数据:0761 0011 MOV #0011。
29、,R1; 0021 SAR R1; 0761 0011 MOV #0011,R1;0041 SHL R1; 0761 0011 MOV #0011,R1;0061 SHR R1; 0761 0011 MOV #0011,R1;0081 ROL R1; 0761 0011 MOV #0011,R1;00A1 ROR R1; 0761 0011 MOV #0011,R1;023B FFFF INC #FFFF;00C1 RCL R1; 运行结果及分析:由于验证过程比较顺利,没有出现严重的错误,移位指令的执行结果也正确。这里只列出算术右移指令和带进位循环右移指令的验证结果。先分析SAR:显然,MOV。
30、指令执行结果是正确的。现在分析SAR指令。首先通过查看微指令流程判断BM和NC是设置是否正确。首先,SAR执行的微指令依次是:00100200300601800709206F070000根据执行结果看:ALU中运行结果是0008,符合算术右移指令的规则。在分析RCR:在这个程序中,先执行MOV指令,再执行加一指令,最后执行带进位循环右移指令。显然,MOV指令的执行结果是正确的,加一指令也能按照其正确流程执行。对于RCR指令,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,RCR执行的微指令依次是:00100200300601800709E06F070000,从指令执行流程来看,RCR。
31、指令时正确的。从指令运行结果来看,RCR由0000 0000 0001 0001变成了1000 0000 0000 1000,可见运行结果也是正确的。四、设计中遇到的问题及解决办法今天这次课设,主要问题出现在CPU的设计上。由于对Verilog的掌握还不是太熟悉,编写代码的时候还是会出现一些小问题。如实例化。而且在移位指令的编码上,我的想法还是和老师的有点不同。在我看来,移位指令的编码应该仅需要2个流程分支,即左移与右移,然后具体是逻辑左移还是算术左移,在shifter.v中已经用多路选择器来判断了,然而,最后还是为转移指令准备了7个分支,下次课设的时候若时间有剩余的话,我会验证用2个流程分支。
32、来实现7个转移指令的正确性。第六天 为CPU扩充堆栈类指令一、设计目标在前面CPU的基础上增加堆栈,使其支持与堆栈有关的PUSH,POP,CALL,RET指令。二、硬件设计1、SP模块设计(加上适当注释)timescale 1ns / 1psmodule SP(q,d,clk,ce,n_reset);parameter DATAWIDTH=16;output DATAWIDTH-1:0 q;input DATAWIDTH-1:0 d;input clk,ce,n_reset;reg DATAWIDTH-1:0 q;always (posedge clk or negedge n_reset)b。
33、eginif (!n_reset) /复位信号有效时,堆栈SP为03Fq = h03F;else if (ce) /ce有效时,将输入送给输出q = d;endendmodule2、顶层模块设计(自己增加修改的设计部分)SP #(DATAWIDTH) SP1(.q(SP_out), .d(IB), .clk(clock), .ce(SPce), .n_reset(n_reset); buffer #(ADDRWIDTH) SP_Buf(.q(IB), .d(SP_out), .oe(SPoe);三、PUSH、POP、CALL、RET指令微程序的设计PUSH指令微程序的设计:微地址(H)微指令(。
34、H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F90C0F400 00C17500000000C1SPoe,Ace0C102B0 00C200A3000000C2DEC,SV0C27C08 00C33700200000C3Soe,ARce,SPce0C30005 2000000011020000ARoe,DRoe,WRPOP指令微程序的设计:微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F90C8B000 00C95400000000C9ARoe,TRce0C9E008 00CA7000200000CASPoe,ARce0CA0006 10C。
35、B0000110100CBARoe,RD,DRce0CB1008 00CC0400200000CCTRce,ARce0CC0005 20CD0000110200CDARoe,DRoe,WR,0CDF400 00CE7500000000CESPoe,Ace0CE0270 00CF0093000000CFINC,SV0CF7C00 0000370000000000Soe,SPceCALL指令的微命令设计:微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F90D0F400 00D17500000000D1SPoe,Ace0D1B2B0 00D254A3000000D。
36、2DEC,SV,ARoe,TRce0D27C08 00D43700200000D3Soe,ARce,SPce0D32003 00D41000300000D4PCoe,DRce0D48405 2000410011020000ARoe,DRoe,WR,TRoe,PCceRET指令的微命令设计:微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F903CE008 003D70002000003DSPoe,ARce03D0006 103E00001301003EARoe,RD,DRce03EC400 003F61000000003FDRoe,PCce03FF400 00。
37、40750000000040SPoe,Ace0400270 004100930000041INC,SV0417C00 0000370000000000Soe,SPce四、测试程序、数据及运行结果1、测试内容(1):CALL 0008H;MOV #1234,R1;RET;MOV #1111,R2;运行数据:运行结果及分析:结果分析:在这个程序中,先执行CALL指令,再执行MOV指令,接着执行RET指令,最后执行MOV指令。对于CALL指令,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,CALL执行的微指令依次是:00100200300601B01F0240250260070D00D1。
38、0D20D30D4000,从指令执行流程来看,CALL指令时正确的。从指令运行结果来看,跳转到0008H单元执行MOV指令,可见运行结果也是正确的。对于MOV指令,这里就不再重复分析了。对于RET指令,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,RET执行的微指令依次是:00100200300703C03D03E03F040041000,从指令执行流程来看,RET指令时正确的。从指令运行结果来看,跳转到0002H单元执行MOV指令,可见运行结果也是正确的。测试内容(2):PUSH 0008H;POP 0008H;运行数据:运行结果及分析:结果分析:在这个程序中,先执行PUSH指令。
39、,再执行POP指令。对于PUSH指令,通过查看微指令流程判断BM和NC是设置是否正确。首先,CALL执行的微指令依次是:00100200300601B01F0240250260070C00C10C20C3000,从指令执行流程来看,POP指令时正确的。从指令运行结果来看,DR中保存了FDDA,且SP自减一,可见运行结果也是正确的。对于POP指令,首先通过查看微指令流程判断BM和NC是设置是否正确。首先,POP执行的微指令依次是:00100200300601B01F0240250260070C80C90CA0CB0CC0CE0CF000,从指令执行流程来看,CALL指令时正确的。从指令运行结果来。
40、看,DR中保存了FDDA,且SP自增一,可见运行结果也是正确的。四、设计中遇到的问题及解决办法这一天课设,CPU的设计很顺利。但是PUSH、POP、CALL、RET指令的微程序出现了一点问题。对于指令的思想而言,没出现过问题,但是在考虑微程序的优化时,把不应该合并的微命令也合并在了一起。比如将SPoe,Ace,INC,SV合并在了一起。运行结果和我想象的完全不一致。仔细观察出现问题的地方后,发现:此时的SP没有正常的自减或自增,而是DR中的内容在自减,原因就在于将INC指令和Ace指令一起使用导致的。经过几次尝试后,我将这四个微命令分成了两组,这时候,堆栈指针SP就能正常地自减和自增了。知道了。
41、问题所在后,我便仔细检查PUSH,POP,CALL,RET四个指令,将经过优化的微程序再次修改,问题也就迎刃而解了。第七天 为CPU扩充中断系统一、 设计目标在前面CPU的基础上增加中断系统,使其支持键盘中断。二、硬件设计1、INTC.v文件(可只写自己增加修改部分。并加上适当注释)if(KR)VA_out=h0020; /对于键盘中断,中断向量的入口地址为0020H2、IF.v文件if(!n_reset)IF=1; /复位后允许中断else if(cli)IF=0; / cli信号关中断else if(sti)IF=1b1; /sti信号开中断二、 中断响应隐指令的微程序设计中断隐指令微地址。
42、(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F9081F400 5082750000050082CLI,SPoe,Ace08202B0 008300A300000083DEC,SV0837C08 0084370020000084Soe,ARce,SPce0842003 0085100003000085PCoe,DRce0850005 2086000011020086ARoe,DRoe,WR086F400 0087750000000087SPoe,Ace08702B0 0088 00A300000088DEC,SV0887C08 0089370020000089S。
43、oe,ARce,SPce0890003 308A00000303008APSWoe,DRce08A0005 208B00001102008BARoe,DRoe,WR08B0002 608C00000206008CINTA,DRce08CC008 008D60002000008DDRoe,ARce08D0006 108E0006108E008EARoe,RD,DRce08EC400 0000610000000000DRoe,PCce中断服务返回指令微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F903EF408 003F75002000003FSPow,ARc。
44、e,Ace03F0276 1040009312010040ARoe,RD,DRce,INC,SV040D800 0041660000000041DRoe,PSWce0417C00 0042370000000042Soe,SPce042F408 0043750020000043SPoe,ARce,Ace0430276 102E00931201002EARoe,RD,DRce,INC,SV02EC400 002F61000000002FDRoe,PCce02F7C00 4000370000040000Soe,SPce,STI四、测试程序、数据及运行结果1、(1)测试内容:023A 000AINC 。
45、000A;产生中断(中断服务程序)0741 8000MOV 8000H,R1;1F61 000FAND #000F,R1;0003RETI运行数据:运行结果:从图片中看出:这是在执行INC指令和微程序隐指令。对于INC指令,通过查看微指令流程判断BM和NC是设置是否正确。首先,INC执行的微指令依次是:00100200300601B01F0240250260070A406F071072000,从指令执行流程来看,INC指令是正确的。从指令运行结果来看,ALU从FF34变成了FF35,可见运行结果也是正确的。对于中断隐指令,通过查看微指令流程判断BM和NC是设置是否正确。首先,隐指令执行的微指令。
46、依次是:08108208308408508608708808908A08B08C08D08E000,从指令执行流程来看,隐指令是正确的。从指令运行结果来看,指令成功跳转到000C单元执行中断服务程序,可见运行结果也是正确的。从图片中看出:这是在执行中断服务程序和AND指令。对于中断服务指令(MOV),通过查看微指令流程判断BM和NC是设置是否正确。首先,INC执行的微指令依次是:00100200300400B00F01600601800705C06F007044046000,从指令执行流程来看,INC指令是正确的。从指令运行结果来看,GRS中的内容为000E,由于从键盘上输入的值为E,可见运行。
47、结果也是正确的。对于AND指令,通过查看微指令流程判断BM和NC是设置是否正确。首先,AND执行的微指令依次是:00100200300400B00F01600601800705C06F070000,从指令执行流程来看,AND指令是正确的。从指令运行结果来看,GRS中的内容为000E,由于按键的值只存储在低4位,所以为了正确取出按键的值,必须执行AND指令,由运行结果可见,AND指令运行也是正确的。从图片中看出:这是在执行中断返回指令和返回后执行的MOV指令。对于中断返回指令,通过查看微指令流程判断BM和NC是设置是否正确。首先,INC执行的微指令依次是:00100200300703E03F04。
48、004104204302E02F000,从指令执行流程来看,中断返回指令是正确的。从指令运行结果来看,程序返回到0002H处,可见运行结果也是正确的。最后执行MOV指令(只是用于检验),通过查看微指令流程判断BM和NC是设置是否正确。首先,AND执行的微指令依次是:00100200300400B00F016006018007044046000,从指令执行流程来看,MOV指令是正确的。从指令运行结果来看,GRS中的内容为1200,由运行结果可见,MOV指令运行也是正确的。五、设计中遇到的问题及解决办法今天的课设遇到的问题主要有3个:(1)源程序中一开始的中断信号应该设置为1在执行微程序的过程中,。
49、中断信号始终是0,就算在键盘上按键后,程序的INTR还是始终为0,在没有意识到每次复位后,程序始终会通过n_reset信号将IF设置为0的特殊情况,我始终不能找到错误的根源,最终只有请老师帮忙解决问题。(2):0000的微指令的BM改成1,否则会跳到取指令而不是判断中断。从程序的运行情况看,程序在执行中断的时候,总是没有跳转去执行中断隐指令,而一直是去执行取指令操作。经过多次反复的检查,程序并没有出现问题,唯一可能的就是没有进行中断分支判断,将问题分析清楚后,也就顺利地解决难题了。(3)0020单元存放的应该是中断向量表的地址。在程序能正常跳转后,以为程序成功了。但是,程序却跳到了0741单元。
50、去执行指令。我感到有点诧异,原来0020单元里存放的是中断向量表的地址,而不是中断服务程序的入口地址。明白了这一原来后,我将0020单元的内容设置为000C,在000C单元里输入了中断服务程序,然后再次执行,果然,程序跳转到了000C单元,开始执行中断服务程序。总结(课程设计的总结,收获、心得体会,对课程设计的评价及建议)这次课程设计历时7天(第一天设计取操作数微程序,第二天设计运算指令,第三天设计初级的CPU,第四条扩充转移指令,第五天扩充移位指令,第六天扩充堆栈指令,第七天扩充中断系统),从这七天的内容安排上看,这次课设给同学们一种由浅入深,井有序然的感觉,逐步引导同学们自主地走上CPU设。
51、计的道路。在这7天里,老师强调的是预习以及完成当天报告。其中,每天的预习起到了决定性的作用,可以说预习与否与你当天的实验质量成正比。预习可以使我们把更多时间放在修正错误上,让我们有更多的时间独立思考问题,解决问题。当天完成报告是对当天实验的回顾和反思,是出现问题后如何解决问题的理性思考。预习与完成当天报告是本次课程设计的重点,出现错误后寻找解决方法是本次课程设计的难点。在这7天里,可以说每天都会遇到新难题,每天都必须花很长时间在纠正错误上,也正是有了这些错误,使得每位同学的能力或多或少得到了提高。此次课程设计,最大的收获就是出现问题后寻找解决方法的过程,这个过程是艰难的,但又很值得回味。每次出现了新问题,自己总会先照着软件上程序运行的流程找找发生错误的原因,没什么头绪时会和同学一起探讨,在到万不得已的情况下,才请老师帮忙解决。这次课程设计是一个收获的过程。在每天老师精心安排的实验中,我们从基础开始,逐步深入,由最初的取操作数到最后的中断系统,我们一步一步地成功地将课设完成。可以说,这次课设是很成功地,不仅是因为自己用心地设计,更是有了一本精心设计过的设计指导书以及老师认真的指导。在此我衷心地感谢老师在这段时间里的热心指导以及编写课设指导书的良苦用心,让我有机会从课堂走进实验,走进了自己动手设计CPU的世界。