好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

FIFO深度计算方法.doc

5页
  • 卖家[上传人]:野鹰
  • 文档编号:1093411
  • 上传时间:2017-05-27
  • 文档格式:DOC
  • 文档大小:39KB
  • / 5 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 写时钟频率 w_clk,读时钟频率 r_clk,写时钟周期里,每 B 个时钟周期会有 A 个数据写入 FIFO读时钟周期里,每 Y 个时钟周期会有 X 个数据读出 FIFO则,FIFO 的最小深度是?计算公式如下:fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk例举说明:如果 100 个写时钟周期可以写入 80 个数据,10 个读时钟可以读出 8 个数据令 wclk=rclk ,考虑背靠背(20 个 clk 不发数据+80clk 发数据+80clk 发数据+20 个 clk 不发数据的200 个 clk)代入公式可计算 FIFO 的深度fifo_depth = 160-160X(80%)=160-128=32如果令 wclk=200mhz ,改为 100 个 wclk 里写入 40 个,rclk=100mhz,10 个 rclk 里读出 8个那么 fifo 深度为 48计算如下 fifo_depth =80-80X(80%)X(100/200)=80-32=48注:将 fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk) 作个变形,得到 fifo_depth = burst_length - (burst_length /w_clk)*[r_clk*(x/y)] 其中(burst_length /w_clk) 表示这个 burst 的持续时间,r_clk*(x/y)表示读的实际速度。

      两者的乘积自然就是这段时间读出的数据量显然 burst_length 表示这 段时间写入的数据量,两者的差为 fifo 中残留的数据,这个也就是理论上的 fifo 的最小深度实际应用中往往是以半空半满信号来指示fifo 的空满状态 的,所以实际设计 fifo 的时候会至少留下一个数据空间的深度裕量FIFO 深度计算讨论(2010-04-15 15:49:00) 转载 ▼标签: 杂谈写时钟周期 w_clk,读时钟周期 r_clk,写时钟周期里,每 B 个时钟周期会有 A 个数据写入 FIFO读时钟周期里,每 Y 个时钟周期会有 X 个数据读出 FIFO则,FIFO 的最小深度是?首先,这道题不一定有解有解的必要条件是在一定时间内(足够长),写入的数据数量一定要等于读出的数据数量因此有:A/B * w_clk = X/Y * r_clk其次,算出写数据的最大 burst_length考虑最坏情况比如,如果条件给出,每 100 个写时钟,写入 80 个数据,那么在背靠背的情况下,burst_length = 2*80=160最后,fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clkBTW:通常,为了安全起见,都会多留一些 depth 的余度 个人觉得,公式应该是这样:A/(B * w_clk) = X/(Y * r_clk)fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk举例说明:如果 100 个写时钟周期可以写入 80 个数据,10 个读时钟可以读出 8 个数据其中 w_ck=5ns,r_ck=10ns如果按照之前的公式,得出的深度为:fifo_depth = burst_length -burst_length * X/Y * r_ck/w_clk=160-160*8/10*2=-94,显然是不对的实际上,考虑背靠背(20 个 clk 不发数据+80clk 发数据+80clk 发数据+20 个 clk 不发数据的 200 个 clk)这样在中间 160 个写时钟周期连续写的情况下,只能读出 160*5/(10*10)*8=64 个数据,所以 FIFO 的深度应该为 160-64=96也就是 fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk=160-160*8/10*5/10=96大家可以讨论一下,加深对这个问题的认识。

      原帖由 windzjy 于 2007-1-14 17:18 发表个人觉得,公式应该是这样:A/(B * w_clk) = X/(Y * r_clk)fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk举例说明:如果 100 个写时钟周期可以写入 80 个数据,10 个读时钟可以读出 ...我以前看到过这个公式,是用来计算同步 fifo 的你所举的那个例子, 如果呼入 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) 作个变形,得到 fifo_depth = burst_length - (burst_length /w_clk)*[r_clk*(x/y)]其中(burst_length /w_clk) 表示这个 burst 的持续时间,r_clk*(x/y)表示读的实际速度两者的乘积自然就是这段时间读出的数据量显然 burst_length 表示这段时间写入的数据量,两者的差为 fifo 中残留的数据,这个也就是理论上的 fifo 的最小深度实际应用中往往是以半空半满信号来指示 fifo 的空满状态的,所以实际设计 fifo 的时候会至少留下一个数据空间的深度裕量仔细看了一下发现自己的问题:1,贴子中写时钟周期 w_clk 和读时钟周期 r_clk 并不是指的周期,而是指的频率2,我举例不当,因该是 wice3 所说的那样,100 个 CLOCK 写 40 个数据,这样在 100 个周期内写入的数据数量和读出的数据数量就一致了,不会造成溢出。

      总结:1,原公式还是对的,只是 w_clk 和 r_clk 意义描述的容易让人误解2,又加深了对 fifo 的理解有什么问题大家可以继续讨论 《动态参数模型确定 SoC 中异步 FIFO 深度的方法》。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.