在上一篇FIFO小谈中大概介绍了FIFO的基本结构,应用场景和一些深度选择的考量。这一章主要介绍一下 同步FIFO的设计 。
同步FIFO根据具体的场景不同有很多不同的设计方法,比如信元FIFO每次只写一段数据,多次写之后才能将一个信元写全,更新一次信元指针。再比如用寄存器列表搭建的FIFO,一拍写入多个数据,写指针按块跳动。这些都是FIFO的特殊应用,这里只讨论最基本的FIFO。
![9192031bc88a3fe3ea3de5f1293487cc.gif](https://i-blog.csdnimg.cn/blog_migrate/c8c1f6c6a5409778c36577c865a0d299.gif)
首先看一个最简单的同步FIFO,是使用寄存器搭建的:
上图中,
输入部分为:
USER_INPUT:主要是FIFO的使用者输入到FIFO的控制信号,包括
1. 写使能
2. 写数据
3. 读使能
输出部分为:
FIFO_RDATA:主要是FIFO使用者从FIFO读出的数据
FIFO_STATUS:主要是FIFO的各种指示状态,空/满状态,将空/将满状态,水位,溢出等
整个FIFO被划分成3个子模块:
■ CTRL_GEN:用来生成FIFO储存单元的实际控制信号,包括:
1. 写指针,指向将要写的FIFO空间,该空间没有数据,满状态除外。每次有效写的下一个时钟根据写入数据数量更新到下一个写位置。
2. 读指针,指向将要读的