异步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
120−75=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(向上取整)
120−37.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
160−128=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∗(4∗1/40MHz)=50000ns
解得x=500,因此FIFO的最小深度为1000-500=500。
补充
由于异步FIFO在设计时采用了格雷码,因此FIFO深度需要是2的幂,否则在最大值N-1跳变到0的时候,其对应的格雷码并不是只变化一个bit,从而会在同步时发生错误。因此,在大多数情况下,算出了最小FIFO深度之后,如果不是2的幂,应该还要取大于等于该深度的最小的2的幂。这是本人的一点看法,当然不这样做也可,不过此时异步FIFO在设计时就不能使用格雷码了。