TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FIFO深度计算分析
+ t' C1 B" C0 y ]+ v Q
5 Z+ z- u( j5 P- K1 w. k写时钟周期w_clk,
! D; h: w+ J# @8 i4 U: @9 O4 ?读时钟周期r_clk,
- A9 ]+ F0 D! J3 f+ h- J `8 E写时钟周期里,每B个时钟周期会有A个数据写入FIFO8 O2 ]9 `! r: b
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
) b. u) T4 H% O; n$ \则,FIFO的最小深度是?
o0 x0 X* J* X3 ?: J8 ]
' `& m4 F; u( b8 {' X首先,这道题不一定有解4 ^0 Z! F. k2 F8 x
有解的必要条件是在一定时间内(足够长),写入的数据数量一定要等于读出的数据数量7 R9 {6 \) s8 i7 _* T# o
因此有:A/B * w_clk = X/Y * r_clk
5 k: Z2 W3 z/ O- ^
/ o1 b( S& U- g* X. k其次,算出写数据的最大burst_length。考虑最坏情况
: v7 M: e* p9 h3 ]+ ^比如,如果条件给出,每100个写时钟,写入80个数据,那么在背靠背的情况下,burst_length = 2*80=160
# L0 l! I7 ]. G1 [5 R
2 ^" R) X0 x$ g0 z* w最后,fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk$ ?7 @; P m6 Q( H9 ]+ V. h
7 h/ V" X8 K: T/ F5 P. {BTW:通常,为了安全起见,都会多留一些depth的余度& H; U: d/ [2 i' {8 u% @( U5 L4 |7 g
个人觉得,公式应该是这样:# r+ o, L/ d Y# f4 f8 M
A/(B * w_clk) = X/(Y * r_clk) e* |9 ]' \* j$ _. j# O* z
' G; S! H, G1 t
fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk1 b& T. \/ v F) ^; f' r5 a
i3 |% U7 C! |9 I
* [2 L* G8 n4 Z% S举例说明:
6 W8 z: P" W. b3 s! m( e6 I& y如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据
n" C3 l& h/ h. [& f其中w_ck=5ns,r_ck=10ns
% q* k/ f2 f9 H/ H8 x
/ L( l& J: W, U( |# o5 f6 ?$ H如果按照之前的公式,得出的深度为:fifo_depth = burst_length - burst_length * X/Y * r_ck/w_clk=160-160*8/10*2=-94,显然是不对的4 G# C) n5 c! D# u
: L4 N- p2 b7 T实际上,考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)/ l; s# m1 [0 u6 E! O2 O
" ?4 Y P Y! |8 i
这样在中间160个写时钟周期连续写的情况下,只能读出160*5/(10*10)*8=64个数据,所以FIFO的深度应该为160-64=96. r' y, T) O2 G9 A' D8 _/ Z+ k, r2 U% z
也就是fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk=160-160*8/10*5/10=96
7 ?0 v& n& q, F3 c( ]& P
2 S' C( c5 d* Q; ?% A
5 b9 G, W7 A/ K. A% t+ @8 S |
|