异步FIFO深度计算
一、写时钟比读时钟快
1、
数据传送的时间 = FIFO写满时间
FIFO写满时间 = FIFO深度 / (写入速率 - 读出速率)
数据传送时间 = 数据量 / 写入速率
因此
FIFO深度 / (写入速率 - 读出速率) = 数据量 / 写入速率
2、深度 = 写数据量(突发长度) - 读数据量(同样时间里读了多少数据)
我们需要根据写时钟和写数据,得到突发长度,然后算出些数据需要写多久,在写数据的时间里,读时钟读了多少数据。
3、最坏情况(背靠背)
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
XY表示:每Y时钟周期有X数据读出FIFO
二、 写时钟比读时钟慢 1、写时钟比读时钟慢,且读写过程中没有空闲周期
这种情况下永远也不会发生数据丢失的情况;fifo的深度为1即可。
2、写时钟比读时钟慢,且读写过程中有空闲周期
深度 = 写数据量(突发长度) - 读数据量(同样时间里读了多少数据)
同步FIFO深度计算
三、读写时钟一致 1、读写时钟频率一致,但在读写过程中存在空闲周期。
深度 = 写数据量(突发长度) - 读数据量(同样时间里读了多少数据)
看题目
题目1: 现需要通过A写10万数据,并通过读时钟送给B,写时钟50Mhz,读时钟为40mhz,如果要数据不丢失,那么需要在AB之间插入FIFO,那么我们到底需要插入多大深度的FIFO呢?
FIFO深度 / (写入速率 - 读出速率) = 数据量 / 写入速率
解题:
FIFO深度 / ( 50 Mhz- 40Mhz ) = 10万 / 50Mhz ,则10万 / 50MHZ = 1 / 50 s = 0.002s = 2ms . 2 ms = FIFO深度 / ( 50 Mhz- 40Mhz ),则深度 = 2ms / 100ns = 20000 = 20k . 因此FIFO深度为 20 k 。
题目2: 已知:时钟频率:clkA = clkB / 4 ;时钟周期: clk (en_B) = clkA * 100 ;en_B占空比为25%。求FIFO深度。
解:
假设clkA = 100 MHz ,clkB = 400Mhz,则TclkA = 10ns,TclkB = 2.5ns,en_B的周期是clkA的100倍,因此Ten_B = 1000ns 由于enB占空比为25%,因此该信号高电平持续250ns。 . 一般写比读快,因此假设clkA为读时钟,clkB为写时钟,当enB高电平时,写时钟写数据,写入的数据量 = 250ns / 2.5ns = 100个数据。 . 当写使能有效的时候,有了数据,因此可进行读操作,读的数据 = 250ns / 10ns = 25 个数据 . 深度 = 写入数据 - 读出数据 = 75
题目3:——同步FIFO
对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为?
解题: . 每100个cycle可以写入80个数据,为了获得更安全的FIFO深度,我们需要考虑最坏的情况,以防数据丢失,也就是背靠背模式,空20个时钟,剩下80个时钟写80个数据,再用80个时钟写80个数据,空20个时钟,这样的结果就是连着写了160个数据,共用了200个时钟,突发长度是160 . 套用公式 ,fifo_depth = burst_length - burst_length * X / Y * r_clk/w_clk . 由于是同步FIFO,读写时钟相同,则 r_clk=w_clk; fifo_depth = 160 - 160 *8 / 10 * 1 = 160-128 =32 ,深度为32
题目4:——异步FIFO wclk=200mhz,100个wclk里写入40个数据,rclk=100mhz,10个rclk里读出8个数据。那么fifo深度为?
解题方法1: 我们仍然考虑最坏的情况,背靠背,即空60个wclk,剩下40个wclk写入有40个数据,接着40个wclk写40个数据,空60个wclk,那么突发数据个数为40+40=80,用了200个wclk。 . 公式:fifo_depth = burst_length - burst_length * X / Y * r_clk/w_clk . 则深度 = 80 - 80 * 8 / 10 * 1/2 = 48 . . 注意:由于FIFO的深度一般是2的整数次幂,要符合格雷码的编码转换规则,对于计算出的深度48,选择比它大的2的整数次幂的数,比如64。
解题方法2 :
公式:深度 = 写数据量(突发长度) - 读数据量(同样时间里读了多少数据) . wclk=200mhz = 1000 / 200mhz = 5ns,突发长度80,则写时间:5ns * 80 = 400 ns . rclk=100mhz = 1000 / 100mhz = 10ns,每10rdclk读8个数据,10rdclk =100ns,因此100ns读8个数据,在400ns中,读数据 = 4 * 32 。 . 深度 = 写数据量 - 读数据量 = 80 - 32= 48
题目5:——写时钟 比 慢时钟 快 ,且读写工程中无空闲周期(在突发中,读写在各自时钟下连续进行)
wclk = 80Mhz ,rclk = 50mhz,突发长度120,写和读的过程中没有空闲周期。
解题:
wclk = 80Mhz = 1000 / 80mhz = 12.5 ns . 写时间 = 12.5 ns * 120 = 1500 . 相同的时间内,计算读多少数据。 rclk = 50mhz = 20ns。读数据 = 1500 /20 = 75数据 . 因此深度 = 写数据 -读数据 = 120 - 75 = 45
题目6:——写时钟 比 慢时钟 快 ,且读写工程中有空闲周期
wclk = 80Mhz ,rclk = 50mhz,突发长度120,两个写时钟写一个数据,4个读时钟周期读一个数据。
解题:
wclk = 80Mhz = 1000 / 80mhz = 12.5 ns . 写数据个数120,每两个wclk写一个数据,则每25ns写一个数据。 写时间 = 120 * 25 = 3000ns 3000ns内,求能读多少数据。 . rclk = 50mhz = 20ns,每4个rclk读一个数据,因此每80ns读一个数据。3000ns可读数据 = 37.5 个数据 = 37个数据。 深度 =120 - 37 = 83
题目7:——写时钟慢于读时钟,且读写过程中没有空闲周期
wclk = 30Mhz ,rclk = 50mhz,突发长度120.
这种情况下永远也不会发生数据丢失的情况;fifo的深度为1即可。
题目8:——写时钟慢于读时钟,且读写过程中有空闲周期 wclk = 30Mhz ,rclk = 50mhz,突发长度120,每两个wclk写一个数据,每4rclk读一个数据。
解题:
wclk = 80Mhz = 1000 / 30mhz = 100/3ns . 写数据个数120,每两个wclk写一个数据,则每(100/3ns)* 2 写一个数据。 写时间 = 120 * (100/3ns)* 2 = 8000ns 8000ns内,求能读多少数据。 . rclk = 50mhz = 20ns,每4个rclk读一个数据,因此每80ns读一个数据。8000ns可读数据 = 100个数据 深度 =120 - 100 = 20
题目8:——读写时钟频率一致,但在读写过程中存在空闲周期。 wclk = 50Mhz ,rclk = 50mhz,突发长度120,每两个wclk写一个数据,每4rclk读一个数据。 解题:
wclk = 50Mhz = 1000 / 50mhz = 20ns . 写数据个数120,每两个wclk写一个数据,则每(20ns)* 2 写一个数据。 写时间 = 120 * 40ns = 4800ns 4800ns内,求能读多少数据。 . rclk =wclk,每4个rclk读一个数据,因此每80ns读一个数据。4800ns可读数据 = 60个数据 深度 =120 - 60 = 60
FIFO知识掌握 FIFO仅在数据突发时才有效; 不能有连续的数据输入和输出,若存在连续的数据流,那么所需FIFO的大小应该是无限的。
|