关于FIFO的深度问题

来源:互联网 发布:plm编程软件 编辑:程序博客网 时间:2024/05/21 04:01

We have a FIFO which clocks data in at 100MHZ and clocks data out at 80MHz. On the input there is only 80 data in any order during each 100 ciocks. In other words, a 100 input clock will carry only 80 data and the other 20 clocks carry no data(data is scatted in any order). How big the FIFO needs to be to avoid data over/under-run?

 

Revolution: 假设写入时为最坏情况(背靠背),即在160×(1/100)微秒内写入160个数据,而在这段时间内只能读出160×(1/100)×80个数据,二者之差160-160×(1/100)×80=32

因此该FIFO深度为32.

 

FIFO的输入输出带宽应该相等,否则进来的永远比出去的多,FIFO总是处于不断积累数据的状态。例如,若写时钟WCLK=200MHZ,读时钟RCLK=100MHZ,链路利用率均为80%,则呼入FIFO的有效带宽是160W bps(W为数据宽度),呼出的有效带宽为80W bps,则矛盾。此时应该提高读时钟的频率,使FIFO的两端带宽匹配,在此前提下才能计算出有解的FIFO深度。

如果令WCLK = RCLK = 100MHz,则同上例;WCLK = RCLK = 200MHz时亦为32。

如果令WCLK = 200MHz,改为100个WCLK里写入40个,RCLK = 100MHz,10个RCLK里读出8个,则FIFO深度为 80-80×(1/200)×100×(8/10)  = 48

 

一般化:

写时钟频率: WCLK;

读时钟频率: RCLK;

写时每B个时钟周期内会有A个数据写入FIFO;

读时每Y个时钟周期内会有X个数据读出FIFO;

则FIFO的最小深度是多少?

 

首先,在一定时间内,写入的数据量应该等于读出的数据量,即必要条件为WCLK×(A/B)= RCLK×(X/Y);

其次,算出写数据的最大burst_length。考虑最坏情况,比如条件会给出每100个写时钟写入80个数据,那么在背靠背的情况下,burst_length = 2×80 = 160;

则:

          FIFO_depth = burst_length -burst_length*(X/Y)*(RCLK/WCLK),

其中的burst_length包含了A和B的信息。

上式可变形为:

         FIFO_depth = burst_length - (burst_length/WCLK)*(RCLK*(X/Y)). 

其中(burst_length/WCLK)表示这个burst的持续时间,(RCLK*(X/Y))表示读的实际速度,两者的乘积自然就是这段时间读出的数据量,显然burst_length表示这段时间写入的数据量,两者之差为FIFO中残留的数据,这个也就是理论上的FIFO的最小深度。

 

实际应用中往往是以半空半满信号来指示FIFO的空满状态的,所以实际设计FIFO的时候会至少留出一个数据空间的深度裕量。

 

原创粉丝点击