请教一下同步fifo及异步fifo深度的计算原理及方法
首先,明白能用FIFO的地方。
1. 有数据需要从一个模块传递到另一个模块。
2. 一定时间内来计算,输出的模块和输入模块的数据速率是一致的。否则再深的FIFO也没用。
那么FIFO深度计算就很简单了,在一定时间内,写入数据(上一个模块输出数据)减去读出数据(下一个模块能够接受的数据)。
您好,非常感谢您的回复,可以再请教你一个问题吗?
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据
其中w_ck=5ns,r_ck=10ns,那么fifo的深度应该是多少呢?可以详细点说明吗?谢谢
大侠,我在网上找到的文档,他是下面那样说的//=============================================================
写时钟周期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和背靠背都不懂,也不明白这些跟那个公式是怎么来的,如果有空的话,可以赐教一下吗?感激不尽
http://blog.chinaaet.com/detail/37555
看下这篇博客吧
谈一下我的理解:
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是什么意思了吧。
差不多了。不理解的再探讨吧。
:P :P :P :P :P :P :P :P :P :P
二楼说得很清楚,一段时间内读写要能匹配,你现在100个w_clk写80个数据,由于周期短,其实只有50个r_clk周期,最多读40个数据,
这样积累下去,FIFO一定溢出的。
云里雾里
非常感谢您的解答,我还有一点小疑问想请教一下,
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指的是读写频率?
不知道我这样理解有没有错呢?
楼上的公式是对的
第一个问题:异步FIFO如果始终读比写慢的话,那么FIFO一定会溢出。所以总体来说,写入FIFO的数据,一定能够在一定时间内读完,所以肯定读要快,哪怕是快一点点也是快,对不对。这里“总体”我写的含糊,没啥具体含义的。
第二:你研究的挺仔细的,我倒是没注意到这一点,我们平常算法不会这么抠这个(不够学术化),简单来说,在写burst_length这么多数据的时间内,能读出去多少,这两个值一减,就得到FIFO的深度,做工程的时候,一般会再留点裕量,确保不会出问题。这个裕量就靠估计了,芯片资源紧张的,少估一点,资源宽松的,多放一点。另外,异步FIFO的深度,因为要格雷码,所以要是4,8,16,32,以此类推,所以,我们一般算的深度不大可能正好就是这个深度,所以一般都会放大到2的幂次方深度。
总之,异步FIFO深度计算这种题目,水很深的
我举个例子给你,我曾经出过一个笔试题目,设计一个弹性FIFO(Elastic FIFO),已知网络数据包最大长度1兆字节,包与包之间有足够间隔,包间隔不需要push进FIFO,写时钟和读时钟是125M,但是其之间有100个PPM的误差,请问这个读写之间的异步FIFO设计要多深(多少字节)。
这里考察的点大概有:
1. PPM是啥意思。
2. 简单异步FIFO设计的深度计算,
3. 异步FIFO 格雷码要是2的幂次方。
4. 弹性FIFO的特点。
一般的会答出全部答案的学校学生,我觉得挺厉害的了。很多人都看不到这里考察的几个点。能看到1,2就算不错。
请教,结果是 128 吗?
这个题要计算的话是不是需要给出每周期读写数据的位宽呢
不需要给位宽,这种异步fifo,只需要计算出,要buffer多少字节就可以了。
个人看法:如果是每个周期写入一个bit的话,计算结果:1024*1024*8*0.0001,大约八百多吧 ,就取1024了
如果每次写一个字节的话就是你给的128了。
噢噢,题目已经说明了是字节哦,那就是128了 考虑背靠背突发的话是不是还要乘以2了?
读写时钟单位一般都是hz的,需要求个倒数换成单位s的
“包与包之间有足够间隔”
还要考虑elastic buffer的特点。弹性FIFO有什么特点,提示,读写指针间距。
学习了
elasticity buffer有两种工作模式,half full mode 和 empty mode, 如果是half full mode的话,这题可以这样解, 假设elasticity buffer每个cycle写入或者读出一个byte,频率是f, 在half full mode下需要starving或者buffering byte数是1Mx|1/f - 1/(fx(1+-100ppm))|这个值约为100,也就是说需要starving或者buffering 100bytes, 所以总共需要200bytes。考虑到gray就取256
如果是empty mode话,100bytes就够了,可是这个会导致包被切成的小片。
请教为什么第二种模式会导致包被切成小片 而第一种模式不会呢?
非常详细
路过 学习一下
那请问一下读时钟比写时钟快,但是读数据位宽比写数据位宽大,该怎么计算呢?
例如读时钟为100MHZ,写时钟为400MHZ,读数据位宽为256bit,写数据位宽为64bit,一个package为4096个64bit的数据,这个该怎么算呢?
精辟!
同样不太懂
你指的弹性buffer的特点是不能空也不能满吗
不太明白,一定时间内,如果读比写快,那为什么还要buffer,如果读写两端同时操作(读的控制只要非空就读),那不是应该会被读空吗?
