杭电计组实验10-实现R-I-J型指令的CPU设计实验 下载本文

内容发布更新时间 : 2024/4/30 22:22:24星期一 下面是文章的全部内容请认真阅读。

else begin case(PC_s) 2'b00:PC<=PC_new; 2'b01:PC<=R_Data_A; 2'b10:PC<=PC_new+(imm_data<<2); 2'b11:PC<={PC_new[31:28],address,2'b00}; endcase end end endmodule OP指令功能译码模块: module OP_YIMA(inst,ALU_OP,rs,rt,rd,Write_Reg, imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF); input [31:0]inst; output 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 [25:0]address; output reg[1:0] w_r_s; output reg[1:0] wr_data_s; output reg[1:0] PC_s; input ZF; always@(*) begin //----------处理R型指令---------- if(inst[31:26]==6'b000000) begin rd=inst[15:11]; rt=inst[20:16]; rs=inst[25:21]; //alu_mem_s=0; wr_data_s=2'b00; Mem_Write=0; //rd_rt_s=0; w_r_s=2'b00; rt_imm_s=0; case(inst[5:0]) 6'b100000:begin ALU_OP=3'b100;Write_Reg=1;PC_s=2'b00;end 6'b100010:begin ALU_OP=3'b101;Write_Reg=1;PC_s=2'b00;end 6'b100100:begin ALU_OP=3'b000;Write_Reg=1;PC_s=2'b00;end 6'b100101:begin ALU_OP=3'b001;Write_Reg=1;PC_s=2'b00;end 6'b100110:begin ALU_OP=3'b010;Write_Reg=1;PC_s=2'b00;end 6'b100111:begin ALU_OP=3'b011;Write_Reg=1;PC_s=2'b00;end 6'b101011:begin ALU_OP=3'b110;Write_Reg=1;PC_s=2'b00;end 6'b000100:begin ALU_OP=3'b111;Write_Reg=1;PC_s=2'b00;end 6'b001000:begin ALU_OP=3'b100;Write_Reg=0;PC_s=2'b01;end endcase end //---------I型立即数寻址指令------- if(inst[31:29]==3'b001) begin imm=inst[15:0]; rt=inst[20:16]; rs=inst[25:21]; Mem_Write=0; //rd_rt_s=1; rt_imm_s=1; //alu_mem_s=0; w_r_s=2'b01; Write_Reg=1; wr_data_s=2'b00; case(inst[31:26]) 6'b001000:begin imm_s=1;ALU_OP=3'b100;end 6'b001100:begin imm_s=0;ALU_OP=3'b000;end 6'b001110:begin imm_s=0;ALU_OP=3'b010;end 6'b001011:begin imm_s=0;ALU_OP=3'b110;end endcase end //--------处理I型取数/存数指令------ if((inst[31:30]==2'b10)&&(inst[28:26]==3'b011)) begin imm=inst[15:0]; rt=inst[20:16];//rt寄存器 rs=inst[25:21];//rs寄存器 //rd_rt_s=1;//rt作为目的存储器 rt_imm_s=1;//imm作为源操作数 imm_s=1; w_r_s=2'b01; wr_data_s=2'b01; PC_s=2'b00; case(inst[31:26]) 6'b100011:begin Mem_Write=0; Write_Reg=1;ALU_OP=3'b100;end 6'b101011:begin Mem_Write=1; Write_Reg=0;ALU_OP=3'b100;end endcase end //-----------处理I型跳转指令--------- if(inst[31:27]==5'b00010) begin imm=inst[15:0]; rt=inst[20:16];//rt rs=inst[25:21];//rs case(inst[31:26]) 6'b000100:begin rt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0; PC_s=(ZF?2'b10:2'b00);end 6'b000101:begin rt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0; PC_s=(ZF?2'b00:2'b10);end endcase end //----------处理J型跳转指令---------- if(inst[31:27]==5'b00001) begin address=inst[25:0]; case(inst[31:26]) 6'b000010:begin w_r_s=2'b00;Write_Reg=0;Mem_Write=0;PC_s=2'b11;end 6'b000011:begin w_r_s=2'b10;wr_data_s=2'b10;Write_Reg=1;Mem_Write=0;PC_s=2'b11;end endcase end end endmodule 寄存器堆模块: module Register_file(R_Addr_A,R_Addr_B,W_Addr,Write_Reg,W_Data,Clk,Reset,R_Data_A,R_Data_B); input [4:0]R_Addr_A; input [4:0]R_Addr_B; input [4:0]W_Addr; input Write_Reg; input [31:0]W_Data; input Clk; input Reset; output [31:0]R_Data_A; output [31:0]R_Data_B; reg [31:0]REG_Files[0:31]; reg [5:0]i; initial//仿真过程中的初始化 begin for(i=0;i<=31;i=i+1) REG_Files[i]=0; end assign R_Data_A=REG_Files[R_Addr_A]; assign R_Data_B=REG_Files[R_Addr_B]; always@(posedge Clk or posedge Reset) begin if(Reset) for(i=0;i<=31;i=i+1) REG_Files[i]<=0; else if(Write_Reg&&W_Addr!=0) REG_Files[W_Addr]<=W_Data; end endmodule ALU运算模块: module ALU(A,B,F,ALU_OP,ZF,OF); input [31:0]A,B; input [2:0]ALU_OP; output reg ZF,OF; output reg[31:0]F; reg C32; always@(*) begin OF=1'b0; C32=1'b0; case(ALU_OP) 3'b000:F=A&B; 3'b001:F=A|B; 3'b010:F=A^B; 3'b011:F=~(A^B);