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

最新文章

  1. Linux字符界面安装VMware tools
  2. 伸缩盒子模型,旧的伸缩盒子模型。浏览器内核、css继承属性
  3. jQuery学习总结
  4. 坑的可以呀re
  5. fastJson java后台转换json格式数据
  6. POJ 1251 Jungle Roads (prim)
  7. leetcode 102 Binary Tree Level Order Traversal ----- java
  8. MongoDB的启动
  9. SQL技术内幕一
  10. Java学习感受
  11. 用Java发送邮件
  12. 解决:Could not find debuginfo pkg for dependency package glibc-2.12-1.132.el6_5.3.i686
  13. 关于MyEclipse启动报错:Error starting static Resources;下面伴随Failed to start component [StandardServer[8005]]; A child container failed during start.的错误提示解决办法.
  14. Android 资源文件命名与使用
  15. .net(C#)在Access数据库中执行sql脚本
  16. 设计模式 | 策略模式(strategy)
  17. 20165323 实验三 敏捷开发与XP实践
  18. java 三种循环及注意事项
  19. topcoder srm 540 div1
  20. ARM、X86/Atom、MIPS、PowerPC

热门文章

  1. c++中的两种getline用法
  2. ps 处理gif
  3. 网上流行护眼色的RGB值
  4. ckeditor_配置 修改工具栏段落的标签和在文中的格式
  5. ODI Scenario 场景
  6. 利用iftop找出是谁占用了带宽
  7. 构建之法 chapter1 心得
  8. 20164318 毛瀚逸 Exp1 PC平台逆向破解
  9. 窗函数法设计FIR滤波器参数特征表
  10. css颜色的设置