0%

FPGA设计高级技巧之时钟域

本节主要介绍了单比特与多比特信号跨时钟域的常见解决办法。

时钟域

  • 单一时钟域:所谓单一时钟域,是指只有一个独立的网络可以驱动整个设计中所有触发器的时钟端口。

  • 时钟域:是指一组逻辑,这组逻辑中的所有同步单元(触发器、同步RAM块以及流水乘法器等)都使用同一网络作为时钟。

  • 并不一定是FPGA只有一个外部时钟输入就是单时钟域了。例如逻辑门控可以产生时钟,同样PLL也可以产生多个时钟输出供内部逻辑使用,只不过PLL的输出时钟之间一般具有相关性。由于PLL产生了多个时钟输出,所以这样的设计也属于多时钟域设计

  • 上句话想表达的应该是输入给FPGA内部使用的时钟(由外部时钟分频或者门控等产生),如果是不同的时钟,那么就是多时钟域,如果只有一个时钟,那么就是单时钟域。

    image-20240120185417972

单比特信号跨时钟域的同步处理

  • 跨时钟域是指设计中存在两个或两个以上异步时钟域。(我目前对异步时钟域的理解是,由不同外部时钟源产生的时钟,但好像大家分析问题的时候往往把它当成不同频率或者不同相位的时钟了)

1.亚稳态及其危害

  • 对于沿触发的触发器来说,其输出存在“1”或“0”两个有效状态。

  • 触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器数据输入端口上的数据在这个时间窗口内发生变化,那么就会产生时序违规。

  • 此时触发器内部的某个节点可能会在一个电压范围内浮动,无法稳定在逻辑0或逻辑1状态。

  • 从时序收敛的角度来说,两个触发器之间的组合逻辑延时要求小于最小的时钟周期,但这种亚稳态信号保持亚稳态的时间,本身就是变相增加了逻辑延时。

    image-20240120191136421

2.处理亚稳态的经典方法:双触发

  • 常见的同步器是使用两级寄存器,即使用寄存器打两拍的方式进行同步。所谓的同步器就是采样一个异步信号,采样输出能够同步到到采样时钟的模块。

  • 该方法一般用于同步慢速信号到快速时钟域,因为快时钟域是肯定可以采集到慢时钟域的数据的(如果快速时钟域的时钟频率是慢速时钟域的1.5倍以上,那么同步较慢的控制信号到一个快速时钟域通常来说不会有问题),所以需要解决的就是亚稳态的问题

    image-20240120191713706
  • 当然,仍然有可能级联的第二个寄存器输出还会表现为非稳定状态,但是这种双寄存同步器已经可以解决大部分亚稳态问题。在设计这种同步器的时候应当注意遵循以下原则:

    • 级联的寄存器必须使用同一个采样时钟

    • 发送端时钟域寄存器输出和接收端异步时钟域级联寄存器输入之间不能有任何其他组合逻辑。因为由于组合逻辑会产生毛刺,这样同步器很有可能采样到不需要的数据。

      image-20240120192032537
    • 同步器中级联的寄存器除了最后一个寄存器外所有的寄存器只能有一个扇出,即其只能驱动下一级寄存器的输入

  • 另外,只要同步器中寄存器链处于同一时钟域,那么寄存器链中寄存器路径之间是可以存在组合逻辑的。

    image-20240120192351712
  • 一些高速设计中需要再额外加入一级寄存器来增加MTBF(平均故障间隔时间),也即同步器中两级寄存器的MTBF太短。

    image-20240120192659688

3.同步快速信号到慢速时钟域

  • 如果丢失信号采样值对于设计来说是不允许的,那么有两种通用的应用方法可以解决这个问题:

    • 一个是开环解决方案,确保信号在无须确认的情况下可以被采集
    • 另一个是闭环解决方案,即在跨时钟域边界时,信号需要接收端的反馈确认。
  • 开环解决方案是:仍然采取之前介绍的打两拍同步器来采样跨时钟域信号,但是前提是需要先将目标展宽,最佳的脉宽是至少为采样时钟周期的1.5倍,这样跨时钟域信号将会被接收时钟域的时钟至少稳定地采样一次。

    image-20240120194307407image-20240120194326051

    image-20240120194557613
  • 闭环解决方案是:在发送时钟域将数据同步到接收时钟域,再通过反馈回发送时钟域,通过一定逻辑判断,只有当接收数据与发送数据相等时,才传输第下一个数据

    image-20240120202038949 image-20240120202304216

多比特信号跨时钟域同步处理

  • 为什么多比特数据跨时钟域时不能采用打两拍的方式处理?如下图所示,每个寄存器的位置不同,布局布线和逻辑的不同会导致每比特数据到达下一级寄存器的延时不同,而且延时会随着打拍数的增加、数据位宽的增加、时钟频率的增大而变得更加恶劣

    image-20240120202805830
  • 多比特信号跨时钟域同步处理通常采用以下三种方式:

    • 多比特信号融合策略:即在可能的情况下,将多比特跨时钟信号融合成单比特跨时钟域信号
    • 多周期路径规划策略:即使用同步加载信号来安全地传递多比特跨时钟域信号
    • 使用格雷码传递多比特跨时钟域信号

1.多比特信号融合

  • 将加载和使能两个控制信号融合成一个单比特信号(这两个控制信号本身相同,且同时有效)

    image-20240120203400280image-20240120203425444

  • 当两个控制信号需要流水间隔一个时钟周期时,要增加一个额外的寄存器将同步后的使能控制信号寄存一拍,这样数据和控制信号形成匹配的流水。

    image-20240120203715571image-20240120203740266

2.多周期路径规划

  • 暂时没懂?有一个边沿检测作为同步???

3.使用FIFO结构处理多比特跨时钟域信号

  • 跨时钟域传输数据用得最多的方法就是使用先入先出结构。FIFO可以用于在两个异步时钟域之间传输多比特信号。格雷码常用于在异步时钟域之间传递多比特计数值,且多用于FIFO内。
  • 有关FIFO的详细内容具体见我的另一篇文章:FPGA数字信号处理之FIFO | ssy的小天地 (ssy1938010014.github.io)

Reference

欢迎来到ssy的世界