1、计算机组成与系统结构实验报告CPU设计与实现院(系): 专业班级: 计算机科学与技术组 员: 指导教师: 实验目的:设计实现 CPU 部件。实验仪器:PC机(安装Altebra 公司的开发软件 QuartusII,Modelsim)两台TEC-CA计算机组成原理试验箱实验过程:一、理论设计1.1、设计指令集设计 CPU 第一步,就是根据需求,确定功能,并且设计出指令集。指令集包括每一条指令的编码方式,操作码以及每一条指令实现的功能。考虑到第一次设计 CPU,在指令集设计过程中难免会出现考虑不周全或者指令集设计不科学的问题,我们借鉴了经典的 31 条 MIPS 指令集。在对指令集每一条指令进行解
2、读、分析后,我们确定:31 条 MIPS 指令可以满足我们的 CPU 的基本功能。下面将 31 条 MIPS 指令的编码格式、对应的操作类型以表格的形式列举出来:MIPS 指令集(共 31 条)助记符 指令格式 示例示例含义 操作及其解释Bit #3126252120161511106 50 R-type op rs rt rdshamt func add 000000 rs rt rd 00000 100000 add $1,$2,$3 $1=$2+$3rd 10rd shamt ;(logical) ,其中rt=$2, rd=$1sra 000000 00000 rt rd shamt 0
3、00011 sra $1,$2,10 $1=$210rd shamt ;(arithmetic) 注意符号位保留其中 rt=$2, rd=$1sllv 000000 rs rt rd 00000 000100 sllv $1,$2,$3 $1=$2$3rd rs ;(logical)其中rs$3,rt=$2, rd=$1srav 000000 rs rt rd 00000 000111 srav $1,$2,$3 $1=$2$3rd rs ;(arithmetic) 注意符号位保留其中 rs$3,rt=$2, rd=$1jr 000000 rs 00000 00000 00000 001000
4、 jr $31 goto $31 PC r130:0)beginout31=r231;out30:0=r230:0-r130:0;endelsebeginout31=r131;out30:0=r130:0-r230:0;endendend0001:beginout=r2+r1;end0010:beginif(r231=r131)beginif(r230:0r130:0)beginout31=r231;out30:0=r230:0-r130:0;endelsebeginout31=r131;out30:0=r130:0-r230:0;endendelsebeginout31=r231;out30
5、:0=r230:0+r130:0;endend0011:beginout=r2-r1;end0100:beginout=r2end0101:beginout=r2|r1;end0110:beginout=r2r1;end0111:beginout=r2r1;end1000:beginif(r231=r131)beginif(r231=1)beginif(r230:0r130:0)beginout=1;endelsebeginout=0;endendelsebeginif(r230:0r1);end1100:beginout=(r2r1); endendcaseendendmodulePC 部件
6、源码module PC(address,alu_pc,pc_alu,pc_ctr,pc_pj,pc_out);input 25:0address;input 31:0alu_pc,pc_ctr,pc_pj;output 31:0pc_out,pc_alu;reg 31:0r;always(*)beginif(pc_ctr)beginr=r+4;endif(pc_pj)beginr=r+4;r27:2=address;r1:0=0;endendendmodule寄存器组源码module Register(rs_addr,rt_addr,rd_addr,rd_data,read,write,rt_
7、out,rs_out);input 4:0rs_addr,rt_addr,rd_addr;input 31:0rd_data;input read,write;output 31:0rt_out,rs_out; reg 31:0rt_out,rs_out;reg 31:0r0:3;always(*)beginif(read)beginif(rs_addr)begincase(rs_addr)00000:beginrs_out=r0;end00001:beginrs_out=r1;end00010:beginrs_out=r2;end00011:beginrs_out=r3;endendcase
8、endif(rt_addr)begincase(rt_addr)00000:beginrt_out=r0;end00001:beginrt_out=r1;end00010:beginrt_out=r2;end00011:beginrt_out=r3;endendcaseendendelsebegincase(rd_addr)00000:beginr0=rd_data;end00001:beginr1=rd_data;end00010:beginr2=rd_data;end00011:beginr3=rd_data;endendcaseendendendmodule立即数扩展部件源码module
9、 DE(DE_U,IMM,DE_OUT);input DE_U;input 15:0IMM;output 31:0 DE_OUT;reg 31:0 DE_OUT;always(*)beginDE_OUT15:0=IMM;if(DE_U=0)beginDE_OUT31=IMM15;DE_OUT30=IMM15;DE_OUT29=IMM15;DE_OUT28=IMM15;DE_OUT27=IMM15;DE_OUT26=IMM15;DE_OUT25=IMM15;DE_OUT24=IMM15;DE_OUT23=IMM15;DE_OUT22=IMM15;DE_OUT21=IMM15;DE_OUT20=I
10、MM15;DE_OUT19=IMM15;DE_OUT18=IMM15;DE_OUT17=IMM15;DE_OUT16=IMM15;endelsebeginDE_OUT31=0;DE_OUT30=0;DE_OUT29=0;DE_OUT28=0;DE_OUT27=0;DE_OUT26=0;DE_OUT25=0;DE_OUT24=0;DE_OUT23=0;DE_OUT22=0;DE_OUT21=0;DE_OUT20=0;DE_OUT19=0;DE_OUT18=0;DE_OUT17=0;DE_OUT16=0;endendendmodule比较部件源码module COM(R1,R2,NVST,COM0,COM1);input COM0,COM1;input 31:0 R1,R2;output NVST;reg NVST;reg num;num=COM0+COM1*2;always(*)begincase(num)0:beginif(R1=R2)NVST=1;elseNVST=0;end1:beginif(R1=R2)NVST=0;elseNVST=1;end2:beginif(R1R2)NVST=1;elseNVST=0;endendcaseendendmodule