fifo 做为FPGA常用的一个模块,每次用的时候都是丢三落四,不是忘这里就是忘哪里。现在记录下来。
1--- 关于FIFO 的复位,是高复位。懒得用复位信号的时候,就是把复位信号一直拉低。后来仿真发现,这样fifo是不工作的,因 为仿真时候观察写入和读出数据计数都是0。在虚伪的时候还需要注意,复位信号如果和fifo的时钟不同步,一定要在新时钟下面打两拍。
还有一点需要注意,在实测的时候发现这样一个问题。列子中,写入数据32bit,读出数据256bit,复位拉低4个时钟以后写使 能有效,数据有效,写入数据1 ,2 ,3 ,4 ,5 ,6……一直自加。按理说,应该fifo直接读出数据也是1 ,2 ,3 ,4 ,5 ,6……但实际 读出数据是 9 ,10,11,12,13…… 也就是前面8个数据没有写入fifo。后来找原因发现是fifo复位以后应该过一段时间再进行读写就不会出现这种问题。
以前写代码的时候,复位以后,fifo full就拉高了,很不方便。 其实,这里是配置的,让fifo复位的时候 full信号为低。在复位下面就可以选。
2--- fifo模式选择,用第一个,读使能和数据之间有延迟。用第二个只要有数,fifo就立马把第一个数据放到读数据总线上。这样给后级级联其他模块带来很大方便。不用再延迟读使能以后再获取数据
3--- 有时候需要fifo中可读数据到一定值以后触发读,但是这有一个问题,fifo只要读出一个数据以后,可读数据就会变少,这怎么办? 对于fifo的读,1 fifo中可读数据达到一定值读, 2 肯定在其他条件下控制fifo不读。那我们可以利用 if else 语句的优先级来控制。
if (fifo 不读的条件)
fifo_rd <= 0;
else (fifo 可读数据大于某值)
fifo_rd &l