异步FIFO通常用于在两个时钟域间传输数据,并且通常情况下,写数据的速率是要比读数据的速率快的,因此,就存在FIFO最小深度的一个问题,以防止在数据传输时发生溢出,造成数据的丢失。 在计算FIFO最小深度时,我们一般考虑极端情况,即在一段时间内写速率达到最大,此时由于读数据慢于写数据,因此需要设置一个FIFO的最小深度,来保证数据不丢失。
CASE1写速率 f A = 80 M H z f_A = 80MHz fA=80MHz 读速率 f B = 50 M H z f_B = 50MHz fB=50MHz 突发长度 B u r s t L e n g t h = 120 Burst Length = 120 BurstLength=120 读写之间没有空闲周期,是连续读写一个突发长度。 分析: 写一个数据,需要1/80MHz=12.5ns,因此写120个数据,需要120*12.5ns 而读一个数据,需要1/50MHz=20ns,在120*12.5ns时间内,读出了120*12.5/20=75个数据,所以FIFO的最小深度应该为 120 − 75 = 45 120-75=45 120−75=45
CASE2fA > fB 在两个连续读写之间有一个周期的延迟 相当于每2个周期写入和读出一个数据,因此有下式 120-120*2*(1/80MHz)/(2*(1/50MHz))=120-120*50/80=45
CASE3写速率fA = 80MHz 读速率fB = 50MHz 突发长度Burst Length = 120 两个连续写入之间的空闲周期为 = 1 两个连续读取之间的空闲周期为 = 3 分析:相当于每2个周期(2*1/80Mhz=25ns)写一个数据,每4个周期(4*1/50MHz=80ns)读一个数据。因此,写120个数据需要25*120=3000ns,在这段时间内,共读出3000/80=37.5个数据,因此最小深度为 120 − 37.5 = 83 ( 向 上 取 整 ) 120-37.5=83(向上取整) 120−37.5=83(向上取整)
CASE4写速率fA = 80MHz 读速率fB = 50MHz 突发长度Burst Length = 120 写使能占得百分比为 = 50% = 1 / 2 读使能占得百分比为 = 25% = 1 / 4 此题和CASE3类似,相当于每2个周期写一个数据,每4个周期读1个数据。因此最小深度也是83
CASE5fA < fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟) 显然读数据快于写数据速率,因此FIFO深度为1即可
CASE6写速率fA = 30MHz 读速率fB = 50MHz 突发长度Burst Length = 120 两个连续写入之间的空闲周期为 = 1 两个连续读取之间的空闲周期为 = 3 分析:此题写时钟频率慢于读时钟频率,但真实的数据写入速率是快于读数据速率的: 每2个周期,即1/30MHz*2=66.6ns写入一个数据; 每4个周期,即1/50MHz*4=80ns读出一个数据。 则写入120个数据,需要66.6*120=8000ns,在这8000ns时间内,共读出8000/80=100个数据,因此FIFO的最小深度应为120-100=20。
CASE7fA = fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟) 如果读写时钟为同一个时钟,则可以不需要FIFO。 如果读写时钟存在相位差,FIFO深度为1即可。
CASE8写速率fA = 50MHz 读速率fB = 50MHz 突发长度Burst Length = 120 两个连续写入之间的空闲周期为 = 1 两个连续读取之间的空闲周期为 = 3 在这个case中读时钟和写时钟频率相同,但是读写速率不同: 每2个周期(1/50Mhz*2=40ns)写入一个数据),每4个周期(1/50MHz*4=80ns)读出一个数据,因此写入120个数据需要40*120=4800ns,在这段时间内,可以读出4800/80=60个数据,因此FIFO的最小深度为120-60=60。
CASE9读写速率相等 每100个时钟写入80个数据 每10个时钟读取8个数据 突发长度为160 由于100个时钟周期内80个数据写入的时机是随机的,因此,我们需要考虑最坏的情况,即写入最快的情况。 从上图中,可以看到,最坏的情况就是case4,即在200个周期内发生两次连续的突发写入,又称“背靠背”的情况。此时,在160个周期内(20-180)共写入了160个数据(在这段时间内写数据速率达到最快),而在160个周期内,只能读出160/10*8=128个数据,故FIFO的最小深度为
160
−
128
=
32
160-128=32
160−128=32
写入时钟20MHz 读出时钟40MHz 每1000个时钟周期写入500个数据 每4个时钟周期读出1个数据 读写数据位宽一致。 分析:同样,我们考虑最坏的情况,即0-1000个周期后500个周期写入数据,第1000-2000个周期前500个周期写入数据,即背靠背的情况,此时在1000个周期(500-1500)内写入了1000个数据,共花费1/20MHz*1000=50000ns,在这段时间内,假设有x个数据读出,则有 x ∗ ( 4 ∗ 1 / 40 M H z ) = 50000 n s x*(4*1/40MHz)=50000ns x∗(4∗1/40MHz)=50000ns 解得x=500,因此FIFO的最小深度为1000-500=500。
补充由于异步FIFO在设计时采用了格雷码,因此FIFO深度需要是2的幂,否则在最大值N-1跳变到0的时候,其对应的格雷码并不是只变化一个bit,从而会在同步时发生错误。因此,在大多数情况下,算出了最小FIFO深度之后,如果不是2的幂,应该还要取大于等于该深度的最小的2的幂。这是本人的一点看法,当然不这样做也可,不过此时异步FIFO在设计时就不能使用格雷码了。