`timescale 1ns / 1ps //设置时钟周期和时间精度

////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2021/05/07 13:39:15 // Design Name: // Module Name: EXMEMReg // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //////////////////////////////////////////////////////////////////////////////////

//模块声明 module EXMEMReg( input clk, //时钟信号 input reset_n, //复位信号 input en, //使能信号 input [31:0] PCAdd4_FromEX, //来自EX阶段的PC+4值 output reg[31:0] PCAdd4_ToMEM, //传递给MEM阶段的PC+4值

input [31:0]        ALUResult_FromEX,   //来自EX阶段的运算结果
output reg[31:0]    ALUResult_ToMEM,    //传递给MEM阶段的运算结果

input [31:0]        RegReadData2_FromEX,//来自EX阶段的读取的寄存器值
output reg[31:0]    RegReadData2_ToMEM, //传递给MEM阶段的读取的寄存器值

input [4:0]         WriteReg_FromEX,    //来自EX阶段的写寄存器编号
output reg[4:0]     WriteReg_ToMEM,     //传递给MEM阶段的写寄存器编号

input               MemRead_FromEX,     //来自EX阶段的读取内存信号
input               MemtoReg_FromEX,    //来自EX阶段的内存读取回写寄存器的信号
input               MemWrite_FromEX,    //来自EX阶段的写内存信号
input               RegWrite_FromEX,    //来自EX阶段的写寄存器信号
input               J_FromEX,           //来自EX阶段的跳转信号

output reg          MemRead_ToMEM,      //传递给MEM阶段的读取内存信号
output reg          MemtoReg_ToMEM,     //传递给MEM阶段的内存读取回写寄存器的信号
output reg          MemWrite_ToMEM,     //传递给MEM阶段的写内存信号
output reg          RegWrite_ToMEM,     //传递给MEM阶段的写寄存器信号
output reg          J_ToMEM             //传递给MEM阶段的跳转信号
);

////////////////////////////////////////////////////////// //PC+4寄存器 ////////////////////////////////////////////////////////// //always块表示PC+4寄存器的行为 always @ (posedge clk) begin if(!reset_n) PCAdd4_ToMEM<=32'h00000000; //如果复位信号为0,将PC+4寄存器的值设为0 else if(en==1) PCAdd4_ToMEM<=PCAdd4_FromEX; //如果使能信号为1,将从EX阶段传来的PC+4值传递给MEM阶段 else PCAdd4_ToMEM<=PCAdd4_ToMEM; //否则,将PC+4寄存器的值保持不变 end

////////////////////////////////////////////////////////// //ALUResult寄存器 ////////////////////////////////////////////////////////// //always块表示ALUResult寄存器的行为 always @ (posedge clk) begin if(!reset_n) ALUResult_ToMEM<=32'h00000000; //如果复位信号为0,将ALUResult寄存器的值设为0 else if(en==1) ALUResult_ToMEM<=ALUResult_FromEX;//如果使能信号为1,将从EX阶段传来的运算结果传递给MEM阶段 else ALUResult_ToMEM<=ALUResult_ToMEM; //否则,将ALUResult寄存器的值保持不变 end

////////////////////////////////////////////////////////// //读取的第二个数据寄存器 ////////////////////////////////////////////////////////// //always块表示读取的第二个数据寄存器的行为 always @ (posedge clk) begin if(!reset_n) RegReadData2_ToMEM<=32'h00000000; //如果复位信号为0,将读取的第二个数据寄存器的值设为0 else if(en==1) RegReadData2_ToMEM<=RegReadData2_FromEX;//如果使能信号为1,将从EX阶段传来的读取的第二个数据寄存器的值传递给MEM阶段 else RegReadData2_ToMEM<=RegReadData2_ToMEM; //否则,将读取的第二个数据寄存器的值保持不变 end

////////////////////////////////////////////////////////// //寄存器堆 输入输出寄存 //////////////////////////////////////////////////////////
//always块表示寄存器堆的行为 always @ (posedge clk) begin if(!reset_n) begin WriteReg_ToMEM <=32'h00000000; //如果复位信号为0,将写寄存器编号设为0 end else if(en==1) begin WriteReg_ToMEM <=WriteReg_FromEX; //如果使能信号为1,将从EX阶段传来的写寄存器编号传递给MEM阶段 end else begin WriteReg_ToMEM <=WriteReg_ToMEM ; //否则,将写寄存器编号保持不变 end end

////////////////////////////////////////////////////////// //控制信号寄存器 //////////////////////////////////////////////////////////
//always块表示控制信号寄存器的行为 always @ (posedge clk) begin if(!reset_n) begin MemRead_ToMEM <=32'h00000000; //如果复位信号为0,将读取内存信号设为0 MemtoReg_ToMEM <=32'h00000000; //将内存读取回写寄存器的信号设为0 MemWrite_ToMEM <=32'h00000000; //将写内存信号设为0 RegWrite_ToMEM <=32'h00000000; //将写寄存器信号设为0 J_ToMEM <=32'h00000000; //将跳转信号设为0 end else if(en==1) begin MemRead_ToMEM <=MemRead_FromEX ; //如果使能信号为1,将从EX阶段传来的读取内存信号传递给MEM阶段 MemtoReg_ToMEM <=MemtoReg_FromEX ; //将从EX阶段传来的内存读取回写寄存器的信号传递给MEM阶段 MemWrite_ToMEM <=MemWrite_FromEX ; //将从EX阶段传来的写内存信号传递给MEM阶段 RegWrite_ToMEM <=RegWrite_FromEX ; //将从EX阶段传来的写寄存器信号传递给MEM阶段 J_ToMEM <=J_FromEX ; //将从EX阶段传来的跳转信号传递给MEM阶段 end else begin MemRead_ToMEM <=MemRead_ToMEM ; //否则,将读取内存信号保持不变 MemtoReg_ToMEM <=MemtoReg_ToMEM; //将内存读取回写寄存器的信号保持不变 MemWrite_ToMEM <=MemWrite_ToMEM; //将写内存信号保持不变 RegWrite_ToMEM <=RegWrite_ToMEM; //将写寄存器信号保持不变 J_ToMEM <=J_ToMEM ; //将跳转信号保持不变 end end
endmodule //模块结

为以下代码写注释timescale 1ns 1ps Company Engineer Create Date 20210507 133915 Design Name Module Name EXMEMReg Project Name Target Devices Tool Versions Description Dependencies Revision Revision

原文地址: http://www.cveoy.top/t/topic/fjyC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录