前言
前段时间面试,因为没考虑过FIFO深度的问题,被面试官吊打一番,痛定思痛,写下这些。
蓄水池问题
一个蓄水池,体积为V,有进水口和出水口。进水口每秒流进m立方米的水,出水口每秒流出n立方米的水。初始时,蓄水池中没有水。
情形一:进水口,出水口一直工作
如果m=n,蓄水池可有可无,流进蓄水池的水会很快流出,蓄水池不会溢出;
如果m>n,经过一段时间t后,蓄水池溢出。
t
=
V
/
(
m
−
n
)
t = V / (m-n)
t=V/(m−n)
可以推论,在这种情况下, 无论蓄水池有多大,总会溢出。
如果m<n,蓄水池永不会溢出。
情形二:出水口一直工作
该情形下,只关心m>n情况。
为了保证蓄水池不溢出,进水口在连续工作t时间后必须关闭,直到蓄水池中有剩余空间v0。进水口可再次连续工作的时间为
t
0
=
v
0
/
(
m
−
n
)
t_0 = v_0/(m-n)
t0=v0/(m−n)
为了不频繁打开关闭进水口,可等到v0=V时再让进水口工作。
此种情形下,蓄水池的行为是,进水口一直工作到蓄水池满,关闭后等到蓄水池为空,再次工作直到蓄水池满。
FIFO深度问题
将FIFO类比成蓄水池。写时钟域吞吐量为m,读时钟域吞吐量为n。吞吐量表示为每秒钟数据量大小。
例如,写时钟为50MHz,每个时钟周期产生一个字节,则吞吐量为50M byte/s
若每两个时钟周期产生一个字节,则吞吐量为25M byte/s
在m>n的情形下,若写时钟域一直工作,则无论FIFO为多深,总会溢出。因此,写时钟域只能工作一段时间,直到FIFO满。
在实际情况下,我们通常是先知道写时钟域能工作的时间,再反推出FIFO的最大深度。参考蓄水池问题,易得
f
i
f
o
d
e
p
t
h
=
t
w
r
∗
(
m
−
n
)
fifo_{depth} = t_{wr} * (m-n)
fifodepth=twr∗(m−n)
举例
A/D采样速率50Mhz,dsp读A/D的速率40Mhz,要不丢失地将将10万个采样数据送入DSP ,在A/D和DSP之间至少加多大容量的(深度)FIFO才行??
答:A/D需工作的时间
t
=
100
,
000
/
50
,
000
,
000
t=100,000/50,000,000
t=100,000/50,000,000
FIFO深度 = 1/500 *(50,000,000-40,000,000)= 20,000