浅谈数字电路设计中的异步FIFO(二)空满标志位的产生
异步FIFO是一种可以实现异步读写操作,先进先出(First In First Out)的电路,通常被使用在数据传输接口的部分,用来存储、缓冲数据,解决在两个异步时钟之间的数据传输问题。
前面的文章我们了解到设计异步FIFO有两个难点:如何同步异步信号,抑制亚稳态的发生;如何正确地设计空、满标志位的控制电路。并且解决了第一个问题,今天我们来聊一聊第二个问题,空、满标志位的设计。
空满标志位产生原则
FIFO空满标志位的产生部分是FIFO的核心。这一部分逻辑的高效与否,直接决定了FIFO的性能。
一般情况之下,FIFO空满标志位的产生原则是:写满情况下,不能溢出;读空情况下,不能多读。
进一步解释一下这个原则,即在任何情况下,不能出现FIFO的读、写地址,指向同一个地址,进行操作的情况。
当出现读、写地址之间相差一个(阈值自己可以设置)或者位置相同的情况,并且还在进行写操作时,FIFO的满标志位,应该拉高,表示此时FIFO已满,不能再继续接受数据,外部电路应该停止继续发送数据。此时外部电路应该根据实际情况,对数据进行保持、或丢弃等操作。同理,当空标志位拉高,则表示FIFO已空,外部电路不能再继续读数据。
FIFO的设计方法
下面我们给出集中常用的设计方法,不同的设计方法,有对应的优缺点,我们需要根据自己的实际需要,进行选择。通过比较读、写地址产生空满标志
通过上面的描述,可以知道,最直接的方式就是通过比较读、写地址,来产生空满标志位。过程分为以下两步:计算出当前FIFO读、写地址的差值;比较差值和预设值,如果两者相等,则将空 、满标志位置位。
这种方法的优点是,逻辑简单,设计方便。但是因为要计算FIFO读写地址的差值,所以如果减法器的位宽较大,则可能要产生一个很大的组合逻辑,这大概率会降低FIFO的速度。只对比读写地址是否相等
为了解决上面方法中的问题,我们通常只关心读写地址是否相等,来避免减法器的引入。
当读写地址相等时,对应有空或者满两种状态。所以我们需要增加一个区间来区分当前状态时空或者满。将地址空间划分成不同的部分,以此来说明当前读写地址所处的位置。
这种方法,可以提升FIFO的运行速度,但是与此同时,因为读写地址只有相等或者不相等两种状态,所以可能会影响FIFO空满标志位判断的准确性。对delay后的地址进行比较
上面两种方法,都有一定的使用风险,下面给出一种设计建议。
之前的方法是直接对比当前FIFO的读写地址,现在我们先将地址进行延时,然后再进行比较。进行这样设计的考虑,主要是对地址进行delay之后,本质上是,留出了一个(或多个)地址的余量(余量的大小和延时的多少相关)。通过组合比较当前地址,经过一级Dealy(或者多级delay)的信号组合,可以产生可靠的空满标志位。
小结
今天我们比较了集中常用的FIFO空满标志位的产生方法,实际上,在不同的应用中,根据对FIFO需求的不同(有的需要可靠性高,有的需要速度快),会有不同的设计方法。