2读1写通用寄存器堆设计实现
一、接口设计
寄存器堆数量32个,存储数据位宽为32bit,采用二维数组实现,读和写有可能同时发生,其中0号寄存器为常0(无论写什么数据,寄存器值都为0)
二、接口结构
三、设计实现
<
//-------------------------
//File Name:datapath.v
//Designer:Liang Genyuan
//-------------------------
module mem_block(
clk,
nrst,
stall,
ren,
raddr1,
raddr2,
wen,
waddr,
wdata,
rs1,
rs2);
input clk;
input nrst;
input stall;
input ren;
input [4:0]raddr1;
input [4:0]raddr2;
input wen;
input [4:0]waddr;
input [31:0]wdata;
output [31:0]rs1;
output [31:0]rs2;
reg [31:0] mem [31:0];
reg wen_reg;
reg waddr_reg;
reg ren_reg;
reg raddr1_reg;
reg raddr2_reg;
reg [31:0]rs1;
reg [31:0]rs2;
integer i;
always@(posedge clk or negedge nrst)begin
if(!nrst)begin
wen_reg<=0;
waddr_reg<=0;
ren_reg<=0;
raddr1_reg<=0;
raddr2_reg<=0;
end
else begin
wen_reg<=wen;
waddr_reg<=waddr;
ren_reg<=ren;
raddr1_reg<=raddr1;
raddr2_reg<=raddr2;
end
end
always@(posedge clk or negedge nrst)begin
if(!nrst)begin
for(i=0;i<=31;i=i+1)
mem[i]<=32'b0;
end
else if(stall==0&&wen_reg==1)begin
mem[waddr_reg]<=wdata;
end
else begin
for(i=0;i<=31;i=i+1)
mem[i]<=mem[i];
end
end
always@(posedge clk or negedge nrst)begin
if(!nrst)begin
rs1<=0;
rs2<=0;
end
else if(ren==1)begin
rs1<=mem[raddr1_reg];
rs2<=mem[raddr2_reg];
end
else begin
rs1<=0;
rs2<=0;
end
end
endmodule