一、异步FIFO
1. 假设两个异步时钟clk_a和clk_b,clk_a=148.5M,clk_b=140M。如图所示,clk_a时钟域中连续1920个16bit的数据通过data_valid标记,有效数据之后,紧接着720个无效数据时钟周期。请问,该数据通过异步fifo同步到clk_b时钟域,异步fifo的最小深度是多少?请写出计算过程。
理解:FIFO不溢出,必须满足输出带宽小于或者等于输入带宽。考虑最恶劣情况(第一个数据周期的1920CLK在周期的后面,第二个数据周期的1920CLK在周期的前面,俗称“背靠背”),即数据全部集中在3840CLK之内(1920+1920)。由于输入带宽148.5MHz*16bit大于出入带宽140MHz*16bit,要想数据不丢失,需要添加FIFO缓存数据。使得单位单位时钟(3840CLK)内输入=输出+FIFO;
在CLK_A时钟域下,时间T1=3840*(1/clk_a)ns;
在CLK_B时钟域下,T1时间一共存在CNT_CLKB=T1/(1/clk_b)=570240/140 ≈ 3620;
在T1时间段内,写入3840个CLK,读出3620个CLK 。所以最少需要缓存3840-3620=220个16bit数据。
二、同步FIFO
同步FIFO,读写时钟相同,每100CLK写入10个数据,每10个CLK读出1个数据,计算FIFO最小深度?
考虑写数据的连续200个CLK周期,前一个100CLK记作TimeA,后一个记作TimeB,写数据的恰好在TimeA的最后和TimeBd 最前,即20个CLK周期发生连续的20次读写,而对应的20个时钟周期读出2个数据,所以这里需要最小的深度20-2=18。