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

FIFO使用技巧的更多相关文章

  1. Perl技巧

    项目里面一直用的是Perl,Perl里有各种小技巧就分享在这吧. push(@a, $b) 把b元素压入a数组中, 还可以有 push(@a, [@b]); 那a就成了二维数组了 scalar(@a) ...

  2. [nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library

    :本篇是我翻译并加入自己理解的nRF51 SDK中按钮相关操作的库和先进先出队列库.虽然是nRF51的SDK,但是通过此文你将更多地了解到在BSP(板级支持)上层嵌入式程序或OS的构建方法. 1.按钮 ...

  3. 【转】 FPGA设计的四种常用思想与技巧

    本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...

  4. Java内存管理的9个小技巧

    Java内存管理的9个小技巧很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测 ...

  5. FPGA/CPLD设计思想与技巧

    本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...

  6. 进程间通信之FIFO

    FIFO有时被称为命名管道.管道只能由相关进程使用,这些相关进程的共同祖先进程创建了管道.但是,通过FIFO,不相关的进程也能交换数据. FIFO是一种文件类型(参考http://www.cnblog ...

  7. Isim你不得不知道的技巧(整理)

    来源:电子产品世界: 注:本文由本人多出整理所得,原文章图片不清晰,自己整理配图后重新发表 安装好ISE,系统已经自带了ISim仿真软件,相比于专业的仿真软件Modelsim,ISim是免费的,不用编 ...

  8. Linux常用命令及使用技巧

    本文重点讲述Linux命令的使用,命令是学习Linux必须熟练掌握的一个部分.Linux下的命令大概有600个,而常用的命令其实只有80个左右,这些常用的命令是需要灵活掌握的.虽然Linux的各个发行 ...

  9. 关于Java内存管理的几个小技巧

    这里将介绍几则Java内存管理的小技巧,让你让你从Java入门开始告别陋习,为Java程序提速.有不少人都说"Java完了,只等着衰亡吧!",为什么呢?最简单的的例子就是Java做 ...

随机推荐

  1. python 类的定义 实例化 实例完后初始化

    先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序 class TMetaclass(type): def __new__(cls,name,bases,attr ...

  2. HD ACM 水题顺序

    原文传送门:http://acm.hdu.edu.cn/ 第一阶段:开始入门吧!(15天,53题) 一.输入输出练习(2天,10题) 1000.1089-1096.1001 二.简单操作:(2-4天, ...

  3. python-django-01

    1.Python工具 - pip 1.作用 Python的软件包管理器,有一些python包被集成到了pip中.只要被集成到pip中的包,都允许通过pip直接安装 2.安装 pip sudo apt ...

  4. 更改手机系统的User-Agent & okhttp

    okhttp 和 volley 1. 之前用的是volley,其中一部分功能,比如User-Agent,是系统去处理的,改成okhttp库后,这部分功能需要浏览器自己处理 2. 具体区别可以参考: h ...

  5. vue 通知 走马灯效果

    封装一个子组件: <template> <div class="container"> <div class="wrap"> ...

  6. 我的代码-flask

    import pickleimport flaskimport pandas as pdimport jsonfrom flask import Flaskfrom flask import requ ...

  7. FragmentXlistview

    package com.example.lenovo.tablayout; /** * Created by lenovo on 2018/7/18. */ import android.os.Asy ...

  8. HTML相关内容

    一,HTML标签的分类 1,单标签和双标签 2,内联标签:span,b,u,i,a,img   块级标签:h1~h6,p,div,hr,ul,ol,li 二,常用标签 1,head内常用标签 标签 含 ...

  9. 关于我与小组成员逐步升级C代码时的一些感想【第二次作业】

    #include<stdio.h> #include<stdlib.h> #include <time.h> int main(){ srand(time(NULL ...

  10. wps excel

    ET.Application etApp;ET.workbook etbook;ET.Worksheet etsheet ;ET.Range etrange;//获取工作表表格etApp = new  ...