异步fifo的设计(一)

来源:互联网 发布:软件著作权模板 编辑:程序博客网 时间:2024/06/05 19:02

       上一篇文章讲的是同步fifo的设计,这篇文章主要讲一下异步fifo的设计。异步fifo和同步fifo的区别主要在于读写所用的时钟是否一致。异步fifo设计因为读写所用的时钟不一致因而设计比较复杂,会涉及到读指针和写指针的同步化。

       异步fifo设计主要要解决两个问题:

        1)如何产生fifo的读写指针

        2)如何判断fifo的空满状态

       这里fifo的写指针用wr_ptr表示,读指针用rd_ptr表示。首先来解释一下这两个指针的含义:写指针指向fifo中下一个要写入数据的地址;读指针指向下一个要读出数据的地址。这里的关键点在与下一个地址,这样避免了使用两个时钟周期去完成一个写操作或者读操作,其中一个时钟周期确定操作的地址,一个周期用于完成操作。

       如何产生fifo的wr_ptr和rd_ptr是第一个需要解决的问题。也是这篇文章讲解的主要内容。这里先解释一下fifo中空和满的的含义。如果fifo是空的话,意味着该fifo的wr_ptr和rd_ptr的值是相等的。空状态一般有两种情况,一种是复位的时候由于wr_ptr和rd_ptr被清0,所以其值相等;另一种情况时rd_ptr的值增加之后追上了wr_ptr 的值,与其相等。如果fifo是满的话,也意味着wr_ptr和rd_ptr的值是相等的,但是需要注意的是此时wr_ptr实际上是将rd_ptr套圈之后再一次追上rd_ptr的值与其相等。这样的话空和满状态都意味着wr_ptr和rd_ptr的值是一样的,那么到底该如何区分是空状态和满状态呢?这就涉及到了异步fifo设计的第一个问题:如何产生fifo的读写指针。

         这里有两种解决办法,一种是增加一个额外的bit来区分;另外一种办法是利用grey码。

         我们先来看第一种方法:增加一个bit之后,对于空状态的判断条件还是wr_ptr和rd_ptr相等,但是对于满状态的判断就增加了条件。满状态的本质就是wr_ptr将rd_ptr套圈之后追上了rd_ptr的值,增加一个bit位(即MSB),如果wr_ptr和rd_ptr的MSB不相等,但是其余的bit是相等,那么这种情况下fifo就是满状态。这种方法如下图所示:


      另一种办法是使用grey码来表示wr_ptr和rd_ptr。利用grey码设计计数器有很多方法,这里主要介绍两种设计方法:第一种设计方法用到一组flip-flop;第二种方法用到两组flip-flop,第二种设计的速度能更快一些。

     这里先讲一下格雷码的相关知识。 如果要设计一个n bit的grey码计数器和一个n-1bit的grey计数器,一种方法是分开设计;另一种方法是通过对n bitde grey码的次MSB位取反,得到n-1bit的grey计数器,这种设计出来的计数器被称作"dual n-bit grey code counter"。具体过程可以看下图:


        由图可以看出最常见的grey码,除了MSB,其余位是以中间点镜像对称的。但是将4-bit的grey码转换成3-bit的grey时,我们希望的不是将4-bit的grey码的下半部分的低三位bit以镜像对称的形式体现,而是希望能够重复上半部分的低三位序列。因此需要将4-bit的grey的次MSB位取反,如上图右半部分所示。这种编码方式的唯一问题是最后得到的不是真正的grey码,因为相邻的grey码之间只有1bit数字不一样,但是所得到的的码元有两个bit不一致。

       下面将介绍用到一组flip-flop的设计:这种设计输出端的寄存器存的是真正的grey码值(wr_ptr,rd_ptr),grey码输出通过Grey-to-binary转换器得到bin,bin经过一个条件增量器之后产生bnext信号,该值又传给Binary-to-grey转换器产生gnext信号。结构图如下所示:


    用到两组filp-flop的设计:这种设计没有Grey-to-binary转换器,并且可以直接映射到fifo内存的地址,也就省去了将fifo内存的地址转化为grey码的操作。该设计如下图所示:

   

    以上就是异步fifo设计中指针的设计方法。下一篇将介绍异步fifo的整体设计。



原创粉丝点击