1、杭电计组实验考试实验报告2016 年 5 月 19 日 成绩: 姓名周勇学号14071225班级计科5班专业计算机科学与技术课程名称数字电路课程设计任课老师章复嘉老师指导老师章复嘉老师机位号实验序号实验名称考试实验时间5月19日实验地点1教225实验设备号一、实验程序源代码顶层架构CPU模块:module cpu(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_W
2、rite,M_R_Data,ALU_Data,alu_mem_s);input wire clk;input reset;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;output ZF;output OF;o
3、utput Write_Reg; /是否写入output 31:0 W_Data;output rd_rt_s; /控制那个作为目的寄存器output 4:0W_Addr;/目的操作数地址output 15:0 imm; /立即数output 31:0 imm_data;/被扩展的立即数output imm_s;/是否需要扩展output rt_imm_s; /B端选择rt或者是immoutput 31:0 ALU_B; /ALU_B端口数据output Mem_Write; /是否写入数据romoutput 31:0M_R_Data;/从数据rom读出来的数据output 31:0ALU_D
4、ata;/ALU运算出来的结果,根据alu_mem_s选择由M_W_Data或者W_Data来赋值output alu_mem_s;/看上面 /读指令 ex7 pc ( .clka(clk), .douta(inst), .rst(reset), .PC(PC), .PC_new(PC_new) /解析指令 ); analysis_inst analysis_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), .im
5、m_s(imm_s), .rt_imm_s(rt_imm_s), .Mem_Write(Mem_Write), .alu_mem_s(alu_mem_s) ); /读取源操作数的值: assign W_Addr = (rd_rt_s)?rt:rd; assign imm_data = (imm_s)?16imm15,imm:161b0,imm; reg1 Reg( .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), .
6、Reset(reset), .Write_Reg(Write_Reg) /不写入 ); assign ALU_B=(rt_imm_s)?imm_data:rt_data; /对源操作数运算,存于目的操作数 ex3 ALU( .ALU_OP(ALU_OP), .A(rs_data), .B(ALU_B), .F(ALU_Data), .ZF(ZF), .OF(OF) );/-wire clk_temp;wire d_outn;reg d_out=0;assign clk_temp = clk d_out ;assign d_outn = d_out ;/-always(posedge clk_t
7、emp)begin d_out = d_outn ; end /数据存储器 Data_Rom Datarom ( .clka(clk_temp), / input clka .wea(Mem_Write), / input 0 : 0 wea .addra(ALU_Data5:0), / input 5 : 0 addra .dina(rt_data), / input 31 : 0 dina .douta(M_R_Data) / output 31 : 0 douta); assign W_Data = alu_mem_s?M_R_Data:ALU_Data;endmodulepc模块:mo
8、dule ex7(clka,douta,rst,PC,PC_new );input rst;input clka;output wire31:0 douta;output reg31:0 PC;output 31:0 PC_new;wire 31:0dina;reg 0:0 wea;assign PC_new=PC+4;initialbegin PC=32h00000000; wea=0;end ex77 regrom ( .clka(clka), / input clka .wea(wea), / input 0 : 0 wea .addra(PC7:2), / input 5 : 0 ad
9、dra .dina(dina), / input 31 : 0 dina .douta(douta) / output 31 : 0 douta);always(posedge rst or posedge clka)begin if(rst) PC=32h00000000; else PC=PC_new;endendmoduleanalysis_inst模块:module analysis_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;o
10、utput reg 2:0 ALU_OP;output reg 4:0 rs;output reg 4:0 rt;output reg 4:0 rd;output reg Write_Reg;output reg 15:0 imm;output reg rd_rt_s;output reg imm_s;output reg rt_imm_s;output reg Mem_Write;output reg alu_mem_s;always(*)begin/-处理R型指令- if(inst31:26=6b000000) /判断是否为R型 begin rd=inst15:11; /rd rt=ins
11、t20:16; /rt rs=inst25:21; /rs alu_mem_s=0;/以alu结果输出 Mem_Write=0;/是否写入数据存储器 rd_rt_s=0;/rd作为目的存储器 rt_imm_s=0;/rt作为源操作数 Write_Reg=(inst5:0=0)?1b0:1b1; case(inst5:0) /映射对应的ALU 6b100000:ALU_OP=3B100; 6b100010:ALU_OP=3B101; 6b100100:ALU_OP=3B000; 6b100101:ALU_OP=3B001; 6b100110:ALU_OP=3B010; 6b100111:ALU_
12、OP=3B011; 6b101011:ALU_OP=3B110; 6b000100:ALU_OP=3B111; endcase end/-处理I型立即寻址指令- if(inst31:29=3b001) begin imm=inst15:0; rt=inst20:16; /rt rs=inst25:21; /rs Mem_Write=0;/是否写入数据存储器 rd_rt_s=1;/rt作为目的存储器 rt_imm_s=1;/imm作为源操作数 alu_mem_s=0;/以alu结果输出 Write_Reg=1; /判断属于那条指令 case(inst31:26) 6b001000: begin
13、imm_s=1; ALU_OP=3B100;end 6b001100: begin imm_s=0; ALU_OP=3B000;end 6b001110: begin imm_s=0; ALU_OP=3B010;end 6b001011: begin imm_s=0; ALU_OP=3B110;end endcase end/-处理I型取数/存数指令- if(inst31:30=2b10&inst28:26=3b011) begin imm=inst15:0; rt=inst20:16; /rt rs=inst25:21; /rs rd_rt_s=1;/rt作为目的存储器 rt_imm_s=1
14、;/imm作为源操作数 imm_s=1; /判断属于那条指令 /读取数据时,以mem输出的数据写入,所以alu_mem_s=1; case(inst31:26) 6b100011: begin alu_mem_s=1; Mem_Write=0;Write_Reg=1;ALU_OP=3B100;end 6b101011: begin Mem_Write=1;Write_Reg=0;ALU_OP=3B100;end endcase endendendmoduleReg模块module reg1(R_Addr_A,R_Addr_B,Clk,W_Addr,W_Data,R_Data_A,R_Data_
15、B,Reset,Write_Reg);input Clk,Reset;input wire Write_Reg;input wire4:0 R_Addr_A;input wire4:0 W_Addr;input wire4:0 R_Addr_B;input wire31:0 W_Data;reg31:0 REG_Files31:0;output wire31:0 R_Data_A;output wire31:0 R_Data_B;integer i=0;always (posedge Clk or posedge Reset) /下降沿存储begin if(Reset) /初始化 begin
16、for(i=0;i=31;i=i+1) REG_Filesi=32h00000000; end else begin if(Write_Reg) REG_FilesW_Addr=W_Data; endend assign R_Data_A=REG_FilesR_Addr_A; assign R_Data_B=REG_FilesR_Addr_B;endmoduleALU模块:module ex3(ALU_OP,A,B,F,ZF,OF);input2:0 ALU_OP;input31:0 A,B;output reg 31:0 F;output reg ZF,OF;reg C32,C31;reg
17、7:0i;always(*)begincase(ALU_OP) 3b000:F=A&B; 3b001:F=A|B; 3b010:F=AB; 3b011:F=(A|B); 3b100:beginC32,F=A+B;OF=C32A31B31F31;end 3b101:beginC32,F=A-B;OF=C32A31B31F31;end 3b110:begin if(AB) F=1; else F=0; end 3b111:F=BA; default: begin end endcase ZF=(F=32h00000000)?1:0); endendmodule二、仿真波形三、电路图四、引脚配置(约束文件)五、思考与探索实验九的16位_不解析指令的简化版。六、意见和建议1.无
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1