FIFO的设计可参考
FIFO的Verilog设计(一)——同步FIFO
FPGA的Verilog设计(二)——异步FIFO
参考文献
[1]FIFO最小深度计算
??在实际使用FIFO时,需要考虑FIFO的深度如何设置,如果深度设置不当,可能会出现资源浪费或者数据丢失等情况。下面将简要介绍FIFO的最小深度如何计算。
??由前两篇文章对FIFO的介绍,FIFO常用于数据缓存、数据匹配和多bit跨时钟域处理。
??因此在读写速度不匹配的时候可以使用FIFO,进行数据缓存。当读速度慢于写速度时,FIFO可作为一个缓存单元。此时总会有部分数据缓存在FIFO中,但是如果读写速度相差过大,就会导致数据溢出。所以在写速度最大、读速度最小时,正好不导致FIFO出现数据溢出的最小深度。当读速度快于写速度时,FIFO更多的是起着变换时钟域的作用。
??FIFO写速度快于读速度模型的应用场景为,无论是数据需不需要跨时钟域,只要FIFO写速度快于读速度,FIFO写入一个数据需要
t
1
t_1
t1?秒,读出一个数据需要
t
2
t_2
t2?秒(
t
1
<
t
2
t_1<t_2
t1?<t2?),一共需要传输
n
n
n个数据。
??FIFO写入n个数据的时间为
n
t
1
nt_1
nt1?,FIFO在
n
t
1
nt_1
nt1?时间内读出数据个数为
n
t
1
t
2
\frac{nt_1}{t_2}
t2?nt1??,此时FIFO中剩余数据个数
?
n
?
n
t
1
t
2
?
\lceil n-\frac{nt_1}{t_2} \rceil
?n?t2?nt1???。
??FIFO写速度等于或慢于读速度模型的应用场景为,在多bit数据需要变换时钟域情况下,FIFO的最小深度设置为1即可。因此FIFO只是起着变换时钟域的作用。
??FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1?=100M1?s,读出一个数据需要
t
2
=
1
80
M
t_2=\frac{1}{80M}
t2?=80M1?s
??FIFO写入2000个数据需要的时间
n
t
1
=
2000
100
M
nt_1=\frac{2000}{100M}
nt1?=100M2000?s
??FIFO在
n
t
1
nt_1
nt1?时间内读出数据个数为
n
u
m
r
d
=
n
t
1
t
2
=
2000
?
80
M
100
M
=
1600
num_{rd} = \frac{nt_1}{t_2} = \frac{2000*80M}{100M} = 1600
numrd?=t2?nt1??=100M2000?80M?=1600
??此时FIFO剩余数据个数为
n
u
m
=
2000
?
n
u
m
r
d
=
2000
?
1600
=
400
num = 2000 - num_{rd} = 2000-1600 = 400
num=2000?numrd?=2000?1600=400
??可得FIFO最小深度为400。
??FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1?=100M1?s,读出一个数据需要
t
2
=
1
80
M
t_2=\frac{1}{80M}
t2?=80M1?s
??100个时钟写入80个数据,可以理解为80个有效写时钟和20个无效写时钟。
??此为突发读写情况,需要考虑什么时候突发写的数据最多。当前后两个100时钟的突发写是连续时,突发写的数量最多,如下图所示
??FIFO写入160个数据需要的时间
n
t
1
=
160
100
M
nt_1=\frac{160}{100M}
nt1?=100M160?s
??FIFO在
n
t
1
nt_1
nt1?时间内读出数据个数为
n
u
m
_
r
d
=
n
t
1
t
2
=
160
?
80
M
100
M
=
128
num\_rd = \frac{nt_1}{t_2} = \frac{160*80M}{100M} = 128
num_rd=t2?nt1??=100M160?80M?=128
??此时FIFO剩余数据个数为
n
u
m
=
160
?
n
u
m
_
r
d
=
160
?
128
=
32
num = 160 - num\_rd = 160-128 = 32
num=160?num_rd=160?128=32
??可得FIFO最小深度为32。
??note:诀窍在于找出最大连续写入的数据量。
??FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1?=100M1?s,读出一个数据需要
t
2
=
3
?
1
80
M
t_2=3*\frac{1}{80M}
t2?=3?80M1?s
??同上情况,FIFO最大连续写入的数据量,写入160个数据需要的时间
n
t
1
=
160
100
M
nt_1=\frac{160}{100M}
nt1?=100M160?
??FIFO在
n
t
1
nt_1
nt1?时间内读出数据个数为
n
u
m
_
r
d
=
n
t
1
t
2
=
160
?
80
M
3
?
100
M
=
42.67
num\_rd = \frac{nt_1}{t_2} = \frac{160*80M}{3*100M} = 42.67
num_rd=t2?nt1??=3?100M160?80M?=42.67
??此时FIFO剩余数据个数为
n
u
m
=
160
?
n
u
m
_
r
d
=
160
?
42.67
=
117.33
num = 160 - num\_rd = 160-42.67 = 117.33
num=160?num_rd=160?42.67=117.33
??可得FIFO最小深度为
?
117.33
?
=
118
\lceil117.33\rceil=118
?117.33?=118,可以设置成2的幂次方128。
??何时不用过分考虑FIFO的最小深度?在数据发送端如果能够接受FIFO的空满信号反馈时可以设置个大概的深度即可。利用FIFO的空满信号(或者almost_full/almost_empty)的反馈来控制FIFO的读写使能能够有效解决数据的溢出。