zoukankan      html  css  js  c++  java
  • 异步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

     
  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/chip/p/5080341.html
Copyright © 2011-2022 走看看