赞
踩
核心思路:在规定时间内读的数据要等于写的数据,写快读慢的情况下,突发burst写入的数据减去该burst时间内读出的数据,多余的数据需要能缓冲下来,让接收端在剩下空闲的时间能把多余的数据读出来。burst length=写的数据=读的数据+FIFO深度
计算方法:先得到突发长度burst length,即一段数据包的数据个数,再计算写数据的用时time,再计算time内读了n个数据,最后深度=burst length-n
主要变量是读写时钟频率,读写使能频率。
例1. fA > fB 读写之间没有空闲周期
写速率fA = 80MHz
读速率fB = 50MHz
突发长度Burst Length = 120
(读写之间没有空闲周期,意味着连续读写,即读/写使能周期=时钟周期)
Sol:
写一个数据需要的时间 = 1 / 80MHz = 12.5ns
写一个burst length需要的时间time = 120 * 12.5ns = 1500ns
读一个数据需要的时间 = 1 / 50MHz = 20ns
time内读出多少个数据,1500 / 20 = 75
剩下的没有读出,就存在FIFO中,则需要120 - 75 = 45
所以这种情况下,需要的FIFO最小深度为45
例2. fA > fB 在两个连续读写之间有一个周期的延迟(读/写使能占比相同)
Sol:
即2个周期写一个数据,造成写1个数据的时间比例1翻倍=25ns。读同理
其余和例1一样
例3. fA > fB,读写空闲周期(IDLE Cycles)不同
写速率fA = 80MHz
读速率fB = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1(或者说写使能占得百分比为 = 50% )
两个连续读取之间的空闲周期为 = 3(读使能占得百分比为 = 25%)
Sol:
两个连续写入之间的空闲周期为1的意思是,每写入一个数据,要等待一个周期,再写入下一个数据。这也可以理解为每两个周期,写入一个数据。
写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns
写一个突发需要的时间 = 120 * 25ns = 3000ns
读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns
3000ns内读出可以多少个数据,3000 / 80 = 37.5
剩下的没有读出,就存在FIFO中,则需要120 - 37.5 = 82.5 约等于 83
例4. fA ≤ fB 读写操作无空闲周期(或每两个连续读写之间有一个周期延迟)
读取速率大于写入速率,FIFO永远不会被写满,FIFO深度为1就行。如果读写时钟为同一个时钟,则可以不需要FIFO,如果读写时钟存在相位差,FIFO深度为1足够。
例5. fA < fB 读写操作有空闲周期(但平均分配)
写速率fA = 30MHz
读速率fB = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1
两个连续读取之间的空闲周期为 = 3
Sol:
写一个数据需要的时间 = 2 * (1 / 30MHz) = 66.667ns
写一个突发需要的时间 = 120 * 66.667ns = 8000ns
读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns
8000ns内读出可以多少个数据,8000 / 80 = 100
剩下的没有读出,就存在FIFO中,则需要120 - 100 = 20
例6. (读写空闲周期不平均分配)读写速率相等
每100个时钟写入80个数据
每10个时钟读取8个数据
突发长度为160
(原文Case9过程有误)
Sol:
写速率的其他20个周期的位置是随机的。所以就有了下面几种情况。
考虑的最坏的情况,即写数据速率最大,读数据速率最小。
写操作最坏得情况是Case-4 ,即两次连续的突发写入,又称“背靠背”。
即写入160个数据用时160个时钟周期。
每个时钟读取的数据个数 = 8 / 10
所以160个时钟读出数据的个数为 160 *(8/10) = 128
剩下的没有读出,就存在FIFO中,则需要深度为:160 - 128 = 32
注意:不管读8个数据在10个时钟内是怎么分布的,都不影响结果。但如果条件改成“每100个时钟读取80个数据”,结果就不一样了。
例7.(读写空闲周期不平均分配)
写入时钟20MHz
读出时钟40MHz
每1000个时钟周期写入500个数据
每4个时钟周期读出1个数据
读写数据位宽一致。
Sol:
考虑到“背靠背”的情况突发长度则为500 * 2 = 1000
则为每1000个时钟周期写入1000个数据
写一个数据需要的时间 = 1 / 20MHz = 50ns
写一个突发需要的时间 = 1000 * 50ns = 50000ns
读一个数据需要的时间 = 4 * (1 / 40MHz) = 100ns
50000ns内读出可以多少个数据,50000 /100 = 500
剩下的没有读出,就存在FIFO中,则需要1000- 500 = 500
例8. A/D采样率50MHz,dsp读A/D读的速率40MHz,要不丢失地将10万个采样数据送入DSP,在A/D在和DSP之间至少加多大容量(深度)的FIFO才行?
解:length=10W
写1个数据用时 1/50M=20ns
写length用时 20*10W=200Wns
读1个数据用时 1/40M=25ns
time内读了几个数据:200W/25=8W
需要FIFO深度=2W
主要参考
知乎-硅农
——————————————————————————
例1. 有1个 FIFO,其位宽是 16 位,写时钟为 100 MHz,读时钟为 80 MHz。写平均速率是 400 Mbit/s,读平均速率是 640 Mbit/s。经过分析使用的场合,发现 100 μs 内最多会有3 200 bit 数据进来,而读使能平均速率是 640 Mbit/s,但有时候会连续不读数据。请问,FIFO 的深度设置多少合理?
解:最恶劣的场景∶第 1个100 μs 周期内的最后 200 个写时钟和第 2 个100 μs 周期内前 200 个写时钟连续来数据,即连续 400 个写数据有效,同时只写不读,因此 FIFO 要保存全部写进来的数据,则深度要大于400
现实中经常会有这种应用场景;读平均速率比写平均速率大,但下游模块要求读出的报文数据必须连续不间断,即从 sop 到 eop 数据是一直有效的。这个时候就需要先将进来的数据保存到 FIFO,当积累到一定量时,才连续读出数据,形成不间断的报文。这个积累的量就是发送水线。
例2. 某个以太网模块,数据位宽为 8 bit,写工作时钟是 80 MHz,写速率是 640 Mbit/s,读时钟是 100 MHz,读速率是 800 Mbit/s。假设输入的报文均是 8 192 B,且一旦开始输入一个报文,则连续不断输入。要求输出的报文都是连续不间断的。请问发送水线为多少是最合理的(存够多少数据才开始发送)?
解:与前面的例题不同,改为基于读的速率计算需要的time
length=8192
读1个数据用时 1/100M
读length用时 8192*(1/100M)
写1个数据用时 1/80M
time内写了几个数据:8192*(80/100)=6553.6
需要FIFO深度=8192-6553.6=1638.4 取1639
————————————————————————————
下面是真实的面试题目,待复习时整理
参考
https://blog.csdn.net/u011412586/article/details/10241585/
https://zhuanlan.zhihu.com/p/355887359
https://blog.csdn.net/fengxiaocheng/article/details/81385202?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242
https://blog.csdn.net/times_poem/article/details/51917648
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。