关于FIFO最小深度计算的问题


计算FIFO深度最小深度的总的思路大概是:

  1. 算出写时钟周期,读时钟周期;
  2. 从描述中提取出突发写数据个数(Burst Length),一次写这么多数据需要多久?同时,这么长时间,读了多少数据?
  3. 之后,Burst length 减去 读出的数据,就是FIFO的最小深度。

理解这些东西且看下文,下文是从上述文档中拿出来的例子,本人边做边写,让自己加深印象,同时更方便大伙那就更好了。

注意:突发的意思是数据在那个时候集中过来。。。(大概可以这么理解)

概述:
当一些数据必须从一个模块传输到另一个模块以避免数据丢失时,我们需要在不同时钟域工作的两个模块之间使用异步FIFO。 只有当您读取速度慢并且写入速度很快以缓冲较慢模块未读取的数据时,才需要FIFO。

FIFO的深度(大小)应该是这样的,FIFO可以存储较慢模块不能读取的所有数据。 FIFO仅在数据突发时才有效; 你不能有连续的数据输入和输出。 如果存在连续的数据流,那么所需FIFO的大小应该是无限的。 您需要知道突发速率,突发大小,频率等,以确定FIFO的适当大小。

1.第一种情况:

   写时钟快于读时钟,写和读的过程中没有空闲周期,也即在突发(burst)过程中,读和写都在各自的时钟域内连续进行。

例:
关于FIFO最小深度计算的问题
分析过程:

   写时钟周期T_A = 1000/80 ns = 12.5ns;同理读时钟周期为20ns;

   突发写长度为120个数据,写120个数据耗时120*12.5 = 1500ns;

   1500ns时间内读出数据1500/20ns = 75个;

   故最小FIFO深度为120 - 75 = 45;

2.第二种情况:

   写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期。

例如:
关于FIFO最小深度计算的问题
分析:

   写时钟周期T_A = 12.5ns,读时钟周期为T_B = 20ns;

   两个写时钟写一个数据,也就是写一个数据需要时间2*T_A = 25ns,那么由于突发写数据个数为120个,写这么多数据需要时间120*25ns = 3000ns;

   4个读时钟周期读一个数据,因此读一个数据需要时间80ns,3000ns读了3000/80 = 37.5个数据(0.5不算一个数据,没读完整),约等于37个数据。

   所以,FIFO的最小深度为120 - 37 = 83;

3.第三种情况:

   写时钟慢于读时钟,且读写过程中没有空闲周期;

例如:
关于FIFO最小深度计算的问题
分析:

   这种情况下永远也不会发生数据丢失的情况;

   fifo的深度为1即可。

4.第四种情况:

   写时钟频率小于读时钟频率,但读写过程中存在空闲周期;

例如:
关于FIFO最小深度计算的问题
分析:

   写时钟周期1000/30 ns = 100/3 ns;

   读时钟周期 20ns;

   写一个数据需要2个时钟,也就是200/3 ns;

   读一个数据需要4个时钟,也就是80 ns;

   写120个数据需要时间8000ns,这段时间内读出数据8000/80 = 100个;

   因此,FIFO的最小深度为120 - 100 = 20;

5.第五种情况:

   读写时钟速率相同,且无空闲时钟。

例如:
关于FIFO最小深度计算的问题
分析:

   如果读写时钟之间没有相位差,则不需要FIFO就可以进行读写呀;

   如果二者存在相位差,只需要FIFO的深度为1即可。

6.第六种情况:

   读写时钟频率一致,但在读写过程中存在空闲周期。

例如:
关于FIFO最小深度计算的问题
分析:
   两个时钟写一个数据,需要时间40ns;

   4个时钟读一个数据,需要80ns;

   由于突发长度为120,需要120*40 = 4800ns写完;这段时间读出数据个数:4800/80 = 60;

   所以,FIFO最小深度为120 - 60 = 60;

7.第七种情况:

   特定条件下,最坏情况分析FIFO最小深度;

例如:
关于FIFO最小深度计算的问题
分析:

   首先,从条件可知,写频率等于读频率;

   其次,读写可以在如下限制下的任意时刻发生:

   “writing of 80 data items will be completed in 100 cycles” and ”reading of 8 data items will be completed in 10 cycles”.

可能的情况有:
关于FIFO最小深度计算的问题
关于FIFO最小深度计算的问题

为了获得更安全的FIFO深度,我们需要考虑最坏的情况,以防数据丢失;

对于最坏的情况,写入和读取之间的数据速率之间的差异应该是最大的。 因此,对于写操作,应考虑最大数据速率,对于读操作,应考虑最小数据速率。

从上表可以看出,最快的写数据速率应该为第4种情况,写操作在最小的时间内完成;

   由于突然写长度为160,所以160个时钟写160个数据;

   由于读速度为10个时钟读8个数据,因此一个数据需要10/8个时钟;

   所以160个时钟读了160*8/10 = 128个数据;

   所以FIFO的最小深度为160-128=32.

8.最后一种情况:

   条件转弯抹角的给出,需要自己提取关键信息;(一般考试都是这种,提出出来关键信息后,在按照上面的方法来分析即可)

例如:
关于FIFO最小深度计算的问题
   假如clkA = 25MHz,则CLKB = 100MHz;

   TA= 40ns, TB = 10ns;

   en_B = 100*40 = 4000ns;占空比为1/4;

   我们认为B为写时钟,写使能时间为4000/4 = 1000ns,则突发写长度为1000/10 = 100个数据;

   在1000ns内读出数据为1000/40 = 25个数据,所以FIFO最小深度为100 - 25 = 75

参考:https://hardwaregeeksblog.files.wordpress.com/2016/12/fifodepthcalculationmadeeasy2.pdf
https://blog.****.net/Reborn_Lee/article/details/100127937?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159512934319725219921578%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159512934319725219921578&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-100127937.pc_ecpm_v3_pc_rank_v3&utm_term=FIFO%E6%B7%B1%E5%BA%A6%E8%AE%A1%E7%AE%97