FIFO深度计算:
上一篇文章讲到一个简单的FIFO计算公式,但是只适用于部分情况,下面深层次介绍一下FIFO计算的过程和网上流传的公式
提示:先将网上流传的两个公式搬出来:
F I F O _ D e p t h > = ( w r _ c l k − r d _ c l k ) ∗ B u r s t _ l e n g t h w r _ c l k FIFO\_Depth >= (wr\_clk - rd\_clk)*\frac{Burst\_length}{wr\_clk} FIFO_Depth>=(wr_clk−rd_clk)∗wr_clkBurst_length
F
I
F
O
_
D
e
p
t
h
>
=
B
u
r
s
t
_
l
e
n
g
t
h
−
B
u
r
s
t
_
l
e
n
g
t
h
∗
r
d
_
c
l
k
w
r
_
c
l
k
∗
r
d
_
r
a
t
e
FIFO\_Depth >= Burst\_length - Burst\_length*\frac{rd\_clk}{ wr\_clk}*rd\_rate
FIFO_Depth>=Burst_length−Burst_length∗wr_clkrd_clk∗rd_rate
举例说明式子中需要注意的点:
写时钟频率w_ clk,读时钟频率r_ clk,写时钟周期里,每B个时钟周期会有A个数据写入FIFO读时钟周期里,每Y个时钟周期会有X个数据读出FIFO。
- Burst_length :最大突发长度, 注意: 指在突发时间段, 写时钟 写入的数据长度
- rd_rate:指一个周期读取的数据字节(byte),1字节 = 8 bit
公式1:
笔试题1:一个8bit宽的FIFO,输入时钟为100MHz,输出时钟为95MHz,设一个package为4Kbit, 且两个package之间的发送间距足够大。问FIFO的深度。
- 异步FIFO,读写频率不同,读写位宽相同。发送一次Burst突发数据量为4Kbit。 发送Burst的时间 T =4000/100MHz。
- 接收方接受的数据量 T*95MHz = 4000 * 95 / 100 bit
- FIFO需要缓存的数据量 4000 - 4000 * 95 / 100 = 200bit
- FIFO_Depth >= 200bit/8bit = 25。那么FIFO的深度至少要大于等于25才行。
公式2:
写时钟频率w_ clk,读时钟频率r_ clk,写时钟周期里,每B个时钟周期会有A个数据写入FIFO读时钟周期里,每Y个时钟周期会有X个数据读出FIFO。问FIFO的深度。
w
r
_
r
a
t
e
=
w
_
c
l
k
wr\_rate = w\_clk
wr_rate=w_clk
w r _ r a t e ′ = A B ∗ T = A B ∗ w _ c l k wr\_rate' = \frac{A}{B*T} = \frac{A}{B}*w\_clk wr_rate′=B∗TA=BA∗w_clk
r
d
_
r
a
t
e
′
=
X
Y
∗
T
=
X
Y
∗
r
_
c
l
k
rd\_rate' = \frac{X}{Y*T} = \frac{X}{Y}*r\_clk
rd_rate′=Y∗TX=YX∗r_clk
假设"背靠背”时发送的数据 = Burst_lengthL,那么”背靠背”的时间:
t
=
B
u
r
s
t
_
l
e
n
g
t
h
w
_
c
l
k
t = \frac{Burst\_length}{w\_clk}
t=w_clkBurst_length 注意, 这段时间内是不是wr_rate’ (看突发长度的概念即可明白)
在这段时间内,接收方可以接受的数据
r
d
_
r
a
t
e
′
∗
t
=
X
Y
∗
r
_
c
l
k
∗
B
u
r
s
t
_
l
e
n
g
t
h
w
_
c
l
k
rd\_rate'*t = \frac{X}{Y}*r\_clk * \frac{Burst\_length}{w\_clk}
rd_rate′∗t=YX∗r_clk∗w_clkBurst_length
缓存数据为
B
u
r
s
t
_
l
e
n
g
t
h
−
X
Y
∗
r
d
_
c
l
k
∗
B
u
r
s
t
_
l
e
n
g
t
h
w
_
c
l
k
Burst\_length -\frac{X}{Y}*rd\_clk * \frac{Burst\_length}{w\_clk}
Burst_length−YX∗rd_clk∗w_clkBurst_length
故
F
I
F
O
_
D
e
p
t
h
>
=
B
u
r
s
t
_
l
e
n
g
t
h
−
X
Y
∗
r
_
c
l
k
∗
B
u
r
s
t
_
l
e
n
g
t
h
w
_
c
l
k
FIFO\_Depth >= Burst\_length -\frac{X}{Y}*r\_clk * \frac{Burst\_length}{w\_clk}
FIFO_Depth>=Burst_length−YX∗r_clk∗w_clkBurst_length
即
F
I
F
O
_
D
e
p
t
h
>
=
B
u
r
s
t
_
l
e
n
g
t
h
−
B
u
r
s
t
_
l
e
n
g
t
h
∗
r
_
c
l
k
w
_
c
l
k
∗
X
Y
FIFO\_Depth >= Burst\_length -Burst\_length * \frac{r\_clk}{w\_clk}*\frac{X}{Y}
FIFO_Depth>=Burst_length−Burst_length∗w_clkr_clk∗YX