异步fifo的最小深度计算在FPGA相关岗位面试中经常出现
-
计算原理:
fifo的填满时间 >= fifo的写入时间
通俗来说就是,fifo的写入期间fifo都没有被填满的话,整个fifo就不会满,深度设计就满足要求。其中:
fifo的填满时间 = fifo深度 / 填充速度;
fifo的写入时间 = 写入数据量 / 写入速度;
这里只考虑写快读慢的场景:
填充速度 = 写时钟频率 - 读时钟频率;
写入速度 = 写时钟频率;
所以可以推导出:
fifo深度_min =写入数据量 / 写时钟频率 * (写时钟频率 - 读时钟频率);
-
问题扩展
再考虑更复杂场景,如果写入数据流在一定周期内不均匀(例如,每100个写时钟周期写80个数,那么就涉及到最恶劣的情况就是,两个100个时钟周期的80个数连在一起写入,也就是160个数据写入fifo),这时引入wr_burst(例中wr_burst =160);情况就可以扩展如下:
设写入时钟为wr_clk,每A个周期写B个数(实际在计算中没有使用AB两个变量,wr_burst代替),读出时钟为rd_clk,每C个时钟读D个数,最恶劣的情况就是连续写wr_burst个数,求fifo的最小深度,带入以上的公式可得:
fifo_depth_min = wr_burst / wr_clk * (wr_clk- 等效读时钟频率);
注意这里使用的是等效时钟频率,因为可能不是每个读时钟都读出数据:
等效读时钟频率 = rd_clk * D/ C;
带入公式可得:
fifo_depth_min= wr_burst / wr_clk * (wr_clk - rd_clk * D / C);
-
例子
写时钟100M,每100个写周期写80个数,读时钟80M,每个时钟周期都往外读数据,求异步fifo的最小深度。
带入以上公式可得fifo_depth_min = 160 / 100M *(100M - 80M * 1/1) =32;