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

文章目录


FIFO的设计可参考
FIFO的Verilog设计(一)------同步FIFO
FPGA的Verilog设计(二)------异步FIFO

参考文献

1FIFO最小深度计算

前言

  在实际使用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} t2nt1,此时FIFO中剩余数据个数 ⌈ n − n t 1 t 2 ⌉ \lceil n-\frac{nt_1}{t_2} \rceil ⌈n−t2nt1⌉。

写速度等于或慢于读速度

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

二、 举例说明

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

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

  FIFO写入一个数据需要 t 1 = 1 100 M t_1=\frac{1}{100M} t1=100M1s,读出一个数据需要 t 2 = 1 80 M t_2=\frac{1}{80M} t2=80M1s

  FIFO写入2000个数据需要的时间 n t 1 = 2000 100 M nt_1=\frac{2000}{100M} nt1=100M2000s

  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=t2nt1=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=100M1s,读出一个数据需要 t 2 = 1 80 M t_2=\frac{1}{80M} t2=80M1s

  100个时钟写入80个数据,可以理解为80个有效写时钟和20个无效写时钟。

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

  FIFO写入160个数据需要的时间 n t 1 = 160 100 M nt_1=\frac{160}{100M} nt1=100M160s

  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=t2nt1=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=100M1s,读出一个数据需要 t 2 = 3 ∗ 1 80 M t_2=3*\frac{1}{80M} t2=3∗80M1s

  同上情况,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=t2nt1=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的读写使能能够有效解决数据的溢出。

相关推荐
ALINX技术博客19 小时前
【期刊共读】如何应对 FPGA 短缺常态?
嵌入式硬件·fpga开发·fpga
156082072191 天前
短波接收机灵敏度测试
fpga开发
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.6 逻辑设计与状态机
fpga开发
LCG元1 天前
【实战】Vivado FPGA 从零实现 UART 串口收发:波特率生成、状态机设计与仿真调试
fpga开发
郭郭的柳柳在学FPGA1 天前
紫光DDR3工程仿真遇到的坑
fpga开发
国科安芯2 天前
ASC8T245S:把 8 位并行总线稳稳“跨过“电压域的双电源收发器
网络·分布式·单片机·嵌入式硬件·fpga开发·架构
HUSTCH20212 天前
DW IP详解
fpga开发
明德扬2 天前
Xilinx下载文件里的BIT、BIN、MCS有什么区别?先分清JTAG配置和Flash启动
fpga开发·fpga
IT信息时代2 天前
FPGA技术未来竞争发展出路
fpga开发
昆山森启智能科技有限公司2 天前
FPGA控制器
fpga开发