1.1 问题背景
在FIFO的使用过程中不可避免的在某些应用下必须使用reset信号,将当前FIFO中数据清空,但是我们现在调用的xilinx的FIFO核在复位条件不满足时会偶现FIFO进入复位状态无法恢复,必须重新断上电才能恢复的问题,所以在使用FIFO时我们必须严格的按照datasheet上要求执行,以免出现异常。
1.2 IP核形式FIFO异步复位要求
IP核形式FIFO复位主要参考pg057-fifo-generator.pdf文档中说明。详见第3章RESET段描述。
其中reset要求如图1所示:
图1 FIFO Asynchronous Reset Socket Timing
结合文档详细说明,reset主要符合以下五点:
- 如果不必要,则建议不例化reset信号。
- 复位过程中读写时钟必须稳定,若过程中出现时钟不稳定,则等时钟稳定了再次进行一次复位。
- 复位信号保持时间长度必须大于3个周期的慢时钟长度。
- 复位过程中不允许有读写操作,即reset信号和wr_rst_busy信号任意一个为高的时候wr_en和rd_en信号必须为低。
- 第2次复位在有wr_rst_busy指示信号时应等wr_rst_busy信号拉低,若无该信号则两次复位之间至少相隔6个周期的慢时钟长度。
1.3 XMP形式FIFO异步复位要求
XMP形式FIFO复位主要参考ug974-vivado-ultrascale-libraries.pdf文档中说明。详见第2章XMP_FIFO_ASYNC段描述.
其中reset要求如图2所示:
图2 XPM_FIFO RESET Behavior
结合文档详细说明,reset主要符合以下四点:
- 复位信号必须与写时钟同步,复位有效时读写时钟必须都稳定。
- 写复位过程中不允许有写信号;即reset信号、wr_rst_busy信号任意一个为高时不允许有wr_en信号为高
- 读复位过程中不允许有读信号;即rd_rst_busy信号拉高时不允许rd_en信号为高
- 第2次复位必须等第一次复位完成后才可进行,即wr_rst_busy信号拉低后才可以进行第二次复位。
2 总结
建议复位标志同时满足IP核和XMP的要求,方便代码移植和修改,但由于客观原因不能同时满足,则至少保证符合当前使用FIFO类型的要求。
若可以同时满足,则按照如下进行:
- 复位信号必须与写时钟同步,复位有效时读写时钟必须同时稳定
- 复位信号时间长度必须大于慢时钟的3个时钟周期长度
- 在reset、wr_rst_busy、rd_rst_busy三个信号任意一个为高时,不允许有wr_en或rd_en拉高。
- 第2次复位必须等上一次复位完成后才可使能,及必须等到wr_rst_busy、rd_rst_busy信号都拉低以后才能开启第二次复位流程。