逻辑设计中多时钟设计【2】

简介

在上个系列中,主要分析了单bit时钟信号是如何在多个时钟域中进行同步的。概括起来只有两点:一是通过同步器,二是将控制信号与数据信号合并成一组(数据+控制)总线,经过FIFO或RAM实现跨时钟域设计。那么在这节中,重点来分析跨时钟域这个概念。通过这节的分析,可以知道那些类型的时钟,在实际的处理过程中是需要同步器的,而哪些不需要经过同步器。一般来说,都可以使用同步器来进行处理,在使用同步器之前,一定要清楚两个时钟间的频率以及相位的关系。但是下面的介绍中,可以不使用同步器的,一方面可以节省逻辑资源,另一方面可以使设计变得简单。


跨时钟域

在讨论时钟域见传输数据的方法之前,先来分析跨时钟域问题的各种类型。如果多个时钟都起源于同一时钟(注:在《硬件架构的艺术》这本书上并没有明确地说是起源于同一外部晶振时钟还是内部RC时钟,或者是PLL或者DCM的时钟,根据作者经验来分析,一般MCU会有内部RC晶振,此处的“同一时钟”并不包含这种精度比较差的RC晶振,因为如果后续需要倍频处理数据的话,因为RC较差的精度,容易造成倍频前的时钟与倍频后的时钟信号在并不是RC此刻震荡的真实频率运算后的结果,造成数据传输的误差。但是这个需要继续实验数据证明,如果有读者发现这个情况并不存在,可以留言回复。总之,推荐比较准确,精度比较高的时钟信号),并且它们的相位和频率关系是一致的,那么这些时钟可以看成是跨同步时钟域的时钟,按照相位和频率的关系,可以将这些时钟分成以下类型:

  • 同频率零相位差时钟
  • 同频率恒定相位差时钟
  • 非同频率可变相位差时钟
在下一节的讨论中,假定两个时钟之间的相位和时钟抖动相同,并假定它们之间的路径已经按同样的时钟延迟和偏移参数进行了平衡。除此之外,还假设这两个时钟起始处的相位差为零,而且触发器的“时钟到Q端”的延时也为零。


概括地来说,我们在讨论信号从一个时钟域到另外一个时钟域是否属于跨同步时钟域,我们仅仅考虑两个时钟信号本身的特性,而暂时不考虑两个时钟在传输过程中因为触发器等发生的时钟延迟造成的影响。


1 同频率零相位差时钟

在此种情况下,两个完全相同的时钟clk1和clk2具有同样的频率与相位差,clk1和clk2我们可以看成为完全相同的。并由同一个时钟源产生。那么,在clk1和clk2之间的传输,并不是跨时钟域的。实际上,这种情形在设计中很少使用。可以不去考虑这种情形。

然而,在实际的逻辑设计中,会碰到另外一种设计情形,即clk1和clk2虽然都是由同一个时钟源产生的,但是两个时钟的起始点不同,并且这个起始点是由异步信号来控制的,那么clk1和clk2应该如何处理,是需要同步器还是根据第3节中的设计方法进行处理,个人推荐如果clk1和clk2因为异步信号造成的延迟并不影响数据信号的传输,并且当异步信号影响完成后,clk1和clk2是同频率,相位差恒定的,那么推荐按照第3节中的处理方法,在满足STA的情况下,不使用同步器。比如reset信号造成的时钟影响。然而,如果组合逻辑信号影响clk1和clk2的时钟的起始点,并且该组合逻辑信号也影响了数据的传输,那么就需要同步器或者Buffer缓存数据。

注:在这种情况下,只需要满足STA(静态时序分析)即可。


2 同频率恒定相位差时钟

这些时钟有相同的时钟周期,但是相位差恒定。实际设计中最常见的有两种,一是对原时钟进行反相处理,二是对原时钟做了一个固定的延迟处理。以下图为例,假设T为时钟周期,时钟相位移动了T/4.

逻辑设计中多时钟设计【2】

每当需要同步的数据信号或控制信号从“clk1”传输到“clk2”时,由于更小的建立时间/保持时间裕量,对组合逻辑(造成建立时间保持时间违例的最主要电路)的延时约束都会变得更紧。如果组合逻辑的延时能保证满足采样沿处建立时间和保持时间的要求。数据就可以正确地传输,并不会有亚稳态产生。在这种情况下是不需要同步器的。只需要使设计的STA通过即可。


当在实际的设计中,因为组合逻辑造成了很大的建立时间/保持时间违例,最通常的处理办法是:在发射边沿和捕获边沿加入偏移,有助于满足时序要求。例如在xilinx中的IODELAY等。


3 非同频率,可变相位差时钟

这类时钟具有不同的频率,而且相位差也是可变的。可以将这类时钟分成两个子类,第一子类中各时钟周期之间是整数倍的关系。第二子类中各时钟周期是非整数倍的关系。不论是哪一子类,各时钟有效边沿的相位差都是可变的。下面将详细讨论着两种情况。

3.1 整数倍频率的时钟

在这种情况下,一个时钟的频率是另一个时钟频率的整数倍,并且它们有效边沿的相位差是可变的。这两个时钟的有效边沿之间可能的最小相位差始终等于较快的那个时钟的时间周期。

在下图中,时钟clk1的频率是时钟clk2的三倍,假定T是时钟clk1的时钟周期,时钟clk2可以用来捕获数据的时间可能是T、2T、3T,这取决于数据在时钟clk1的哪个边沿发出。因此,任意路径的最差延迟都应该在时钟边沿相位差为T时满足建立时间的要求。最差保持时间检查应该在时钟边沿相位差为零时进行。

在以上所有情况下,都有较快时钟的一个完整的周期用来传输数据,以使其能正确地捕捉,所以它通常都可以保证满足建立时间和保持时间的要求。因此,就不会讯在亚稳态或数据不一致的问题,也就不必使用同步器。

需要特别注意的是,在这里,数据由较快的时钟发出,并由较慢的时钟捕获,那么就要考虑数据是否会丢失。原数据应该保持至少一个目的时钟周期的稳定状态。可以使用一些控制电路来满足这一要求。例如使用一个简单的有限状态机FSM,使原数据每三个原时钟改变一次,就不会出现丢失数据的情况了。

逻辑设计中多时钟设计【2】

然而,这个问题并不绝对,并不是一定只需要简单的FSM就能实现的。如果在实际的开发中遇到了同样的问题,首先应该分析输入数据的带宽是不是很大,如果跟上面的例子一样clk1是clk2频率的3倍,但是,clk1所传输的数据量很大,比如视频信号,这就需要使用buffer或者存储器来对clk1时钟域的数据进行暂存。如果这样处理,通过buffer后完全实现了数据的跨时钟域同步(虽然并不属于跨时钟域)。


3.2 非整数倍频率的时钟

这种情况指一个时钟的频率是另一个时钟的非整数倍。而且它们有效边沿的相位差是可变的。

与前面提到的各时钟之间保持整数倍关系不同,因此两个时钟之间的最小相位差足以使亚稳态产生。应当注意的是,亚稳态是否产生,这个与实际的频率以及芯片设计工艺相关。

在第一种情况下,在源时钟有效沿和目的时钟有效沿之间有足够大的相位差,足以保证在当前设计的芯片,当前运行的频率情况下不会产生亚稳态。

在第二种情况下,源时钟和目的时钟有效沿非常接近,导致产生亚稳态问题。然而,在这里时钟频率倍数关系需要满足以下条件,即一旦有时钟边沿接近出现,下一个时钟周期就会留出足够大的时间冗余,使得数据的捕获不会出现违背建立时间或保持时间的要求。

在第三种情况下,两个时钟的时钟边沿在许多连续的周期中都非常接近。但是因为这两个时钟的源头是相同的,所以它们之间的相位差是可以计算出来的。


注意,在下面的所有例子中,会使用某些延迟值,假设时钟边沿之间的相位冗余在小于或等于1.5ns时会产生亚稳态。


例一:

在这种情况中,两个时钟的有效边沿永远不会接近,从而可以保留足够的冗余来满足电路对建立时间和保持时间的要求。

假设两个时钟clk1和clk2分别是对同一个时钟clk的3分频和2分频。那么clk1比clk2慢1.5倍。如下图示,clk1的周期是15ns,clk2的周期为10ns.这两个时钟间的最小相位差是2.5ns,(注意:在分析相位差的时候,有一个前提,即前面提到的“不考虑起始点”)这对于满足建立时间和保持时间已经足够了。(2.5ns>1.5ns)

逻辑设计中多时钟设计【2】

然而,由于该相位差很小,裕量很小1ns(2.5ns-1.5ns),所以在设计中,在跨越两个时钟的位置处应当避免使用的组合逻辑延迟大于1ns。如果在使用的组合逻辑可能会引起亚稳态,那么必须使用同步器。

在数据从慢时钟域传递到快时钟域时,必须增加逻辑一保证数据在快时钟域中只取样一次,这是不会有数据丢失现象。然而,在从快时钟域向慢时钟域传递数据时,就可能出现数据丢失。为了解决这个问题,必须将源数据保持至少一个目标时钟周期,以保证在两个连续变换的源数据之间至少有一个目标时钟到达。


例二:

在这种情况下,两个时钟的有效沿可能间隔性地非常接近,即两个时钟沿会出现挨着的情况。然后在再次出现挨着的情况之前,接下来的几个周期两个时钟沿会保留组后的裕量(能正确捕捉到数据)。这里“挨着”的意思是接近到了足以产生亚稳态的程度。在下图中,时钟clk1和clk2的周期分别为10ns和7ns。那么它们之间的最小相位差是0.5ns,这必然会引起亚稳态,所以需要使用同步器。

由于亚稳态的出现,当两个时钟沿很接近时,数据不能被目标域正确地捕获。然而,在这种情况下,一旦出现时钟沿非常接近的情况时,那么下一个周期的裕量就会很大,是数据就可以被目标时钟正确捕获。下图中信号B2就表示这种情况。所期望的输出是B1,实际的波形是B2.在这里,数据不会丢失,但是可能有数据不连贯的问题。

对于从快时钟域到慢时钟域的传输,可能出现数据丢失,为了阻止这种现象,源数据应该保持至少一个目标时钟周期不变,同样可以通过FSM来实现这一目的。

逻辑设计中多时钟设计【2】

在这种情况下,石中剑的相位差异很小,并能连续存在几个周期。除了变化的相位差异和周期性的重复现象,其余都与异步时钟很相似。

在下图中,时钟clk1和clk2的周期分别为10ns和9ns.可以看出两个时钟的有效时钟沿很接近,并持续4各连续周期。在前两个周期中可能会违背建立时间(源时钟在目的时钟之前),而在后两个时钟周期中可能会违背保持时间(目的时钟在源时钟之前)。

逻辑设计中多时钟设计【2】

这种情况下,将会出现亚稳态的问题,因此需要同步器。同时,除了亚稳态的问题,还有数据从慢时钟域到快时钟域时发生的数据丢失。从上图看出,B1是不包含亚稳态的正确输出。但实际的输出可能是B2.发生的数据丢失情况,因为第一个周期“1”由于违背建立时间未能捕捉到,而在第二个周期中由于违背保持时间误捕捉到了“0”。

为了不丢失数据,数据需要保持稳定至少两个目的时钟周期。这既是用于从快到慢的传输,也是用于从慢到快的传输。可以通过使用简单的FSM对原数据产生进行控制完成这一任务。单数据不连贯的问题仍然存在。

这时,已标准话的技术(比如握手和FIFO)对于传输数据更为有效,因为他们解决了数据不连贯的问题。


总结

在本节中讨论了时钟的三种情况,在下列这三种情况中,是否需要同步器做同步,以及哪些情况不需要同步器,为什么不使用同步器都做个相应的解释,但逻辑设计并没有一成不变的规则,需要根据实际的信号情况进行具体分析。


本节中的图以及三个例子,均来自于《硬件架构的艺术》