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为空后还错误的读出数据。

  • 相关阅读:
    记一次centos7.2下用crontab执行定时任务的过程(初级)
    海外手机号码正则匹配
    装了wamp之后,80端口被占用解决办法
    newtonsoft动态修改JObject
    .net正则提取手机号码,并替换带有手机号码的a标签
    .vs目录有什么用?
    centos7安装nginx-1.13.6 新手入门,图文解析
    centos7安装kafka_2.11-1.0.0 新手入门
    centos7安装apache 新手入门 图文教程
    面向对象——案例练习(4)判断点是否在圆的内部
  • 原文地址:https://www.cnblogs.com/liqi120150/p/6847751.html
Copyright © 2011-2022 走看看