作者:FPGA入门到精通
异步FIFO(First In First Out,先进先出)是一种关键的数据缓冲结构,广泛应用于跨时钟域之间传输数据。
异步FIFO的深度计算问题在FPGA笔试题中出现频率非常高。
本文将详细探讨异步FIFO深度的计算方法,并结合多个案例进行分析。
一、异步FIFO的基本概念
1、异步FIFO的作用
异步FIFO能够在不同时钟域之间提供数据缓冲,解决数据流速不匹配的问题,保证数据传输的连续性和完整性。
2、异步FIFO的组成
异步FIFO通常由以下几部分组成:
(1)存储数据的介质
LUT/BRAM/Distributed-RAM/URAM。
(2)写地址指针和读地址指针
分别指示数据写入和读取的位置。
(3)控制逻辑
管理FIFO的读写操作及状态信号。
3、异步FIFO深度的重要性
(1) 深度对性能的影响
FIFO的深度决定了其缓冲数据的能力。
深度不足可能导致数据丢失,而深度过大则可能造成资源浪费。
(2)深度对资源的消耗
FIFO深度的增加会占用更多的FPGA内部存储资源,比如Block RAM,影响设计的成本和复杂性。
二、异步FIFO深度的计算方法
1、理论基础
FIFO深度的计算基于数据的写入速率、读取速率以及数据传输的最大burst长度。
(1) 计算公式
a、写比读快
关键在于计算出最恶劣的情况下,在突发读写这段时间内,有多少数据没有被读取。
FIFO 的最小深度 D 可以通过以下公式计算:
D = Bw - Br = Bw - Bw * fr/fw
其中,Bw和Br分别为写入和读取的burst长度,fw和fr分别为写时钟和读时钟的频率。
b、读写同速或读比写快
只起到跨时钟域传输数据的作用,FIFO深度设成最小即可。
(2)实际应用中的考虑
在实际应用中,需要考虑时钟相位差异、数据位宽、传输效率等因素,并在计算出的最小深度基础上增加适当的余量。
一般会选择接近该值的2的幂次方。
2、异步FIFO深度计算的案例分析
案例一:AD采样率为50MHz,FPGA读数据速率为40MHZ,需要5万个采样数据完整的送入FPGA,在AD和FPGA之间FIFO缓存的最大深度?
计算过程:
突发读写数据量:50000个
写数据时钟:50MHz
读数据时钟:40MHz
则FIFO的最小深度为:
50000(1 - 40/50) = 10000
案例二:假设FIFO写时钟频率为100MHz,读时钟频率为80Mhz:
① 传输1000个数据,FIFO最小深度是多少?
FIFO的最小深度:
1000*(1 - 80/100) = 200
② 100个写时钟下写入80个数据,1个读时钟读取1个数据,FIFO的最小深度是多少?
最恶劣情况分析:
100个写时钟下写入80个数据,也就是有80个有效时钟写数据,20个空闲周期。
那么最恶劣的情况就是,前一个100写时钟的80个有效时钟,与后一个100写时钟的80个有效时钟,挨在一起。
也就是一次写入了160个数据。
FIFO最小深度计算:
160*(1 - 80/100)= 32
③ 100个写时钟下写入80个数据,3个读时钟读1个数据,FIFO的最小深度是多少?
最恶劣情况分析同上一题,也就是一次写入160个数据。
每3个读时钟读取1个数据,等效于读时钟频率为fr/3时,1个周期读取1个数据。
所以最小深度为
160*(1 - 80/3/100)≈ 117.3333 = 118。
考虑到FIFO深度一般是2的n次幂,可以取128。
④ 100个写时钟写入80个数据,3个读时钟读2个数据,FIFO的最小深度是多少?
最恶劣情况分析同上一题,也就是一次写入160个数据。
每3个读时钟读取2个数据,等效于读时钟频率为fr*2/3时,1个周期读取1个数据。
所以最小深度为
160*(1 - 80*2/3/100)≈ 74.666 = 75。
考虑到FIFO深度一般是2的n次幂,可以取128。