异步fifo的深度,如何确定?_二叉树的最小深度和最大深度

异步fifo的深度,如何确定?_二叉树的最小深度和最大深度目录1.异步FIFO最小深度计算1.1异步FIFO最小深度计算原理1.2异步FIFO最小深度常用计算公式1.2.1假如读写FIFO是同时进行的1.2.2读写FIFO不是同时进行的情况2.异步FIFO最小深度计算实例2.1用于SDRAM中的读写FIFO2.2异步时钟数据接口3.FIFO实例1.异步FIFO最小深度计算计算FIF…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

1.  异步FIFO最小深度计算

1.1 异步FIFO最小深度计算原理

1.2 异步FIFO最小深度常用计算公式

1. 2.1假如读写FIFO是同时进行的

1.2.2 读写FIFO不是同时进行的情况

2. 异步FIFO最小深度计算实例

2.1 用于SDRAM中的读写FIFO

2.2异步时钟数据接口

3.FIFO实例


1.  异步FIFO最小深度计算

     计算FIFO深度是FIFO设计中常遇到的问题。当异步FIFO读写端口的throught-put(吞吐量)不同时,会遇到数据丢失的问题,这时就需要考虑FIFO的Deepth问题了,即为满足读写流畅不卡顿(数据不丢失)时,FIFO的Deepth的最小值。

    计算异步FIFO的最小深度,首先必定是要了解清除应用场景的,这关乎到FIFO的最小深度的计算。FIFO主要是用于数据的缓存,用在读慢写快的场景下。异步FIFO读写不同频,我们选用的FIFO要能够在极端的情况下仍然能够保证数据的不溢出。因此,考虑的前提一般都是读慢写快的情景(写时钟大于读时钟),但需要注意的是,这里的写操作是猝发传输,而不能使连续操作。倘若写快读慢的场景下,写数据流是连续的,那再大的FIFO都会有写满的时候,因此无法避免数据的溢出(下面有一个蓄水的例子)。

     当写快读慢时,FIFO便可被用作系统中元件或队列。因此FIFO的大小其实也就暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率 取决于 系统的负载能力 。因此为了保证FIFO的大小,需要考虑FIFO传输的最坏情况。

        所谓最坏情况,就是使得写速率最大,读速率最小;通常是考虑猝发传输。

宏观看,整个时间域上,”写数据=读数据”,这个是异步FIFO正常工作最基本的要求,是大前提。由于写快读慢,在发送方”突发传输“的发送数据的T内,是很有可能发送方写数据量>接收方读取的数据量,那么剩下未读取的数据必定需要存储共接收方继续读取并不能丢弃,因此FIFO的深度要能够保证,在这段时间T内,如果接收方未能将发送方发送的数据接收完毕的话,剩下的数据都是可以存储在FIFO内部而且不会溢出的,那么在发送方停止发送数据的”空闲时隙”内,接收方可以从容地接收剩下来的数据。

 

1.1 异步FIFO最小深度计算原理

速率的概念 

       想象一个场景,有一个水龙头在不断向下流水,水龙头下放着一口缸在接水,而缸上有一个出水口也在源源不断的出水。假如,水龙头的单位时间进水量大于出水口的出水量,那么缸内就会开始不断的积水。如果水龙头按照这样持续不断的进水,那积水必将越来越多,结果就是无论缸多大,早晚都会盛满溢出的。因此这种供水需要   间歇性   的地往缸里注水(数据的猝发传输)。

全速读写,引起的溢出问题:

异步fifo的深度,如何确定?_二叉树的最小深度和最大深度

    同样的道理,如果数据流是在连续不断写,则FIFO无论多大,只要是读写时钟不同源同频就都会丢数(类比可能不太恰当,水缸空了,读空;水缸满了,写数据会覆盖。这涉及到一个数据的最大连续写长度(一个cycle写一个数据)以保证数据的正确传输即FIFO能够完整传输数据。

     那到底如何利用异步FIFO呢?一般数据的传输会以一定格式的数据包,且以一定频率进行传输,而不是永久的连续传输下去。这样的话,就算是写快,读慢,只要保证在写满FIFO之前能把一个数据包发送完毕。

很多场景比较简单,没有考虑性能和资源的问题,只要Deepth合理就行,比如有时候常取Deepth_value=   WR_Burst_len*(Wr_clk/Rd_clk),会选取大于Deepth_vlaue最接近的2^N数值,或是直接对Wr_clk/Rclk向上取整。

    FIFO常用于缓冲块数据,一般用在写快读慢的情况下,遵循如下规则:

                           {FIFO深度/(写速率读出速率)}>     {
写入数据量/写入速率}

   本质上就是:

                               FIFO被填满的时间   > 数据包传送时间(猝发发送的时间)

       如此就能确保对FIFO写数据时,不存在overflow ,从FIFO读数据时,不存在underflow。

: A/D采样速率50Mhz,dsp读A/D的速率40Mhz,要不丢失地将将10万个采样数据送入DSP ,在A/D和DSP之间至少加多大容量的(深度)FIFO才行??(来源网络)

异步fifo的深度,如何确定?_二叉树的最小深度和最大深度

: Deepth/(50000000-40000000)>(100000/50000000)

即Deepth>10_0000/5=20000。那么最小深度为20k。

一种错误的算法为:

10,0000/4000000 = 1/400s =2.50ms数据包传输时间;Deepth =(50M-40M)*2.5ms=25k,这样算的话,进去的数据就不是100k了,而是100k+50M*(0.0025-0.0002)=125,000个。

 


introduction  
        One of the most common questions in interviews is how to calculate the depth of a FIFO. Fifo is used as buffering element or queueing element in the system, which is by common sense is required only when you slow at reading than the write operation.

        So size of the FIFO basically implies the amount of data required to buffer, which depends upon data rate at which data is written and the data rate at which data is read(FIFO的深度暗示了需要缓冲的数据量,缓冲的数据量取决于写速率和读速率).

        Statistically, Data rate varies in the system majorily depending upon the load in the system. So to obtain safer FIFO size we need to consider the worst case scenario for the data transfer across the FIFO under consideration.(统计表明,系统中数据率的变化主要依赖于系统的负载。所以,为了得到安全的FIFO 深度,在设计时,我们需要考虑跨FIFO的数据传输的最坏情况)。

         For worst case scenario, Difference between the data rate between write and read should be maximum. Hence, for write operation maximum data rate should be considered and for read operation minimum data rate should be considered. So in the question itself, data rate of read operation is specified by the number of idle cycles and for write operation, maximum data rate should be considered with no idle cycle.
         So for write operation, we need to know Data rate = Number of data * rate of clock. Writing side is the source and reading side becomes sink, data rate of reading side depends upon the writing side data rate and its own reading rate which is Frd/Idle_cycle_rd.

In order to know the data rate of write operation, we need to know Number of data in a Burst which we have assumed to be B.

So following up with the equation as explained below: Fifo size = Size to be buffered = B – B * Frd / (Fwr* Idle_cycle _rd ).

即FIFO_DEPTH = Burst_length – Burst_length*rd_clk/(wr_clk*Idle_cycle_rd)。

Here we have not considered the sychnronizing latency(同步处理有延迟) if Write and Read clocks are Asynchronous. Greater the Synchronizing latency, higher the FIFO size requirement to buffer more additional data written.

 

1.2 异步FIFO最小深度常用计算公式推导

1. 2.1假如读写FIFO是同时进行的

构造一模型:

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

读时钟:r_clk;且读时钟周期里,每Y个时钟周期里会有X个数据读出FIFO。

读写的Busrt_len: 相同,都为Burst_len。

那么FIFO要求的最小深度为?

答:首先,这一题目并不一定是有解的,有解的前提是要求一定时间内(T),写入的数据量要等于读出的数据量,即A/B*wr_clk =X/Y*r_clk。

然后,要算出写数据的最大猝发长度burst_length,考虑最坏的情况。比如若题目给出的是每100个时钟有80个数据写入FIFO,那么在背靠背的情况下,burst_length=2*80=160。假如题目中明显给出了数据包的传输方式,比如一个package与另一个package相隔很远,也就是互不影响,不会出现这种背靠背的情况。

最后FIFO的最小深度:fifo_depth =Burst_length – Burst_len * X/Y * r_clk/w_clk

BTW:通常,为了安全起见,都会多留一些depth的余度。

FIFO最小深度计算公式推导过程:

核心指导就是上面提到的条件:FIFO深度/(写速率读出速率)}>     {
写入数据量/写入速率}

并且为满足在恶劣条件下工作,需要考虑写最快,读最慢时的情况:

            fifo_depth/[wda_width*(wr_clk-rd_clk*X/Y)] > Burst_len / wr_clk*rda_width

 一般情况下读写数据位宽一致,则有:

            fifo_depth/(wr_clk-rd_clk*X/Y) > Burst_len / wr_clk

整理得: fifo_depth > Burst_len / wr_clk(wr_clk-rd_clk*X/Y)

           即  fifo_depth > Burst_len -Burst_len* (rd_clk/ wr_clk)*X/Y

 

:如果100 个写时钟周期可以写入80个数据,10个时钟周期可以读出8个数据。令wclk =rclk ,考虑背靠背(20个clk发数据+80clk发数据+80clk发数据+20clk不发数据的共200个clk)代入公式可计算FIFO深度:

fifo_deepth = 160-160*80%=160*128=32

如果令wclk=200Mhz ,改为100个wclk中写入40个,rclk=100Mhz,10个r_clk中读出8个。那么此时的FIFO最小深度应该为:

fifo_depth = 80-80*

 

1.2.2 读写FIFO不是同时进行的情况

  假如读写FIFO不是同时进行,这就需要设置FIFO深度为写数据最大突发的个数

 

2. 异步FIFO最小深度计算实例

设置FIFO的深度,具体需要要根据应用场景而定。 

2.1 用于SDRAM中的读写FIFO

     在SDRAM应用中,设置一个FIFO的深度,一般为操作数据的两倍就够了。比如SDRAM全页读写256,那对应深度为512。因为SDRAM读写速度肯定快于FIFO写速度,和后面FIFO的读速度,因此SDRAM前后操作总体速率一致。

2.2异步时钟数据接口

     用于异步时钟域数据接口,假如读写同时进行的,一般情况设置 的FIFO就是写时钟大于读时钟。这个时候设置FIFO的深度就要对应两个时钟以及对应写最大的突发数据。

假设写时钟频率为40Mhz,读时钟为25Mhz,且在写端最大的突发写数据个数为100个数据。那么深度计算为:100-100*(2 /40)=37.5则对应深度至少为38。

3.FIFO实例

例:一个8bit宽的AFIFO,输入时钟为100Mhz,输出时钟为95Mhz,设一个package为4Kbit,且两个package之间的发送间距足够大。求AFIFO的深度。

答:足够大说明相邻的两次传输不会相互影响,只需要考虑一个package;

猝发长度计算:若burst_length =4000/8=500,厂商惯用算法为1Kbit=1024bit ,故burst_length = 4*1024/8=512;

计算模块 fifo_depth   =  burst_length – burst_length*(X/Y)*(r_clk/w_clk)

因为X和Y的值没有给出,所有默认为1。

可得depth1 =4000/8-(4000/8)*(95/100)=25。或depth =512-512*(95/100) =25.6,所以fifo_depth最小值为26

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170184.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java 可达性分析算法_js并发请求

    java 可达性分析算法_js并发请求作者:Grey原文地址:OkHttpClient调优案例实际案例系统运行一段时间后,线程数量飙升,持续居高不下排查工具https://fastthread.io/这个工具是在线的,可以将日志文件上传上去后直接生成分析报告,并且可以导出为PDF以下是我导出的分析结果值得关注的指标:和占了前两位,由于很多同事开发的时候,没有定义有意义的线程名称,所以这2031个线程不好排查,我们就从这里的线程数入手,很显然,这里是的使用问题,所以,我们排查了一下系统中所有使用的地方,发现所有的用法都是这样用的:因为我们

  • msfconsole是什么意思_msfconsole渗透手机

    msfconsole是什么意思_msfconsole渗透手机先模拟多层内网,摸清后渗透的使用,再从学校入手。内网渗透test网络拓扑以kali为攻击机,xp作为跳板主机,win7是内网主机xp主机是提供web,FTP等服务,已被kali机获取shellwin7正常不与外网访问,和DMZ区域处于同一网段环境搭建使用VMware的主机模式,构建虚拟局域网。查看Host-only模式详解虚拟网络编译器中添加两块网卡vm1,vm2。类型:主…

  • java 有哪些关键字_JAVA的常用关键字有哪些?「建议收藏」

    java 有哪些关键字_JAVA的常用关键字有哪些?「建议收藏」JAVA的常用关键字有哪些?发布时间:2020-05-2521:46:00来源:亿速云阅读:133作者:鸽子下表是java中经常会用到的关键字:一:用于定义访问权限修饰符的关键字:1)public公共的public关键字是可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。可能只会在其他任何类或包中引用public类、方法或字段。2)protected受保护的prot…

  • select poll使用

    select poll使用

    2021年11月14日
  • Linux04:(4.6k)vim编辑器「建议收藏」

    Linux04:(4.6k)vim编辑器「建议收藏」文章目录Linux_day04一.vim编辑器vim的三种模式1.命令模式2.末行模式3.编辑模式实用功能扩展内容==1.vim的配置文件==2.异常退出问题3.别名机制4.退出方式补充一些win10下的快捷键Linux_day04一.vim编辑器vim的三种模式命令模式不能对文件直接编辑,但可以通过快捷键删除行,复制,粘贴,移动光标等编辑模式-输入末行模式可以在末行输入命令:搜索,替换,保存,退出,撤销vim打开文件的方式:1.#vim 文件路径——直接打开文件(光

  • 蓝桥杯单片机矩阵按键扫描编程

    蓝桥杯单片机矩阵按键扫描编程

    2021年11月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号