fifo IP 核使用常见问题汇总

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 <= 1;
else
  fifo_rd <= fifo_rd ;
每次这样用fifo总是纠结,每次都忘,每次都是纠结好久想到要用  if  else 优先级来做

4---- fifo如果写入读出数据不一样
   写入位宽小,读出位宽大,则先写进去的位宽在高位。
    写入位宽大,读出位宽小,则先读出来的是数据的高位。

5----- VIVADO   2017.4 版本,一个奇怪的现象。使用ila的时候,如果观测的有fifo端口上的数据,则fifo工作不正常。如果把fifo端口上的数据用时钟重新打一拍以后,再放到ILA 上面,则fifo工作正常。

你可能感兴趣的:(FPGA)