使用两年多的Altera器件,总觉得自己对FIFO这类简单的Core已经是熟悉不能再熟悉了,到现在的结果是花了三个星期时间解决一个FIFO时序问题。
现象
|
FIFO实际读写情况 |
上述图是从SignalTap中保存的.vcd文件,其中avm_clock为读时钟,rdreq在图中都处于无效状态,而写数据一直在进行(wrreq高电平有效,写时钟未示意),但是rdusedw却随着数据写入逐渐减少,到最后直至wrfull有效,rdusedw为零。
分析
Altera提供的FIFO Megacore中有rdusedw和rdempty两中信号,分别用于描述FIFO内的可读数据量和FIFO内部为空,但是当你读完FIFO内数据的同时,并不会马上响应,即rdusedw不会在紧接的时钟为0,rdempty不会高电平有效。如果此时,你需要根据rdempty信号是否进行下一次读进程,则会发生上述描述的现象。
|
错误读时序 |
如上图所示,读完13个数据后,FIFO已经为空。但是rdusedw在两个时钟后才为零,由于FIFO有读保护逻辑,rdusedw一直为零。错误已经造成
总结
首先,
wind330
希望看过本文的同学不对这种错误费解。然后,尽量不利用Altera FIFO的wrfull和rdempty信号判断是否读写FIFO,而是利用自己工程中其他信息判断FIFO是否为满或空。最后,这种问题无法用行为仿真得出结果。