大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
目录
1. 异步FIFO最小深度计算
计算FIFO深度是FIFO设计中常遇到的问题。当异步FIFO读写端口的throught-put(吞吐量)不同时,会遇到数据丢失的问题,这时就需要考虑FIFO的Deepth问题了,即为满足读写流畅不卡顿(数据不丢失)时,FIFO的Deepth的最小值。
计算异步FIFO的最小深度,首先必定是要了解清除应用场景的,这关乎到FIFO的最小深度的计算。FIFO主要是用于数据的缓存,用在读慢写快的场景下。异步FIFO读写不同频,我们选用的FIFO要能够在极端的情况下仍然能够保证数据的不溢出。因此,考虑的前提一般都是读慢写快的情景(写时钟大于读时钟),但需要注意的是,这里的写操作是猝发传输,而不能使连续操作。倘若写快读慢的场景下,写数据流是连续的,那再大的FIFO都会有写满的时候,因此无法避免数据的溢出(下面有一个蓄水的例子)。
当写快读慢时,FIFO便可被用作系统中元件或队列。因此FIFO的大小其实也就暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率 取决于 系统的负载能力 。因此为了保证FIFO的大小,需要考虑FIFO传输的最坏情况。
所谓最坏情况,就是使得写速率最大,读速率最小;通常是考虑猝发传输。
宏观看,整个时间域上,”写数据=读数据”,这个是异步FIFO正常工作最基本的要求,是大前提。由于写快读慢,在发送方”突发传输“的发送数据的T内,是很有可能发送方写数据量>接收方读取的数据量,那么剩下未读取的数据必定需要存储共接收方继续读取并不能丢弃,因此FIFO的深度要能够保证,在这段时间T内,如果接收方未能将发送方发送的数据接收完毕的话,剩下的数据都是可以存储在FIFO内部而且不会溢出的,那么在发送方停止发送数据的”空闲时隙”内,接收方可以从容地接收剩下来的数据。
1.1 异步FIFO最小深度计算原理
速率的概念
想象一个场景,有一个水龙头在不断向下流水,水龙头下放着一口缸在接水,而缸上有一个出水口也在源源不断的出水。假如,水龙头的单位时间进水量大于出水口的出水量,那么缸内就会开始不断的积水。如果水龙头按照这样持续不断的进水,那积水必将越来越多,结果就是无论缸多大,早晚都会盛满溢出的。因此这种供水需要 间歇性 的地往缸里注水(数据的猝发传输)。
全速读写,引起的溢出问题:
同样的道理,如果数据流是在连续不断写,则FIFO无论多大,只要是读写时钟不同源同频就都会丢数(类比可能不太恰当,水缸空了,读空;水缸满了,写数据会覆盖)。这涉及到一个数据的最大连续写长度(一个cycle写一个数据)以保证数据的正确传输即FIFO能够完整传输数据。
那到底如何利用异步FIFO呢?一般数据的传输会以一定格式的数据包,且以一定频率进行传输,而不是永久的连续传输下去。这样的话,就算是写快,读慢,只要保证在写满FIFO之前能把一个数据包发送完毕。
很多场景比较简单,没有考虑性能和资源的问题,只要Deepth合理就行,比如有时候常取Deepth_value= WR_Burst_len*(Wr_clk/Rd_clk),会选取大于Deepth_vlaue最接近的2^N数值,或是直接对Wr_clk/Rclk向上取整。
FIFO常用于缓冲块数据,一般用在写快读慢的情况下,遵循如下规则:
{FIFO深度/(写速率–读出速率)}> {
写入数据量/写入速率}。
本质上就是:
FIFO被填满的时间 > 数据包传送时间(猝发发送的时间)
如此就能确保对FIFO写数据时,不存在overflow ,从FIFO读数据时,不存在underflow。
例: A/D采样速率50Mhz,dsp读A/D的速率40Mhz,要不丢失地将将10万个采样数据送入DSP ,在A/D和DSP之间至少加多大容量的(深度)FIFO才行??(来源网络)
答: Deepth/(50000000-40000000)>(100000/50000000)
即Deepth>10_0000/5=20000。那么最小深度为20k。
一种错误的算法为:
10,0000/4000000 = 1/400s =2.50ms数据包传输时间;Deepth =(50M-40M)*2.5ms=25k,这样算的话,进去的数据就不是100k了,而是100k+50M*(0.0025-0.0002)=125,000个。
introduction
One of the most common questions in interviews is how to calculate the depth of a FIFO. Fifo is used as buffering element or queueing element in the system, which is by common sense is required only when you slow at reading than the write operation.So size of the FIFO basically implies the amount of data required to buffer, which depends upon data rate at which data is written and the data rate at which data is read(FIFO的深度暗示了需要缓冲的数据量,缓冲的数据量取决于写速率和读速率).
Statistically, Data rate varies in the system majorily depending upon the load in the system. So to obtain safer FIFO size we need to consider the worst case scenario for the data transfer across the FIFO under consideration.(统计表明,系统中数据率的变化主要依赖于系统的负载。所以,为了得到安全的FIFO 深度,在设计时,我们需要考虑跨FIFO的数据传输的最坏情况)。
For worst case scenario, Difference between the data rate between write and read should be maximum. Hence, for write operation maximum data rate should be considered and for read operation minimum data rate should be considered. So in the question itself, data rate of read operation is specified by the number of idle cycles and for write operation, maximum data rate should be considered with no idle cycle.
So for write operation, we need to know Data rate = Number of data * rate of clock. Writing side is the source and reading side becomes sink, data rate of reading side depends upon the writing side data rate and its own reading rate which is Frd/Idle_cycle_rd.In order to know the data rate of write operation, we need to know Number of data in a Burst which we have assumed to be B.
So following up with the equation as explained below: Fifo size = Size to be buffered = B – B * Frd / (Fwr* Idle_cycle _rd ).
即FIFO_DEPTH = Burst_length – Burst_length*rd_clk/(wr_clk*Idle_cycle_rd)。
Here we have not considered the sychnronizing latency(同步处理有延迟) if Write and Read clocks are Asynchronous. Greater the Synchronizing latency, higher the FIFO size requirement to buffer more additional data written.
1.2 异步FIFO最小深度常用计算公式推导
1. 2.1假如读写FIFO是同时进行的
构造一模型:
写时钟:wr_clk;且写时钟周期里,每B个时钟周期会有A个数据写入FIFO;
读时钟:r_clk;且读时钟周期里,每Y个时钟周期里会有X个数据读出FIFO。
读写的Busrt_len: 相同,都为Burst_len。
那么FIFO要求的最小深度为?
答:首先,这一题目并不一定是有解的,有解的前提是要求一定时间内(T),写入的数据量要等于读出的数据量,即A/B*wr_clk =X/Y*r_clk。
然后,要算出写数据的最大猝发长度burst_length,考虑最坏的情况。比如若题目给出的是每100个时钟有80个数据写入FIFO,那么在背靠背的情况下,burst_length=2*80=160。假如题目中明显给出了数据包的传输方式,比如一个package与另一个package相隔很远,也就是互不影响,不会出现这种背靠背的情况。
最后FIFO的最小深度:fifo_depth =Burst_length – Burst_len * X/Y * r_clk/w_clk
BTW:通常,为了安全起见,都会多留一些depth的余度。
FIFO最小深度计算公式推导过程:
核心指导就是上面提到的条件:{FIFO深度/(写速率–读出速率)}> {
写入数据量/写入速率}并且为满足在恶劣条件下工作,需要考虑写最快,读最慢时的情况:
fifo_depth/[wda_width*(wr_clk-rd_clk*X/Y)] > Burst_len / wr_clk*rda_width
一般情况下读写数据位宽一致,则有:
fifo_depth/(wr_clk-rd_clk*X/Y) > Burst_len / wr_clk
整理得: fifo_depth > Burst_len / wr_clk(wr_clk-rd_clk*X/Y)
即 fifo_depth > Burst_len -Burst_len* (rd_clk/ wr_clk)*X/Y
例:如果100 个写时钟周期可以写入80个数据,10个时钟周期可以读出8个数据。令wclk =rclk ,考虑背靠背(20个clk发数据+80clk发数据+80clk发数据+20clk不发数据的共200个clk)代入公式可计算FIFO深度:
fifo_deepth = 160-160*80%=160*128=32。
如果令wclk=200Mhz ,改为100个wclk中写入40个,rclk=100Mhz,10个r_clk中读出8个。那么此时的FIFO最小深度应该为:
fifo_depth = 80-80*
1.2.2 读写FIFO不是同时进行的情况
假如读写FIFO不是同时进行,这就需要设置FIFO深度为写数据最大突发的个数。
2. 异步FIFO最小深度计算实例
设置FIFO的深度,具体需要要根据应用场景而定。
2.1 用于SDRAM中的读写FIFO
在SDRAM应用中,设置一个FIFO的深度,一般为操作数据的两倍就够了。比如SDRAM全页读写256,那对应深度为512。因为SDRAM读写速度肯定快于FIFO写速度,和后面FIFO的读速度,因此SDRAM前后操作总体速率一致。
2.2异步时钟数据接口
用于异步时钟域数据接口,假如读写同时进行的,一般情况设置 的FIFO就是写时钟大于读时钟。这个时候设置FIFO的深度就要对应两个时钟以及对应写最大的突发数据。
假设写时钟频率为40Mhz,读时钟为25Mhz,且在写端最大的突发写数据个数为100个数据。那么深度计算为:100-100*(2 /40)=37.5则对应深度至少为38。
3.FIFO实例
例:一个8bit宽的AFIFO,输入时钟为100Mhz,输出时钟为95Mhz,设一个package为4Kbit,且两个package之间的发送间距足够大。求AFIFO的深度。
答:足够大说明相邻的两次传输不会相互影响,只需要考虑一个package;
猝发长度计算:若burst_length =4000/8=500,厂商惯用算法为1Kbit=1024bit ,故burst_length = 4*1024/8=512;
计算模块 fifo_depth = burst_length – burst_length*(X/Y)*(r_clk/w_clk)
因为X和Y的值没有给出,所有默认为1。
可得depth1 =4000/8-(4000/8)*(95/100)=25。或depth =512-512*(95/100) =25.6,所以fifo_depth最小值为26
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170184.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...