2读1写通用寄存器堆设计实现

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
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俩个圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值