• 异步FIFO最小深度计算


    计算FIFO深度是设计FIFO中常遇到的问题。常识告诉我们,当读速率慢于写速率时,FIFO便可被用作系统中的缓冲元件或队列。因此FIFO的大小基本上暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率取决于系统的负载能力。因此为了保证FIFO的大小,我们需要考虑FIFO传输的最坏情况下。所谓最坏的情况就是使得写速率最大,读速率最小;通常是考虑突发传输。

    一、异步FIFO最小深度计算原理

          如果数据流连续不断则FIFO深度无论多少,只要读写时钟不同源同频则都会丢数;
    FIFO用于缓冲块数据流,一般用在写快读慢时,遵循的规则如下:


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

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

         例:A/D采样率50MHz,dsp读A/D读的速率40MHz,要不丢失地将10万个采样数据送入DSP,在A/D在和DSP之间至少加多大容量(深度)的FIFO才行?
    100,000 / 50MHz = 1/500 s = 2ms
    (50MHz - 40MHz) * 1/500 = 20k既是FIFO深度。

    一种错误的算法(我也犯了同样的错误):
    100,000 / 40MHZ= 1/400s = 2.50ms
    (50M - 400M)*1/400 =25K.那么这样进去的数据就不是100K了,而是100K+50M*(0.0025-0.002)=125,000bit,错误在时间的计算。

    二、异步FIFO最小深度常用计算公式(假如读写FIFO是同时进行的)

    写时钟频率w_clk,
    读时钟频率 r_clk,
    写时钟周期里,每B个时钟周期会有A个数据写入FIFO
    读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
    则,FIFO的最小深度是?

    计算公式如下:

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

    此公式可有原理推导而来。

    例举说明:

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

         如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48
    计算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48

    注:将 fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk) 作个变形,得到 fifo_depth = burst_length -[(burst_length *(1/w_clk))]/[(Y*(1/r_clk))/X] 其中[(burst_length *(1/w_clk))] 表示这个burst的持续时间,[(Y*(1/r_clk))/X] 表示读出每个数据所需的时间(即:读的实际速度)。两者相除自然就是这段时间读出的数据量。显然burst_length表示这 段时间写入的数据量,两者的差为fifo中残留的数据,这个也就是理论上的fifo的最小深度。实际应用中往往是以半空半满信号来指示fifo的空满状态的,所以实际设计fifo的时候会至少留下一个数据空间的深度裕量。

    三、读写FIFO不是同时进行的情况下,异步FIFO最小深度计算

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

    四、异步FIFO最小深度计算实例(1)

    对于设置一个fifo深度,这个需要参考具体应用情况。


    1、SDRAM应用

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


    2、两异步时钟数据接口

          如:两个异步时钟域数据接口,假如读写是同时进行的,一般这时设置FIFO情况就是写时钟大于读时钟。这个时候设置FIFO的深度就要对应两个时钟以及对应写最大的突发数据。假设写时钟频率是40MHz,读时钟为25Mhz,在写端最大突发写数据个数为100个数据。对应设置深度计算:100(1-25/40)=37.5,对应深度设置至少为38。(用第二点所述公式计算)
          假如读写不是同时的,这就需要设置深度为写数据最大突发个数,如上例中,对应最大突发个数为100个,则深度设置为100。

    五、异步FIFO最小深度计算实例(2)

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

    公式:fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk)

    burst_length = 4Kbit/8bit ,有两种结果,其一,根据存储厂商的惯用算法,4Kbit=4000bit,burst_length=500;其二,用一般二进制算法,4Kbit=4*1024=4096bit,burst_length=512。

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

    可得:其一,fifo_depth = 500 - 500*(95/100)= 25 ,所以fifo_depth最小取值是25 。

            其二,fifo_depth = 512 - 512*(95/100)= 25.6 ,所以fifo_depth最小取值是26 。

    声明:此处转载他处

    参考:

    [1] http://blog.sina.com.cn/s/blog_6a89f7010100mnua.html

    [2] http://www.cnblogs.com/zhangzhi/archive/2009/11/04/1595808.html

    [3]  http://www.cnblogs.com/yuphone/archive/2011/06/21/2085840.html

    [4]  http://www.asic-world.com/tidbits/fifo_depth.html

    [5]  http://m282094986.blog.163.com/blog/static/38324693201301051444715/

    [6]  http://bbs.eetop.cn/thread-383962-1-1.html

     
  • 相关阅读:
    如何写一个bat文件,让他去执行某一个地方的bat文件
    服务器加电自动开机模式设置
    第三章 线程状态
    第二章 线程安全
    第一章 线程
    多线程入门
    异常
    SSO系统介绍
    解决:Nginx访问静态页面出现中文乱码
    错误处理:java.lang.NoClassDefFoundError: javax/jms/JMSContext
  • 原文地址:https://www.cnblogs.com/chip/p/5080341.html
Copyright © 2020-2023  润新知