异步fifo的设计主要涉及读写指针的产生,空满状态的判断
一:简单讲解
重要参数:fifo深度(简单来说就是需要存多少个数据)
fifo位宽(每个数据的位宽)
FIFO有同步和异步两种,同步即读写时钟相同,异步即读写时钟不相同
同步FIFO用的少,可以作为数据缓存
异步FIFO可以解决跨时钟域的问题,在应用时需根据实际情况考虑好fifo深度即可
本次要设计一个异步FIFO,深度为8,位宽也是8
二:读写指针的产生(格雷码)
深度为8,如果用二进制表示,3位即可,但这里要考虑空满状态。什么是空满状态呢?
写满,读空,用一个写指针控制数据写入FIFO,读指针控制读取数据。当写指针将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码。
第一种方法:我们在设计时将指针的位宽设计成 4 位,最高位的作用就是区分是读空还是写满。第一种方法易产生亚稳态等问题,所以不是我们要讲述的重点。具体理论 1 如下
当最高位相同,其余位相同认为是读空
当最高位不同,其余位相同认为是写满
注意:理论1试用的是二进制数之间的空满比较判断。
第二种方法:grey码
1:grey码(贴不了照片,不知道怎么回事)
格雷码判断是否为读空或写满时应使用理论 2,看最高位和次高位是否相等,具体如下:
当最高位和次高位相同,其余位相同认为是读空
当最高位和次高位不同,其余位相同认为是写满
可以看出,除了最高位,上图的格雷码关于红线对称。
格雷码如何产生呢?
格雷码可由二进制码(十进制值同)^ 二进制码右移一位得到
下面将介绍用到一组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码的操作。该设计如下图所示: