异步FIFO设计(1)

异步FIFO设计(1)

在数字IC设计中,跨时钟域处理向来是人们关注的主要问题之一。跨时钟域问题包括两大类:从快到慢和从慢到快(包含单bit数据和多bit数据)。FIFO(First In Firt Out),特别是异步FIFO,是处理这类问题的“万能法宝”。

什么是FIFO存储器

FIFO,其特点就是先进的数据先出(后进后出),因此得名。
在这里插入图片描述

本文将依据该领域大牛Clifford E. Cummings的文章《Simulation and Synthesis Techniques for Asynchronous FIFO Design》来探讨异步FIFO(若无特别说明,下文中的FIFO均指异步FIFO)的设计思想。

写指针和读指针

在同步FIFO中,写入和读取FIFO缓冲区的数据是在同一时钟域中进行的,且不能同时进行。因此,写和读可以共用一个指针:当写数据操作时(此时不能读),指针指向的地址随写入数据而增加;当读数据操作时(此时不能写),指针指向的地址随读取数据而减小。因此,可以简单的用指针值与0和最大地址空间值比较,来获取同步FIFO的状态(写满状态或者读空状态)。
而在异步FIFO中,写入和读取FIFO缓冲区的数据是在不同的时钟域中进行,读写操作可以同时进行。由于两个时钟域的时钟速率不尽相同,写指针和读指针就需要分离开来。而FIFO状态的获取就需要比较两个指针。
写指针始终指向下一个要写入的数据字;在FIFO写操作中,写入指针所指向的内存位置被写入,然后写入指针加1,指向下一个要写入的位置。类似地,读指针始终指向当前要读取的FIFO字。因此,在重置时,两个指针都设置为0,这恰好是下一个要写入\读取的FIFO字位置。

满状态和空状态

在FIFO写满或者读空的状态时,写指针和读指针的值都是相同的,我们该如何区分两者呢?
区分满状态和空状态的方法是在每个指针上都增加一个额外的比特位。当写指针超过最终的FIFO地址时,写指针将MSB加1,同时将其余位置回0。读取指针也是如此。如果两个指针的MSB不同,这意味着写指针比读指针多了一个FIFO深度(相当于赛跑中套了一圈),此时FIFO为满状态。如果两个指针的MSB相同,意味着读指针追上了写指针,此时FIFO为空状态。
在这里插入图片描述

指针编码的选择

若采用二进制计数值,n位计数器的每一位都可能同时改变(例如,二进制数中的7->8是0111->1000),当我们将计数值从一个时钟域同步到另一个时钟域很容易出现问题。
解决该问题的一种方法是在保持寄存器中采样并保持周期性二进制计数值,并将同步就绪信号传递到新的时钟域。当就绪信号被识别时,接收时钟域向发送时钟域发回一个同步的确认信号。在接收到确认信号之前,采样指针不能改变。
而在FIFO指针计数器中,通常采用Gray编码。Gray码每个时钟周期只允许改变一个比特,消除了在同一时钟边缘上试图同步多个变化信号的问题。

格雷码计数器的实现

前面提到,为了区分空状态,我们将指针拓展了一位。因此,对于单个指针,我们需要两个格雷码计数器(一个n位的用于比较,一个n-1位的用于指示地址),因为观察可以发现,n位格雷码计数器的低n-1位不能直接用来做一个n-1位的计数器。
简单的实现方法是直接写两个单独的格雷码计数器。但在大牛的文章中给出了单个计数器实现的方法。

双n位格雷码计数器——Ⅰ型

在这里插入图片描述

通过观察4位和3位格雷码的区别可以发现,4位格雷码的前半部分(不包含MSB)与3位格雷码相同,而后半部分是3位格雷码的倒序。因此,我们可以通过n位计数器的前两位MSB做异或操作,来得到n-1位计数器的MSB,再将n位计数器的低n-2位与之拼接得到n-1位格雷码值。例如:1100对应3位格雷码就是1 xor 1 = 0,再和00拼接得到000。文章给出的框图如下:
在这里插入图片描述

双n位格雷码计数器——Ⅱ型

事实上,只有n位计数器的值需要同步到另一个时钟域,而作为地址指示的n-1位不需要。因此,文章采用了另一种Ⅱ型格雷码计数器,该计数器包含一个n位的格雷码计数器,然后将二进制计数器的n-1位直接作为寻址的计数器。不得不佩服其设计的巧妙!
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值