模块虽小但是要有新意,首先写一个同步FIFO,这是一个烂大街的入门级项目,但是我肯定不会写的那么简单,需求如下:
- size=3232(高宽)
- 同时读写
- 给出空满、将空将满信号
- 单口sram接到读使能下一拍出数据(或者n拍之后)
和大多数文章所写描述的同步FIFO的需求不一样的地方在于最后一个需求,内部例化的sram的读取动作不是读及读出的操作。因此基于这种sram,又要兼顾FIFO的标准协议,以及需要FIFO逻辑速度到达最优,需要对设计进行一些小的处理
下图为本次同步FIFO设计的框图:
设计分析:
- 使用reg0的原因
由于sram延时一拍读出,因此就需要有reg0处理延时,既只要reg0为空,寄存器就向sram读数,达到提前取数,消除延时的效果。(一般sram有几拍延时就有几个reg0) - 使用reg1的原因
reg1用于处理边界条件,在sram和reg0为空时,没有读使能的情况下写入第一个数,此时第一个数如果存入sram,则读取流程将变成sram-reg0-output,中间延迟过长,但是假如使用reg1用于存储第一个数据,则可以把这一拍数据延时解决掉。(且同上述,一般有几个reg0就有几个reg1) - 使用mux2的原因
mux2也是用于处理边界条件,在sram和所有寄存器都为空时,写使能和读使能同时来到,则数据bypass通过SYNC_FIFO模块。 - mux0和mux1则用于处理上述逻辑关于数据通道切换的处理。
- 关于sram存取、各种空满信号的判断,就不再一一叙述,想了解这方面设计可以参见网上各种同步FIFO设计。