异步FIFO最小深度的计算

异步FIFO通常用于在两个时钟域间传输数据,并且通常情况下,写数据的速率是要比读数据的速率快的,因此,就存在FIFO最小深度的一个问题,以防止在数据传输时发生溢出,造成数据的丢失。
在计算FIFO最小深度时,我们一般考虑极端情况,即在一段时间内写速率达到最大,此时由于读数据慢于写数据,因此需要设置一个FIFO的最小深度,来保证数据不丢失。

CASE1

写速率 f A = 80 M H z f_A = 80MHz fA=80MHz
读速率 f B = 50 M H z f_B = 50MHz fB=50MHz
突发长度 B u r s t L e n g t h = 120 Burst Length = 120 BurstLength=120
读写之间没有空闲周期,是连续读写一个突发长度。
分析:
写一个数据,需要1/80MHz=12.5ns,因此写120个数据,需要120*12.5ns
而读一个数据,需要1/50MHz=20ns,在120*12.5ns时间内,读出了120*12.5/20=75个数据,所以FIFO的最小深度应该为
120 − 75 = 45 120-75=45 12075=45

CASE2

fA > fB 在两个连续读写之间有一个周期的延迟
相当于每2个周期写入和读出一个数据,因此有下式
120-120*2*(1/80MHz)/(2*(1/50MHz))=120-120*50/80=45

CASE3

写速率fA = 80MHz
读速率fB = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1
两个连续读取之间的空闲周期为 = 3
分析:相当于每2个周期(2*1/80Mhz=25ns)写一个数据,每4个周期(4*1/50MHz=80ns)读一个数据。因此,写120个数据需要25*120=3000ns,在这段时间内,共读出3000/80=37.5个数据,因此最小深度为
120 − 37.5 = 83 ( 向 上 取 整 ) 120-37.5=83(向上取整) 12037.5=83()

CASE4

写速率fA = 80MHz
读速率fB = 50MHz
突发长度Burst Length = 120
写使能占得百分比为 = 50% = 1 / 2
读使能占得百分比为 = 25% = 1 / 4
此题和CASE3类似,相当于每2个周期写一个数据,每4个周期读1个数据。因此最小深度也是83

CASE5

fA < fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟)
显然读数据快于写数据速率,因此FIFO深度为1即可

CASE6

写速率fA = 30MHz
读速率fB = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1
两个连续读取之间的空闲周期为 = 3
分析:此题写时钟频率慢于读时钟频率,但真实的数据写入速率是快于读数据速率的:
每2个周期,即1/30MHz*2=66.6ns写入一个数据;
每4个周期,即1/50MHz*4=80ns读出一个数据。
则写入120个数据,需要66.6*120=8000ns,在这8000ns时间内,共读出8000/80=100个数据,因此FIFO的最小深度应为120-100=20。

CASE7

fA = fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟)
如果读写时钟为同一个时钟,则可以不需要FIFO。
如果读写时钟存在相位差,FIFO深度为1即可。

CASE8

写速率fA = 50MHz
读速率fB = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1
两个连续读取之间的空闲周期为 = 3
在这个case中读时钟和写时钟频率相同,但是读写速率不同:
每2个周期(1/50Mhz*2=40ns)写入一个数据),每4个周期(1/50MHz*4=80ns)读出一个数据,因此写入120个数据需要40*120=4800ns,在这段时间内,可以读出4800/80=60个数据,因此FIFO的最小深度为120-60=60。

CASE9

读写速率相等
每100个时钟写入80个数据
每10个时钟读取8个数据
突发长度为160
由于100个时钟周期内80个数据写入的时机是随机的,因此,我们需要考虑最坏的情况,即写入最快的情况。
在这里插入图片描述
从上图中,可以看到,最坏的情况就是case4,即在200个周期内发生两次连续的突发写入,又称“背靠背”的情况。此时,在160个周期内(20-180)共写入了160个数据(在这段时间内写数据速率达到最快),而在160个周期内,只能读出160/10*8=128个数据,故FIFO的最小深度为
160 − 128 = 32 160-128=32 160128=32

Case10

写入时钟20MHz
读出时钟40MHz
每1000个时钟周期写入500个数据
每4个时钟周期读出1个数据
读写数据位宽一致。
分析:同样,我们考虑最坏的情况,即0-1000个周期后500个周期写入数据,第1000-2000个周期前500个周期写入数据,即背靠背的情况,此时在1000个周期(500-1500)内写入了1000个数据,共花费1/20MHz*1000=50000ns,在这段时间内,假设有x个数据读出,则有
x ∗ ( 4 ∗ 1 / 40 M H z ) = 50000 n s x*(4*1/40MHz)=50000ns x(41/40MHz)=50000ns
解得x=500,因此FIFO的最小深度为1000-500=500。

补充

由于异步FIFO在设计时采用了格雷码,因此FIFO深度需要是2的幂否则在最大值N-1跳变到0的时候,其对应的格雷码并不是只变化一个bit,从而会在同步时发生错误。因此,在大多数情况下,算出了最小FIFO深度之后,如果不是2的幂,应该还要取大于等于该深度的最小的2的幂。这是本人的一点看法,当然不这样做也可,不过此时异步FIFO在设计时就不能使用格雷码了。

  • 5
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA硅农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值