在讲解如何去计算FIFO深度之前,我们来理解一个术语burst length,如果你已经了解了可以跳过。要理解数据的突发长度,首先我们来考虑一种场景,假如模块A不间断的往FIFO中写数据,模块B同样不间断的从FIFO中读数据,不同的是模块A写数据的时钟频率要大于模块B读数据的时钟频率,那么在一段时间内总是有一些数据没来得及被读走,如果系统一直在工作,那么那些没有被读走的数据会越累积越多,那么FIFO的深度需要是无穷大的,因此只有在突发数据传输过程中讨论FIFO深度才是有意义的。也就是说我们一次传递一包数据完成后再去传递下一包数据,我们把一段时间内传递的数据个数称为burst length。在维基百科中,burst transmission是这样解释的:In telecommunication, a burst transmission or data burst is the broadcast of a relatively high-bandwidth transmission over a short period。
我们知道burst length过后,通过上述讨论我们大概就知道FIFO的最小深度与burst rate, burst size, read and write frequency等因素有关。要确定FIFO的深度,关键在于计算出在突发读写这段时间内有多少个数据没有被读走。也就是说FIFO的最小深度就等于没有被读走的数据个数。
在讨论之前我们假定模块A向FIFO写数据的时钟频率为fa,模块B从FIFO读数据的时钟频率为fb。
场景1:fa>fb with no idle cycles in both write and read
假设:
写数据时钟频率fa=80MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
在突发传输过程中,数据都是连续读写的
那么:
写一个数据所需要的时间 = 1/80MHz = 12.5ns
突发传输中,写完所有数据所需要的时间 = 120*12.5ns = 1500ns
读一个数据所需要的时间 = 1/50MHz = 20ns
所以写完所有的突发传输数据需要花费1500ns
在1500ns内能够读走的数据个数 = 1500ns/20ns = 75
所以在1500ns内还没有被读走的数据个数 = 120-75 = 45
因此FIFO的最小深度为45
场景2:fa > fb with idle cycles in both write and read
假设:
写数据时钟频率fa=80MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
每隔1个cycle写一次
每隔3个cycle读一次
那么:
每隔1个cycle写一次,意味着2个cycle才写一个数据
每隔3个cycle读一次,意味着4个cycle才读一个数据
写一个数据所需要的时间 = 2*1/80MHz = 25ns
突发传输中,写完所有数据所需要的时间 = 120*25ns = 3000ns
读一个数据所需要的时间 = 4*1/50MHz = 80ns
所以写完所有的突发传输数据需要花费3000ns
在3000ns内能够读走的数据个数 = 3000ns/80ns = 37.5
所以在3000ns内还没有被读走的数据个数 = 120-37.5 = 82.5
因此FIFO的最小深度为83
场景3:fa > fb with duty cycles given for wr_enb and rd_enb.
假设:
写数据时钟频率fa=80MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
写使能信号占整个burst时间比重为1/2
读使能信号占整个burst时间比重为1/4
那么:
场景4与场景3描述不一致,但情形是一致的,因此FIFO的最小深度也为83
场景4:fa < fb with no idle cycles in both write and read
假设:
写数据时钟频率fa=40MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
在突发传输过程中,数据都是连续读写的
那么:
由于读数据比写数据要快,因此FIFO只起到过时钟域的作用,FIFO的最小深度为1即可
场景5:fa < fb with idle cycles in both write and read
假设:
写数据时钟频率fa=40MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
每隔1个cycle写一次
每隔3个cycle读一次
那么:
每隔1个cycle写一次,意味着2个cycle才写一个数据
每隔3个cycle读一次,意味着4个cycle才读一个数据
写一个数据所需要的时间 = 2*1/40MHz = 50ns
突发传输中,写完所有数据所需要的时间 = 120*50ns = 6000ns
读一个数据所需要的时间 = 4*1/50MHz = 80ns
所以写完所有的突发传输数据需要花费6000ns
在6000ns内能够读走的数据个数 = 6000ns/80ns = 75
所以在6000ns内还没有被读走的数据个数 = 120-75 = 45
因此FIFO的最小深度为45
场景6:fa = fb with no idle cycles in both write and read
假设:
写数据时钟频率fa=50MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
那么:
如果读写时钟同源并且无相位差,那么可以不需要FIFO;否则FIFO的最小深度为1
场景8:fa = fb with idle cycles in both write and read
假设:
写数据时钟频率fa=50MHz
读数据时钟频率fb=50MHz
突发长度= number of data to be transferred = 120
每隔1个cycle写一次
每隔3个cycle读一次
那么:
每隔1个cycle写一次,意味着2个cycle才写一个数据
每隔3个cycle读一次,意味着4个cycle才读一个数据
写一个数据所需要的时间 = 2*1/50MHz = 40ns
突发传输中,写完所有数据所需要的时间 = 120*40ns = 4800ns
读一个数据所需要的时间 = 4*1/50MHz = 80ns
所以写完所有的突发传输数据需要花费4800ns
在4800ns内能够读走的数据个数 = 4800ns/80ns = 60
所以在4800ns内还没有被读走的数据个数 = 120-60 = 60
因此FIFO的最小深度为60
场景8:Data rates are given,read and write random(important!!!)