异步FIFO

本文主要实现异步FIFO代码的实现。

另外,主要本文实现的异步FIFO存在以下限制:

  1. 写入和读出位宽相等;
  2. 深度需要为2的幂指数;

简介

该模块分为三个部分:

  • 读控制
  • 写控制
  • 顶层
图1: 异步FIFO框图

初始化

使用了异步复位同步释放的逻辑,需要注意复位信号拉高之后,需要等待两个周期才开始工作。
在这两个周期之内,禁止对模块进行输入,否则模块工作异常。

空满信号

对于异步FIFO采用地址扩展一位的方式对FIFO进行读写计数,进而判断空满。  

  • 读空信号:复位的时候,读指针和写指针相等,读空信号有效(这里所说的指针其实就是读地址、写地址)当读指针赶上写指针的时候,写指针等于读指针意味着最后一个数据被读完,此时读空信号有效。
  • 写满信号:当写指针比读指针多一圈时,写指针等于读指针意味着写满了,此时写满信号有效

当最高位相同,其余位相同认为是读空
当最高位不同,其余位相同认为是写满

注意:判断空满使用的是二进制的地址,而非格雷码转换后的地址。

跨时钟域同步

使用格雷码进行同步。时钟同步逻辑——通过两级DFF分别将写时钟域的写指针同步到读时钟域,将读时钟域的读指针同步到写时钟域。

格雷码计数器

格雷码转二进制
使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。

二进制转格雷码
二进制的最高位作为格雷码的最高位,次高位的格雷码为二进制的高位和次高位相异或得到,其他位与次高位类似。

避坑记录

Vivado仿真时间调度

附录

开源地址

作者

LiXintao

发布于

2025-11-07

更新于

2025-11-13

许可协议

评论