FIFO -- 深度计算
FIFO深度的计算公式
求FIFO的最小深度主要有以下要点:
-
在求解之前需要验证一下在允许的最大时间长度内写入的数据量是否等于读出的数据量,保证有解;
-
求FIFO深度需要考虑最坏的情形,读写的速率应该相差最大,也就是说需要找出最大的写速率和最小的读速率;
-
不管什么场景,要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走;
-
由于FIFO空满标志位的判断延迟,在实际应用中需要预留一些余量。
下面我们来推导一下FIFO深度的求解公式,假设: -
写时钟频率为fwr
-
读时钟频率为frd
-
在写时钟周期内,每m个周期内就有n个数据写入FIFO
-
在读时钟周期内,每x个周期内可以有y个数据读出FIFO
那么:
- 首先必须满足\((1/fwr)*(m/n) ≥ (1/frd)*(x/y)\)
- ”背靠背“的情形下是FIFO读写的最坏情形,burst长度 \(B = 2*n\)
- 写完burst长度数据最快所需时间 \(T = (1/fwr) * B\)
- 从FIFO中读出一个数据至少需要时间 \(t= (1/frd) * (x/y)\)
- 在T时间内能够读走的数据个数 = \(T/t = B * (frd/fwr) * (y/x)\)
- 在T时间内还没有读走的数据个数 = \(B - B * (frd/fwr) * (y/x)\)
- 因此FIFO的最小深度为 \(\color{red}{B - B * (frd/fwr) * (y/x)}\)
- 注意保留一些余量
假设:
写数据时钟频率fa=80MHz
读数据时钟频率fb=50MHz
在写时钟周期内,每100个周期就有40个数据写入FIFO
在读时钟周期内,每10个周期可以有8个数据读出FIFO
那么:
首先这里没有给出数据的突发长度,从假设中可以得出每100个周期就有40个数据写入FIFO,这里可能就有人会说突发长度就是40个数据,其实不是这样的,因为数据是随机写入FIFO的,我们需要考虑做坏的情形,即写速率最大的情形,只有如下图背靠背的情形才是写速率最高的情形,burst length为80
![](https://lyc-picture.oss-cn-shanghai.aliyuncs.com/screenshot/651372-20180101113152581-1250627173.png)
用公式计算最小深度为: \(80-80*50/80*(8/10)=40\)