异步FIFO(一)——FIFO的理论基础

本文为学习笔记,主要参考《VerilogHDL高级数字设计》,Clifford的论文Simulation and Synthesis Techniques for Asynchronous FIFO Design以及张波的硕士论文:基于SOC异步FIFO的设计与形式验证

FIFO简介

FIFO为First in first out 的缩写,是一种先进先出存储器,通常用于接口电路的数据缓存,跨时钟域的数据传输。与普通的存储器的区别在于,没有外部输入的读写地址,使用读写的时钟进行读写控制,FIFO只能按顺序读写数据。
异步FIFO的基本结构为
异步FIFO(一)——FIFO的理论基础
整个FIFO主要分为4个结构:双端口RAM存储器,写操作控制逻辑,读操作控制逻辑,空/满标志位产生逻辑。

FIFO深度的计算

在设计一个FIFO之前,我们首先要计算FIFO的深度。有关于FIFO深度的计算问题大家可以参考博文:https://blog.csdn.net/qq_26652069/article/details/90720568

写读地址

FIFO 本质属性是缓存器,要求数据进出前后顺序上保持一致。为了实现先进先出,通常,FIFO 初始设计会定义内部存储器以及一个时钟周期FIFO 写入和读出数据的长度,并初始化相应的计数器。当堆栈为空时,写指针指向内存初始位置,当写操作开始驱动写逻辑单元,一个写时钟后,内存完成了对写数据的存储,这时写地址指针加1,指向下一个存储地址,直到下一次写操作,重复上述行为。同样的,读操作也是如此,读地址指针会从一开指向初始位置,直到指向写地址位置,表示读空位置。所以,不同于一般内存的地址控制,异步FIFO中,无需地址线来查找特定的存储单元取而代之的是读写地址指针的应用。

空满标志

空满标志的产生,是一个FIFO设计是否合理的核心。设计FIFO时我们需要避免,满写空读的情况发生。
由上节的读写地址的产生我们可以知道,FIFO为空时意味着,读地址追上了写地址。FIFO为满时意味着,写地址绕过了一圈又追上了读地址。
空满标志的产生主要有两种方法:
1、长度计数器法,写一次计数器加一读一次计数器减一;
2、地址为扩展法,用最高位来判断空满,当地址位相等时,扩展的最高位相等,则为空,不相等为满。
这里我们采用的是,地址位扩展法来产生空满标志,因此需要在写时钟域产生满标志,防止满写;在读时钟域产生空标志,防止空读。

异步FIFO的时钟同步

由于异步FIFO工作在两个独立的时钟域下,读写可同时发生。当读写指针,指向不同的地址时,读写操作互不影响;当读写指针指向同一个单元时,容易导致亚稳态的出现。
这时,我们就需要,将写指针同步到读时钟域,将读指针同步到写时钟域。
同步装置的电路有两种基本的类型:
第一种,异步输入脉冲宽度,比时钟周期更大一些。
异步FIFO(一)——FIFO的理论基础
第二种,异步输入脉冲宽度比时钟周期小一些
异步FIFO(一)——FIFO的理论基础
在同步时,可以选择使用格雷码计数器,因为格雷码计数器在每个时钟周期上只变化一位,在同步时不容易出错。但是格雷码为无权码,计数器不容易实现,且不易比较产生空满标志。因此先将地址转化为格雷码,由同步器同步至另一个时钟,再由格雷码-二进制码转换器转换成二进制码进行比较。

虚空和虚满

以满标志的产生为例,读地址通过同步器同步到写时钟域,在这会产生两个或三个周期的延迟,因此满标志的产生是通过比较现在的写地址和两三个周期以前的读地址产生的。所以这里显示的满并不是真的满,但是这不影响FIFO正常功能。
异步FIFO的代码将在下一篇给出。