zoukankan      html  css  js  c++  java
  • FIFO使用技巧

    FPGA中,经常会用到FIFO来缓冲数据或者跨时钟传递数据。

    1、Almost full & Almost empty

    作为初学者,最开始使用FIFO的时候,对于它的理解,无非是配置好位宽、深度;如有必要,再加上Full、Empty信号即可;或者在跨时钟应用中,选用DCFIFO。
    FIFO中有两个信号,Almost Full和Almost Empty,一直不理解为什么需要这两个信号。有Full、Empty,为什么还要加上Almost这两个鸡肋?
    在读FIFO时,我们一般在时序逻辑中判断Empty Signal:如果Empty Signal为低,说明FIFO有数据可以读,于是拉高Readreq。这在连续读操作会出问题。

    如上图,第2个clock中Empty signal为高,于是第3个clock中Readreq为高,此时读出的数据是没有问题的。但假设此时已经是FIFO的最后一个数据,由第3个clock的Readreq signal,在第4个clock中Empty Signal才会拉高,而在第4个clock中,时序逻辑输入的Empty Signal是上一个时钟的低电平信号,于是认为还有有效的FIFO数据,Readreq继续为高。
    有两种方法解决这个问题:

    • Readreq拉高后的下一个时钟再去判断Empty Signal;
    • 配合使用Almost Empty Signal来处理;

    第一种方法每两个clock才能处理一个FIFO数据,想要快速地读出数据,这种方法显然不合适。
    方法二的思路是:将FIFO的Empty和Almost_empty以及读使能配合起来使用,来保证能够连续读,并准确的判断FIFO空满状态,提前决定是否能启动读使能。具体的实施办法是:当Empty为1,立即停止读;当Empty为0,Almost_empty为0时,可以放心读;当Empty为0,但是Almost_empty为1时,如果上一拍读使能Read也为1,那么不能读;当Empty为0,但是Almost_empty为1时,如果上一拍读使能Read为0,可以读最后一拍。这样,在数据连续读取时,既能不间断的读出数据而又不导致FIFO为空后还错误的读出数据。

  • 相关阅读:
    逐步实现python版wc命令
    Linux中短横线(-)小记
    memcached启动脚本(class练习)
    nginx启动脚本(class练习)
    Python-类的方法
    re模块
    shutil模块
    时间模块(time/date)
    迭代器
    生成器
  • 原文地址:https://www.cnblogs.com/liqi120150/p/6847751.html
Copyright © 2011-2022 走看看