新闻中心

EEPW首页 > EDA/PCB > 设计应用 > 基于异步FIFO实现不同时钟域间数据传递的设计

基于异步FIFO实现不同时钟域间数据传递的设计

作者:■ 武汉大学物理科学与技术学院 常胜 黄启俊时间:2005-05-06来源:eaw

摘    要:数据流在不同间的传递一直是集成电路芯片设计中的一个重点问题。本文通过采用的方式给出了这个问题的一种解决方法,并采用 硬件描述语言通过前仿真和逻辑综合完成设计。
关键词:
引言
当今集成电路设计的主导思想之一就是设计同步化,即对所有时钟控制器件(如触发器、RAM等)都采用同一个时钟来控制。但在实际的应用系统中,实现完全同步化的设计非常困难,很多情况下不可避免地要完成数据在不同间的传递(如高速模块和低速模块之间的数据交换)。这时,如何保持系统的稳定,顺利完成数据的传输就成为一个重要的问题,这也是异步电路设计中最为棘手的问题。
通常的做法是采用对每位信号加同步器或增加握手信号来解决这一问题,但这样会增加系统的复杂度且影响传输速度。本文的做法是在两个时钟域的交界处设计一个,通过它来实现数据流的传输。由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。

不同时钟域间数据传递的
问题及其解决方法
不同时钟域间数据传递的最重要问题就是亚稳态问题。当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败。亚稳态是在两时钟敏感沿靠得很近、第二级时钟敏感沿到来时其输入数据不稳时发生,可将其视为仅仅是第二级触发器输入信号不稳定所导致的结果。只要使输入信号稳定,就能解决亚稳态问题。
针对如上所述亚稳态的特点,可设计一个同步器来保证数据的稳定传输以解决这个问题。其原理在于使信号在新的时钟域中先稳定下来再进入相关的逻辑,以保证信号与新的时钟同步。本设计在时钟域的接口处就采用此法。

异步FIFO模块设计及实现
异步FIFO结构设计
本文所设计的异步FIFO采用循环队列方式,由独立的两个时钟Iclk和Oclk来控制读、写指针。模块结构如图1所示。
输入端口:输入端时钟Iclk,输出端时钟Oclk,8位并行输入数据Din,复位信号Rst_。
输出端口:8位并行输出数据Dout,FIFO写满信号Full,FIFO读空信号Empty。
信号后缀:i—由输入时钟域控制、o—由输出时钟域控制、g—GRAY码、b—二进制自然码。
由于FIFO的空、满是通过比较读、写指针来确定的,而读、写指针分别属于Oclk和Iclk两个时钟域,所以对其比较时要进行同步化处理,即用到双触发器型同步器,以避免亚稳态的出现。以写指针Wp为例。Wpib转换为Wpig,一方面控制Din的写入地址,另一方面通过同步和GRAY到二进制码转换送入到Oclk。本文将传输的Wp由GRAY码形式转换为二进制形式,形成Wpob。此时Wpob与Rpob为同步信号,比较其大小后可判断FIFO是否读空来控制FlagE信号。若FIFO为空,则FlagE置Empty信号,同时调整Rpob停止读出数据。同理可知Rp和Full的控制过程。
在整个数据流动过程中,需要跨过时钟域的指针经历了两次码制的变化:二进制码到GRAY码和GRAY码到二进制码。前者是利用GRAY码在递增时每次只有一位发生变化的特点,以GRAY码的形式通过时钟域分界线最大限度减小了指针信号的变化,避免了信号传输中的抖动。而再将信号由GRAY码转换为二进制码进行比较则是由FIFO异步的特点所决定。由于读、写指针异步,不存在稳定的相对关系,为避免读、写指针同时对一个存储单元进行操作,在对FIFO做空、满比较时会对指针差留下一定余量。由于GRAY码形式不易于直接比较这种有固定差额的数值,所以将其转化为二进制码进行比较。
HDL实现
下面采用 HDL语言在RTL级上设计此异步FIFO数据通道。此方案的核心在于GRAY码到二进制的转换和同步器的设计,均在同步和GRAY到二进制码转换模块中实现,程序如下:
……
always@(posedge Oclk or negedge Rst_)// Oclk domain synchronization
if(!Rst_)
……//initialize Wpmg1,Wpmg2 and Wpob
else
 begin
  Wpmg1<= Wpig;
  Wpmg2<= Wpig1;
 Wpob[0]<= Wpmg2[5]^Wpmg2[4] ^Wpmg2[3] ^Wpmg2[2] ^Wpmg2[1] ^Wpmg2[0];//GRAY to binary
 Wpob[1]<= Wpmg2[5]^Wpmg2[4] ^Wpmg2[3] ^Wpmg2[2] ^Wpmg2[1];
  ……
  Wpob[0]<= Wpmg2[5];
 end
……
如上程序所示,以写指针为例,输入时钟GRAY码写指针Wpig进入输出时钟域后赋给两个串行寄存器Wpmg1、Wpmg2,此后将Wpmg2变换成二进制码并传输给下一级寄存器Wpob。这样就完成跨时钟域数据的同步化并实现了码制的变换。
这样,当读、写信号被顺利同步化以后,实际上其中通过时钟域边界的信号(仍以Wpob为例)已被同步器延迟了两个Oclk周期,在这段时间内Wpib有可能已经在Iclk作用下增加了。如果使用“Wpob=Rpob”为条件来判断FIFO达到空状态,则此时实际控制读FIFO主体的指针Wpig可能已继续下行,导致读出错误的数据。为避免这种情况的出现,进行指针比较时是留有一定余地的,具体程序如下:
……
parameter DIFF=3’b 100;
……
assign FlagE=((Wpob<=Rpob +DIFF)&&(Wpob>=Rpob))?1:0;
……
如上程序所示,以空标志为例,比较的是保留了4位的“即空”状态,即读指针离写指针还差4个周期时,就认为其读“空”,从而置读空标志FlagE。对于一个FIFO而言,数据流在其中是连续流动的,“即空”状态的判断是通过减小FIFO的最大容量来保证传输的稳定。

仿真验证和综合
设系统复位后Din输入为从0开始每Iclk周期加1至63的循环变化数据。如果仿真时钟周期Iclk设为30ns、Oclk设为50ns,所得结果如图2所示。
从图2中可以看到,当输入时钟频率大于输出时钟频率时会出现数据写满的情况。因为此时写时钟是快时钟,故写满比较发生在输入时钟域。当比较到两指针差等于定义的DIFF值(此时为4)时,由Iclk触发写满信号给前级系统。同理可得空状态的仿真也能达到设计要求。
对于逻辑综合,本文使用Synopsys公司的Design Compiler工具实现ASIC综合。通过生成的Violators.rpt、area.rpt、tim_max.rpt、lib.rpt等报告观察综合所得电路的特性,可知此设计无violated constraints,表明综合结果能够达到约束条件的要求,此设计能在给定条件下工作,即约束成功。

结语
本文讨论了异步设计中数据在不同时钟域间传递所产生的亚稳态问题及其解决方法,使用Verilog HDL,采用Top-Down的模块设计方法实现了一种解决此问题的异步FIFO方案。经验证这种方案能方便安全地实现数据跨时钟域的传递,并能同时起到数据缓存的作用,因此是一种较好的解决方法。■

参考文献
1 A.Chakraborty, M.R.Greenstreet  A minimal source-synchronous interface,  ASIC/SOC Conference, 2002. 15th Annual IEEE International , 25-28 Sept. 2002  Page(s): 443 -447
2 William J. Dally,John W. Poulton  Digital Systems Engineering,
CambridgeUniversity Press, 1998,  Page(s): 468. 
3 Clifford E. Cummings   Synthesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs,   Sunburst Design, Inc.



评论

技术专区

关闭