MIPS流水线CPU的verilog实现 联系客服

发布时间 : 星期二 文章MIPS流水线CPU的verilog实现更新完毕开始阅读c9f71522ed630b1c59eeb52e

dffre #(32) dffre1( .d(Instruction_if), .en(PC_IFWrite), .r(IF_flush|reset), .clk(clk), .q(Instruction_id));

dffre #(32) dffre2( .d(NextPC_if), .en(PC_IFWrite), .r(IF_flush|reset), .clk(clk),

.q(NextPC_id));

// ID Module

wire[4:0] RtAddr_id,RdAddr_id,RsAddr_id;

wire RegWrite_wb,MemRead_ex,MemtoReg_id,RegWrite_id,MemWrite_id; wire MemRead_id,ALUSrcA_id,ALUSrcB_id,RegDst_id,Stall; wire[4:0] RegWriteAddr_wb,RegWriteAddr_ex,ALUCode_id; wire[31:0] RegWriteData_wb,Imm_id,Sa_id,RsData_id,RtData_id; ID ID ( .clk(clk), .Instruction_id(Instruction_id), .NextPC_id(NextPC_id), .RegWrite_wb(RegWrite_wb),

.RegWriteAddr_wb(RegWriteAddr_wb), .RegWriteData_wb(RegWriteData_wb), .MemRead_ex(MemRead_ex), .RegWriteAddr_ex(RegWriteAddr_ex),

.MemtoReg_id(MemtoReg_id), .RegWrite_id(RegWrite_id), .MemWrite_id(MemWrite_id), .MemRead_id(MemRead_id), .ALUCode_id(ALUCode_id), .ALUSrcA_id(ALUSrcA_id), .ALUSrcB_id(ALUSrcB_id), .RegDst_id(RegDst_id), .Stall(Stall), .Z(Z), .J(J), .JR(JR), .PC_IFWrite(PC_IFWrite), .BranchAddr(BranchAddr), .JumpAddr(JumpAddr), .JrAddr(JrAddr), .Imm_id(Imm_id),

.Sa_id(Sa_id),

.RsData_id(RsData_id), .RtData_id(RtData_id), .RtAddr_id(RtAddr_id), .RdAddr_id(RdAddr_id),

.RsAddr_id(RsAddr_id));

// ID->EX Register

wire MemtoReg_ex,RegWrite_ex,ALUSrcA_ex,ALUSrcB_ex,RegDst_ex; wire [4:0] ALUCode_ex,RdAddr_ex,RsAddr_ex,RtAddr_ex; wire [31:0] Sa_ex,Imm_ex,RsData_ex,RtData_ex;

dffr #(2) WB_I_E( .d({MemtoReg_id,RegWrite_id}), .r(Stall|reset), .clk(clk),

37

.q({MemtoReg_ex,RegWrite_ex}));

dffr #(2) M_I_E( .d({MemWrite_id,MemRead_id}), .r(Stall|reset), .clk(clk), .q({MemWrite_ex,MemRead_ex}));

dffr #(8) EX_I_E( .d({ALUCode_id,ALUSrcA_id,ALUSrcB_id,RegDst_id}), .r(Stall|reset), .clk(clk), .q({ALUCode_ex,ALUSrcA_ex,ALUSrcB_ex,RegDst_ex})); dffr #(32) Data_Sa( .d(Sa_id), .r(Stall|reset), .clk(clk), .q(Sa_ex)); dffr #(32) Data_Imm( .d(Imm_id), .r(Stall|reset), .clk(clk), .q(Imm_ex)); dffr #(32) Data_Rs( .d(RsData_id), .r(Stall|reset), .clk(clk), .q(RsData_ex)); dffr #(32) Data_Rt( .d(RtData_id), .r(Stall|reset), .clk(clk), .q(RtData_ex)); dffr #(15) Data_I_E( .d({RdAddr_id,RsAddr_id,RtAddr_id}), .r(Stall|reset), .clk(clk), .q({RdAddr_ex,RsAddr_ex,RtAddr_ex}));

// EX Module

wire[31:0] ALUResult_mem,ALUResult_ex,MemWriteData_ex; wire[4:0] RegWriteAddr_mem; wire RegWrite_mem; EX EX(

.RegDst_ex(RegDst_ex), .ALUCode_ex(ALUCode_ex), .ALUSrcA_ex(ALUSrcA_ex), .ALUSrcB_ex(ALUSrcB_ex), .Imm_ex(Imm_ex), .Sa_ex(Sa_ex),

.RsAddr_ex(RsAddr_ex), .RtAddr_ex(RtAddr_ex), .RdAddr_ex(RdAddr_ex), .RsData_ex(RsData_ex), .RtData_ex(RtData_ex),

.RegWriteData_wb(RegWriteData_wb), .ALUResult_mem(ALUResult_mem), .RegWriteAddr_wb(RegWriteAddr_wb), .RegWriteAddr_mem(RegWriteAddr_mem), .RegWrite_wb(RegWrite_wb), .RegWrite_mem(RegWrite_mem), .RegWriteAddr_ex(RegWriteAddr_ex), .ALUResult_ex(ALUResult_ex), .MemWriteData_ex(MemWriteData_ex), .ALU_A(ALU_A), .ALU_B(ALU_B));

assign ALUResult=ALUResult_ex;

//EX->MEM

wire MemtoReg_mem,MemWrite_mem;

38

wire [31:0] MemWriteData_mem;

dffr #(2) WB_E_M( .d({MemtoReg_ex,RegWrite_ex}), .r(reset), .clk(clk), .q({MemtoReg_mem,RegWrite_mem}));

dffr M_E_M( .d(MemWrite_ex), .r(reset), .clk(clk), .q(MemWrite_mem));

dffr #(32) ALUResult_E_M( .d(ALUResult_ex), .r(reset), .clk(clk), .q(ALUResult_mem)); dffr #(32) dffr_MemWriteData( .d(MemWriteData_ex), .r(reset), .clk(clk),

.q(MemWriteData_mem));

dffr #(5) dffr_RegWrite( .d(RegWriteAddr_ex), .r(reset), .clk(clk), .q(RegWriteAddr_mem));

//MEM Module wire[31:0] MemDout_wb; DataRAM DataRAM( .addr(ALUResult_mem[7:2]), .clk(clk),

.din(MemWriteData_mem), .dout(MemDout_wb), .we(MemWrite_mem));

//MEM->WB

wire MemtoReg_wb; wire [31:0] ALUResult_wb;

dffr #(2) WB_M_W( .d({MemtoReg_mem,RegWrite_mem}), .r(reset), .clk(clk), .q({MemtoReg_wb,RegWrite_wb}));

dffr #(32) ALUResultM_W( .d(ALUResult_mem), .r(reset), .clk(clk), .q(ALUResult_wb)); dffr #(5) dffr_M_W( .d(RegWriteAddr_mem), .r(reset), .clk(clk), .q(RegWriteAddr_wb)); //WB

assign RegWriteData_wb=MemtoReg_wb?MemDout_wb:ALUResult_wb;

endmodule

39