一、核心思想
FIFO即先进先出,不能随机读写随即地址的数据,只能挨个读写。异步fifo是指读写时钟不同,读和写分别在各自的时钟域下,适用于不同时钟域下的数据传输。缓冲等。
二、读写时序
1、写操作
当写信号有效且fifo非满就写到写地址对应的位
2、读操作
当读信号有效且fifo非空既可以进行读地址对应数据
三、设计难点
1、如何判断FIFO的空满
- 根据网上的例子,常规方法都是在读写地址指针加一个额外的状态位。当读或写够一轮状态位就取反。
- 当写地址指针与读地址指针低八位完全相等,而写地址领先读地址一轮,则表示写满了。(二进制情况下)
- 当写地址指针与读地址指针低八位完全相等,而读地址追上了写地址,则表示读空了。(二进制与格雷码情况下)
- 但是将二进制转换成格雷码后判断满的标志则为,格雷码状态下高两位相反,其余相同
2、如何解决不同时钟下两个地址指针的比较,降低亚稳态
- 利用格雷码进行地址指针的判断:因为格雷码每加1,只有一位在变。
- 加两级寄存器,将读地址转换为格雷码再同步到写时钟域下,判断fifo是否为满;将写地址转化为格雷码同步到读时钟域下,判断fifo是否为空。
四、代码
fifo_async.v
module fifo_async#(parameter dwidth = 8,awidth = 4)(
input wclk ,
input rclk ,
in