简介:
异步FIFO(先进先出)是芯片设计中常见的组件,用于跨时钟域的数据缓存,保证数据传输的稳定性和可靠性。然而,如何确定FIFO的深度,即存储单元的数量,却是一个棘手的问题。深度过小会导致数据丢失,深度过大则会浪费资源。因此,需要根据具体的应用场景和设计需求,选择合适的FIFO深度。
01
应用场景
异步FIFO主要用于解决跨时钟域的数据传输问题。在芯片设计中,不同的模块可能工作在不同的时钟域,例如CPU、DSP、外设等。由于时钟频率不同,数据传输可能会出现时序问题,导致数据丢失或错误。异步FIFO可以作为缓冲区,将数据暂存起来,保证数据传输的稳定性和可靠性。
02
计算方法
异步FIFO深度计算方法主要有两种:
已知读写带宽,求FIFO深度
这种方法适用于已知读写带宽的情况,例如读写频率、位宽等。我们可以计算在特定时间段内写入的数据量与读出的数据量之差,从而确定FIFO的最小深度。
假设一个场景,写时钟频率为200MHz,读时钟频率为100MHz,读写位宽均为32bit。已知每100个写时钟周期最多写入960bit数据,读每个时钟周期读取一个数据。我们需要计算FIFO的最小深度,以避免数据丢失。
最恶劣的情况是连续写入数据,而读无法及时读取,导致FIFO满溢。我们可以计算在一段时间内写入的数据量与读出的数据量之差,从而确定FIFO的最小深度。
写时钟周期 Twr为 5ns,读时钟周期 Trd为 10ns。
假设连续写入时间为 300 个写时钟周期,即 1.5μs。
在这段时间内,写入数据个数 Nwr为300。
读出数据个数 Nrd为 (120×Twr)/Trd = 150。
因此,FIFO深度 x 至少为 Nwr - Nrd = 150。
由于FIFO深度只能取2的整数次幂,因此最小深度为 28 = 256。
保证数据连续输出,求缓存数据量
这种方法适用于需要保证数据连续输出的场景,例如读取固定长度数据包。我们需要计算在读取数据期间,写入的数据量加上已缓存的数据量要大于等于数据包长度,从而确定FIFO至少需要缓存多少数据才能开始发送。
假设另一个场景,写入时钟频率为100MHz,读取时钟频率为50MHz,数据位宽为8byte。写侧连续写入长度为512Byte的数据包,数据包之间可能存在Gap气泡。我们需要计算在保证数据包SOP/EOP输出连续不间断的情况下,FIFO至少需要缓存多少数据才能开始发送。
为了保证数据连续输出,需要在读取8192Byte数据期间,写入的数据量加上已缓存的数据量要大于等于512Byte。
写时钟周期 Twr为 10ns,读时钟周期 Trd 为20ns。
读取512Byte数据需要的时间 t 为 512 × Trd = 10.24μs。
写入数据个数 Nwr 为 (10.24×10−6)/(10×10−9)= 1024。
为了保证数据连续输出,FIFO深度x需要满足Nwr + x > 512,即 x > 512。
因此,FIFO深度最小应为 29 = 512。
03
影响因素
除了读写带宽和数据包长度之外,还有其他因素会影响异步FIFO深度计算,例如:
时钟域的同步问题:时钟域的同步问题会导致数据传输延迟,从而影响FIFO的深度计算。
FIFO的读写控制逻辑:FIFO的读写控制逻辑会影响数据传输的效率,从而影响FIFO的深度计算。
数据包的长度变化:数据包的长度变化会导致写入数据量的变化,从而影响FIFO的深度计算。
FIFO的读空/写满标志:FIFO的读空/写满标志会影响数据传输的控制逻辑,从而影响FIFO的深度计算。
注意事项:
留有余量:为了避免数据丢失,需要在计算出的FIFO深度基础上留有一定的余量。
考虑数据传输的波动性:数据传输的波动性会导致写入数据量的变化,从而影响FIFO的深度计算。
考虑FIFO的功耗和面积:FIFO的功耗和面积与FIFO深度有关,需要在性能和成本之间进行权衡。