首先,这个vivado的fifo和quartus有很大不同。
用BRAM来实现异步fifo。
vivado的fifo有复位,在时钟信号稳定后,复位至少三个时钟周期(读写端口的慢时钟),复位完成后30个时钟周期后再进行写操作(慢时钟)。
有两个模式:标准模式和预读模式。
标准模式,读出的数据会比读使能延后一个时钟周期,fifo的深度也会比配置的少一个。
预读模式,读出的数据会与读使能同步,深度会比配置的多一个。
犯下的错误:顶层模块,fifo的复位接到了系统复位上。
没有认真阅读正点原子开发指南,忽略了深度的问题。
模块框图:

时序图:

代码:
module fifo_wr_ctrl(
input wire sys_clk , // clk_wr // 50Mhz
input wire sys_rst_n ,
output wire rst_fifo ,
output wire wr_clk ,
output wire [7:0] wr_din ,
output reg wr_en
);
// parameter
parameter RST_FIFO_CNT = 3 ,
RST_WAIT_CNT = 30 ,
DATA_IN_CNT = 200 ; // 设置深度256,但实际深度只有255.写进数据0~254
// localparam
localparam RST = 4'b0001 ,
RST_WAIT = 4'b0010 ,
DATA_IN_S = 4'b0100 ,
FINISH_S = 4'b1000 ;
// reg signal define
reg [7:0] cnt_core ;
reg finish ;
reg [3:0] state ;
// wire signal define
wire rst_flag ;

文章讲述了在使用Vivado设计FIFO时,作者遇到的关于复位时序、模式选择以及顶层模块设计的错误,强调了正确配置和理解硬件时序的重要性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



