前言
本来打算整理一下自己的学习笔记,但是前辈们的笔记已经很详细了,所以就直接摘录了,所有来源均已标注。
笔试面试考点:fifo最小深度计算
对于异步FIFO而言,因为读写时钟和读写的位宽可能不一样,从而导致我们在设计异步fifo时需要考虑会不会出现一次写入太多数据,导致出现fifo写满但数据还向fifo输入数据这种情况(此时FIFO写满了数据是没法把数据写进fifo中的,但是数据仍继续输入过来就只能导致数据丢失了)。
当然,讨论fifo最小深度有两个隐含前提,
1)数据输入速率大于读数据速率,注意这里不是FIFO读写速率,而是数据输入与被读的速率,毕竟FIFO只是一个缓存,真正把控数据读写的还是工程师们。
2)FIFO写和读的数据吞吐量相同,即一段时间内FIFO写入与读出的数据要相同。假设FIFO写吞吐量更大一下, 那fifo迟早会有写满的时候,那时候数据仍在输入,就导致数据丢失。
笔试面试中有以下几个考察方式:
1)写时钟频率为100MHz,读时钟频率为200MHz。读写位宽一致。每100个时钟写入60个数据,每10个时钟读出3个数据。
首先,计算读写吞吐量,即单位时钟写入/读出数据量,写入带宽为(60/100)100MHz=60MHz;
读取带宽为(3/10)200MHz。两者相等则可以进行下一步计算,否则写吞吐量大于读则最小深度为无限大,读吞吐量大于写吞吐量,则最小深度为1即可。
何为最小深度?即为在最坏的读写情况下我FIFO都能保证数据不溢出的深度即为最小深度。
这种最坏的情况是“背对背写入”,即100个时钟最后的60个时钟连续写入,下一次的100个时钟前60个时钟连续写入,那这样会连续写入120个数据,而写入这120个数据需要的时间为:120(1/100MHz)=1200ns。
这段时间读出了多少数据呢?
首先计算1200ns有多少个读时钟,平均每个读时钟读了多少个数据出去。
即1200ns200MHz*(3/10)=72个数据,则此时FIFO种有120-72=48个数据,这是在最坏情况下的FIFO存留的数据个数,因此这种情况下FIFO的最小深度为48个数据,如果FIFO最小深度比48还小,则会导致读写失衡,FIFO写满了但数据还向FIFO输入。
2)上面针对的是读写位宽相同的情况,先假设写时钟频率为100MHz,读时钟频率为200MHz。写位宽为10bit,读位宽为5bit。每100个时钟写入60个10bit数据,每100个时钟读出x个数据。
2.1)问读写吞吐量一样的时候,x值为多少?
首先是写入带宽(6010/100)100MHz=600bitMHz
读取带宽=600bitMHz=(x5/100)200MHz,解的x=60。即每100个时钟读出60个5bit数据才能保证读写吞吐量相同。
当然我们也可以认为每100个时钟写入600bit数据,每100个时钟读出300bit数据。同理,写入1200个数据要用120个写时钟,即1200ns。
则1200ns会读出1200ns200MHz(300/100)=720个1bit数据
这样FIFO最小深度=1200-720=480个1bit数据。
这样我们得出结论:对于读写不同位宽的,将其转换为1bit即可。
3)A/D采样率为100MHz,读A/D速率为80MHz,要将10万个单bit采样数据送入FPGA,至少需要在A/D和FPGA之间加多大深度的FIFO才能保证数据不丢失?
这里已经告诉我们总的数据量了,10W单bit数据,假设我们最坏的情况就是连续写入10W个数据,
则写一个数据所需时间为: 1/100MHz = 0.0110e-6 s (这里10e-6表示10的负6次方,下同)
写完10万个数据需要时间为: 10e5 * 0.0110e-6=0.001 s
读一个数据需要

最低0.47元/天 解锁文章
1222

被折叠的 条评论
为什么被折叠?



