丁彬勇,白雪飞,黄 鲁
(中国科学技术大学 电子科学与技术系 集成电路实验室,安徽 合肥 230027)
在现代集成电路设计中,随着集成度的不断提升,常常会遇到数据缓存与不同时钟域之间数据传递的问题,在不同系统间如不能设计出有效的接口单元,将会产生数据传输过程中的复写、丢失和无效数据的读入等错误,同时亚稳态现象也会出现在不同时钟域之间的数据传递过程中。此时,如何实现数据高速有效的传输并克服跨时钟域间数据传递时的亚稳态成为一个关键点问题。由于异步FIFO (First In First Out)能够有效解决不同传输速度和不同时钟域之间数据传递的问题,异步FIFO在实际电路中得到广泛的运用。本文介绍一种基于ASIC的高速异步FIFO的设计和实现方案。
异步FIFO指在不同时钟域之间,由一个时钟域写入,待写入数据稳定之后,由另一个时钟域读出。图1为异步FIFO的基本结构框图,FIFO的存储单元采用双端口RAM的解决方式,同步模块SYNC完成异步读写时钟域之间指针信号的同步过程,将同步前后的指针送到 wrfull、rdempty模块,产生 wrfull、rdempty信号,从而构成一个完整的FIFO。
表1 FIFO各信号列表
在不同时钟域之间传递的信号,由于两个时钟之间没有清楚的相位和频率关系,很容易出现亚稳态现象。亚稳态是指触发器无法在某个规定的时间段内达到一个可以确认的状态。当一个触发器进入亚稳态时,触发器会输出一些中间电平,或者可能处于振荡状态。在数字电路中,如果将亚稳态信号直接应用于后续的组合逻辑,将会产生难以预测的结果。图2所示为异步时钟的亚稳态现象,图中CLK_A和CLK_B为异步时钟。
图2 异步时钟和亚稳态
亚稳态是不可避免的,但可以采用合适的方法将其降低到一个合适的低概率水平。
首先可以从读写地址指针的编码入手。若采用传统的二进制计数,地址指针的每次增加,则有可能出现从全1到全0的所有位的同时跳变,这种情况使得出现亚稳态的概率大大增加。本文将采用一种特殊的编码方式,使得地址指针的每次增加只会出现一位改变,从而减小亚稳态发生的概率。
其次可以采用两级锁存的办法。如图3所示,在一个信号进入另一个时钟域前,将该信号用两级触发器进行锁存,即使第一级触发器的输出出现亚稳态,经过一个时钟周期之后,进入第二级触发器的信号已经稳定到一个确定的电平,从而两级锁存的输出可以有效减小亚稳态发生的概率。
传统的FIFO指针编码采用格雷码编码的方式。用格雷码表示的地址指针,每次指针的增加,地址指针只会有一位发生变化,降低了指针信号跳变的次数,从而有效减小了亚稳态出现的概率[1]。
与格雷码编码不同,本文设计的FIFO,其指针编码采用的是一种称为移位码的编码方式,移位码的计数规则是每左移一位,将最高位取反后移入最低位[2]。表2分别列出了二进制码、格雷码与移位码的对比情况。
表2 二进制码、格雷码和移位码
由表2可知,移位码每个相邻的码字之间只有一位不同,该特性与格雷码相似,可以有效减小亚稳态出现的概率;并且移位码计数一个周期等同于二进制码计数两个周期,这在之后产生空满标志的过程中将会有很好的应用。
当FIFO的深度为n时,二进制码和格雷码的码字长度是log2(n),而移位码的码字长度为n,这也是移位码的一个缺点,码字长,造成电路中需要更多的寄存器,使得电路面积增大,不过由于计数和产生空满标志位电路的结构更简单,使得面积又得以有效减小。移位码计数电路非常简单,采用移位码编码的写指针计数电路如图4所示,其中wr_ptr为时钟同步后的指针输出,wr_ptr_nxt为下一时钟指针预输出,读指针与之相似。
图4 移位码写指针计数电路
FIFO的存储器可以采用定制的双端口RAM或DFF搭建而成。由于本文设计的32×8的FIFO存储容量不大,所以都是采用DFF搭建而成。
观察表2的移位码可以看出,若将当前移位码与下一位移位码异或,即可快速得到用于存储单元的寻址信号,以下为写地址描述,读地址与之相似。
assign wr_addr=wr_ptr^wr_ptr_nxt;
空满标志位的产生,首先要对读写指针进行同步,同步方法即采用前文所述的三级DFF进行不同时钟域之间的同步。采用格雷码编码方式时,在同步之前需将二进制地址指针转化为格雷码进行同步,同步之后再转化为二进制码来产生空满标志[3],这就使得电路结构复杂化,无形中就增加了电路面积。而在采用移位码编码方式下,由于移位码的每次改变只有一位发生变化,因此直接采用两级DFF对其地址指针进行同步,同步之后将同一时钟域内的读写指针进行比较就可以产生空满标志位了。
仔细观察表2可以看出一种产生空满标志位的巧妙方法:当写指针等于同步到写时钟域内的读指针按位取反时,表示写指针在多遍历一边FIFO的基础上追上了读指针,即FIFO已满。又由于满标志的产生是因为写时钟域内的写指针的增加,失效是由于读时钟域内读指针的增加,所以要把满标志信号同步到写时钟域[4],产生wrfull信号,Verilog实现如下:
空标志位的产生与满标志有一点不同,当读指针与写指针相同时,表示读指针追上了写指针,且二者遍历FIFO的次数相同,即FIFO已空,同样也需要将空标志信号同步到读时钟域内,其Verilog的描述在此不再赘述。
图5所示为移位码方式实现32×8的FIFO的仿真图,该图截取了FIFO从只写状态到写满的波形图,从图5中可以看出,当写指针等于同步到写时钟域内的读指针r2w_ptr_sync按位取反时,写满标志位wrfull跳变为高,且wrfull的输出与写时钟wrclk同步。图6所示为FIFO从只读状态到读空的波形图。由波形分析可知,该FIFO很好地实现了FIFO先进先出及产生空满标志的功能。
图5 FIFO的写满标志仿真结果
图6 FIFO的读空标志仿真结果
将本文设计的 32×8的 FIFO在 SMIC 0.18 μm CMOS工艺下进行综合,将综合结果列于表3。作为对比,利用格雷码编码设计了一个同样大小的FIFO,也将其综合的结果列于表3。综合时钟是 500 MHz(周期为 2 ns)。由表3可以看出采用移位码方式设计的FIFO在500 MHz的时钟约束下,时序仍可以收敛,关键路径中最差的保持时间余量(slack)仍为正,而采用格雷码方式设计的FIFO的slack已经为负,同时移位码方式设计的FIFO面积也比格雷码方式小,动态功耗也有一定程度的降低。
表3 32×8异步FIFO综合结果对比
本文设计了一种采用移位码编码的FIFO,采用这种编码方式,同时解决了亚稳态和产生空满标志位的问题,电路结构更为简单,缩短了电路中的关键路径,使得电路时序更加优化,工作频率明显提升,电路面积和功耗也有一定的降低。该种FIFO已用于基于BPSK(移相键控)调制的超宽带基带芯片中,能稳定工作在500 MHz的时钟频率下。
[1]汪东,马剑武,陈书明.基于 Gray码的异步 FIFO接口技术及其应用[J].计算机工程与科学,2005,27(1):58-60.
[2]周敏.高速异步 FIFO的设计和实现[J].计算机工程与科学,2009,31(2):85-87.
[3]CUMMINGS C E,ALFKE P.Synthesis and synthesis techniques for asynchronous FIFO design with asynchronous pointer comparisons[Z].SNUG,2002.
[4]CUMMINGS C E.Synthesis and scripting techniques for designing multi-asynchronous clock design[Z].SNUG,2001.