一看就会的FIFO最小深度计算

  • Post author:
  • Post category:其他



目录


前言


基础题


附加题1


附加题2


附加题3


总结


前言

计算题一直是笔试中常见的一类题型,

上文

我们学会了建立时间和保持时间的计算方法,本文来学习一下FIFO的深度计算问题。

FIFO的深度问题是为了解决数据传输中的读写速率不匹配的问题,如果一个FIFO的写入速率比读出速率快,那么没来得及及时读出的数据就需要存储在FIFO中等待被读出。其实这就是一个比较简单的数学问题,可以联想到小学题目中给游泳池一边灌水一边放水(?)。

基础题

一般通常会见到题干是这样的:“

一笔数据的个数N是120个,FIFO的

写入时钟频率fw为80MHz

,FIFO的

读出时钟频率fr为50MHz

,求FIFO的最小深度。

其实这道题就是在问一个游泳池需要多大才能一边灌水一边放水,水还不能溢出游泳池。那么我可以直接用数据总量120,除以写入速率80MHz,可以得到一个灌水时间 T = 120 / 80MHz 。那么在这么长时间中,我们能放多少水呢?就是 n = T * 50MHz = 120 / 80MHz * 50MHz = 75 。所以我们至少需要一个 (120 – 75 = 45)这个大的一个游泳池才能满足要求,即就是我们所需要的FIFO最小深度为 45 。这里可以提炼出公式:

最小深度 d = N – N / fw * fr

有时出题的老师会再绕一个弯,加考一些基础知识。例如:一笔数据是5kbit,FIFO的宽度是1byte,balabala… 在这里用数据总量除以FIFO宽度就是数据个数了。即一笔数据的个数为 5kbit / 8bit = 640 个。

附加题1

因为异步FIFO需要处理异步界面,不能像放水一样那么迅捷,所以出题时可能会提到“

当写入 3 (任意数)个数据后才能开始读出

”,那么我们的 FIFO 最小深度就必须加上这个缓冲量,即FIFO最小深度为 45 + 3 = 48 。

附加题2



若每隔一个周期写一次数据,每隔三个周期读一次数据,请计算最小深度。

每隔一个周期写一次数据,意味着每两个周期才写一次数据,意味着我们的写入速率从原先的80MHz降为了40MHz。以此类推,读出速率从50MHz降成了12.5MHz 。这样一来再套用公式 最小深度 d = N – N / fw * fr = 120 – 120 / 40 * 12.5 = 82.5 。即可得FIFO的最小深度为 83 。

从这道题可以看出,读写时钟频率和读写速率是两回事,以此题为蓝本的变种类型题还有很多,但是万变边不离其宗,关于FIFO最小深度的计算我们主要关注

读写速率

即可。

附加题3



若在10个周期内,只有8个周期写入数据,请计算最小深度。

我们上面的几道题其实都有一个默认的先决条件,那就是每一笔数据之间间隔很远。因为如果我们一直不停的放水,那么只要灌水速率大于放水速率,无论水池大小,最终都会溢出。

但是这道题我们就要打破这个先决条件(由于未知原因),我们现在认为每一笔数据都是紧挨着写入了FIFO中,而且每笔数据在其时间段内写入不规律,如下图所示,红线区域为有效数据。

在这种情况下,我们为了FIFO不会溢出数据,计算最小深度时,我们就必须要考虑到写入数据时的最坏情况。

根据题干可得,我们在10个周期内会写入8个数据,最坏情况下20个周期会连续写入16个数据,我们需要在写入数据后,在这20个周期的时间内将写入的数据全部读出,才能够保证FIFO不会溢出。

由写入时钟频率80MHz,知一个周期12.5ns,因此留给读出数据的时间就只剩下(20 – 2)* 12.5ns = 225ns。

再看读出时钟频率为50MHz,知读出一个数据花费20ns,那16个数据全部读完需要 16 * 20 = 320ns。因此本题无解。

所以我们只能提高读出速率,我们需要在225ns内读出16个数据,易知每14ns我们就应该读出一个数据,即读出时钟频率为72MHz。

总结

前面几道题都是只考虑这一笔数据,并且数据写入具有周期性,在数据全部写入FIFO后,需要占据多余的一些时间才能将FIFO中的数据全部读出。而这种设计自然不能应用于会有多笔数据随机写入FIFO中的情况,这种情况需要考虑更多的东西。但归根结底,这种类型的题和给游泳池边灌水边放水并无两样。