1.原理
`timescale 1ns/1ns
module tb_fifo();
reg sys_clk ;
reg sys_rst_n ;
reg [7:0] pi_data ;
reg rd_req ;
reg wr_req ;
reg [2:0] cnt;
wire empty ;
wire full ;
wire [7:0] po_data ;
wire [7:0] usedw ;
initial
begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt<=3'd0;
else if(cnt==2'd3)
cnt<=3'd0;
else
cnt<=cnt+1'b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
wr_req<=1'b0;
else if((rd_req==1'b0)&&(cnt==3'd3))
wr_req<=1'b1;
else
wr_req<=1'b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
pi_data<=8'd0;
else if((wr_req==1'b1)&&(pi_data==8'd255))
pi_data<=8'd0;
else if(wr_req==1'b1)
pi_data<=pi_data+1'b1;
else
pi_data<=pi_data;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
rd_req<=1'b0;
else if(full==1'b1)
rd_req<=1'b1;
else if(empty==1'b1)
rd_req<=1'b0;
scfifo_8x256 scfifo_8x256 _inst
(
.clock (sys_clk ),
.data (pi_data ),
.rereq (rd_req ),
.wrreq (wr_req ),
.empty (empty),
.full (full ),
.q (po_data ),
.usedw (usedw )
);
endmodule
刚一写满255,此时的读请求信号还是回=会有高电平因为读请求信号要等到,写满信号为高电平时,才会在下一周期拉高,所以此时输出的数据是256,大于8位,截取的是低八位所以为0。写满255,下一个周期就拉高写满信号(时序有延时),写满信号一拉高,则rd_req就拉高表示可以读数据了,这样写请求就为低电平了。
先出fifo使能信号和数据对齐