介绍异步FIFO最小深度计算
FIFO简单介绍
FIFO(First In First Out)是一种常见的数据缓存器,其特点为数据在写时钟下顺序写入,先写入的数据在前,后写入的数据在后,当读时钟到来时,先读出先写入的数据,后读出后写入的数据,顺序与写入顺序一致。常用场景为在不同时钟域的不同模块间进行数据传输时,避免数据的丢失。对于FIFO的读写时钟的不同可将FIFO分为同步FIFO和异步FIFO,同步FIFO指FIFO的读写时钟为同一时钟,读写操作在时钟到来时同步发生;异步FIFO指FIFO的读写时钟不一致,FIFO的读写操作相互独立。
异步FIFO的深度和宽度的区别:FIFO宽度(WIDTH)是指在进行一次读写操作时,写入或读出数据的数据位,而FIFO深度(DEPTH)是指当前设计的FIFO可以存储多少个WIDTH位宽的数据。例如FIFO宽度为16,深度为24,即此FIFO在写满的情况下可以存储24个16位的数据
FIFO突发长度(Brust Length)是指一串需要进行连续传输的数据,在此指FIFO需要传输数据的长度。
由于异步FIFO的应用较为广泛,在此以异步FIFO来分析下在不同情况下FIFO的最小深度计算。
情况1:写时钟频率(fa)>读时钟频率(fb);读写时钟之间无空闲时钟
假设:
- fa=80MHz;fb=50MHz;Brust Length=120
计算过程:
- 写入一个数据需要时间:1/80MHz=12.5ns
- 写入突发长度数据所需时间:120×12.5ns=1500ns
- 读出一个数据所需时间:1/50MHz=20ns
- 在写入突发长度时可读出数据个数:1500ns/20ns=75
- 剩余未读出数据个数:120-75=45
- FIFO最小深度为45
情况2:写时钟频率(fa)>读时钟频率(fb);读和写时钟之间都存在空闲时钟
假设:
- fa=80MHz;fb=50MHz;Brust Length=120
- 两个写数据之间空闲时钟=1
- 两个读数据之间空闲时钟=3
计算过程:
- 写入一个数据需要时间:2×(1/80MHz)=25ns
- 写入突发长度数据所需时间:120×25ns=3000ns
- 读出一个数据所需时间:4×(1/50MHz)=80ns
- 在写入突发长度时可读出数据个数:3000ns/80ns=37.5≈37
- 剩余未读出数据个数:120-37=83
- FIFO最小深度为83
- 两个写数据之间空闲时钟为1可理解为每2个写时钟才写入一个数据
- 两个读数据之间空闲时钟为3可理解为每4个写时钟才读出一个数据
- 同样的情况出现在给定写使能和读使能信号占空比的情况(假定高电平使能),与上述情况相同的设定为写使能信号的占空比为50%,读使能信号的占空比为25%
情况3:写时钟频率(fa)<读时钟频率(fb);读写时钟之间无空闲时钟
假设:
- fa=30MHz;fb=50MHz;Brust Length=120
计算过程:
- 这种情况下无需考虑FIFO深度,因为读时钟比写时钟快,所以FIFO不会出现写满导致数据丢失的情况
- FIFO的最小深度为1
情况4:写时钟频率(fa)<读时钟频率(fb);读和写时钟之间都存在空闲时钟(同样适用于读写使能信号存在占空比的情况)
假设:
- fa=30MHz;fb=50MHz;Brust Length=120
- 两个写数据之间空闲时钟=1
- 两个读数据之间空闲时钟=3
计算过程:
- 写入一个数据需要时间:2×(1/30MHz)=66.667ns
- 写入突发长度数据所需时间:120×66.667ns=8000ns
- 读出一个数据所需时间:4×(1/50MHz)=80ns
- 在写入突发长度时可读出数据个数:8000ns/80ns=100
- 剩余未读出数据个数:120-100=20
- FIFO最小深度为20
情况5:写时钟频率(fa)=读时钟频率(fb);读和写时钟之间都存在空闲时钟
假设:
- fa=50MHz;fb=50MHz;Brust Length=120
- 两个写数据之间空闲时钟=1
- 两个读数据之间空闲时钟=3
计算过程:
- 写入一个数据需要时间:2×(1/50MHz)=40ns
- 写入突发长度数据所需时间:120×40ns=4800ns
- 读出一个数据所需时间:4×(1/50MHz)=80ns
- 在写入突发长度时可读出数据个数:480000ns/80ns=60
- 剩余未读出数据个数:120-60=60
- FIFO最小深度为60
- 当读写时钟频率一致且读写时钟之间不存在空闲时钟时,FIFO最小深度为1
情况6:常用计算公式
假设:
- 写时钟频率fw
- 读时钟频率fr
- Brust Length
- 每B个写时钟周期写入A个数据
- 每Y个读时钟周期读出X个数据
计算公式为:
FIFO_DEPTH=Brust_Length(1-(X/Y)×(fr/fw))
- 注意考虑背靠背传输的问题,即Brust Length最大化
注:参考资料来自Putta Satish