计算机组成原理课程设计报告7520989371.doc
计算机组成原理课程设计报告专业名称: 网络工程班级学号: 3080610032学生姓名: 黄秋月指导教师:丁伟设计时间: 2010年7月8日2010年7月15 日第一天 取操作数微程序的设计和调试一、设计目标 设计并调试取操作数的微程序二、取操作数微流程200800CC025025三、测试程序、数据及运行结果格式如下:1、测试内容:立即数寻址、直接寻址测试指令(或程序):MOV #5678H,0010H指令功能:将立即数5678H送到内存地址为0010单元,机器码如下 机器码: 内存地址(H)机器码(H)汇编指令0000077A 5678 0010MOV #5678H , 0010H 在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图1.2,分析过程如下:对照图1.2,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>024>025>026>007>004>047>072>000,参照取指令,取操作数和MOV执行微流程分析,所执行的微指令顺序是正确的 其次分析执行的过程,在003的微指令执行后,下一步IR=077A,说明取指令是正确的;在016的微指令执行后,下一步TR=5678,说明取原操作数是正确的;在在026的微指令执行后,下一步A=FFFF(此时0010单元的内容为FFFF,见图1.2),说明取目的操作数是正确的。最后分析指令执行的结果,指令执行前0010单元的内容为FFFF(见图1.1)指令执行后内容变为5678(在指令的最后一条微指令,微地址为072的下一步,见图1.5),说明结果是正确的。 图1.1指令执行前的RAM的内容 图1.2运行结果及分析: 图1.3指令执行后RAM的内容2、测试内容:相对寻址、间接寻址测试指令(或程序):MOV +0004H,(0010H)指令功能:将有效地址(PC+0004H)的内容送到0010H地址的地址中去 机器码: 内存地址(H)机器码(H)汇编指令00000719 0004 0010MOV +0004, (0010H) 在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图2.2,分析过程如下:对照图2.2,首先看微指令的执行次序:001>002>003>004>00B>00F>010>011>017>015>016>006>01B>01F>022>023>024>025>026>007>044>047>072>000,参照取指令,取操作数和MOV执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,在003的微指令执行后,下一步IR=0719,说明取指令是正确的;在016的微指令执行后,下一步TR=0000,说明取原操作数是正确的;在在026的微指令执行后,下一步A=0004(此时0010单元的内容为FFFF,见图2.2),说明取目的操作数是正确的。最后分析指令执行的结果,指令执行前0010单元的内容为FFFF,以FFFF为地址FFFF内容原为0004,最终指令执行后内容变为0000(在指令的最后一条微指令,微地址为072的下一步,见图2.2),说明结果是正确的。图2.1图2.23、测试内容:寄存器寻址、寄存器间接寻址测试指令(或程序):MOV R1,(R2)机器码: 内存地址(H)机器码(H)汇编指令0000042A MOV R1,(R2)在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图3.2,分析过程如下:对照图3.2,首先看微指令的执行次序:001>002>003>004>008>006>019>025>026>007>044>047>072>000,参照取指令,取操作数和MOV执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,在003的微指令执行后,下一步IR=042A,说明取指令是正确的;在008的微指令执行后,下一步TR=0000,说明取原操作数是正确的;在在026的微指令执行后,A=0000说明取目的操作数是正确的。最后分析指令执行的结果,指令执行前R1单元的内容为0000(见图3.2),指令执行后以R2内容0000为地址,即将0000转移到0000地址(在指令的最后一条微指令,微地址为072的下一步,见图3.2)说明结果是正确的4、测试内容:寄存器寻址、寄存器变址寻址测试指令(或程序):MOV R1,2(R2)机器码: 内存地址(H)机器码(H)汇编指令00000432 0002 MOV R1,2(R2)在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图2.2,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>008>006>01A>01C>01D>01E>027>025>026>007>044>047>072>000,参照取指令,取操作数和MOV执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,在003的微指令执行后,下一步IR=0719,说明取指令是正确的;在008的微指令执行后,下一步TR=0000,说明取原操作数是正确的;在在026的微指令执行后,下一步A=0002,说明取目的操作数是正确的。最后分析指令执行的结果,指令执行前R1单元的内容为0000(见图1.2),将其转移到0002+R2,开始0002+R2内容为0002指令执行后内容变为0000(在指令的最后一条微指令,微地址为072的下一步,见图1.5),说明结果是正确的。四、设计中遇到的问题及解决办法第一天主要是对各个寻址方式的了解,起初对各个寻址方式的寻址过程不熟悉,不能看懂调试微流程的各步骤,经过请教同学和查看课本,有了进一步的了解。第二天 运算指令的微程序设计与调试一、设计目标 设计并调试运算指令的微流程二、运算指令微程序入口地址指令助记符指 令 编 码入口地址(H)FEDCBA9876543210MOVsrc, dst000001源地址码目的地址码044ADDsrc, dst000010源地址码目的地址码048ADDCsrc, dst000011源地址码目的地址码 04CSUB src, dst000100源地址码目的地址码 050SUBBsrc, dst000101源地址码目的地址码 054CMPsrc, dst000110源地址码目的地址码 058ANDsrc, dst000111源地址码目的地址码 05COR src, dst001000源地址码目的地址码 060XOR src, dst001001源地址码目的地址码 064TESTsrc, dst001010源地址码目的地址码 068INC dst00000010001目的地址码0A4DEC dst00000010010目的地址码 0A8NOT dst00000010011目的地址码 0AC三、运算类指令微程序(参照指导书图26的形式)四、测试程序、数据及运行结果1、测试内容:ADDC 0010H, (R2)机器码:内存地址(H)机器码(H)汇编指令00000F4A 0010 ADDC 0010H,(R2)在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图1.4,首先看微指令的执行次序:001>002>003>004>00B>00F>014>015>016>006>019>025>026>007>04C>06F>071>072>000,参照取指令,取操作数和ADDC执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,在003的微指令执行后,下一步IR=0F4A,说明取指令是正确的;在016的微指令执行后,下一步TR=FFFC,说明取原操作数是正确的;在在026的微指令执行后,下一步A=0F4A,说明取目的操作数是正确的。最后分析指令执行的结果:即FFFC+0F4A结果,由072下一条指令可以看出其结果为0F47,说明结果是正确的。运行结果:2.测试内容:DEC 0010H机器码:内存地址(H)机器码(H)汇编指令0000025A 0010 ADDC 0010H,(R2)在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>006>01B>01F>024>025>026>007>0AB>06F>071>072>000,参照取指令,取操作数和DEC执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,DEC为单操作数指令,在003的微指令执行后,下一步执行取目的操作数,在026的微指令执行后,下一步A=FFFD,说明取目的操作数是正确的。最后分析指令执行的结果:即FFFD-1结果,由072下一条指令可以看出其结果为FFFC,说明结果是正确的。运行结果3. 测试内容:CMP #0010, +0001H机器码:内存地址(H)机器码(H)汇编指令00001B78 0010 0001 CMP #0010,+0001H在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>020>021>027>025>026>007>058>000,参照取指令,取操作数和ADDC执行微流程分析,所执行的微指令顺序是正确的 其次分析执行的过程,在003的微指令执行后,下一步IR=0F4A,说明取指令是正确的;在016的微指令执行后,下一步TR=FFFC,说明取原操作数是正确的;在在026的微指令执行后,下一步A=0F4A,说明取目的操作数是正确的。最后分析指令执行的结果:CMP指令不保存结果,只有PSW记录,SZOC结果为1运行结果4.测试内容:.AND R1,0010H机器码:内存地址(H)机器码(H)汇编指令00001C3A 0010 AND R1,0010H在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>008>006>01B>01F>024>025>026>007>05C>06F>071>072>000,参照取指令,取操作数和AND执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,在003的微指令执行后,下一步IR=0F4A,说明取指令是正确的;在008的微指令执行后,下一步TR=0000,说明取原操作数是正确的;在在026的微指令执行后,下一步A=FFFC,说明取目的操作数是正确的。最后分析指令执行的结果:即0000 AND FFFC结果,由072下一条指令可以看出其结果为FFFB,说明结果是正确的。运行结果五、设计中遇到的问题及解决办法第二天的实验主要目的是了解执行阶段的操作方式,本实验只要求简单的运算指令执行阶段,根据不同指令操作码OP转向不同分支,该控制由微转移方式字段产生,预习时入口地址的形成根据指导书了解得到,不懂得地方就请教同学。第三天 CPU硬件的初级设计与验证一、设计目标 在运算器实验的基础上对硬件进行扩充,建立初级CPU的数据通路,构造一个只支持运算指令的初级CPU 二、硬件设计1、PC模块设计程序计数器PC与R模块一样采用异步复位,PC通过三态门与IB相连。timescale 1ns / 1psmodule PC(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清0 data=0; else if(ce) 在时钟信号clk的上升沿如果数据装入使能ce有效则dq, data=d; else if(PCinc) 自加信号PCinc有效则q+1q data=data+1;endassign q = data;endmodule2、DR模块设计DR采用异步复位timescale 1ns / 1psmodule DR #( / DR连接内部总线IB和系统总线的DBparameter DATAWIDTH=16)(input wire DATAWIDTH-1:0 data_IB, / DR有两路数据输入data_IB、data_DB,分别来自IB、DBinput wire DATAWIDTH-1:0 data_DB,input wire clk,input wire DRce_IB, /相应的有两个装入使能信号DRce_IB、DRce_DBinput wire DRce_DB,input n_reset,output reg DATAWIDTH-1:0 q); /输出端q分别通过两个三态门连到IB、DB。always(posedge clk or negedge n_reset) /在时钟信号的上升沿begin if(!n_reset) /复位时DR清0 q=0; else if(DRce_IB) /当DRce_IB有效时则data_IBq q=data_IB;else if(DRce_DB) /当DRce_DB有效时则data_DBqq=data_DB; endendmodule 3、顶层模块设计(自己增加的设计部分)/TR寄存器的实例化R #(DATAWIDTH) TR(.q(TR_out),.d(IB),clk(clock),.ce(TRce),.TR_reset(TR_reset);/AR寄存器的实例化R#(ADDRWIDTH)AR(.q(AR_out),.d(AB),.clk(clock),.ce(ARce),.AR_reset(AR_reset);/IR寄存器的实例化R #(DATAWIDTH) IR(.q(IR_out),.d(IB),.clk(clock),.ce(IRce),.IR_reset(IR_reset);三、验证测试指令:(1) ADDC 0010H, (R2)执行结果:(2) DEC 0010H执行结果:(3) CMP #0010执行结果:(4) +0001HAND R1,0010H执行结果:经过与DAY2实验结果的比较,结果与其相同,证明硬件设计是正确的四、设计中遇到的问题及解决办法DAY3的实验是自己设计初级的CPU及简单的运算功能,设计硬件的的大部分verilog语言都已经给出,只需根据要求补全DR,PC的代码,及在COU中实例化AR,IR,TR,DR,PC的代码根据其功能要求补全第四天 为CPU扩充转移指令一、设计要求 在初级CPU的基础上进行功能扩充,使其支持转移类型指令二、硬件uAG模块设计(自己修改的设计部分,加上适当注释)always * begin case (BM)3'd0:uAGout = NA; /0,固定转移3'd1:uAGout = NA8,INTR&IF,NA6:0; /1,根据是否中断产生两分支 3'd2:uAGout = NA8:2, BM2_uAR1, BM2_uAR0; /2,取指令后的三分支转移,双单无操作数,即取源, 3'd3: uAGout=NA8:1,BM3_uAR0;3'd4:uAGout = BM4_uA; /4,按OP多路转移3'd5:uAGout = NA8:2, BM5_uAR10; /5,按寻址方式M多路转移3'd6:uAGout = NA8:3, BM6_uAR21, 1'b0; /6,按寻址方式M'多路转3'd7:uAGout = NA8:1, BM7_uAR0; /7,结果回送时,按寄存器、存储器转移 default:uAGout = 9'b000000000;endcase end /uAR1,uAR0双操作数=00,01;单操作数=10;无操作数11assign BM2_uAR1 = !(|IR15:10); assign BM2_uAR0 = !(|IR9:5);always(SZOC, IR) begin case(IR7:6)/ 条件转移类指令 2'b00:Flag_MUX<=SZOC0 /选00时表示满足条件CF=12'b01:Flag_MUX<=SZOC 1 /选01时表示满足条件OF=1 2'b10:Flag_MUX<=SZOC2 /选10时表示满足条件ZF=12'b11:Flag_MUX<=SZOC3 /选11时表示满足条件SF=1default:Flag_MUX<=1'b0; endcase end三、转移指令微程序的设计四、测试程序、数据及运行结果1.测试内容:JMP+0010运行数据:02180010运行结果及分析:内存地址(H)机器码(H)汇编指令00000218 0010 JMP+0010在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>006>01B>01F>020>021>027>025>026>007>0A0>000,参照取指令,取操作数和DEC执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,JMP为单操作数指令,在003的微指令执行后,下一步执行取目的操作数。将PC无条件转移到0012地址2.测试内容: ADD#1000,0010H JC0014H /0010H->F000运行数据:0B7A 1000 0010 011A 0014运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>024>025>026>007>048>06F>071>072>000>001>002>003>006>01B>01F>024>025>026>007>075>077>000,参照取指令,取操作数和ADD执行微流程,及JC操作指令执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,ADD为双操作数指令,在003的微指令执行后,下一步IR=0B7A,说明取指令是正确的,执行取源操作数,在016的微指令执行后下一步TR=1000,说明取源操作数是正确的;执行取目的操作数,在026的微指令执行后,下一步A=F000,即取地址0010的内容,说明取目的操作数是正确的。由结果可知SZOC=5,满足有进位条件,由第二条指令执行003的微指令执行后,下一步IR=011A,说明取指令是正确的,即将PC转移到0014,由运行结果证明是正确的运行结果及分析:3.测试内容: ADD #8010,0010H JO 0014H /0010H->8023运行数据:0B7A 8010 0010 015A 0014 运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>024>025>026>007>048>06F>071>072>000>001>002>003>006>01B>01F>024>025>026>007>075>077>000,参照取指令,取操作数和ADD执行微流程,及JC操作指令执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,ADD为双操作数指令,在003的微指令执行后,下一步IR=0B7A,说明取指令是正确的,执行取源操作数,在016的微指令执行后下一步TR=8010,说明取源操作数是正确的;执行取目的操作数,在026的微指令执行后,下一步A=8023,即取地址0010的内容,说明取目的操作数是正确的。由结果可知SZOC=3,满足有溢出条件,由第二条指令执行003的微指令执行后,下一步IR=015A,说明取指令是正确的,执行取目的操作数,执行阶段,最终PC转移到0014地址上,由运行结果证明是正确的运行结果:4.测试内容: AND #5555,0010H JZ (0014H) /0010H->AAAA运行数据:1F7A 5555 0010 0199 0014 运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>024>025>026>007>05C>06F>071>072>000>001>002>003>006>01B>01F>022>023>024>025>026>007>075>077>000,参照取指令,取操作数和AND执行微流程,及JZ操作指令执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,AND为双操作数指令,在003的微指令执行后,下一步IR=1F7A,说明取指令是正确的,执行取源操作数,在016的微指令执行后下一步TR=5555,说明取源操作数是正确的;执行取目的操作数,在026的微指令执行后,下一步A=AAAA,即取地址0010的内容,说明取目的操作数是正确的。由结果可知SZOC=5,满足全为零条件,由第二条指令执行003的微指令执行后,下一步IR=0199,说明取指令是正确的,执行取目的操作数。执行阶段,即将PC转移到0014地址内容0012H上,由运行结果证明是正确的5.测试内容: SUBB #0002 ,0010H 0010H->0001JS +0014H运行数据: 177A 0002 0010 01D8 0014运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>004>00B>00F>016>006>01B>01F>024>025>026>007>054>06F>071>072>000>001>002>003>006>01B>01F>020>021>027>025>026>007>075>077>000,参照取指令,取操作数和SUBB执行微流程,及JS操作指令执行微流程分析,所执行的微指令顺序是正确的其次分析执行的过程,SUBB为双操作数指令,在003的微指令执行后,下一步IR=177A,说明取指令是正确的,执行取源操作数,在016的微指令执行后下一步TR=0002,说明取源操作数是正确的;执行取目的操作数,在026的微指令执行后,下一步A=FFFF,即取地址0010的内容,说明取目的操作数是正确的。由结果可知SZOC=9,满足符号位为负条件,由第二条指令执行003的微指令执行后,下一步IR=01D8,说明取指令是正确的,执行取目的操作数。执行阶段,将转移到0019地址上,由运行结果证明是正确的五、设计中遇到的问题及解决办法预习时不太理解转移指令的作用,后来知道了转移指令也是一个执行指令,转移指令分条件转移和无条件转移,所以在设计调试程序时先设计一条指令,使其满足转移指令的条件,满足条件的的选择是由IR76来判断的,在CPU中编写程序,当IR76=00时,即CF满足条件,当IR76=01时,即OF满足条件,当IR76=10时,即ZF满足条件,当IR76=11时,即SF满足条件通过实验,弄清了转移指令的作用,即在满足转移指令条件下PC指向另一条地址。第五天 为CPU扩充移位指令一、设计目标 在前面CPU的基础上扩充硬件,使其支持转移指令二、硬件设计1、SHIFTER模块设计module SHIFTER(q,d,clk,sv,sl,sr,n_reset,IR76,CF); parameter DATAWIDTH = 16; output DATAWIDTH-1:0 q; input DATAWIDTH-1:0 d;input 1:0IR76; input clk,n_reset,CF; input sv, sl, sr;reg DATAWIDTH-1:0 data;wire data_lsb;wire data_hsb; /实例化两个四选一多路选择器mux lsb_mux(.q(data_lsb),.d1(1'b0),.d2(1'b0),.d3(d15),.d4(CF),.addr(IR76);/低位多路选择器的实例化mux hsb_mux(.q(data_hsb),.d1(d15),.d2(1'b0),.d3(d0),.d4(CF),.addr(IR76); /高位多路选择器的实例化always (posedge clk or negedge n_reset) begin if (!n_reset) data = 0;else if(sv) data = d; else if (sl) data = dDATAWIDTH-2:0, data_lsb; else if(sr) data = data_hsb, dDATAWIDTH-1:1; endassign q = data;endmodule;2、CF模块设计module CF_MUX(d15, d0, Cout, q, SL, SR);input d15, d0, Cout;input SL, SR;output q;reg q;always (*)begincase (SL, SR)3'b01: q = d0;3'b10: q = d15;default:q = Cout;endcaseendendmodule; 3、IR_DECODE模块设计(自己增加修改的设计部分) 2'b00: BM4_uA<=5'b01001,IR7:5,1'b0;4、顶层模块设计(增加自己修改的设计部分)CF_MUX CF_MUX(.q(CF_out),.d0(ALU_out0),.d15(ALU_out15),.Cout(CF_out),.SL(SL),.SR(SR);/PSWwire CF = CF_out;R#(DATAWIDTH)PSW(.q(PSW_out),clk(clock),.n_reset(n_reset),.ce(PSWce),.d(12'b0,SF,ZF,OF,CF);buffer #(DATAWIDTH)PSW_IB(.q(IB),.d(PSW_out),.oe(PSWoe);三、移位指令微程序的设计微地址(H)微指令(H)微指令字段(H)微命令F0F1F2F3F4F5F6F7F8F90921810006F06010000006FPSWce,SRO941820006F06020000006FPSWce,SL0961810006F06010000006F PSWce,SR0981820006F06020000006F PSWce,SL09A1810006F06010000006F PSWce,SR 09C1820006F06020000006F PSWce,SL09E1810006F06010000006FPSWce,SR四、测试程序、数据及运行结果1.测试内容:SAR(0010H) /0010->0014->2513运行数据:0039 0010运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>006>01B>01F>020>021>027>025>026>007>09E>06F>071>072>000,参照取指令,取操作数和SAR执行微流程,所执行的微指令顺序是正确的其次分析执行的过程,SAR为单操作数指令,在003的微指令执行后,下一步IR=0039,说明取指令是正确的,执行取目的操作数,在026的微指令执行后,下一步A=2513,即以0010的内容0014H为地址,其中0014的内容为2513,说明取目的操作数是正确的。算术右移后变为1289,由运行结果证明是正确的2.测试内容:SHL 0010 /0010->2513运行数据:005A0010运行结果及分析:在调试软件UniDebugger中,根据表将机器码输入RAM,输入后如下图。扩展单步执行的结果如图,分析过程如下:对照图,首先看微指令的执行次序:001>002>003>006>01B>01F>024>025>026>007>094>06F>071>072>000,参照取指令,取操作数和SHL执行微流程,所执行的微指令顺序是正确的其次分析执行的过程,SHL为单操作数指令,在003的微指令执行后,下一步IR=005A,说明取指令是正确的,执行取目的操作数,在026的微指令执行后,下一步A=2513,即0010的内容为2513,说明取目