首页 > 学院 > 开发设计 > 正文

异步 FIFO 最小深度计算方法及原理分析(转补)

2019-11-14 12:38:00
字体:
来源:转载
供稿:网友

异步 FIFO 最小深度计算方法及原理分析(转补)

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


目录

异步 FIFO 最小深度计算原理异步 FIFO 最小深度常用计算公式读写 FIFO 不是同时进行的情况下异步 FIFO 最小深度计算实例系统设计的问题流量平衡参考文档


异步 FIFO 最小深度计算原理

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

FIFO深度(写入速率−读出速率)=FIFO被填满时间>数据包传送时间=写入最大突发数据量写入速率

即是确保对FIFO写数据时不存在 Overflow 。

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


异步 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) 此公式可从上面原理推导而来。

例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

注: 将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 最小深度计算实例

例3: 如两个异步时钟域数据接口,假如读写是同时进行的,一般设置 FIFO 的深度就要对应两个时钟以及对应写最大的突发数据。假设写时钟频率是40MHz,读时钟为25MHz,在写端最大突发写数据个数为100个数据。对应深度计算:100(1-25/40)=37.5,对应深度设置至少为38。

假如读写不是同时的,这就需要设置深度为写数据最大突发个数,如上例中,对应最大突发个数为100个,则深度设置为100。

例4: 一个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) 等式左边是系统设计吞吐量,右边是负载流量。

例5: 两个异步时钟域数据接口,写时钟频率是19MHz,读时钟为20MHz,读写是同时进行的,输入数据不间断。求FIFO的最小深度? 显然有, ( r_clk * X/Y ) > ( w_clk * A/B ) 故理论上FIFO的最小深度是1。

声明:本博文转自下面链接,并做了少许修改和补充。属于个人学习笔记,欢迎讨论!


参考文档

[1] http://blog.csdn.net/u011412586/article/details/10241585/


上一篇:建最小堆min_heap_sort

下一篇:大数乘法

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表