湘潭大学实验报告课程名称 计算机原理与设计 实验名称多周期CPU与存储器实验 页数专业 班级 同组者姓名 无组别 学号 姓名 实验日期一、实验目的1. 了解多周期 CPU 的数据传输通路。 2. 了解指令执行的周期划分。 3. 掌握用时序电路实现多周期 CPU 的控制部件的方法。 4. 了解指令存储器与数据存储器合二为一的实现方法。 5. 按给定数据,测试多周期 CPU 功能。 二、实验要求1、做好实验预习,掌握多周期 CPU + 存储器的总体电路设计和 CPU 的功能特性,并熟悉本实验中所用的控制台开关的作用和使用方法。 2、写出实验报告,内容是: ①实验目的; ②按理论分析值给出对应的仿真波形。 ③比较实验数据的理论分析值与实验结果值;并对结果进行分析。实验结果与理论分析值比较,有没有不同?为什么? ④通过本实验,你对多周期 CPU 有何认识,有什么心得体会? 三、实验原理 多周期 CPU + 存储器的总体电路设计如图 4-1 所示。 本实验模块设计如图 4-2 所示,包含多周期 CPU 模块 mccpu 和存储器模块 mcmem。 四、实验内容(1)设计元件 在 Quartus II 环境下,用文本输入编辑器 Text Editor 分别输入 mccpu.v 多周期 CPU 单元文件和 mcmem.v 存储器单元文件,编译 Verilog HDL 文件,并将 mccpu.v 与 mcmem.v 文件制作成可调用的原理图元件。 (2)以原理图方式建立顶层文件工程选择图形方式。根据图 4-2 输入实验电路图,从 Quartus II 的基本元件库中将各元件调入图形编辑窗口、连线,添加输入输出引脚。将所设计的图形文件 mccomp.bdf 保存到原先建立的文件夹中,将当前文件设置成工程文件,以后的操作就都是对当前工程文件进行的。 (3)器件选择 选择 Cyclone 系列,在 Devices 中选择器件 EP1C12QC240C8。编译,引脚锁定,再编译。引脚锁定后需要再次进行编译,才能将锁定信息确定下来,同时生成芯片编程/配置所需要的各种文件。 (4)芯片编程 Programming(可以直接选择光盘中的示例已完成的设计进行验证实验) 打开编程窗口。将配置文件 mccomp.sof 下载进 GW48 系列现代计算机组成原理系统中的 FPGA 中。 (5)选择实验系统的电路模式是 NO.0,验证 CPU 的控制和运算功能以及对存储器的访问功能。根据 mcmem.mif 文件初始化存储器,并设置 clock、resetn、mem_clk 的值,验证 CPU的控制和运算功能以及对存储器的访问功能,记录实验数据。 五、实验环境与设备GW48CP+主系统、pc机六、实验代码设计(含符号说明)modulealu(a,b,aluc,r,z);input[31:0]a,b;input[3:0]aluc;output[31:0]r;outputz;assignr=cal(a,b,aluc);assignz=~|r;function[31:0]cal;input[31:0]a,b;input[3:0]aluc;casex(aluc)4'bx000:cal=a+b;4'bx100:cal=a-b;4'bx001:cal=a&b;4'bx101:cal=a|b;4'bx010:cal=a^b;4'bx110:cal={b[15:0],16'h0};4'bx011:cal=ba[4:0];4'b0111:cal=ba[4:0];4'b1111:cal=$signed(b)a[4:0];endcaseendfunctionendmodulemoduledff32(d,clk,clrn,q);input[31:0]d;inputclk,clrn;output[31:0]q;reg[31:0]q;always@(negedgeclrnorposedgeclk)if(clrn==0)beginq=0;endelsebeginq=d;endendmodulemoduledffe32(d,clk,clrn,e,q);input[31:0]d;inputclk,clrn,e;output[31:0]q;reg[31:0]q;always@(negedgeclrnorposedgeclk)if(clrn==0)beginq=0;endelsebeginif(e==1)q=d;endendmodulemodulemccomp(clock,resetn,q,a,b,alu,adr,tom,fromm,pc,ir,mem_clk);inputclock,resetn,mem_clk;output[31:0]a,b,alu,adr,tom,fromm,pc,ir;output[2:0]q;wirewmem;mccpumc_cpu(clock,resetn,fromm,pc,ir,a,b,alu,wmem,adr,tom,q);mcmemmemory(clock,fromm,tom,adr,wmem,mem_clk,mem_clk);endmodulemodulemccpu(clock,resetn,frommem,pc,inst,alua,alub,alu,wmem,madr,tomem,state);input[31:0]frommem;inputclock,resetn;output[31:0]pc,inst,alua,alub,alu,madr,tomem;output[2:0]state;outputwmem;wire[3:0]aluc;wire[4:0]reg_dest;wirez,wpc,wir,wmem,wreg,iord,regrt,m2reg,shift,selpc,jal,sext;wire[31:0]npc,rega,regb,regc,mem,qa,qb,res,opa,bra,alub,alu_mem;wire[1:0]alusrcb,pcsource;wire[31:0]sa={27'b0,inst[10:6]};mccucontrol_unit(inst[31:26],inst[5:0],z,clock,resetn,wpc,wir,wmem,wreg,iord,regrt,m2reg,aluc,shift,selpc,alusrcb,pcsource,jal,sext,state);wiree=sext&inst[15];wire[15:0]imm={16{e}};wire[31:0]immediate={imm,inst[15:0]};wire[31:0]offset={imm[13:0],inst[15:0],1'b0,1'b0};dffe32ip(npc,clock,resetn,wpc,pc);dffe32ir(frommem,clock,resetn,wir,inst);dff32dr(frommem,clock,resetn,mem);dff32ra(qa,clock,resetn,rega);dff32rb(qb,clock,resetn,regb);dff32rc(alu,clock,resetn,regc);assigntomem=regb;mux2x5reg_wn(inst[15:11],inst[20:16],regrt,reg_dest);wire[4:0]wn=reg_dest|{5{jal}};//jal:r31--p4;mux2x32mem_address(pc,regc,iord,madr);mux2x32result(regc,mem,m2reg,alu_mem);mux2x32link(alu_mem,pc,jal,res);mux2x32oprand_a(rega,sa,shift,opa);mux2x32alu_a(opa,pc,selpc,alua);mux4x32alu_b(regb,32'h4,immediate,offset,alusrcb,alub);mux4x32nextpc(alu,regc,qa,jpc,pcsource,npc);//nextpcregfilerf(inst[25:21],inst[20:16],res,wn,wreg,clock,resetn,qa,qb);wire[31:0]jpc={pc[31:28],inst[25:0],1'b0,1'b0};alualunit(alua,alub,aluc,alu,z);endmodulemodulemccu(op,func,z,clock,resetn,wpc,wir,wmem,wreg,iord,regrt,m2reg,aluc,shift,alusrca,alusrcb,pcsource,jal,sext,state);input[5:0]op,func;inputz,clock,resetn;outputregwpc,wir,wmem,wreg,iord,regrt,m2reg;outputreg[3:0]aluc;outputreg[1:0]alusrcb,pcsource;outputregshift,alusrca,jal,sext;outputreg[2:0]state;reg[2:0]next_state;parameter[2:0]sif=3'b000,//IFstatesid=3'b001,//IDstatesexe=3'b010,//EXEstatesmem=3'b011,//MEMstateswb=3'b100;//WBstatewirer_type,i_add,i_sub,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr;wirei_addi,i_andi,i_ori,i_xori,i_lw,i_sw,i_beq,i_bne,i_lui,i_j,i_jal;and(r_type,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0]);and(i_add,r_type,func[5],~func[4],~func[3],~func[2],~func[1],~func[0]);and(i_sub,r_type,func[5],~func[4],~func[3],~func[2],func[1],~func[0]);and(i_and,r_type,func[5],~func[4],~func[3],func[2],~func[1],~func[0]);and(i_or,r_type,func[5],~func[4],~func[3],func[2],~func[1],func[0]);and(i_xor,r_type,func[5],~func[4],~func[3],func[2],func[1],~func[0]);and(i_sll,r_type,~func[5],~func[4],~func[3],~func[2],~func[1],~func[0]);and(i_srl,r_type,~func[5],~func[4],~func[3],~func[2],func[1],~func[0]);and(i_sra,r_type,~func[5],~func[4],~func[3],~func[2],func[1],func[0]);and(i_jr,r_type,~func[5],~func[4],func[3],~func[2],~func[1],~func[0]);and(i_addi,~op[5],~op[4],op[3],~op[2],~op[1],~op[0]);and(i_andi,~op[5],~op[4],op[3],op[2],~op[1],~op[0]);and(i_ori,~op[5]