使用FIFO积累

FIFO是在FPGA设计中使用的非常频繁,也是影响FPGA设计代码稳定性以及效率等得关键因素。我总结一下我在使用FIFO过程中的一些心得,与大家分享。
         我本人是做有线通信的,所做的设计中大量的使用到FIFO,用于报文的缓存。我经常使用一个FIFO存报文内容,另一个FIFO存报文的长度,两者配合使用。
         在数据连续读取时,为了能不间断的读出数据而又不导致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使用时,使用到Almost_full信号以及读写counter来控制FIFO的读满预警,如果数据不是在空满判断的下一拍写入FIFO,则设计FIFO的满预警时要小心。如果你不确定判断满预警之后要延迟多少拍才能真正写入FIFO,那么尽量让FIFO有足够满预警裕量。例如,在wr_data_count为128才是真的满了,你可以设成wr_data_count为120的时候就给出满预警,可以保证设计的可靠和安全。当然,如果你能准确的算出判断满预警与真正写入FIFO的延迟,可以用精确的满预警阈值。
      当需要使用到数据位宽转换时,如将128位的数据转换成64位的数据,最好不要用XILINX自己生成的位宽转换FIFO。可以例化两个64位的FIFO,自己控制128转64。这样可以大大的节省资源,是XILINX CORE生成的FIFO资源的一半。

(1)FIFO作为跨时钟域使用;

多bit位宽,尽量使用FIFO进行跨时钟域;如果仅仅是打两拍解决的话,会引起vivado布线困难;造成临近逻辑不稳定;

避免过约束引起的时序问题;

(2)FIFO作为数据位宽转换使用;

一般在同一时域下不必用FIFO作为位宽的转换;若跨时钟域可以采用xilinx IP进行生成对应的转换,如果在资源非常紧张的情况下,需要考虑其他的方法,减少FIFO的使用;

FIFO作为转换位宽时,高位优先出(将宽bit转窄bit);先进置于高位(窄bit转宽bit);

(3)FIFO优化时序

优先使用内部的RAM块实现FIFO;若为了布线可以使用分布式资源布线;RAM资源实现FIFO和调整输入输出位宽,分布式Lut资源输出位宽与输入位宽一致;

(4)FIFO的控制

通过图2、图3可以看到,FIFO可以使用full/empty/almost_full/almost_empty进行控制;读写计数值可以作为的状态机的控制值;

(5)FIFO的时序问题

FIFO根据不同的配置,读写时序一般低于450Mhz,当速率过高需要考虑布线问题;

(6)FIFO的资源使用

FIFO的summary中可以看出当前配置下,FIFO需要使用到的BRAM资源、LUT资源等;对于BRAM来说,有BRAM18K和BRAM36K,但实际上一个BRAM36K还是由两个BRAM18K合并实现;

(7)端口的时钟域

参看FIFO官方手册体现了读写端口的时钟域分布。

图1: FIFO实现类型

图2:可配置的full/empty

图3:读写计数

图4:FIFO详细summary

最新文章

  1. psql-10权限和事务
  2. 用python脚本通过excel生成文件夹树结构
  3. bzoj4034: [HAOI2015]T2
  4. sed命令给文本文件的每行的行首或者行尾添加文字
  5. POJ1002 487-3279
  6. caffe 无GPU 环境搭建
  7. Hibernate注解:一对多外键关联
  8. JavaScript之六种排序法
  9. php curl下载图片 URL地址
  10. 微软未公开的 SP
  11. delphi定义自己的消息
  12. Android 如何引用com.android.internal.R目录下的资源
  13. 让Terminal显示git分支
  14. 解决Chrome动画”卡顿”的办法
  15. Discuz添加自定义模板广告
  16. LeetCode第[1]题(Java):Two Sum 标签:Array
  17. javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)
  18. 使用svn无法cleanup和lock问题
  19. 实现迁徙学习-《Tensorflow 实战Google深度学习框架》代码详解
  20. mongodb丢失数据的原因剖析 - 迎风飘来的专栏 - CSDN博客 https://blog.csdn.net/yibing548/article/details/50844310

热门文章

  1. Jedis与Lua脚本结合
  2. centos7: php7.2.9安装配置
  3. delphi 程 序从exe运行改成dll库
  4. 第一章 Lab
  5. New Year and Old Subsequence CodeForces - 750E (dp矩阵优化)
  6. python-flask-script定制manage命令
  7. ubuntu server 启用mysql日志
  8. Alibaba Java Coding Guidelines
  9. C语言实现哈夫曼编码(最小堆,二叉树)
  10. HBase环境搭建、shell操作及Java API编程