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

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

3天内不再提示

FIFO的阈值如何设置

FPGA之家 来源:FPGA自习室 作者:FPGA自习室 2022-08-19 09:02 次阅读

什么是FIFO?

FIFO是First in First out 的缩写,一般是由寄存器reg或者ram搭起来的,相对于普通存储器而言,FIFO没有地址可操作的地址总线,因而使用比较方便,但是数据只能像水流一样排队进排队出。

什么情况下使用FIFO?

FIFO一般发生在不同时钟域下数据的交互或者同一时钟域下写快读慢的情况下,就像“蓄水池“一样,让下游来不及处理的数据暂存起来,不会因此而发生数据丢失。当然写时钟数据不能一直是持续的写入,否则再大的fifo迟早也会溢出。写时钟侧数据应是突发写入,在某一段时间内写数据是大于读数据的,此时FIFO的深度要保证这段时间内数据不会溢出。从长时间轴来看写口和读口流量必定是均衡的。从带宽角度来看写带宽是大于读带宽的,FIFO的作用就是完成大带宽到小带宽的转变。

什么是FIFO的阈值?

FIFO的接口信号一般会有将满prog_full和prog_empty信号,对应afull_cnt将满阈值和aempty_cnt 将空阈值;当FIFO的数据data_count大于afull_cnt 时,将满afull 将会拉高,由于路径上有一定延时(Nxclk)因此必须要提前通知上游模块,不要再给下游模块发数据了,否则FIFO会溢出,不会使用full满信号作为通知上游的反压信号。Prog_empty 信号一般不会使用,使用empty,FIFO非空即读。

0c677e50-1f55-11ed-ba43-dac502259ad0.jpg

FIFO的阈值如何设置?

1.当FIFO的数据等于afull_cnt时,afull 开始拉高,反压 路径延时M拍到达上游模块Module A,此时FIFO中的数 据拍数为afull_cnt + M

2.上游模块ModuleA 收到afull信号后开始响应,但是还 会给下游发送路径流水数据N拍

此时FIFO中的数据为afull_cnt +M +N

3.为了数据不会溢出,Fifo_depth >= afull_cnt +M +N ;得到afull_cnt <=Fifo_depth –(M+N)

0c972628-1f55-11ed-ba43-dac502259ad0.jpg

FIFO的深度如何计算?

上述而得到的afull_cnt 最大值,没有得到下限值。在没有考虑反压期间下游Module B 需要读出的数据,为了保证FIFO不会被读空。

这里考虑FIFO是异步(wclk快于rclk)的场景,(M+N)是写时钟wclk域下的时钟周期拍数,而在读时钟rclk域下时钟周期拍数(rclk/wclk)*(M+N);反压期间FIFO需要至少要存有M+N拍数据以防被下游模块读空,导致数据断流(极限情况下rclk=wclk) ;

FIFO的深度一方面要要能缓存当起反压afull后上游的数据流水;另一方面也要使得当反压撤销后不会被下游读空,Afull_cnt应不小于(M+N)。从而得到fifo_depth >=(M+N)+ (M+N) =2*(M+N)。

由于异步FIFO通过比较读写指针进行满空判断,但是读写指针属于不同的时钟域,所以在比较之前需要先将读写指针进行同步处理,这样在设计的时候读写指针用了至少两级寄存器同步,同步会消耗至少两个时钟周期,势必会使得判断空或满有所延迟。满判断时并不是真的满,有2个地址不会进行读写,因此在理论计算的fifo的深度上要多加2。通常FIFO深度会留有20%左右的裕量;而且对与异步FIFO而言FIFO的深度只能是2^n

如下图所示,如果afull_cnt设的过小假设为5 M+N=15 fifo将会被读空。导致数据断流T->T+15 是起反压期间,写多少,读走多少,data_count 不会变化维持在afull_cnt 上,当撤销反压之后(T+15->T+30) 这段时间不会有数据写入,因此必须使得afull_cnt 大于M+N.

此例,对于异步FIFO而言,fifo深度理论计算至少等于2*15+2 =32 正好是2^n,为了设计的可靠性,一般会预留一定裕量,异步FIFO的深度将会扩大一倍,depth=64;15<=Afull_cnt <64-15=49;这个区间内都是合理的。

0cccaeba-1f55-11ed-ba43-dac502259ad0.jpg

FIFO的深度计算公式

1.如果从带宽的角度分析FIFO的深度,则FIFO的深度和写口和读口最大带宽差有关。

带宽计算公式:bw=freq*data_width

一般考虑的场景:空闲----bust-----空闲----bust

深度计算公式:T(bust)*bw(read)+fifo_depth >=T(bust)*bw(write)

且保证空闲时间内slave把FIFO读空:T(空间)*bw(read) >=fifo_dpeth

极端的场景:空闲---bust---bust----空--- (背靠背场景)

深度计算公式:T(bust)*bw(read)+fifo_depth >=2*T(bust)*bw(write)

且保证空闲时间内slave把FIFO读空:T(空闲时间)*bw(read) >=fifo_dpeth

2.FIFO用于缓冲块数据流,一般用在写快读慢时,遵循的规则如下:

{FIFO深度 /(写入速率 - 读出速率)} = {FIFO被填满时间} > {数据包传送时间}= {写入数据量 / 写入速率}

即:保对FIFO写数据时不存在overflow,从FIFO读出数据时不存在underflow

计算公式如下:

fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk

写时钟频率w_clk,

读时钟频率 r_clk,

写时钟周期里,每B个时钟周期会有A个数据写入FIFO

读时钟周期里,每Y个时钟周期会有X个数据读出FIFO

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5041

    浏览量

    117765
  • 数据
    +关注

    关注

    8

    文章

    6514

    浏览量

    87614
  • fifo
    +关注

    关注

    3

    文章

    369

    浏览量

    43078

原文标题:FIFO阈值设置及深度计算原理

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ADXL372读取FIFO中的数据,获得的数据比设置的活动阈值位0.5g大很多是为什么?

    设置活动阈值位0.5g,通过晃动加速度传感器,读取FIFO中的数据获得的数据比0.5g大很多,不符合预期的结果
    发表于 12-27 06:32

    请教一个FIFO应用问题

    我准备用24位的A/D采集地震信号(加速度芯片采集的加速度值),信号先存入FIFO中,对信号设置一个阈值,当数值超过阈值时报警,并记录报警前30秒地震数据,报警后10秒(30秒也行)的
    发表于 10-20 16:37

    求助专家关于DM642的VP口FIFO阈值和EDMA设置问题

    DM642的VP口的FIFO最大阈值为2560byte(每个通道); 如果所采集的图像数据,每行的像素超过了2560个字节,例如每行有5120个字节。该如何设置
    发表于 05-31 05:33

    使用INT1_THS的LIS2DH12 FIFO如何将阈值设置链接到FIFO数据

    我希望按照INT1_THS中设置阈值过滤输入的FIFO数据,但无论幅度如何都设置WTM标志。这两个功能不兼容吗?如果没有,我需要知道如何将阈值
    发表于 09-14 09:59

    LSM9DS1 FIFO适用于陀螺仪和acc吗?

    我来自使用LSM9DS0。我对9DS1中陀螺仪和acc的工作原理有点困惑。似乎FIFO控制寄存器只允许我设置1个水印/阈值。这是否意味着它适用于陀螺仪和acc? 9DS0允许我为每个传感器设置
    发表于 10-10 16:04

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

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

    FIFO阈值设置及深度计算原理

    发表于 06-08 15:36

    vivado的fifo生成步骤介绍

    ifo深度D、设置输出数据位宽、读fifo深度会自动生成E、选择异步复位F、勾选复位管脚G、选择高电平复位或低电平复位4、设置满、空标志位选择信号可编程满、空阈值、可以自主
    发表于 01-08 17:20

    算法为什么无法读取FIFO LIS3DH?

    在我的项目中,我使用了 LIS3DH 芯片。大部分时间处理器处于休眠状态。处理器按时唤醒并超过冲击阈值。在冲击阈值唤醒的情况下,我需要从唤醒信号之前的 FIFO 缓冲区(32 次测量)中读取数据
    发表于 12-07 06:34

    在LSM6DSL中未接收到FIFO阈值中断的原因?

    在我的应用中,我需要 LSM6DSL 在达到配置的 FIFO 阈值时生成中断。我将 FIFO 用于加速度计和陀螺仪。我的配置如下,FIFO_CTRL5 = 0x09 // ODR 12
    发表于 01-13 09:02

    如何设置状态机中断的阈值

    你好 ,我需要知道如何设置状态机中断的阈值,你能举个例子解释一下吗?精确地意味着在寄存器中设置唤醒状态机的值
    发表于 02-03 07:50

    基于新阈值函数的小波阈值去噪算法

    本文主要介绍了一种基于新阈值函数的小波阈值去噪算法。在小波阈值去噪法中的两个重要的因素—阈值选取方式和阈值函数,直接决定图像去噪的效果,所以
    发表于 01-10 10:12 9212次阅读
    基于新<b class='flag-5'>阈值</b>函数的小波<b class='flag-5'>阈值</b>去噪算法

    AXI STREAM FIFO如何设置双时钟

    IP核的全称是: AXI4-STREAM FIFO 设置注意事项:一定要选择异步时钟,也就是双时钟,如下: 关于其他配置: TLAST 一般要选择的,作为边界界定。其他可以不选。深度不必太深,因为只起到穿越时钟区域的作用。
    发表于 03-26 14:40 4973次阅读
    AXI STREAM <b class='flag-5'>FIFO</b>如何<b class='flag-5'>设置</b>双时钟

    FIFO设计—异步FIFO

    异步FIFO主要由五部分组成:写控制端、读控制端、FIFO Memory和两个时钟同步端
    发表于 05-26 16:17 1050次阅读
    <b class='flag-5'>FIFO</b>设计—异步<b class='flag-5'>FIFO</b>

    请问异步FIFO的溢出操作时怎么样判断的?

    和空槽位。 当异步FIFO溢出时,通常是指FIFO写满了数据,但是接下来还有新的数据要写入,此时就需要进行溢出操作了。判断异步FIFO的溢出操作一般有三种方式: 1. 基于阈值的判断方
    的头像 发表于 10-18 15:28 379次阅读