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 beginsys_clk=1'b1;sys_rst_n<=1'b0;#20sys_rst_n<=1'b1;endalways #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;elsecnt<=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;elsewr_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;elsepi_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使能信号和数据对齐
