FIFO阈值如何设置

1、       什么是FIFO?

FIFO(first in firstout)是一种用寄存器reg或者RAM实现的存储结构,常用于存储数据通道中的数据流,采用先入先出的数据,当下游模块无法及时处理上流模块输出的数据时,此时需要用FIFO暂存数据,防止数据丢失。

2、       什么是FIFO阈值

FIFO阈值包含将满阈值afull_cnt和将空阈值aempty_cnt,当FIFO内包含的数据data_cnt大于等于afull_cnt时,将满信号有效(afull为1),afull传输给上游模块A,通知上游模块停止发送数据,防止FIFO发送溢出,NOTE:将满阈值afull_cnt的作用是防止FIFO发送溢出导致数据丢失。将空阈值的作用时防止FIFO空的,即FIFO中没有有效数据了还会产生读数据操作。

 

SequenceMatcher设定阈值_FIFO

3、       FIFO将满阈值如何设置

请看下图,数据data和有效信号vld从模块A产生,经过N拍延时,输入到FIFO,FIFO产生将满信号afull,经过M拍延时反馈到模块A,假设模块A接收到afull=1时,立即停止发送数据。假设FIFO深度为depth_fifo,每拍为一个时钟周期。

1为了保证FIFO不发生溢出,请问将满阈值afull_cnt至少应该设置成多少?

2为了充分发挥FIFO的性能,FIFO深度depth应该为多少?

 

SequenceMatcher设定阈值_SequenceMatcher设定阈值_02

FIFO将满阈值如何设置:

1)当FIFO中的数据为afull_cnt时,产生afull=1,

2)Afull=1经过M拍到达模块A,此时FIFO中可能存在的最大数据量为(afull_cnt+M)个数据。

3)Afull=1到达模块A时,模块A立即停止发送数据,此时电路中还存在N拍数据将陆续送到FIFO中,所以最后FIFO中应该为(afull_cnt+M+N)个数据,

4)为了保证数据不会溢出,所以应该满足公式depth_fifo>= afull_cnt+M+N,因此,将满阈值应该至少为depth_fif-(M+N)

FIFO深度depth应该为多少:

若depth_fifo过小,afull有效之后,fifo中存储的数据将很快被下游数据读取,而新的数据又无法及时到达FIFO,因此会造成流水气泡,影响电路性能。

假设M=5 ,N=10,假设depth_fifo=20,则afull_cnt=5, 所以在T时刻,fifo中存了5个数据后afull=1会有效,在之后的15个周期内会陆续存入15个数据。假设下游模块B每个周期读取FIFO中的一个数据,因为当FIFO内的数据data_cnt小于5时,afull才会无效(为0),因此在T+15和T+30的时刻内,下游电路B只能读5个数据,因此会造成数据断流,影响电路性能。

 

SequenceMatcher设定阈值_FIFO阈值_03

为保证电路性能,在T+15到T+30这个时间段内应该有15个数据可读,因此afull_cnt应该不小于15(M+N)。所以FIFO深度应该不小于2*(M+N)