寄存器堆的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
寄存器堆设计
1、功能概述:
MIPS指令格式中的寄存器号是5bits,指令可以访问25=32个32位的寄存器。这样的一堆寄存器“堆在一起”构成一个寄存器堆(Register File)。
2、接口说明:
寄存器堆模块接口信号说明表
脉冲reg,
复位端reg,
写使能端reg,
写地址reg,
写数据reg,
读地址一reg,
读地址二reg,
读数据一reg,
读数据二reg;
设计思路:
1、复位处理是利用标志位flag实现的,当复位时,flag=0;利用i来计数,当i<31
时,flag都等于0;直到i=32,复位完成,flag=1,这时,才可以进行写操作。
2、当复位时,需要32个脉冲才能将寄存器全部复位。复位未完成,flag一直等于
0。若复位未完成时,进行写操作,这时,并不能写进去,便出错了。所以,进行32分频,当寄存器可以写入时,复位已完成。
3、设计电路源代码
//----32个32位寄存器堆
module regfile(
input reg, //脉冲
input reg, //复位端
input reg, //写使能端
input [4:0] reg读地址一
input [4:0] reg读地址二
input [4:0] reg, //写地址
input [31:0] reg, //写数据
output [31:0] reg读数据一
output [31:0] reg读数据二
);
//----------------------------------
reg [31:0]regfiles[0:31]; //实现寄存功能
reg [4:0] i; //实现flag的变换reg flag; //实现复位的标志reg reg; //实现写数据的脉冲
reg [4:0]count;
//---32分频处理
always@(posedge reg or posedge reg)
begin
if(reg)
begin
count<=5'd0;
reg<=1'b0;
end
else if(count<5'd16)
begin
count<=count+1'b1;
end
else
begin
count<=5'd0;
reg<=~reg;
end
end
//---复位处理
always@(posedge reg or posedge reg)
begin
if(reg)
begin
i<=5'd0;
flag<=1'b0;
end
else if(i<5'b11111)
begin
i<=i+1'b1;
flag<=1'b0;
end
else
flag<=1'b1;
end
//---写操作
always@(posedge reg)
begin
if(~flag)
regfiles[i]<=32'd0;
else
begin
if(reg(reg'd0)) //写使能端为一,写地址不为零
begin
regfiles[reg]<=reg; //写入
end
end
end
//---读操作
assign reg(reg'd0)?32'd0:regfiles[reg];
assign reg(reg'd0)?32'd0:regfiles[reg];//
//----------------------------------------
endmodule
4、设计电路仿真
所设计的指令存储器模块电路,采用ISE仿真器工具进行了设计仿真验证,验证结果表
明存储器功能以及接口时序完全正确,如下是仿真验证的波形图。附件1是仿真激励源代码。
图5 寄存器堆电路读写仿真波形图
附件1:
module reg;
// Inputs
reg clk;
reg rst;
reg Wen;
reg [4:0] Raddr_1;
reg [4:0] Raddr_2;
reg [4:0] Waddr;
reg [31:0]Wdata;
// Outputs
wire [31:0] Rdata_1;
wire [31:0] Rdata_2;
// Instantiate the Unit Under Test (UUT)
reg (
.reg(clk),
.reg(rst),
.reg(Wen),
.reg(Raddr_1),
.reg(Raddr_2),
.reg(Waddr),
.reg(Wdata),
.reg(Rdata_1),
.reg(Rdata_2)
);
always #0.25 clk<=~clk;
reg [5:0]j,k;
initial begin
clk = 1'b0;
rst = 1'b1;