0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA FIFO深度计算的基本步骤和示例

CHANBAEK 来源:FPGA入门到精通 作者: 未可知摩尔 2023-08-07 15:39 次阅读

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

本文主要介绍FIFO深度计算的方法,FIFO的一个关键参数是其深度,也就是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
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • fifo
    +关注

    关注

    3

    文章

    369

    浏览量

    43069
  • 存储结构
    +关注

    关注

    0

    文章

    21

    浏览量

    9677
收藏 人收藏

    评论

    相关推荐

    FPGA学习-总结fifo设计中深度H的计算

    对于fifo来说,H的设置至关重要。既要保证功能性,不溢出丢数,也要保证性能流水。深度设置过小会影响功能,过大又浪费资源。因此,总结下fifo设计中深度H的
    发表于 08-29 11:19 1140次阅读

    谈一谈FIFO深度

    最近加的群里面有些萌新在进行讨论**FIFO深度**的时候,觉得 **FIFO深度计算比较难以理解** 。所
    的头像 发表于 11-28 16:19 439次阅读
    谈一谈<b class='flag-5'>FIFO</b>的<b class='flag-5'>深度</b>

    FPGA的最大深度

    被用作系统中的缓冲元件或队列。因此FIFO的大小基本上暗示了所需缓存数据的容量,该容量取决于读写数据的速率。FIFO深度计算=B-B*F2/(F1*I), B为突发数据块大小
    发表于 05-28 14:17

    求助,FPGA fifo深度不够怎么办?

    图像压缩之后的数据存入fifo,然后经过nrf2401发送。。但是由于图片尺寸比较大,导致fifo深度不够,受限于FPGA芯片尺寸的限制,fifo
    发表于 05-22 14:34

    如何计算异步FIFO深度和单独的时钟源

    fifo不为空时,用rd clk = 50 MHz连续读出数据。从模拟开始,在5次写入后,fifo空置为空。如何正确计算深度?最初,我的深度
    发表于 04-09 06:25

    如何利用LabVIEW FPGA模块实现FIFO深度设定?

    数据进入FPGA的速率高于传出的速率,持续的传输会造成数据的溢出,断续的传输可能会造成数据不连续。使用基于LabVIEW FPGA的DMA FIFO作为主控计算机和
    发表于 10-12 09:05

    谈谈FIFO阈值的阈值设置及深度计算

    `立即学习—60天FPGA工程师入门就业项目实战特训营(3月16日开班) 谈谈FIFO阈值的阈值设置及深度计算1.什么是FIFO2.什么情况下使用
    发表于 02-19 21:09

    【教程】“最恶劣”的FIFO深度计算

    FIFO内缓存数据最多。计算此时写入数据-该阶段读出数据即为FIFO的最小深度。   Nwr = 120x = Nwr - Nrd = 120 - 96 = 24.二.为保证数据连续输
    发表于 02-22 20:37

    LabVIEW FPGA模块实现FIFO深度设定

    为了解决基于LabVIEWFPGA模块的DMAFIFO深度设定不当带来的数据不连续问题,结合LabVIEWFPGA的编程特点和DMA FIFO的工作原理,提出了一种设定
    发表于 09-26 13:45 6979次阅读
    LabVIEW <b class='flag-5'>FPGA</b>模块实现<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>设定

    基于LabVIEW FPGA模块程序设计特点的FIFO深度设定详解

    为了解决基于LabVIEWFPGA模块的DMAFIFO深度设定不当带来的数据不连续问题,结合LabVIEWFPGA的编程特点和DMA FIFO的工作原理,提出了一种设定
    发表于 01-04 14:25 4308次阅读
    基于LabVIEW <b class='flag-5'>FPGA</b>模块程序设计特点的<b class='flag-5'>FIFO</b><b class='flag-5'>深度</b>设定详解

    铜导线在100℃时的趋肤效应深度计算实用工具免费下载

    铜线 高频趋肤效应深度计算工具
    发表于 03-06 11:47 16次下载

    FIFO最小深度计算所有情况

    数据缓存下来,那么我们需要开多大的空间缓存这些数据呢?缓存开大了会浪费资源,开小了会丢失数据,如何去计算最小FIFO深度是本文的重点。 本文涵盖了FIFO最小
    的头像 发表于 05-11 14:37 1983次阅读
    <b class='flag-5'>FIFO</b>最小<b class='flag-5'>深度计算</b>所有情况

    你们知道FIFO最小深度计算

    FIFO 最小深度计算 例子 - 1:f_wr 》 f_rd,连续读写 写时钟80MHz。 读时钟50MHz。 Burst_Len = 120,也就是要求至少安全写入120个数据。 连续写入和连续
    的头像 发表于 09-10 09:23 1537次阅读
    你们知道<b class='flag-5'>FIFO</b>最小<b class='flag-5'>深度计算</b>吗

    FIFO最小深度计算的方法

    由于平时我们工作中,FIFO都是直接调用IP核,对于FIFO深度选择并没有很在意,而在笔试面试过程中,经常被问及的问题之一就是如何计算FIFO
    的头像 发表于 07-03 17:25 2290次阅读

    FIFO的结构与深度计算介绍

    在IC设计中,模块与模块之间的通信设计中,多时钟的情况已经不可避免;数据在不同时钟域之间的传输很容易引起亚稳态;异步FIFO就是一种简单、快捷的解决方案。
    发表于 06-27 10:02 2383次阅读
    <b class='flag-5'>FIFO</b>的结构与<b class='flag-5'>深度计算</b>介绍