您的位置 首页 > 国际

异步fifo 异步FIFO设计(非常详细,图文并茂,值得一看!)

原文:http://bbs.eetop.cn/thread-308169-1-1.html

一.概述

在大规模的ASIC或FPGA设计中,多时钟系统是不可避免的,这就导致了不同时钟域的数据传输问题。较好的解决方案之一是使用异步FIFO作为不同时钟域数据传输的缓冲区,既可以放宽不同时钟域数据传输的时序要求,又可以提高它们之间的传输效率。本文描述了异步先进先出的设计。

二、设计原则

2.1结构框图

图2.1.1

同步模块synchronize to write clk的功能如上图所示,是将读时钟域的读指针rd_ptr收集到写时钟(wr_clk)域,然后与写指针wr_ptr进行比较,生成或取消写满标志位wr _ full;同样,同步模块synchronize to read clk的功能是将写时钟域中的写指针wr_ptr收集到读时钟域中,然后与读指针rd_ptr进行比较,生成或取消read 空标志位rd_empty。

还有写指针wr_ptr和写满标志wr_full生成模块,读指针rd_ptr和读空标志rd_empty生成模块,双端口内存RAM模块。

2.2二进制计数器的问题

异步先进先出读写指针需要数学运算和比较才能产生精确的空满标志位。但是由于读写指针属于不同的时钟域,读写时钟之间的相位关系是不确定的,当同步模块采集到另一个时钟域的指针时,指针可能处于跳转过程中,如图2.2.1所示,那么采集到的值很可能是一个意外的值,当然是一个意外的错误。

图2.2.1

在上图中,rd_ptr2sync 3和4与4和5之间的中间状态是由各寄存器的时钟rd_clk的偏差引起的。在二进制增量操作中,在大多数情况下,两个或更多位将在同一增量操作中改变。但是由于实际电路中的时钟偏差和不同的路径延迟,二进制计数器在自身递增时必然会产生错误的中间结果,如图2.2.2所示。

图2.2.2

上图显示了图2.2.1的电路原型和本地波形的放大。由于rd_clk的上升沿在不同时间到达三个寄存器,rd_ptr2sync的值在从3'b011跳转到3'b100的过程中经历了3'b111和3'b101,直到最后一个时钟(rd_clk0)到达时才跳转到正确的结果3'b100。虽然中间结果的持续时间相对较短,但这些不正确的中间结果可能会被其他时钟域中的同步模块收集,并导致错误的操作,如上图所示。

因此,为了避免中间结果的产生,可行的方案之一是当同步模块收集的数据逐渐改变时,一次仅改变一位。格雷码计数器是个不错的选择。

2.3格雷码计数器的实现

2.3.1格雷码的表现形式

格雷码最大的一个特点就是在递增或递减的过程中一次只改变一位,这是它最大的优势。同时它也有自己的局限性,就是循环计数的深度必须是2的n次方,否则会失去一次只改变一位的特性。深度为16的二进制和格雷码色阶表如下:

二进制灰色

0 0000 0000

1 0001 0001

2 0010 0011

3 0011 0010

4 0100 0110

5 0101 0111

6 0110 0101

7 0111 0100

8 1000 1100

9 1001 1101

10 1010 1111

11 1011 1110

12 1100 1010

13 1101 1011

14 1110 1001

15 1111 1000

0 0000 0000

2.3.2二进制和格雷码之间的转换

1、二进制到格雷码:

2.3.3格雷码计数器的实现

如下图图2.3.1所示,指向内存的地址指针由二进制计数器产生,用于跨时钟域传播的格雷码指针通过二进制指针的实时转换和寄存器的采集获得。这里应该注意,计数器的位宽比实际需要的位宽多一位。这样做的目的是方便判断FIFO是空还是满,后面会有描述。

图2.3.1格雷码计数器结构图

2.4 空全标志位的生成

异步FIFO的核心部分是精确生成空全标志位,直接关系到设计的成败。本文采用比较读写指针来判断FIFO的空充满度。如果FIFO的深度在n-1位线可访问的地址空之间,则本设计中使用的指针位宽比实际多一位,即N位,有助于判断FIFO是空还是满。

2.4.1读取空标志位的生成

当读地址rd_ptr赶上写地址wr_ptr,即rd_ptr完全等于wr_ptr时,可以断定FIFO中的数据已经被读取空,FIFO只有在两种情况下才会为空:第一种是系统复位,读写指针全部清零;在另一种情况下,当FIFO不为空时,数据读速率快于数据写速率,当读地址赶上写地址时,FIFO为空。空标志位的生成需要在读时钟域中完成,以便FIFO已经空并且空标志位尚未生成,但是可能发生的情况是,FIFO中有数据并且空标志位尚未被撤销,但是即使在最坏的情况下,/[/k0。在另一种情况下,在空标志比较逻辑检测到读地址和写地址相同之后,系统生成由于同步模块的滞后,用于比较的写地址不能及时更新,这样就产生了一个本来不应该产生的空标志信号,但这种情况不会导致错误,就像这个FIFO一样。

图2.4.1.1空标志生成逻辑

如图2.4.1.1空标志生成逻辑所示,写时钟域中的写指针通过两级寄存器与读时钟域同步,然后与读指针进行比较。如果它们完全相等,将产生空标志信号。同步模块用两级寄存器实现,以消除可能的亚稳态。如前所述,由于wr_ptr_gray是用gray码实现的,所以即使同步模块在wr_ptr_gray跳转时采集,也只采集到两个可能的值,一个是跳转前的值,一个是跳转后的值。两者的差别只有1,最坏的情况是“虚/[”

图2.4.1.2空标志生成时序

2.4.2全写标志位的生成

与read 空标志位的生成机制类似,完整的写标志位是通过比较读和写地址生成的。读写指针的关系就像a、b两个田径运动员在圆形跑道上比赛一样。当b运动员领先a并领先一整圈时,a和b有相同的位置。这种情况对应于读指针和写指针指向同一个地址,但是写指针领先一整圈,并且先进先出已满。与读取空标志的生成一样,当读取和写入指针相同时,也会生成完整标志。但如果地址宽度等于FIFO实际深度所要求的宽度,且某一时刻读写地址相同,则很难判断FIFO是空还是满。所以读/写指针需要加一位来标记写地址是否在读地址之前(在系统工作正常的前提下,读地址不能在写地址之前)。例如,如果先进先出的深度是8,我们需要一个宽度为4的指针。

图2.4.2.1格雷码指针与存储器空的映射关系

如果读指针的最高位是0,写指针的最高位是1,这意味着写指针在读指针之前。此时,如果读指针和写指针指向同一个存储器空,参照图2.4.2.1可以判断FIFO已满。写满标志位的逻辑只需要注意格雷码指针最高位不同(写先于读)且指向同一个内存空的情况,那么如何通过比较两个格雷码指针来判断这种情况的发生?第一,最高位不同(因为读指针不能领先写指针,只有写指针领先读指针才有可能);其次,如果最高位为1的所有格雷码指针的第二高位被否定,那么指向同一存储器空的两个指针是相同的,因此第二个条件是第二高位不同。

图1 . 2.4.2.2写满标志位生成逻辑

三.摘要

前面描述了异步FIFO的应用需求和实现原理,重点介绍了空满标志信号的生成方法以及可能出现的“虚空”和“虚满”现象。了解这些关键信号的产生原理,就很容易设计出异步FIFO。

点击展开全文

异步fifo 异步FIFO设计(非常详细,图文并茂,值得一看!)

原文:http://bbs.eetop.cn/thread-308169-1-1.html 一.概述 在大规模的ASIC或FPGA设计中,多时钟系统是不可避免的,这就导致了不同时钟域的数据传输问题。较好的解决方案之一是使用异步FIFO作为不同时钟域数据传输的缓冲区,既可以

热门文章