FIFO的设计可参考
FIFO的Verilog设计(一)——同步FIFO
FPGA的Verilog设计(二)——异步FIFO
参考文献
[1]FIFO最小深度计算
前言
在实际使用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}
t2nt1,此时FIFO中剩余数据个数
⌈
n
−
n
t
1
t
2
⌉
\lceil n-\frac{nt_1}{t_2} \rceil
⌈n−t2nt1⌉。
写速度等于或慢于读速度
FIFO写速度等于或慢于读速度模型的应用场景为,在多bit数据需要变换时钟域情况下,FIFO的最小深度设置为1即可。因此FIFO只是起着变换时钟域的作用。
二、 举例说明
1. FIFO写时钟为100MHz,读时钟为80Mhz
情况一:一共需要传输2000个数据,求FIFO的最小深度
FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1=100M1s,读出一个数据需要
t
2
=
1
80
M
t_2=\frac{1}{80M}
t2=80M1s
FIFO写入2000个数据需要的时间
n
t
1
=
2000
100
M
nt_1=\frac{2000}{100M}
nt1=100M2000s
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=t2nt1=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。
情况二:100个时钟写入80个数据,1个时钟读1个数据,求FIFO的最小深度
FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1=100M1s,读出一个数据需要
t
2
=
1
80
M
t_2=\frac{1}{80M}
t2=80M1s
100个时钟写入80个数据,可以理解为80个有效写时钟和20个无效写时钟。
此为突发读写情况,需要考虑什么时候突发写的数据最多。当前后两个100时钟的突发写是连续时,突发写的数量最多,如下图所示
FIFO写入160个数据需要的时间
n
t
1
=
160
100
M
nt_1=\frac{160}{100M}
nt1=100M160s
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=t2nt1=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:诀窍在于找出最大连续写入的数据量。
情况三:100个时钟写入80个数据,3个时钟读1个数据,求FIFO的最小深度
FIFO写入一个数据需要
t
1
=
1
100
M
t_1=\frac{1}{100M}
t1=100M1s,读出一个数据需要
t
2
=
3
∗
1
80
M
t_2=3*\frac{1}{80M}
t2=3∗80M1s
同上情况,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=t2nt1=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。文章来源:https://www.toymoban.com/news/detail-764108.html
三、什么情况下不太需要考虑FIFO的最小深度
何时不用过分考虑FIFO的最小深度?在数据发送端如果能够接受FIFO的空满信号反馈时可以设置个大概的深度即可。利用FIFO的空满信号(或者almost_full/almost_empty)的反馈来控制FIFO的读写使能能够有效解决数据的溢出。文章来源地址https://www.toymoban.com/news/detail-764108.html
到了这里,关于FIFO的Verilog设计(三)——最小深度计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!