寄存器堆的设计Word文档格式.docx
《寄存器堆的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《寄存器堆的设计Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
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;
//实现复位的标志
regreg;
//实现写数据的脉冲
reg[4:
0]count;
//---32分频处理
always@(posedgeregorposedgereg)
begin
if(reg)
begin
count<
=5'
d0;
ﻩreg<
=1'
b0;
ﻩend
ﻩelseif(count<
5'
d16)
ﻩbegin
ﻩcount<
=count+1'b1;
end
else
ﻩbegin
ﻩcount<
=5'
d0;
ﻩreg<
=~reg;
end
//---复位处理
always@(posedgeregorposedgereg)
begin
if(reg)
ﻩbegin
i<
=5'
d0;
ﻩflag<=1'b0;
ﻩendﻩ
else if(i<
5'b11111)
ﻩ i<
=i+1'
b1;
flag<
=1'
b0;
end
ﻩelse
flag<
=1'
b1;
ﻩ
//---写操作
always@(posedge reg)
if(~flag)
ﻩregfiles[i]<=32'd0;
else
begin
if(reg(reg'
d0)) //写使能端为一,写地址不为零
ﻩbegin
ﻩﻩregfiles[reg]<=reg;
//写入
ﻩﻩﻩend
ﻩﻩend
end
//---读操作
assignreg(reg'
d0)?
32'
d0:
regfiles[reg];
assignreg(reg'
d0)?
regfiles[reg];
//
//----------------------------------------
endmodule
4、设计电路仿真
所设计的指令存储器模块电路,采用ISE仿真器工具进行了设计仿真验证,验证结果表明存储器功能以及接口时序完全正确,如下是仿真验证的波形图。
附件1是仿真激励源代码。
图5 寄存器堆电路读写仿真波形图
附件1:
modulereg;
ﻩ//Inputs
regclk;
ﻩregrst;
regWen;
ﻩ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 theUnitUnderTest(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;
initialbegin
clk=1'
rst = 1'
ﻩWen = 1'
ﻩRaddr_1=5'
Raddr_2=5'd0;
ﻩﻩWaddr=5'd0;
ﻩWdata = 32'
ﻩinitial begin
#16rst =1'
b0;
//复位
#32Wen=1'
b1;
Waddr=5'd5;
Wdata= $random;
//写操作
#16Waddr= 5'd30;
Wdata= $random;
#16Waddr=5'
d0;
Wdata=32'
hffff;
#16Wen=1'
Raddr_1= 5'd5;
Raddr_2=5'
d30;
//无法写入无法写入
#16Raddr_1=5'
Raddr_2=5'
ﻩ//----------------------------------------
ﻩ#16Wen =1'
b1;
//写操作
ﻩfor(j=0;
j<6'
d32;
j=j+1)
ﻩbegin
ﻩ@(posedgeclk) #16 Waddr=j;
ﻩﻩWdata=31-j;
ﻩend
ﻩ//----------------------------------------
#48Wen=1'
//读操作
ﻩﻩfor(k=0;
k<6'
d32;
k=k+1)
ﻩﻩbegin
ﻩ@(posedgeclk) #16 Raddr_1= k;
ﻩRaddr_2=31-k;
end
end
endmodule
modulereg;
//Inputs
ﻩregclk;
ﻩregrst;
ﻩ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 theUnitUnderTest (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.25clk<
=~clk;
ﻩreg[5:
0]j,k;
initial begin
ﻩﻩclk=1'
b0;
ﻩrst=1'b1;
ﻩWen=1'b0;
ﻩRaddr_1=5'
ﻩRaddr_2=5'
ﻩWaddr=5'
ﻩﻩWdata = 32'
initialbegin
#16rst=1'
b0;
//复位
ﻩ#32 Wen=1'
b1;
Waddr=5'
d5;
Wdata=$random;
//写操作
#16Waddr=5'd30;
Wdata =$random;
#16 Waddr=5'
d0;
Wdata=32'
hffff;
#16Wen=1'
b0;
Raddr_1=5'
d5;
Raddr_2=5'
//无法写入无法写入
#16Raddr_1=5'
Raddr_2 =5'
ﻩ//----------------------------------------
ﻩﻩ#16 Wen=1'
b1;
//写操作
ﻩﻩfor(j=0;
j<
6'
d32;
j=j+1)
begin
ﻩ@(posedgeclk)#16Waddr=j;
Wdata =31-j;
ﻩﻩend
//----------------------------------------
ﻩ#48 Wen = 1'
//读操作
ﻩfor(k=0;
k<
6'
d32;
k=k+1)
ﻩbegin
ﻩ@(posedgeclk)#16Raddr_1= k;
ﻩﻩRaddr_2=31-k;
end
ﻩend
endmodule