基于异步FIFO实现不同时钟域间数据传递的设计
发布时间:2008/5/28 0:00:00 访问次数:611
关键词:异步fifo;时钟域;verilog
引言
当今集成电路设计的主导思想之一就是设计同步化,即对所有时钟控制器件(如触发器、ram等)都采用同一个时钟来控制。但在实际的应用系统中,实现完全同步化的设计非常困难,很多情况下不可避免地要完成数据在不同时钟域间的传递(如高速模块和低速模块之间的数据交换)。这时,如何保持系统的稳定,顺利完成数据的传输就成为一个重要的问题,这也是异步电路设计中最为棘手的问题。
通常的做法是采用对每位信号加同步器或增加握手信号来解决这一问题,但这样会增加系统的复杂度且影响传输速度。本文的做法是在两个时钟域的交界处设计一个异步fifo,通过它来实现数据流的传输。由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。
不同时钟域间数据传递的
问题及其解决方法
不同时钟域间数据传递的最重要问题就是亚稳态问题。当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败。亚稳态是在两时钟敏感沿靠得很近、第二级时钟敏感沿到来时其输入数据不稳时发生,可将其视为仅仅是第二级触发器输入信号不稳定所导致的结果。只要使输入信号稳定,就能解决亚稳态问题。
针对如上所述亚稳态的特点,可设计一个同步器来保证数据的稳定传输以解决这个问题。其原理在于使信号在新的时钟域中先稳定下来再进入相关的逻辑,以保证信号与新的时钟同步。本设计在时钟域的接口处就采用此法。
异步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实现
下面采用verilog 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可
关键词:异步fifo;时钟域;verilog
引言
当今集成电路设计的主导思想之一就是设计同步化,即对所有时钟控制器件(如触发器、ram等)都采用同一个时钟来控制。但在实际的应用系统中,实现完全同步化的设计非常困难,很多情况下不可避免地要完成数据在不同时钟域间的传递(如高速模块和低速模块之间的数据交换)。这时,如何保持系统的稳定,顺利完成数据的传输就成为一个重要的问题,这也是异步电路设计中最为棘手的问题。
通常的做法是采用对每位信号加同步器或增加握手信号来解决这一问题,但这样会增加系统的复杂度且影响传输速度。本文的做法是在两个时钟域的交界处设计一个异步fifo,通过它来实现数据流的传输。由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。
不同时钟域间数据传递的
问题及其解决方法
不同时钟域间数据传递的最重要问题就是亚稳态问题。当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败。亚稳态是在两时钟敏感沿靠得很近、第二级时钟敏感沿到来时其输入数据不稳时发生,可将其视为仅仅是第二级触发器输入信号不稳定所导致的结果。只要使输入信号稳定,就能解决亚稳态问题。
针对如上所述亚稳态的特点,可设计一个同步器来保证数据的稳定传输以解决这个问题。其原理在于使信号在新的时钟域中先稳定下来再进入相关的逻辑,以保证信号与新的时钟同步。本设计在时钟域的接口处就采用此法。
异步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实现
下面采用verilog 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可