FIFO的深度应该怎么计算

描述

本文首发于公众号 FPGA开源工坊

FIFO是FPGA/IC设计中经常使用到的模块,它经常被用在两个模块之间进行数据的缓存,以避免数据在传输过程中丢失。同时FIFO也经常被用在跨时钟域处理中。

FIFO深度的计算是FPGA和IC笔面试中经常被问到的一个问题,在这篇文章里面我们就来讨论一下FIFO的深度应该怎么计算。

FIFO的深度如果设置的小了就会有丢数的风险,设置的大了会有资源的浪费。

在讨论如何计算FIFO的深度之前,应该先明白一个概念,那就是突发传输 ,也就是burst。

突发传输

为什么要明确突发传输的概念呢?我们假设有以下几种开发场景。

场景一:读比写快

假如说一个FIFO在不间断的向里面写入数据和读出数据,并且向FIFO里面写数据的速度比从FIFO里面读数据的速度要慢,那么是不是这个FIFO永远都不会被写满了。

场景二:写比读快

假如说一个FIFO在不间断的向里面写入数据和读出数据,并且写入的速度比读出的速度快,那么是不是意味着这个FIFO的深度无论设置多少都终将会被写满。

所以不间断在对FIFO不间断的进行读写的情形中讨论FIFO深度是没有意义的。

而我们要讨论的FIFO深度其实是在突发传输中才是有意义的。

突发传输:就是说一个又一个的数据包,每一个数据包之间是有间隙的。

每一个数据包的长度叫做burst length 突发长度

FIFO的最小深度就与突发长度,读写速率有关系。

计算出来FIFO的深度关键就在于计算出来在读写突发的这段时间内,有多少数据没有被读走,这个数据的多少就是FIFO的最小深度。

计算公式
FPGA

FIFO的深度可以用下面的公式计算出来

可以看到在上述公式里面的关键就是确定burst length。

下面就通过几个例子来说明burst length的计算。

例子

例一

某大厂的笔试题:

设计同步FIFO,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,FIFO的深度至少为:

A: 16

B: 32

C: 64

D: 72

首先从题目中知道同步FIFO,所以rd_clk和wr_clk是一样的。

第二每10个cycle中可以读出8个数据,那么rd_rate就是8/10也就是0.8

现在关键就是burst length的计算了。

每100个cycle可以写入80个数据,那么是不是意味着这80个数据可以在100个cycle的周期的任意时间写进FIFO里面。那么什么时候是连续写入数据最多的极端情况呢,这个极端情况就是burst length最大的时候。

这个极端情况就是在连续的200个cycle中,是不是可以写入160个数据,那么这160个数据背靠背的连续写入就是极端情况了。

如下图所示:

FPGA

在连续两百个周期内,前20个周期空闲,中间160个时钟向FIFO写入数据,最后20个时钟再次空闲。

所以burst length就是160

所以FIFO的最小深度为
FPGA

例二

有一个FIFO设计,输入时钟100MHz,输出时钟80MHz,输入数据模式是固定的,其中1000个时钟中有800个时钟传输连续数据,另外200个空闲,请问为了避免FIFO下溢/上溢,最小深度是多少

A: 320

B: 80

C: 160

D: 200

根据题意wr_clk是100, rd_clk是800。

因为输入数据的模式是固定的,所以不用考虑背靠背的情况,所以burst length是800

题目中没有说明在输出的时候读使能是否会拉低,所以我们认为FIFO一直在输出,也就是rd_rate是1

所以FIFO的深度为:

FPGA

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分