FPGA跨时钟域亚稳态研究

时间:2022-10-17 02:53:45

FPGA跨时钟域亚稳态研究

【摘要】在FPGA电路设计中,一个系统可能包含了很多跨时钟域的时钟信号,当其目标域时钟与源域时钟不同时,如何在这些不同域之间传递数据成为了一个重要问题。特别是在中心模块与电路芯片的通信设计中,容易导致亚稳态的跨时钟域就不可避免。针对FPGA设计中的亚稳态问题,本文给出了一系列行之有效的解决方法,很好地抑制亚稳态,提高系统可靠性。

【关键词】亚稳态;建立时间;保持时间;异步FIFO;握手协议

1.引言

在FPGA同步时序电路设计中,即所有时钟寄存器的时钟共享一个时钟,可以有效地消除亚稳态。然而,许多实际应用要求在同一个可编程逻辑器件内采用多个时钟,且核心模块与外设的通信设计也涉及跨时钟域的数据传递。跨时钟的异步时序电路含有的多个时钟源,它们存在频率和相位的差异,当它们用作寄存器的输入时钟时,就可能违背建立时间和保持时间的要求,出现亚稳态[1-5]。亚稳态问题是跨时钟域异步数据传输过程面临的主要问题。

在FPGA设计中,每种触发器都有时序要求。“建立时间”(Setup time)是指在时钟沿到来之前,触发器输入信号必须保持稳定的时间。“保持时间”(Hold time)则是指在时钟沿之后,信号必须保持稳定的时间。这些指标通常比较保守,以应对不同的PVT(工艺、电压、温度)环境下时序各有差异的情况。如果一个设计满足了这些时序要求,则触发器出现错误的可能性可以忽略不计。

亚稳态是当信号在跨时钟的异步电路中或是无关的时钟域之间传输时导致数字系统失效的一种现象。为了使触发器能够正确捕获并输出数据,FPGA的信号传输数据信号都会有一定的时序要求,为了确保可靠的操作,输入寄存器的数据信号必须在时钟沿的某段时间(寄存器的建立时间Tsu)之前保持稳定,并且持续到时钟沿之后的某段时间(寄存器的保持时间Th)之后才能改变。寄存器的输入反映到输出则需要经过一定的延时(时钟到输出的时间Tco)。如果数据信号的变化违反了Tsu和Th的要求,那么寄存器的输出就会处于亚稳态[6]。此时,寄存器的输出会在高电平1和低电平0之间盘旋一段时间,这也意味着寄存器的输出达到一个稳定的高或者低电平的状态所需要的时间会大于Tco。

随着跨时钟域设计的愈发常见和复杂化,只要系统中存在跨时钟域,亚稳态就是无法避免的,因此设计的电路首先要减少亚稳态导致错误的发生,其次要使系统对产生的错误不敏感。前者要靠同步来实现,而后者根据不同的设计应用有不同的处理办法。

2.FPGA设计中的亚稳态

2.1 亚稳态

在FPGA设计中,数据信号在不同时钟域间传递,最容易产生亚稳态,即触发器无法在时序要求的规定时间段内达到一个可确认的状态。数据信号在传输过程中触发器的建立时间或保持时间不满足时序要求,即信号在稳定前的状态,一般是由于时序余量不够,使得电路的输入电平无法上升或下降到所需逻辑电平1或0。

2.2 亚稳态分析

跨时钟异步输入信号可以在任何时间点翻转,它与下级同步采样信号没有必然联系。此外,在数据翻转前,设计者无法预知该被采样信号的时钟沿或翻转顺序,也就不能保证信号满足建立时间。无法保证稳定的采样,给跨时钟域的FPGA设计带来难题。

跨时钟域的转换的核心就是要保证下级时钟对上级时钟数据的采样的Tsu和Th时间。如果触发器的Tsu时间或Th时间不能满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后较长时间处于不确定状态,在这段时间内Q端产生毛刺并不断振荡,最终固定在某一个值,这个值不一定等于原来数据输入端口D的数值,这短时间称为判决时间(Resolution time),经过Resolution time之后Q端经稳定到0或1上,但究竟是0还是1,是随机的。与输入没有必然的联系。

如图1所示,时钟CLK_A在上升沿时采样数据DATAIN,数据信号data是时钟CLK_A同步产生的,输入信号data对下一级的触发器的时钟CLK_B是跨时钟的异步信号,由于data的变化与CLK_B时钟域时钟的采样边沿太接近,未满足采样建立时间,造成的亚稳态周期。输出DATAOUT传递到后面的组合逻辑会产生不定状态,若在进入下一级采样前还没有进入稳定状态,就会导致系统混乱。

亚稳态的危害主要是破坏系统的稳定性。由于输出在稳定前可能有毛刺、振荡、固定的某一电压值,因此亚稳态将导致逻辑误判,严重的情况输出0~1之间的电压值还会使下一级产生亚稳态,即亚稳态的传播。逻辑误判导致功能性错误,而亚稳态传播则扩大故障面。另外,在亚稳态下,电源干扰、环境噪声、工作温度等细微的扰动都可能导致更恶劣的状态不稳定,这时系统的传输延迟增大,状态输出错误。

3.FPGA跨时钟解决方案

FPGA设计中,要减少亚稳态导致的错误并使系统对产生的错误不敏感,就要正确定义和处理FPGA内部与外部时钟之间的接口。对于异步或无关时钟域间传输的信号,在FPGA本地时钟域使用该信号前,必须对其进行同步。同步器的功能是采样异步输入信号,使产生的输出信号满足同步系统对建立时间和保持时间的要求,从而抑制亚稳态对电路的影响。在许多应用中,跨时钟域传送的不只是简单的信号,数据总线、地址总线和控制总线都会同时跨域传输,这些复杂的情况,就需要应用握手协议和异步FIFO的手段来处理这些情况。因此处理跨时钟域常用的方法有两级触发器同步法、握手协议和异步FIFO法3种。

3.1 两级寄存器同步法

为了避免进入亚稳态,通常采用的方法是使用两级寄存器,即一个信号要进入另外一个时钟域之前用另一时钟域的时候进行两次寄存,在图2中,左边为异步的输入端,经过两级触发器采样,在右边的输出与时钟CLK_B同步,而且该输出基本不存在亚稳态。其原理是即使第一个触发器的输出端存在亚稳态,经过一个CLK时钟周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。理论上如果再添加一级寄存器,是同步采样达3级。则末级输出为亚稳态的概率几乎为0。因此使用两级寄存器采样可以有效地减少亚稳态继续传播的概率。

使用图2所示两级寄存器采样不仅能降低亚稳态的概率。但是并不能保证第二级的输出的稳定电平就是正确的电平。前面说过经过Resolution time之后寄存器输出电平是一个不正确定的稳态值。也就是说这种处理方法不能排除采样错误的产生。这时就要求所设计的系统对采样错误有一定的容忍度。有些应用本身就对采样错误不敏感,有些系统对错误采样比较敏感,可以采用一些纠错编码手段完成错误的纠正。

3.2 握手协议

握手协议是实现总线数据跨时钟域通信的一种有效方法,它能在避免亚稳态传播的同时正确地捕获总线数据。握手信号,双方电路在声明或中止各自的握手信号前都要等待对方的响应。使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req、ack)分别使用脉冲检测方法进行同步。在具体实现中,首先,电路A声明它的请求信号,即先把数据放入总线,随后发送有效的请求req信号给电路B。然后,电路B检测到有效的req信号后锁存数据总线,声明它的响应信号,即回送一个有效的ack信号表示读取完成应答。当电路A检测到电路B回应的响应信号有效后,中止自己的请求信号,即撤销当前的req信号。最后,当电路B检测到电路A的信号req撤销后也相应撤销ack信号,此时完成一次正常握手通信。此后,可以继续开始下一次握手通信,如此循环。该方式能够使接收到的数据稳定可靠,有效的避免了亚稳态的出现,以上所述的通信流程如图3所示。

信号跨越一个时钟域要花两个时钟周期的时间,信号在跨越多个时钟域前被电路寄存。全部的时间序列是:A时钟域中最多五个周期加上B时钟域最多六个周期。握手有效的避免了亚稳态的出现,因为通过检测请求与响应信号,每个电路都清楚地知道对方的状态。但控制信号握手检测会消耗通信双方较多的时间,完成所有交互的整个过程要花费很多时钟周期。

3.3 异步FIFO

异步FIFO[7-8]是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个跨时钟异步时钟之间的数据传输。使用一个异步FIFO在两个时钟域的交界处通信,通过它来实现数据流的传输。由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。

由图4可以看出:整个系统分为两个完全独立的时钟域——读时钟域和写时间域;FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。在写时钟域部分,由写地址产生逻辑产生写控制信号和写地址;读时钟部分由读地址产生逻辑产生读控制信号和读地址。在空/满标志产生部分,由读写地址相互比较产生空/满标志。

不同时钟域间数据传递的问题及其解决方法不同时钟域间数据传递的最重要问题就是亚稳态问题。当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败,同样会产生亚稳态。但是通过设计改进可以将其发生的概率降低到一个可以接受的程度。

在FIFO设计中,FIFO指针逻辑使用了格雷码,代替指针使用的二进制码。格雷码在每一次计数增减时只改变其中的一位。你可以在格雷码总线上使用同步器,因为每一次总线改变时只有一根信号线有变化,于是就消除了格雷码总线各位通过不同同步器时的竞争情况,降低了亚稳态的产生,在异步FIFO设计中,通过提高空/满标志产生逻辑的可靠性,能够很好地抑制亚稳态,进一步的降低了亚稳态的产生。

4.结语

在FPGA跨时钟域设计中,亚稳态与设计可靠性有着密切的联系。本文探讨分析了跨时钟域亚稳态的产生机制及FPGA设计中亚稳态问题的解决方法,提出的这些方法行之有效。传输在不相关时钟域的信号,都有可能在相对于捕获寄存器时钟沿的任何时间点变化。因此,设计者无法预测信号变化的顺序或者说信号两次变化间经过了几个锁存时钟周期。设计者必须考虑到电路的这些情况,在实际应用中,设计者可根据具体的实际情况而使用异步FIFO传输信号或者使用握手信号进行控制。

一般情况下两级寄存器同步适合步时钟域之间单信号传输;当几个电路不能预知相互的响应时间时,握手方法能让数字电路间实现有效的通信;总线数据同步、高速数据传输、数据在跨越时钟域时需要存储容量大的缓冲时则可以采用异步FIFO。这些措施能够有效解决FPGA设计中跨时钟域的亚稳态问题,能实现数据跨越时钟域的安全传递。

参考文献

[1]夏字闻.Verilog数字系统设计教程(2版)[M].北京:北京航空航天大学出版社,2008.

[2]魏堃.跨时钟域信号同步技术研究[D].西安:西安电子科技大学,2009.

[3]Michelle Lange.Automated CDC verification protects complex electronic hardware from metastability failures.Mentor Graphics Corporation.Aug.2008.

[4]孟宪元,译.高级FPGA设计结构、实现和优化[M].北京:机械工业出版社,2009.

[5]徐翼,郑建宏.异步时钟域的亚稳态问题和同步器[J].微计算机信息,2008,24(2):171-172.

[6]吴小蕻.跨时钟域若干问题的研究-同步与亚稳态[D].合肥:中国科学技术大学,

2008.

[7]杨青山,蔡敏.基于多时钟域的异步FIFO设设计[J].中国集成电路,2007(9):36-39.

[8]于海,樊晓桠.基于FPGA异步FIFO的研究与实现[J].微电子学与计算,2007.

上一篇:基于DSP的测量数据预处理 下一篇:RoboCup 2D仿真球员射门技能中智能算法的应用...