本文转载自:孤独的单刀博客
1、为什么需要计算FIFO的最小深度
因为笔试常考。
开玩笑的。首先我们来想下FIFO有哪些作用?我大概总结下FIFO的几个重要作用:
FIFO最常被用来解决写、读不匹配的问题(时钟、位宽),总结下来,其实FIFO最大的作用就是缓冲。既然是缓冲,那么就要知道这个缓存的空间到底需要多大。接下来的讨论,都建立在满足一次FIFO突发传输的基础上。连续无止境的突发不考虑。比如写时钟100M,读时钟50M,无限制的读写,那么FIFO的深度只能是无穷大了,因为写比读快,FIFO一定永远都不够用。所以在实际运用中,不会存在无限制的对FIFO进行读写。如果这样的话,FIFO就变成了一个“存储器件”,而不是一个“缓存器件”,对于FIFO的这种用法无疑是毫无意义的。
2、实例
2.1、写时钟快、读时钟慢
2.1.1、无间断的写、读操作
条件:
写入时钟频率 fA = 80MHz;读取时钟频率 fB = 50MHz. 一次写入的突发长度120
读写操作不间断
解法:
写入一个数据需要的时间:1/80MHz = 12.5ns;读取一个数据需要的时间:1/50MHz = 20ns
写入120个数据,需要的时间:120 * 12.5ns = 1500ns
在写入全部数据所需的时间(1500ns)内,可以读取出的数据数:1500ns / 20ns = 75
所以一次突发,一共需要写入120数据,在这段时间内可以被读出75数据,剩下的数据就是需要使用FIFO来缓存,所以FIFO的最小深度为120 - 75 = 45
2.1.2、间断的写、读操作
条件:
写入时钟频率 fA = 80MHz;读取时钟频率 fB = 50MHz. 一次写入的突发长度120。
每两次写入操作间隔1个写时钟周期,每两次读取操作间隔3个读时钟周期。
解法:
每两次写入操作间隔1个写时钟周期,等于每两个写时钟周期才写入1个数据,即等价的写入时钟频率 fA'=40MHz,写入一个数据需要的时间:1/40MHz = 25ns
每两次读取操作间隔3个读时钟周期,等于每4个写时钟周期才读取1个数据,即等价的读取时钟频率 fB'=12.5MHz,读取一个数据需要的时间:1/12.5MHz = 80ns
写入120个数据,需要的时间:120 * 25ns = 3000ns
在写入全部数据所需的时间(3000ns)内,可以读取出的数据数:3000ns / 80ns = 37.5 ≈ 37(要向下取整,不然有1个数据会丢)
所以一次突发,一共需要写入120数据,在这段时间内可以被读出37数据,剩下的数据就是需要使用FIFO来缓存,所以FIFO的最小深度为120 - 37 = 83
2.2、写时钟慢、读时钟快
2.2.1、无间断的写、读操作
条件:
写入时钟频率 fA = 30MHz;读取时钟频率 fB = 50MHz. 一次写入的突发长度120
写、读操作无间断
解法:
因为读操作的频率快于写操作的频率,所以数据一旦被写入FIFO后很快就会被读走,所以FIFO的最小深度为1即可
2.2.2、间断的写、读操作
条件:
写入时钟频率 fA = 30MHz;读取时钟频率 fB = 50MHz. 一次写入的突发长度120。
每两次写入操作间隔1个写时钟周期,每两次读取操作间隔3个读时钟周期。
解法:
每两次写入操作间隔1个写时钟周期,等于每两个写时钟周期才写入1个数据,即等价的写入时钟频率 fA'=15MHz,写入一个数据需要的时间:1/15MHz = 66.667ns
每两次读取操作间隔3个读时钟周期,等于每4个写时钟周期才读取1个数据,即等价的读取时钟频率 fB'=12.5MHz,读取一个数据需要的时间:1/12.5MHz = 80ns
写入120个数据,需要的时间:120 * 66.667ns = 8000ns
在写入全部数据所需的时间(8000ns)内,可以读取出的数据数:8000ns / 80ns = 100
所以一次突发,一共需要写入120数据,在这段时间内可以被读出100数据,剩下的数据就是需要使用FIFO来缓存,所以FIFO的最小深度为120 - 100 = 20
2.3、写时钟、读时钟一样快
2.3.1、无间断的写、读操作
条件:
写入时钟频率 fA = 读取时钟频率 fB = 30MHz。一次写入的突发长度120。
写、读操作无间断
解法:
1、假设读、写时钟无位差、则两个时钟同频、同相,是同步信号,故可以直接对接操作,无需FIFO
2、若读、写时钟存在相位差,则被写入的数据在一个时钟周期内会被读走,所以FIFO的最小深度为1即可
2.3.2、间断的写、读操作
条件:
写入时钟频率 fA = 读取时钟频率 fB = 50MHz。一次写入的突发长度120。
每两次写入操作间隔1个时钟周期,每两次读取操作间隔3个时钟周期。
解法:
每两次写入操作间隔1个写时钟周期,等于每两个写时钟周期才写入1个数据,即等价的写入时钟频率 fA'=25MHz,写入一个数据需要的时间:1/25MHz = 40ns
每两次读取操作间隔3个读时钟周期,等于每4个写时钟周期才读取1个数据,即等价的读取时钟频率 fB'=12.5MHz,读取一个数据需要的时间:1/12.5MHz = 80ns
写入120个数据,需要的时间:120 * 40ns = 4800ns
在写入全部数据所需的时间(4800ns)内,可以读取出的数据数:4800ns / 80ns = 60
所以一次突发,一共需要写入120数据,在这段时间内可以被读出60数据,剩下的数据就是需要使用FIFO来缓存,所以FIFO的最小深度为120 - 60 = 60
2.4、特定时间内时间写、读速率固定
条件:
每100个时钟写入80个数据,剩余20个随机值(无效)
每10个时钟读出8个数据
一次写入的突发长度160
解法:
因为每100个时钟内,仅写入80个数据,而这80个数据可能任意分布,所以160个数据的写入可能有以下几种情况:
可以看到,第4种情况是最极端的:一次性需要写入160数据,时间为160个时钟
160个时钟内,读出的数据是160*8/10 = 128
所以一共需要写入160数据,在这段时间内可以被读出128数据,剩下的数据就是需要使用FIFO来缓存,所以FIFO的最小深度为160 - 128 = 32
3、总结