原文:http://www.asic-world.com/tidbits/fifo_depth.html
介绍 面试中最常被问到的问题之一,就是如何计算FIFO的深度。常识告诉我们,当读速率慢于写速率时,FIFO便可被用作系统中的缓冲元件或队列。因此FIFO的大小基本上暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率取决于系统的负载能力。因此为了保证FIFO的大小,我们需要考虑FIFO传输的最坏情况下。
在最坏的情况下,与最求读写速率最大化不同的是。对于读操作来说,应该考虑最大数据速率;那么对于写操作来说,应该考虑最小数据速率。
在这个问题中,读操作的数据速率是由空闲周期的数据决定的。而写操作的最大数据速率则不应该考虑空闲周期。
在写操作中,我们需要知道数据速率,亦即数据个数 * 时钟速率。写的这一边为源端,而读的这一边则变为宿端。读操作的数据速率则取决于写的那一边的数据速率和它本身的读取速率,即Frd/Idle_cycle_rd。
为了了解写操作的数据速率,我们需要知道在突发传输中的数据个数,我们架设为B。
跟上前面的问题,那么FIFO的大小=缓存的大小=B-B*Frd/(Fwr*Idle_cycle_rd)。
这里我们没有讨论异步读写的同步延迟。越大的同步延迟,需要越大的FIFO大小,以缓存更多的写数据。
例子:FIFO深度计算 假设我们需要设计符合下列要求的FIFO,我们想要计算最小的FIFO深度。
- 异步FIFO
- 写时钟30MHz F1
- 读时钟40MHz F2
- 突发写数据大小 B
- 案例1:读端有1个空闲时钟周期 I
- 案例2:读端有10个空闲时钟周期 I
FIFO深度计算=B-B*F2/(F1*I)
如果我们变换读周期,亦即在两个读周期之间有1个空闲周期,那么FIFO深度=B-B*F2/(F1*2)
在我们当前的问题中,FIFO深度=B-B*40/(30*2)=B(1-2/3)=B/3
这意味着,如果突发传输的数据容量为10,那么FIFO深度为=10/3=3.3=4(近似)
如果B=30,那么FIFO深度=20/3=6.6=7
如果在两个读周期中有10个空闲周期,那么FIFO深度=B-B*F2/(F1*10)=B(1-4/30)=B*26/30 |