在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 15258|回复: 31

[求助] 请教一下同步fifo及异步fifo深度的计算原理及方法

[复制链接]
发表于 2014-11-24 21:01:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
请教同步fifo及异步fifo深度的计算原理及方法,网上的找了很多,看得云里雾里的,公式的原理也没说明白,求大侠指导,万分感激
发表于 2014-11-24 21:28:15 | 显示全部楼层
首先,明白能用FIFO的地方。
1. 有数据需要从一个模块传递到另一个模块。
2. 一定时间内来计算,输出的模块和输入模块的数据速率是一致的。否则再深的FIFO也没用。

那么FIFO深度计算就很简单了,在一定时间内,写入数据(上一个模块输出数据)减去读出数据(下一个模块能够接受的数据)。
 楼主| 发表于 2014-11-24 21:47:48 | 显示全部楼层
回复 2# acgoal

您好,非常感谢您的回复,可以再请教你一个问题吗?
   如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据

其中w_ck=5ns,r_ck=10ns,那么fifo的深度应该是多少呢?可以详细点说明吗?谢谢

 楼主| 发表于 2014-11-24 22:12:16 | 显示全部楼层
回复 2# acgoal

大侠,我在网上找到的文档,他是下面那样说的//=============================================================
写时钟周期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_clk

//================================================================

可能是因为我比较菜,没看懂他的解释,burst_length和背靠背都不懂,也不明白这些跟那个公式是怎么来的,如果有空的话,可以赐教一下吗?感激不尽

发表于 2014-11-24 22:24:34 | 显示全部楼层
回复 1# qqiummo


    http://blog.chinaaet.com/detail/37555
看下这篇博客吧
发表于 2014-11-25 08:01:14 | 显示全部楼层
本帖最后由 acgoal 于 2014-11-25 19:41 编辑

回复 4# qqiummo

谈一下我的理解:
   burst 就是连续写,这里认为写是通过burst的方式是有一定道理的,因为实际的工程中用到异步FIFO的地方基本上都是,连续写然后空闲一段,再连续写一段,再空闲一段。这里的连续写多少个字节,就是burst length(突发长度),就是一次写突发,写多少字节。   背靠背突发就是两次突发(burst)连起来了,你不理解的地方可能就是,连续两次突发,不如干脆算成一次更长的突发(burst)?可是事实上是会有最差情况连续两次突发。这里有几个前提:
1. 异步设计是ASIC,包括FPGA设计比较难计算的场景,所以很多时候宁愿保守一点。有时候你很难理解人家算的最差情况,介于可能有这种情况出现或者不可能出现这种情况之间。比如说,我是做以太网接口的,这里就有最差两个突发,但是你做别的方面,可能就没这个情况出现。
2. 异步FIFO的读速率一定要比写速率总体来说快,一般来说,这个总体时间是两次突发的时间。在两次突发完成之内,要读完至少第一次突发的数据。
上面解释了burst存在。下面谈谈如何计算异步FIFO深度,公式你已经贴出来了。
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk

burst_lengh你已经了解了。公式里第一个burst length就是在指定时间内写入数据的长度,这个指定时间是多少呢,就是burst_length/w_clk,这么长时间。在这个指定时间内,写入了burst_length长度的数据。
那么在这个时间内,能读多少数据出去呢?长度 = 时间 * 速度,时间是burst_length/w_clk,读速率是多少?就是X/Y*r_clk (每Y个时钟周期会有X个数据读出,X/Y是每个读时钟周期能读出多少数据,再乘以读的时钟周期,就是读速率了)。这样你就知道burst_length *X/Y*r_clk/w_clk是什么意思了吧。

差不多了。不理解的再探讨吧。
发表于 2014-11-25 08:45:08 | 显示全部楼层
:P :P :P :P :P :P :P :P :P :P
发表于 2014-11-25 09:29:52 | 显示全部楼层
回复 3# qqiummo


    二楼说得很清楚,一段时间内读写要能匹配,你现在100个w_clk写80个数据,由于周期短,其实只有50个r_clk周期,最多读40个数据,
这样积累下去,FIFO一定溢出的。
发表于 2014-11-25 09:40:37 | 显示全部楼层
云里雾里
 楼主| 发表于 2014-11-25 21:25:33 | 显示全部楼层
本帖最后由 qqiummo 于 2014-11-25 23:51 编辑

回复 6# acgoal
非常感谢您的解答,我还有一点小疑问想请教一下,
   1、“异步FIFO的读速率一定要比写速率总体来说快,一般来说,这个总体时间是两次突发的时间。在两次突发完成之内,要读完至少第一次突发的数据”这一句我不太明白,       异步FIFO的读速率不是应该比写速率慢吗?
       为什么读速率一定要比写速率总体快呢?
       假如FIFO读速率比写速率总体来说要慢,那么会发生什么情况呢?
       还有”写速率总体”指的是?
   2、看完您写的公式的原理,我焕然大悟,但是还是觉得,那个公式是有问题的,因为
      假设r_clk是读周期(就是读一个1个数据需要的时间);w_clk是写周期(就是写一个数据需要的时间),我觉得
      (1)写burst_length的时间应该是burst_length*w_clk,即写burst_length个数据需要的时间;
      (2)1/r_clk 就是一秒钟连续读能读的数据的个数,那么读速率应该是(X/Y)*(1/r_clk);公式不就应该是

      fifo_depth = burst_length - burst_length * w_clk*(X/Y)*(1/r_clk)
               = burst_length - burst_length * (X/Y)*(w_clk/r_clk)才对;
  而不是

     fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk,或者那个公式中的r_clk,w_clk指的是读写频率?
不知道我这样理解有没有错呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 02:08 , Processed in 0.035601 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表