推荐答案
测试一下
题目
假设两个异步时钟clk_a和clk_b,clk_a=148.5M,clk_b=140M。如图所示,clk_a时钟域中连续1920个16bit的数据通过data_valid标记,有效数据之后,紧接着720个无效数据时钟周期。请问,该数据通过…
参考答案与知识点
参考答案
我们分析:异步FIFO最小深度计算。已知clk_a=148.5MHz,clk_b=140MHz。连续1920个有效数据(每个数据16bit),之后有720个无效时钟周期(即没有有效数据)。要求计算异步FIFO的最小深度。
注意:题目描述“连续1920个16bit的数据通过data_valid标记,有效数据之后,紧接着720个无效数据时钟周期。”所以数据是以burst方式发送:1920个有效数据,然后720个无效周期。这个模式重复?题目只说了“该数据”可能指的是这样一个周期。但通常我们考虑最坏情况:在clk_a域连续写入1920个数据,写入速率是148.5M,每时钟写入一个数据(因为data_valid标记有效)。写时钟周期T_w = 1/148.5M s。写1920个数据所需时间 = 1920 * T_w。读时钟频率140MHz,读时钟周期T_r = 1/140M s。读速率:在clk_b域,需要读取这些数据,但读使能如何?通常异步FIFO的读侧由读时钟控制,读使能可以是连续有效(假设读使能一直有效)。但题目没有明确读使能条件,通常我们按照读写速率计算所需深度,考虑最坏情况:写侧连续写入1920个数据,读侧连续读出,但读时钟频率较慢,所以写入快于读出,需要缓存。
写速率:148.5M数据/秒,但注意是每写时钟写一个数据,数据位宽16bit。读速率:140M数据/秒(假设读使能一直有效)。所以写入比读出快,因为148.5 > 140。在连续写入1920个数据期间,读出的数据数量为:写入时间 * 读速率 = (1920 / 148.5M) * 140M = 1920 * (140/148.5) ≈ 1920 * 0.94276 ≈ 1810.1。即写入1920个数据时,读出约1810个数据,剩余大约110个数据未读出。所以最小深度至少为110?但还需要考虑写入完成后还有720个无效周期,在这段时间内只有读没有写,可以继续读出剩余数据。720个无效周期相当于时间720 / 148.5M,在这段时间内可以读出数量 = (720/148.5M) * 140M = 720 * (140/148.5) ≈ 720 * 0.94276 ≈ 678.8。所以剩余110个数据可以在无效周期内全部读出(因为678 > 110)。因此理论上FIFO深度只需要大于等于最大剩余量,即约110。但这是理想情况,考虑时钟频率的精确比例,以及异步FIFO的格雷码同步等,通常深度取2的幂次且满足安全裕量。但题目问最小深度,可能需计算精确值。
但是注意:实际中异步FIFO深度需要考虑读写时钟频率差异的极端情况,以及背靠背写的情况。这里写使能是连续1920个有效,然后720个无效。那么最坏情况就是连续写入1920个数据,没有更长的连续写入。所以最大写入数据量为1920。读出需要的时间:1920 / 140M ≈ 13.714us,写入时间:1920/148.5M ≈ 12.929us。写入结束时,读出数据量 = 12.929us * 140M ≈ 1810,剩余110。然后在无效周期内,写入停止,读继续,无效周期时间720/148.5M ≈ 4.848us,读可读出4.848us*140M≈678.7,足够读出110,所以深度至少110+1?但注意:FIFO深度必须大于等于写指针赶超读指针的最大差值。在写入期间,最大差值出现在写入完成时,差值为1920 - (写入时间内的读出数) = 1920 - floor(1920 * 140/148.5)? 实际上由于时钟非整数倍,需要精确计算。用分数:148.5/140 = 1.060714,所以写时钟周期1/148.5,读时钟周期1/140。写入1920个数据的时间是1920 * T_w。在这段时间内读出的数据个数为 floor(1920 * T_w / T_r) 或更精确考虑时钟沿对齐?通常异步FIFO深度计算中,我们取worst-case:假设写使能连续,读使能连续,深度公式为:depth = burst_length - (burst_length * (f_r / f_w)) 当 f_w > f_r。但如果 burst_length * (f_r / f_w) 不是整数,需要向上取整。即 max_remain = ceil(burst_length * (1 - f_r/f_w))? 实际上:burst_length - burst_length * (f_r/f_w) = burst_length * (1 - f_r/f_w)。但这里1 - 140/148.5 = 8.5/148.5 = 0.05724,乘以1920 ≈ 109.9,所以剩余约110。但需考虑异步FIFO的读取延迟和同步开销,通常加1或2。但题目没有要求考虑这些,只问最小深度。
另外,注意数据位宽16bit,但FIFO深度通常以数据个数计,与位宽无关。所以深度是数据个数。
但还有一点:写时钟快于读时钟,可能造成FIFO溢出。计算深度时考虑连续写入最大burst长度。这里的burst是1920,然后有720个空闲周期。如果没有空闲周期,持续写入,那么深度需要无限大。但这里有空闲,所以可以计算。
另一种常见方法:最坏情况是写入速率大于读出速率,最大数据积累发生在写入burst结束时。深度至少为 burst_length - (burst_length * (f_r/f_w)) 向上取整,再考虑裕量。但注意空闲周期允许读追赶,所以深度只需要大于最大积累量,不需要考虑后续读空。
因此答案:最小深度约为110,但实际设计取2的幂次如128。但题目问“最小深度”,应给出计算值,可能整数为110或111?计算精确:1920 * (148.5 - 140) / 148.5 = 1920 * 8.5 / 148.5 = (1920 * 8.5) / 148.5 =
涉及知识点
- 时钟