1、 读写没有空闲周期。(fA>fB)
例如,fA = 80MHz;fB = 50MHz;Burst Length = 120;读写之间没有空闲周期,连续读写一个突发长度。
解法:
写一个数据需要的时间 = 1 / 80MHz = 12.5ns;
写一个突发需要的时间 = 120 * 12.5ns = 1500ns;
读一个数据需要的时间 = 1 / 50MHz = 20ns;
每 1500ns, 120 个数据被写入 FIFO,但读一个数据需要 20ns 的时间,则 1500ns 内读出1500 / 20 = 75个数据,剩下的 120 - 75 = 45没有读出,就存在 FIFO 中。
快捷方法: FIFO 深度 =120 - 120*50/80 = 45。
补充:读写没有空闲,若 fA<=fB,则 FIFO 不会写满,深度为 1 即可。
2、读写都有空闲周期。(读写速率大小随意,可以相等)
例如,fA = 80MHz;fB = 50MHz;Burst Length = 120;两个连续写入之间的空闲周期为 = 1(写使能占得百分比为 50%);两个连续读取之间的空闲周期为 = 3(读使能占得百分比为 25%)
解法:
每写入一个数据等待 1 个周期再写入下个数据,即 2 周期写入 1 个数据。
每读出一个数据等待 3 个周期再读出下个数据,即 4 周期读出 1 个数据。
写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns
写一个突发需要的时间 = 120 * 25ns = 3000ns
读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns
每 3000ns, 120 个数据被写入 FIFO,但读一个数据需要 80ns 的时间,则 3000ns 内读出3000 / 80 = 37.5个数据,, FIFO 深度=120-37.5=83。
快捷方法: FIFO 深度 = 120 - 120*(50/4)/(80/2)=82.5=83。
3、考虑背靠背,读写速率相等。
例如,读写速率相等,每 100 个时钟写入 80 个数据;每 10 个时钟读取 8 个数据
突发长度为 160 (这个条件其实多余)
解法:
每 100 个时钟写入 80 个数据,那剩下 20 个时钟周期去哪了?
每 10 个时钟读取 8 个数据,那剩下 2 个时钟周期去哪了?
剩下的周期在哪我们不管,只考虑最差的情况,即前 20 个时钟周期空闲,后80 个周期写完 80 个数据,立马又是写请求,这次是前 80 个时钟周期写完 80 个数据,后 20 个时钟周期空闲。即两次连续的突发写入,又称为背靠背。
写一个突发需要的时间: 160 时钟周期,则 160 个时钟周期内读出160*8/10=128个数据。
FIFO 深度 = 160 - 128 = 32。
4、 考虑背靠背,读写速率不等。
例如,fA = 20MHz,fB = 40MHz,每 1000 个时钟周期写入 500 个数据,每 4 个时钟周期读出 1 个数据。
解法:
考虑到“背靠背”的情况突发长度则为 500 * 2 = 1000,则为每 1000 个时钟周期写入 1000 个数据;
写一个数据需要的时间 = 1 / 20MHz = 50ns;
写一个突发需要的时间 = 1000 * 50ns = 50000ns;
每 4 个周期,读取一个数据。读一个数据需要的时间 = 4 * (1 / 40MHz) = 100ns;
每 50000ns, 1000个数据被写入 FIFO,但读一个数据需要 100ns 的时间,可以计算出, 50000ns 内读出50000 /100 = 500个数据;
剩下的没有读出,就存在 FIFO 中,则需要FIFO深度为 1000- 500 = 500。