题目详见原文:FIFO深度计算
只有在突发传输情况下,讨论FIFO深度才有意义
FIFO的最小深度与burst rate, burst size, read and write frequency等因素有关。要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走。也就是说FIFO的最小深度就等于没有被读走的数据个数。
关于延迟和同步空满信号的问题:
在异步FIFO设计中,我们需要去判断FIFO的空满来保证逻辑的正确性,判断空满标志需要去比较读写指针,而读指针与写指针处在不同的时钟域中,我们需要采用格雷码和两级同步寄存器去降低亚稳态的概率,而两级同步必然会导致空满标志位的判断至少延迟2个cycle。对于空标志位来说,将写指针同步到读时钟域至少需要花费2个时钟,而在同步这段时间内有可能还会写入新的数据,因此同步后的写指针一定小于或等于(当且仅有同步时间内没有新数据写入的情况下才会等于)当前的写指针,所以此时判断不一定是真空;同理,对于满标志位来说,将读指针同步到读时钟域至少需要花费2个时钟,而在同步这段时间内有可能还会读出新的数据,因此同步后的读指针一定小于或等于当前读指针,所以此时判断并不一定是真满。
在最坏的情形中,读写的速率应该相差最大,也就是说需要找出最大的写速率和最小的读速率。
注意:这里需要验证一下是否有解,即写入burst数据时间必须大于等于读出burst数据时间,不然数据就会越累积越多,使得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的最小深度为 B - B * (frd/fwr) * (y/x)
- 注意保留一些余量