文章目录
一、FIFO是啥??
- FIFO本质上还是RAM,可读可写,只不过是先写先读,核、就像数据结构里面的队列。
- 其主要在多比特做跨时钟域处理、前后带宽不同步等情况下使用
- 根据时钟可分为同步FIFO和异步FIFO
二、同步FIFO-IP核的配置和验证
在vivado的ip-catalog中找到FIFO0-IP核
选择同步时钟FIFO
三、使用
1.实例化FIFO
module fifo(
input wire sys_clk ,
input wire sys_rst_n ,
input wire [7:0] din ,
input wire wr_en ,
input wire rd_en ,
output wire [7:0] dout ,
output wire full ,
output wire empty ,
output wire [7:0] data_count
);
scfifo_8x256 scfifo_8_256_inst (
.clk (sys_clk), // input wire clk
.din (din), // input wire [7 : 0] din
.wr_en (wr_en), // input wire wr_en
.rd_en (rd_en), // input wire rd_en
.dout (dout), // output wire [7 : 0] dout
.full (full), // output wire full
.empty (empty), // output wire empty
.data_count (data_count) // output wire [7 : 0] data_count
);
endmodule
2.仿真验证
module sim_fifo( );
reg sys_clk ;
reg sys_rst_n ;
reg [7:0] din ;
reg wr_en ;
reg rd_en ;
wire [7:0] dout ;
wire full ;
wire empty ;
wire [7:0] data_count ;
reg [1:0] cnt ; // 计数器时间间隔
fifo fifo_inst (
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.din (din),
.wr_en (wr_en),
.rd_en (rd_en),
.dout (dout),
.full (full),
.empty (empty),
.data_count (data_count)
);
// 50MHz
parameter clk_period_50M = 20;
always # (clk_period_50M / 2) sys_clk = ~sys_clk;
initial begin
sys_clk = 0;
sys_rst_n = 0;
#20
sys_rst_n = 1;
end
// cnt:计数器变量的赋值
always @ (posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n)
cnt <= 2'd0;
else if (cnt == 2'd3)
cnt <= 2'd0;
else
cnt <= cnt + 1'b1;
// wr_en:写请求信号的赋值
always @ (posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n)
wr_en <= 1'b1;
else if ((cnt == 2'd0) && (rd_en == 1'b0))
wr_en <= 1'b1;
else
wr_en <= 1'b0;
// din:写数据
always @ (posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n)
din <= 8'd0;
else if ((din == 8'd255) && (wr_en == 1'b1))
din <= 8'd0;
else if (wr_en == 1'b1)
din <= din + 1'b1;
else
din <= din;
// rd_en:读请求信号的赋值
always @ (posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n)
rd_en <= 1'b0;
else if (full == 1'b1) // FIFO写满后开始读取
rd_en <= 1'b1;
else if (empty == 1'b1) // FIFO取空后停止读
rd_en <= 1'b0;
endmodule
写满之后开始读
读空之后开始写