寄存器堆的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档