异步FIFO最⼩深度计算⽅法及原理分析
计算 FIFO 深度是设计 FIFO 中常遇到的问题。常识告诉我们,当读速率慢于写速率时(瞬时速率),FIFO 便可被⽤作系统中的缓冲元件或队列。FIFO 的⼤⼩取决于读写数据的速率,系统的数据速率取决于系统的负载能⼒,因此为了保证系统性能,我们需要考虑 FIFO 传输的最坏情况。所谓最坏的情况就是使得写速率最⼤,读速率最⼩的时候考虑突发传输;
异步 FIFO 最⼩深度计算原理
IFO ⽤于缓冲块数据流,⼀般⽤在写快读慢突发传输的情况,遵循的规则如下:
即是确保对FIFO写数据时不存在 Overflow 。
例1:
A/D 采样率50MHz,DSP 读 A/D 的速率40MHz,要不丢失地将10万个采样数据送⼊ DSP,在 A/D 在和 DSP 之间⾄少设置多⼤容量的FIFO才⾏?
100,000/50MHz=1/500s=2ms100,000/50MHz=1/500s=2ms
(50MHz−40MHz)∗1/500=20k(50MHz−40MHz)∗1/500=20k,即是 FIFO 深度;
异步 FIFO 最⼩深度常⽤计算公式
这⾥假设读写 FIFO 是可以同时进⾏的,
特种车牌
写时钟频率 w_clk,
读时钟频率 r_clk,
写时钟周期⾥,每 B 个时钟周期会有 A 个数据写⼊ FIFO,大众途昂2022款价格与图片
读时钟周期⾥,每 Y 个时钟周期会有 X 个数据读出 FIFO,
则 FIFO 的最⼩深度的计算公式如下:
此公式可从上⾯原理推导⽽来;其中写⼊速率为w_clk,读出速率为(X/Y)*r_clk;
旅行车推荐例2:
如果100个写时钟周期可以写⼊80个数据,10个读时钟可以读出8个数据。令w_clk=r_clk ,考虑背靠背 (20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk) ,代⼊公式可计算 FIFO 的深度,
fifo_depth = 160-160*80% = 160 - 128 = 32
如果令w_clk=200MHz,改为100个w_clk⾥写⼊40个,r_clk=100MHz,10个r_clk⾥读出8个,那么 FIFO 深度为48。计算如下, fifo_depth = 80 - 80 * 80% * (100/200) = 80 - 32 = 48
江淮和悦rs怎么样注:
两者相除⾃然就是这段时间读出的数据量。显然burst_length表⽰这段时间写⼊的数据量,两者的差为 FIFO 中残留的数据,这个也就是理论上的 FIFO 的最⼩深度;
奥迪s8多少钱读写 FIFO 不是同时进⾏的情况下
假如读写 FIFO 不是同时进⾏的,FIFO 深度就是写数据最⼤突发个数;
异步 FIFO 最⼩深度计算实例
例3:
如两个异步时钟域数据接⼝,假如读写是同时进⾏的,⼀般设置 FIFO 的深度就要对应两个时钟以及对应写最⼤的突发数据。假设写时钟频率是40MHz,读时钟为25MHz,在写端最⼤突发写数据个数为100个数据。对应深度计算:100(1-25/40)=37.5,对应深度设置⾄少为38;
假如读写不是同时的,这就需要设置深度为写数据最⼤突发个数,如上例中,对应最⼤突发个数为100个,则深度设置为100;
例4:
赛威sls⼀个8bit宽的异步 FIFO,输⼊时钟为100MHz,输出时钟为95MHz,设⼀个 frame 为4Kbit,且两个 frame 之间的发送间距⾜够⼤。求FIFO的最⼩深度?
burst_length = 4K/8 = 4*1024/8 = 4096/8 = 512。
因为X和Y的值没有给出,所以默认为1。
fifo_depth = 512 - 512*(95/100) = 25.6 ,所以fifo_depth最⼩取值是26;
系统设计的问题——流量平衡
为了保证输⼊数据(负载)全部通过,输出吞吐量要⼤于输⼊吞吐量;但也不要太⼤,以免设计过剩。
所以有,
(r_clk∗X/Y)=(w_clk∗A/B)
(r_clk∗X/Y)=(w_clk∗A/B)
等式左边是系统设计吞吐量,右边是负载流量。
例5:
两个异步时钟域数据接⼝,写时钟频率是19MHz,读时钟为20MHz,读写是同时进⾏的,输⼊数据不间断。求FIFO的最⼩深度?
显然有,
( r_clk * X/Y ) > ( w_clk * A/B )
故理论上FIFO的最⼩深度是1;