【FPGA IP系列】FIFO深度计算详解

这篇具有很好参考价值的文章主要介绍了【FPGA IP系列】FIFO深度计算详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FIFO(First In First Out)是一种先进先出的存储结构,经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。

FIFO的一个关键参数是其深度,也就是FIFO能够存储的数据条数,深度设计的合理,可以防止数据溢出,也可以节省FPGA资源的消耗。

一、FIFO深度计算影响因素

影响FIFO深度计算的主要因素包括:

  • FIFO的位宽:决定了每个FIFO存储单元的大小

  • FIFO的数据字长:决定每个数据词包含多少比特有效数据

  • FIFO的总存储容量:决定最大可以存储的数据条数

以32位位宽,8位字长的FIFO为例,每个FIFO存储单元需要32/8=4个字节。

如果FIFO总容量为128字节,那么可以存储128/4=32个数据。

此外,FIFO深度还需要考虑:

  • FPGA资源约束条件:过大的FIFO会占用过多资源

  • 实际应用需求:深度过小可能导致数据丢失

  • 存储密度:选择2的整数次幂作为深度可以优化资源利用

综合考虑上述各因素后确定最佳的FIFO深度。

二、FIFO深度计算步骤

FPGA FIFO深度计算的基本步骤如下:

  • 根据传输最恶劣的情况(一段时间内缓存数据量最大的时候),计算剩余数据量(写数据量 - 读数据量)。

  • 根据剩余数据总存储容量/写位宽,计算FIFO最大可存储的数据量

  • 选择大于等于最大数据量的2的幂作为FIFO深度

  • 将FIFO深度转换为二进制表示

如果写比读慢,那就不用担心数据溢出,只有读比写慢的时候,需要考虑fifo深度设计,以防止数据溢出。

三、Verilog代码示例

下面是使用Verilog代码计算FIFO深度的示例:

// FIFO参数  
parameter DATA_WIDTH = 32; // 32位
parameter WORD_SIZE = 8;  // 8位字长 
parameter FIFO_SIZE = 128; // 总容量128字节

// 每个FIFO存储单元的大小
localparam FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;

// FIFO最大可存储数据量
localparam FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;  

// 选择大于FIFO_MAX_WORDS的2的幂  
localparam FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ?  
                       (2**$clog2(FIFO_MAX_WORDS)) : 1;
                       
// FIFO深度比特宽
localparam FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

这个示例中,根据位宽32位、字长8位和容量128字节,计算出FIFO深度为32,需要5比特表示。

四、SystemVerilog代码示例

下面是使用SystemVerilog编写的等价代码:

// FIFO参数
localparam int DATA_WIDTH = 32; 
localparam int WORD_SIZE = 8;
localparam int FIFO_SIZE = 128;

// 每个FIFO存储单元的大小  
localparam int FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;

// FIFO最大可存储数据量
localparam int FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;

// 选择大于FIFO_MAX_WORDS的2的幂 
localparam int FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ? 
                            2**(FIFO_MAX_WORDS.log2) : 1;
                            
// FIFO深度比特宽            
localparam int FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

SystemVerilog通过使用内置的log2函数可以简化代码。

五、FIFO深度计算实例

下面通过一些具体实例进一步说明FIFO深度计算过程。

1、匹配数据带宽

如果FIFO需要匹配指定的数据带宽,那么深度计算要考虑串行化因子的影响。

例如需要200MHz的串行LVDS接口,使用10位数据,那么单位时间内可以传输200MHz * 10位 = 2Gbps的数据。

如果后端接口是32位宽,100MHz,,那么其带宽为100MHz * 32位 = 3.2Gbps。为匹配带宽,前端数据需要缓存,此时FIFO深度计算如下:

后端带宽 = 3.2Gbps  
前端带宽 = 2Gbps
串行化因子 = 后端带宽/前端带宽 = 3.2/2 = 1.6  
FIFO深度 > 串行化因子 = 1.6

因此,选择FIFO深度为2才能匹配带宽需求。

2、防止数据溢出

如果写入FIFO的数据速率可能高于读取速率,那么需要增加FIFO深度来防止数据溢出。

场景1:如写入速率是100MB/s,读取速率是80MB/s,允许最大等待时间为50μs,那么需要的FIFO大小计算如下:

写入速率 = 100MB/s
读取速率 = 80MB/s 
最大等待时间 = 50μs
额外存储量 = 写入速率 × 最大等待时间  
          = 100MB/s × 50μs
          = 5000bit

因此,FIFO深度需要考虑额外存储5000bit的数据量,也就是除了正常存储量外还需要确保至少有5000bit的额外FIFO深度。

场景2:异步FIFO,写时钟100MHZ,读时钟80MHZ。读写位宽均为16bit。已知每100个写周期最多写入960bit数据,读侧每时钟读取一个数据。问:FIFO深度至少为多少?

最恶劣情况:前100个周期的后连续60个周期写入960bit数据,后100个周期的前连续60个周期写入960bit数据。

写数据:最大数量为连续120个写周期内,写入数据量960*2bit = 1920 bit,用时为120/100 ns。

读数据:这段时间内的数据量为 120/100 * 80 * 16bit = 1536 bit 。

最大缓存数据量为 1920 - 1536 = 384 bit

写数据最大缓存深度:384/16 = 24

最大深度需要是2的幂次方,即为32

3、优化资源利用

有时为了优化资源利用,可能需要降低FIFO深度。

例如根据带宽计算,一个18Kb block RAM可以实现depth=512的FIFO,但考虑到资源限制,只能使用一个9Kb RAM,这时可以将FIFO设计为depth=256,节省block RAM资源。

同样,为了优化资源利用,FIFO深度通常设计为2的整数次幂,这可以减少地址解码逻辑所需资源。

六、结论

FIFO深度计算并不复杂,但需要考虑许多实际因素,如带宽匹配、防溢出和资源优化等。一般来说,根据存储需求计算出最大深度,再综合考虑资源和性能约束,选择大于等于该最大深度的2的幂次方作为最终FIFO深度,既能满足存储需求,又可以优化FPGA资源利用。


本文将不断定期更新中,码字不易,点⭐️赞,收⭐️藏一下,不走丢哦

本文由FPGA入门到精通原创,有任何问题,都可以在评论区和我交流哦

您的支持是我持续创作的最大动力!如果本文对您有帮助,请给一个鼓励,谢谢。文章来源地址https://www.toymoban.com/news/detail-735804.html

到了这里,关于【FPGA IP系列】FIFO深度计算详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA原理与结构——FIFO IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门         FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器

    2024年02月11日
    浏览(47)
  • Altera FPGA 储存单元IP核之RAM、FIFO

         只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值。      随机存取储存器,可以随时把数据写入任一指定地址的储存单元,也可以随时从任一指定地址中读取数据。其读写速度是由时钟频率决定的。RAM主要用来存放程

    2023年04月08日
    浏览(45)
  • FPGA原理与结构(12)——FIFO IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门         FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器

    2024年02月08日
    浏览(43)
  • xilinx FPGA FIFO IP核的使用(VHDL&ISE)

    1.新建工程和ip核文件 下图显示了一个典型的写操作。拉高WR_EN,导致在WR_CLK的下一个上升边缘发生写入操作。因为FIFO未满,所以WR_ACK输出1,确认成功的写入操作。当只有一个附加的单词可以写入FIFO时,FIFO会拉高ALMOST_FULL标志。当ALMOST_FULL拉高之后,一个附加的写入将导致

    2024年02月03日
    浏览(54)
  • FPGA IP核配置FIFO中遇到数据不匹配以及输出数据缺失问题的解决与思考

    本人配置了一个 16bit 数据转 8bit 数据的FIFO,因为不涉及异步时钟,所以使用的是单时钟。 一、初级问题 : empty信号一直为高 ,嗯~让我难以下手,毕竟这个问题过于简单化了,这是复位的问题,我的是低电平复位,前期为了方便,我便把复位信号拉低了,然后它一直处于复

    2024年02月03日
    浏览(50)
  • [FPGA IP系列] 2分钟了解FPGA中的BRAM

    FPGA设计中,BRAM是一项非常关键的内置存储资源,FPGA开发需要熟练使用BRAM,今天再复习一下BRAM的知识,包括BRAM的定义、组成、应用等等。 RAM是Random Access Memory,也就是随机访问数据存储器,RAM的内部是一个一个小内存单元(可以看成是一个小格子)组成。 每个内存单元都对应

    2024年02月12日
    浏览(52)
  • [FPGA IP系列] BRAM IP参数配置与使用示例

    FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM,上一篇文章中已经详细介绍了Vivado FIFO IP,今天我们来聊一聊BRAM IP。 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧。 1、打开BRAM IP核 在Vivado的IP Catalog中找到Block Memory Generator IP核,双击打开参数配置界面。 2、配置BRAM I

    2024年02月04日
    浏览(48)
  • FPGA FIFO基本介绍(FIFO Geneerator(13.2))

    软件:vivado 2020.2  参考文献: 文档xilinx官网pg057-fifo-generator文档下载链接官网https://docs.xilinx.com/v/u/en-US/pg057-fifo-generatorhttps://docs.xilinx.com/v/u/en-US/pg057-fifo-generator https://docs.xilinx.com/v/u/en-US/pg057-fifo-generator 原官网免费文档已被上传为付费文档,笔者上传的免费文档未过审核。

    2024年01月25日
    浏览(45)
  • FPGA中FIFO的应用(二)——异步FIFO设计

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.3 🔍来源:自学经历 📖文章内容概述:介绍了 异步FIFO 的基本工作原理和深度计算,通过仿真观察了其读写过程。 连载系列

    2024年02月03日
    浏览(44)
  • FPGA——FIFO

    FIFO FIFO(First In First Out,即先入先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。FIFO 根据读写时钟是否相同,分为 SCFIFO(single-clock FIFO)和 DCFIFO(duabl-clock FIFO),SCFIFO 的读写为同一时钟,应用在同步时钟系统中;DCFIFO 的读写时钟不同,应用在异步时钟系统

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包