BTW:通常,为了安全起见,都会多留一些depth的余度
大家可以讨论一下,加深对这个问题的认识。
原帖由 windzjy 于 2007-1-14 17:18 发表我以前看到过这个公式,是用来计算同步fifo的。
个人觉得,公式应该是这样:
A/(B * w_clk) = X/(Y * r_clk)
fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk
举例说明:
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出 ...
你所举的那个例子, 如果呼入fifo的数据宽度和呼出相同的话,都设为w bit。那么呼如fifo的带宽就是200wbps,呼出fifo的带宽是100wbps。考虑链路利用率都是80%。那么呼入fifo的有效带宽是160wbps。呼出fifo的带宽是80wbps。现在看到矛盾了,由于输入输出带宽不相等,进来永远比出去多,那么FIFO总是处于不断积累数据的状态。所以lz所举的这个例子并不合适。
应该提高读时钟的速率,使fifo两端的带宽匹配,在这个前提下才能计算出有解的fifo深度。
如果令wclk=rclk (以下内容中的clk表示时钟的频率,不是周期)。可使得读写带宽匹配。那么这个例子的答案是32
原因如下: 考虑背靠背的情况,160个wclk连续都写入了160个数据。而这160个wclk时间内,由于wclk=rclk,那么读出了(16/10 )×8=128个数据。有32个数据会被留在fifo里。那么fifo的最小深度就是32。
如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48
续上:
讲数据带入公式 fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
正好也是也是这个结果。所以我觉得公式是对的。
其实 A/B * w_clk = X/Y * r_clk 即 (A/B)*W_CLK=(X/Y)*R_CLK
所表达的含义就是 fifo的输入和输出带宽要匹配,其中A/B表示链路利用率,w_clk×width表示带宽,这里大概是默认输入输出的数据宽度相同,所以以wclk来代替带宽。 X/Y 和 r_clk 的含义也是这样:) 。在带宽匹配的前提下数据不会无限积累。
fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk)公式是对的
讲数据带入公式 fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
正好也是也是这个结果。所以我觉得公式是对的。
其实 A/B * w_clk = X/Y * r_clk 即 (A/B)*W_CLK=(X/Y)*R_CLK
所表达的含义就是 fifo的输入和输出带宽要匹配,其中A/B表示链路利用率,w_clk×width表示带宽,这里大概是默认输入输出的数据宽度相同,所以以wclk来代替带宽。 X/Y 和 r_clk 的含义也是这样:) 。在带宽匹配的前提下数据不会无限积累。
fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk)公式是对的
实际应用中往往是以半空半满信号来指示fifo的空满状态的,所以实际设计fifo的时候会至少留下一个数据空间的深度裕量。
有什么问题大家可以继续讨论。