Xilinx FIFO Generate 需要注意RST复位
记录在使用Xilinx的FIFO Generate的时候遇到的问题(modelsim仿真和ILA都能遇到);
——full,empty 等信号一直keep high;
直接原因
以下内容说的都是Asynchronous Reset;
在手册pg057-fifo-generator.pdf,Page127中有介绍:
拙劣的翻译:
进行复位操作的时候,读写时钟必须是有效的。不管什么原因,在复位操作的时刻,读写时钟如果丢失,必须在读写时钟有效的时刻再次进行复位操作。违反此操作将导致不可预期的行为发生。甚至,信号busy会被卡住,并可能需要重新配置FPGA。
其他建议
文中后续也有对异步复位的建议:
拙劣的翻译:
如果异步复位的信号宽度是一个慢时钟宽度(应该是读写时钟中较慢的那一个),而且是在非常靠近满时钟上升沿的时候断言,那么复位检测就可能不会遇到这种导致无法预期的行为发生情况。为了避免这种情况,尽管在本手册中在一些时候说断言慢时钟的一个周期,但通常建议异步复位信号断言至少三个慢时钟周期。
文中有个定义C_SYNCHRONIZER_STAGE不理解什么意思,有知道的可以评论交流。
时序
在手册中也给出了建议的复位时序:
需要注意:FIFO的所有输出信号在图中的No Access Zone期间必须视为无效;
可以观察到时序:
- RST信号有8个慢时钟周期的高电平;
- 在RST上升沿时期,7个wr_clk周期后WR_RST_BUSY信号拉高,FULL信号拉高,此时的wr_en信号应该拉低;
- 在RST上升沿时期,7个rd_clk周期后RD_RST_BUSY信号拉高,EMPTY信号拉高,此时的rd_en信号应该拉低,而且此时的数据输出端口均为无效;
- 复位周期 + 60个满时钟周期后,FIFO可以正常读写;
手册中也给出了一个不安全的时序图:
这个图中最明显的就是Async Reset的复位周期为3个慢时钟周期。
这样的时序情况下可能会引起一些异常(但是这个时序后面FIFO还是可以进行读写工作的)。
仿真
在modelsim仿真的时序中,如果FIFO的复位出现在了wr_clk或者rd_clk之前,那FIFO是不能进行读写的(注意FULL信号和EMPTY信号是会强行拉高的):
而后,再次进行FIFO的复位,FULL和EMPTY信号恢复正常,FIFO可以正常读写了:
总结
用FIFO IP的时候要注意 RST信号,建议满足:
1. 有效复位必须在wr_clk和rd_clk有效之后;
2. 有效复位至少要维持慢时钟的3个周期;
3. 复位操作过后,要等待至少30个慢时钟周期,再去使用FIFO进行读写操作;
按照这三个条件,对FIFO的RST进行配置,目前还没遇到问题,如有问题,评论沟通。