上一篇文章讲的是同步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套圈之后