FIFO的Verilog设计(三)——最小深度计算

发布时间:2023年12月17日


FIFO的设计可参考
FIFO的Verilog设计(一)——同步FIFO
FPGA的Verilog设计(二)——异步FIFO
参考文献
[1]FIFO最小深度计算

前言

??在实际使用FIFO时,需要考虑FIFO的深度如何设置,如果深度设置不当,可能会出现资源浪费或者数据丢失等情况。下面将简要介绍FIFO的最小深度如何计算。

一、FIFO的最小深度

??由前两篇文章对FIFO的介绍,FIFO常用于数据缓存、数据匹配和多bit跨时钟域处理。
??因此在读写速度不匹配的时候可以使用FIFO,进行数据缓存。当读速度慢于写速度时,FIFO可作为一个缓存单元。此时总会有部分数据缓存在FIFO中,但是如果读写速度相差过大,就会导致数据溢出。所以在写速度最大、读速度最小时,正好不导致FIFO出现数据溢出的最小深度。当读速度快于写速度时,FIFO更多的是起着变换时钟域的作用。

写速度快于读速度

??FIFO写速度快于读速度模型的应用场景为,无论是数据需不需要跨时钟域,只要FIFO写速度快于读速度,FIFO写入一个数据需要 t 1 t_1 t1?秒,读出一个数据需要 t 2 t_2 t2?秒( t 1 < t 2 t_1<t_2 t1?<t2?),一共需要传输 n n n个数据
??FIFO写入n个数据的时间为 n t 1 nt_1 nt1?,FIFO在 n t 1 nt_1 nt1?时间内读出数据个数为 n t 1 t 2 \frac{nt_1}{t_2} t2?nt1??,此时FIFO中剩余数据个数 ? n ? n t 1 t 2 ? \lceil n-\frac{nt_1}{t_2} \rceil ?n?t2?nt1???

写速度等于或慢于读速度

??FIFO写速度等于或慢于读速度模型的应用场景为,在多bit数据需要变换时钟域情况下,FIFO的最小深度设置为1即可。因此FIFO只是起着变换时钟域的作用。

二、 举例说明

1. FIFO写时钟为100MHz,读时钟为80Mhz

情况一:一共需要传输2000个数据,求FIFO的最小深度

??FIFO写入一个数据需要 t 1 = 1 100 M t_1=\frac{1}{100M} t1?=100M1?s,读出一个数据需要 t 2 = 1 80 M t_2=\frac{1}{80M} t2?=80M1?s
??FIFO写入2000个数据需要的时间 n t 1 = 2000 100 M nt_1=\frac{2000}{100M} nt1?=100M2000?s
??FIFO在 n t 1 nt_1 nt1?时间内读出数据个数为 n u m r d = n t 1 t 2 = 2000 ? 80 M 100 M = 1600 num_{rd} = \frac{nt_1}{t_2} = \frac{2000*80M}{100M} = 1600 numrd?=t2?nt1??=100M2000?80M?=1600
??此时FIFO剩余数据个数为 n u m = 2000 ? n u m r d = 2000 ? 1600 = 400 num = 2000 - num_{rd} = 2000-1600 = 400 num=2000?numrd?=2000?1600=400
??可得FIFO最小深度为400。

情况二:100个时钟写入80个数据,1个时钟读1个数据,求FIFO的最小深度

??FIFO写入一个数据需要 t 1 = 1 100 M t_1=\frac{1}{100M} t1?=100M1?s,读出一个数据需要 t 2 = 1 80 M t_2=\frac{1}{80M} t2?=80M1?s
??100个时钟写入80个数据,可以理解为80个有效写时钟和20个无效写时钟。
在这里插入图片描述

??此为突发读写情况,需要考虑什么时候突发写的数据最多。当前后两个100时钟的突发写是连续时,突发写的数量最多,如下图所示
在这里插入图片描述

??FIFO写入160个数据需要的时间 n t 1 = 160 100 M nt_1=\frac{160}{100M} nt1?=100M160?s
??FIFO在 n t 1 nt_1 nt1?时间内读出数据个数为 n u m _ r d = n t 1 t 2 = 160 ? 80 M 100 M = 128 num\_rd = \frac{nt_1}{t_2} = \frac{160*80M}{100M} = 128 num_rd=t2?nt1??=100M160?80M?=128
??此时FIFO剩余数据个数为 n u m = 160 ? n u m _ r d = 160 ? 128 = 32 num = 160 - num\_rd = 160-128 = 32 num=160?num_rd=160?128=32
??可得FIFO最小深度为32。
??note:诀窍在于找出最大连续写入的数据量。

情况三:100个时钟写入80个数据,3个时钟读1个数据,求FIFO的最小深度

??FIFO写入一个数据需要 t 1 = 1 100 M t_1=\frac{1}{100M} t1?=100M1?s,读出一个数据需要 t 2 = 3 ? 1 80 M t_2=3*\frac{1}{80M} t2?=3?80M1?s
??同上情况,FIFO最大连续写入的数据量,写入160个数据需要的时间 n t 1 = 160 100 M nt_1=\frac{160}{100M} nt1?=100M160?
??FIFO在 n t 1 nt_1 nt1?时间内读出数据个数为 n u m _ r d = n t 1 t 2 = 160 ? 80 M 3 ? 100 M = 42.67 num\_rd = \frac{nt_1}{t_2} = \frac{160*80M}{3*100M} = 42.67 num_rd=t2?nt1??=3?100M160?80M?=42.67
??此时FIFO剩余数据个数为 n u m = 160 ? n u m _ r d = 160 ? 42.67 = 117.33 num = 160 - num\_rd = 160-42.67 = 117.33 num=160?num_rd=160?42.67=117.33
??可得FIFO最小深度为 ? 117.33 ? = 118 \lceil117.33\rceil=118 ?117.33?=118,可以设置成2的幂次方128。

三、什么情况下不太需要考虑FIFO的最小深度

??何时不用过分考虑FIFO的最小深度?在数据发送端如果能够接受FIFO的空满信号反馈时可以设置个大概的深度即可。利用FIFO的空满信号(或者almost_full/almost_empty)的反馈来控制FIFO的读写使能能够有效解决数据的溢出。

文章来源:https://blog.csdn.net/weixin_51116586/article/details/134961292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。