异步fifo操作问题(xilinx fifo IP core)
思路看起来没什么问题,问题可能出现在你写读驱动那一块的代码上了,估计跟pipeline有关系,你检查一下读写时序。
valid 有效再读
操作方法要根据这个IP的要求来做,我估计这个FIFO正确的操作方式应该是这样的:要想写,先查询wr_ack,如果有效则写,如果无效则不要写,等待直到wr_ack有效时才去写;要想读,先查询valid,如果有效则去读,如果无效则不要读直到valid有效。
你的操作方式里都存在无效的写或者读,好像没见过FIFO是这样设计的,你去看看这个FIFO的操作说明吧。
fifo有空和满标志的,另外fifo空了valid也会掉下去
fifo 的full和empty的有效是在写入或读出时钟上升沿之后3到4个时钟才有效的,比如写入fifo一个数,明明写入之后就会满,full不会立刻变成1,把写使能关闭,在写时钟的三个周期后full才会变成1。之前没用empty和full信号就是因为不知道这个,才用了wr_ack和valid信号。这两个信号可能也存在这样的问题,wr_ack和valid的有效可能不会在写入或者读出的时钟沿立刻有效。后来我又改成了empty和full信号的,不再使用wr_ack和valid了,也就没有验证他们的有效是否会延迟。这个应该是可行的,但这么使用fifo好像确实没有用empty和full好。谢谢您提的宝贵建议!
wr_ack是write的acknowledge信号,就是要在写之后才会有效的,valid类似。存在好多无效读写确实不对,是因为empty和full信号,最开始没有搞明白,就用的wr_ack和valid信号。谢谢您指点!
谢谢您的回复,很有帮助!
valid信号相当于read的acknowledge信号,表示读数是否成功,是应该读数之后再检测的。谢谢您的回复!
那你还不如自己写一个FIFO,很简单的,别用它的IP了,这操作方法看起来怪怪的。FIFO的empty以及full信号,分别在read以及write的时钟域下,应该是及时置起来的;如果存在滞后,这FIFO的设计就有问题,会发生空了还在读,满了还在写的错误。
现在使用方法,写之前关闭写使能,写时钟出现十个周期(足够用),再检查是否满。读也是一样的。这样就可以了。会浪费一些时钟周期,不过这个影响不大。
