FIFO(二):FIFO工作原理
阅读原文时间:2021年04月20日阅读:1

                                            FIFO工作原理

     根据FIFO工作的时钟域分为同步/异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写。异步FIFO读写时钟不一致,读写相互独立。

1.读写指针的工作原理

读指针:总是指向下一个将要读取的单元,复位时指向第一个单元(编号为0);

写指针:总是指向当前要被读出的数据,复位时,指向第一个单元(编号为0);

2. FIFO的“空/满”检测

FIFO设计的关键:产生可靠的FIFO读写指针和生成FIFO“空/满”状态标识。

      很明显,当FIFO写满时,就不能再写新数据了,否则就导致数据的溢出;而在空状态即之前写入的数据已经读完,就不能再读取了,否则读出的数据就是无效数据。

2.1读空信号(rd_empty)

      一般情况当读写指针相等时,表明FIFO为空,这种情况发生在 复位操作时 或者当读指针读出FIFO中最后一个字 后,追赶上写指针时,此时读空信号有效。

发生如下图所示:

2.2写满信号(wr_full)

     当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈折回来(wrapped around)又追上了读指针,如下图:

以上FIFO的读写状态是基于读写指针的比较,而问题是两者的判断条件都是读写指针相等,区别在于写满状态是在写指针写满一圈后重新追上读指针,这该如何取表示呢???

如何区分到底是满状态还是空状态呢??

2.3 FIFO读写状态的判断方法

可以采用以下两种方法:

1extra bit

一般情况下深度为N=2^n的FIFO其地址的位宽为n,其读写地址的位宽也为n。共有N个存储单元,若数据位宽为W则该FIFO的容量即为N*W bit。

现在在指针中添加额外的位(extra bit,即地址的MSB)变为n+1bit,该extra bit用于指示写指针是否递增并越过最后一个FIFO地址,若越过则将该MSB加1,其它位清零。对读指针也进行同样的操作。如对于深度为8的FIFO,需要采用3+1bit是计数器:0000-1000、1001-1111,MSB作为折回标志,而低3位作为地址指针。

那么判断机制为:

   *如果两个指针的MSB不同,就说明写指针比读指针多折回一次:如r_addr=0000,且w_addr=1000,为满;

   *如果两个指针的MSB相同,就说明两个指针折回次数相等。再者其余位相等(则说明FIFO为空。

2)设置数据计数器

设置一个data_counter, 当写使能有效时每写入一个data计数器同时加1;读操作时,每读出一个data时该计数器减1。如此,当data_counter为0时FIFO空,当data_counter计数至FIFO深度deep时,表示FIFO写满。

由于计数器会占用额外的资源,当FIFO较大时,可能会降低FIFO的读写速度。

3 读写指针的表示

读写指针的编码有多种,上述提到的指针采用二进制码形式表示。

3.1二进制FIFO指针

将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个 二进制到gray码的转换电路 ,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。

3.2 gray码表示指针

使用gray码解决了一个问题,同时也带来另一个问题,即格雷码如何判断空与满?

空的判断

依然依据二者完全相等(包括MSB);

满的判断

如下图,由于gray码除了MSB外具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB其余位都相同,不能说它为满。因此不能单纯地检测最高位了,在gray码上判断为满必须同时满足以下3条:

wptr 和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次;

wptr与rptr的次高位不相等;如上图位置7和和位置15,转化为2进制:0111和1111. 。MSB不同说明多折回一次,111相同代表同一个位置。 

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器