您好,欢迎访问三七文档
实验报告2016年5月11日成绩:姓名周勇学号14071225班级计科5班专业计算机科学与技术课程名称《数字电路课程设计》任课老师章复嘉老师指导老师章复嘉老师机位号实验序号9实验名称R-I指令CPU实验时间5月11日实验地点1教225实验设备号一、实验程序源代码顶层架构CPU模块:modulecpu(clk,reset,ALU_OP,inst,rs,rt,rd,rs_data,rt_data,rd_data,ZF,OF,Write_Reg,PC,PC_new,rd_rt_s,W_Addr,imm,W_Data,imm_s,imm_data,ALU_B,rt_imm_s,Mem_Write,M_R_Data,ALU_Data,alu_mem_s);inputwireclk;inputreset;output[2:0]ALU_OP;//操作符output[31:0]inst;//指令存放output[4:0]rs;//rs地址output[4:0]rt;//rt地址output[4:0]rd;//rd地址output[31:0]rs_data;//rs数据output[31:0]rt_data;//rt数据output[31:0]rd_data;//rd数据output[31:0]PC;output[31:0]PC_new;outputZF;outputOF;outputWrite_Reg;//是否写入output[31:0]W_Data;outputrd_rt_s;//控制那个作为目的寄存器output[4:0]W_Addr;//目的操作数地址output[15:0]imm;//立即数output[31:0]imm_data;//被扩展的立即数outputimm_s;//是否需要扩展outputrt_imm_s;//B端选择rt或者是immoutput[31:0]ALU_B;//ALU_B端口数据outputMem_Write;//是否写入数据romoutput[31:0]M_R_Data;//从数据rom读出来的数据output[31:0]ALU_Data;//ALU运算出来的结果,根据alu_mem_s选择由M_W_Data或者W_Data来赋值outputalu_mem_s;//看上面//读指令ex7pc(.clka(clk),.douta(inst),.rst(reset),.PC(PC),.PC_new(PC_new)//解析指令);analysis_instanalysis_inst(.inst(inst),.ALU_OP(ALU_OP),.rs(rs),.rt(rt),.rd(rd),.Write_Reg(Write_Reg),.imm(imm),.rd_rt_s(rd_rt_s),.imm_s(imm_s),.rt_imm_s(rt_imm_s),.Mem_Write(Mem_Write),.alu_mem_s(alu_mem_s));//读取源操作数的值:assignW_Addr=(rd_rt_s)?rt:rd;assignimm_data=(imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};reg1Reg(.R_Addr_A(rs),.R_Addr_B(rt),.Clk(clk),.W_Addr(W_Addr),.W_Data(W_Data),.R_Data_A(rs_data),.R_Data_B(rt_data),.Reset(reset),.Write_Reg(Write_Reg)//不写入);assignALU_B=(rt_imm_s)?imm_data:rt_data;//对源操作数运算,存于目的操作数ex3ALU(.ALU_OP(ALU_OP),.A(rs_data),.B(ALU_B),.F(ALU_Data),.ZF(ZF),.OF(OF));//----wireclk_temp;wired_outn;regd_out=0;assignclk_temp=clk^d_out;assignd_outn=~d_out;//----always@(posedgeclk_temp)begind_out=d_outn;end//数据存储器Data_RomDatarom(.clka(clk_temp),//inputclka.wea(Mem_Write),//input[0:0]wea.addra(ALU_Data[5:0]),//input[5:0]addra.dina(rt_data),//input[31:0]dina.douta(M_R_Data)//output[31:0]douta);assignW_Data=alu_mem_s?M_R_Data:ALU_Data;endmodulepc模块:moduleex7(clka,douta,rst,PC,PC_new);inputrst;inputclka;outputwire[31:0]douta;outputreg[31:0]PC;output[31:0]PC_new;wire[31:0]dina;reg[0:0]wea;assignPC_new=PC+4;initialbeginPC=32'h00000000;wea=0;endex77regrom(.clka(clka),//inputclka.wea(wea),//input[0:0]wea.addra(PC[7:2]),//input[5:0]addra.dina(dina),//input[31:0]dina.douta(douta)//output[31:0]douta);always@(posedgerstorposedgeclka)beginif(rst)PC=32'h00000000;elsePC=PC_new;endendmoduleanalysis_inst模块:moduleanalysis_inst(inst,ALU_OP,rs,rt,rd,Write_Reg,imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s);input[31:0]inst;outputreg[2:0]ALU_OP;outputreg[4:0]rs;outputreg[4:0]rt;outputreg[4:0]rd;outputregWrite_Reg;outputreg[15:0]imm;outputregrd_rt_s;outputregimm_s;outputregrt_imm_s;outputregMem_Write;outputregalu_mem_s;always@(*)begin//--------------------处理R型指令----------------------if(inst[31:26]==6'b000000)//判断是否为R型beginrd=inst[15:11];//rdrt=inst[20:16];//rtrs=inst[25:21];//rsalu_mem_s=0;//以alu结果输出Mem_Write=0;//是否写入数据存储器rd_rt_s=0;//rd作为目的存储器rt_imm_s=0;//rt作为源操作数Write_Reg=(inst[5:0]==0)?1'b0:1'b1;case(inst[5:0])//映射对应的ALU6'b100000:ALU_OP=3'B100;6'b100010:ALU_OP=3'B101;6'b100100:ALU_OP=3'B000;6'b100101:ALU_OP=3'B001;6'b100110:ALU_OP=3'B010;6'b100111:ALU_OP=3'B011;6'b101011:ALU_OP=3'B110;6'b000100:ALU_OP=3'B111;endcaseend//------------------处理I型立即寻址指令------------------------if(inst[31:29]==3'b001)beginimm=inst[15:0];rt=inst[20:16];//rtrs=inst[25:21];//rsMem_Write=0;//是否写入数据存储器rd_rt_s=1;//rt作为目的存储器rt_imm_s=1;//imm作为源操作数alu_mem_s=0;//以alu结果输出Write_Reg=1;//判断属于那条指令case(inst[31:26])6'b001000:beginimm_s=1;ALU_OP=3'B100;end6'b001100:beginimm_s=0;ALU_OP=3'B000;end6'b001110:beginimm_s=0;ALU_OP=3'B010;end6'b001011:beginimm_s=0;ALU_OP=3'B110;endendcaseend//----------------处理I型取数/存数指令------------------if(inst[31:30]==2'b10&&inst[28:26]==3'b011)beginimm=inst[15:0];rt=inst[20:16];//rtrs=inst[25:21];//rsrd_rt_s=1;//rt作为目的存储器rt_imm_s=1;//imm作为源操作数imm_s=1;//判断属于那条指令//读取数据时,以mem输出的数据写入,所以alu_mem_s=1;case(inst[31:26])6'b100011:beginalu_mem_s=1;Mem_Write=0;Write_Reg=1;ALU_OP=3'B100;end6'b101011:beginMem_Write=1;Write_Reg=0;ALU_OP=3'B100;endendcaseendendendmoduleReg模块modulereg1(R_Addr_A,R_Addr_B,Clk,W_Addr,W_Data,R_Data_A,R_Data_B,Reset,Write_Reg);inputClk,Reset;inputwireWrite_Reg;inputwire[4:0]R_Addr_A;inputwire[4:0]W_Addr;inputwire[4:0]R_Addr_B;inputwire[31:0]W_Data;reg[31:0]REG_Files[31:0];outputwire[31:0]R_Data_A;outputwire[31:0]R_Data_B;integeri=0;always@(posedgeClkorposedgeReset)//下降沿存储beginif(Reset)//初始化beginfor(i=0;i=31;i=i+1)REG_Files[i]=32'h00000000;endelsebeginif(Write_Reg)REG_Files[W_Addr]=W_Data;endendassignR_Data_A=REG_Files[R_Addr_A];assignR_Data_B=REG_Files[R_Addr_B];endmoduleALU模块:moduleex3(ALU_OP,A,B,F,ZF,OF);input[2:0]ALU_OP;input[31:0]A,B;outputreg[31:0]F;outputregZF,OF;regC32,C31;reg[7:0]i;always@(*)begincase(ALU_OP)3'b000:F=A&B;3'b001:F=A|B;3'b010:F=A^B;3'b011:F=~(A|B);3'b100:begin{C32,F}=A+B;OF=C32^A[31]^B[31]^F[31];end3'b101:begin{C32,F}=A-B;OF=C32^A[31]^B[31]^F[31];end3'b110:beginif
本文标题:杭电计组实验九
链接地址:https://www.777doc.com/doc-5726866 .html