精华内容
下载资源
问答
  • 本文主要介绍单比特信号跨时钟域处理问题,感性趣的朋友可以参考下。
  • 在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同频...
  • 上次提出了一个处于异步时钟域的MCU与FPGA直接通信的实现方式,其实在这之前,特权同学想列举一个异步时钟域中出现的很典型的问题。也就是要用一个反例来说明没有足够重视异步通信会给整个设计带来什么样的危害。
  • 本文介绍跨时钟域的数据传递方法,是针对2个同源的时钟信号,大家一起看下。
  • 跨时钟域设计.zip

    2020-03-17 16:50:31
    基于SystemVerilog的跨时钟域设计与验证,翻译Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog
  • 本文我们主要来讨论一下基于FPGA的跨时钟域信号处理同步设计的重要,希望能对你的学习有所帮助。
  • 但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法...
  • 单bit信号跨时钟域的三种方法,电平同步器+边沿同步器+脉冲同步器 包含设计代码与测试代码,欢迎反馈
  • 航天用FPGA设计复杂度越来越高,其表现之一就是设计中存在多个时钟域,当信号从一个时钟域进入另一个时钟域,即不同时钟域之间发生数据交互时,就会带来信号跨时钟域产生的亚稳态问题(CDC问题)。亚稳态问题虽普遍...
  • 经典跨时钟域同步电路 各种异步处理 值得推荐
  • 针对当前 SOC 内部时钟越来越复杂 接口越来越多以及亚稳态 漏信号等常见的各种问题 分析了以往的优化方法的优缺点 然后从电路的角度出发 提出了一种新的 SOC 跨时钟域同步电路设计的方法 这种方法电路简单可靠性高 ...
  • 首先,这是根据各个手册和资料,收集总结的内容,包含了FPGA工程师最基本的时序概念,亚稳态的相关知识,跨时钟域,格雷码 其次,通过公式MTBF分析亚稳态,重要内容有代码 然后,介绍同步电路,跨时钟域的4种方法...
  • 跨时钟域设计.pdf

    2019-07-18 15:07:29
    FPGA跨时钟域设计,深入理解跨时钟域的设计,实际工程经验
  • 讲述在IC设计中,跨时钟域信号同步方法6种
  • 跨时钟域之全面解析

    千次阅读 多人点赞 2020-07-04 17:33:47
    跨时钟域(Clock Domain Crossing,CDC)信号处理问题,首先要考虑的就是亚稳态。 1.亚稳态 亚稳态是指在设计的正常运行过程中,信号在一定时间内不能到达稳定的0或者1的现象。 在多时钟设计中,亚稳态是不可避免的...

    跨时钟域(Clock Domain Crossing,CDC)信号处理问题,首先要考虑的就是亚稳态。

    1.亚稳态

    亚稳态是指在设计的正常运行过程中,信号在一定时间内不能到达稳定的0或者1的现象。

    在多时钟设计中,亚稳态是不可避免的,可以减少亚稳态的发生和传播,消除亚稳态的有害影响。
    在这里插入图片描述
    上图中在信号adat传输到bclk中采样,由于采样时间靠近第二个时钟的上升沿,发生同步失败。同步失败是由于输处bdat变为亚稳态,而在bdat再次被采样时没有收敛到合法的稳定状态。

    为什么会产生亚稳态?
    存储元件,如交叉耦合反相器、SR锁存器、D锁存器和D触发器等都有两个稳定的状态,即0和1,也就是能存储0和1这两个状态。亚稳态就是既不是0又不是1的状态。在分析元器件时,把器件抽象为理想器件以简化分析,但实际的元器件并不是理想的,一个理想的CMOS反相器的电平传输特性如下所示:
    在这里插入图片描述
    理想的CMOS反相器件的电平传输特性:
    在0 < VIN < VM时,VOUT= V+
    在VM < VIN < V+时,VOUT=0

    刚好在VM这个点就能完成“突变”,界限明确。实际上变化时一个过程的。实际的CMOS反相器电平传输特性如下:
    在这里插入图片描述

    在0 < VIN < VIL时,VOH < VOUT < VMAX
    在VIH < VIN < V+时,Vmin < VOUT < VOL
    在VIL <VIN <VH时,VOUT = VIN(VOL < VOUT < VOH)

    如果在后一级的判断电路把低于VOL电压判断为0,把高于VOH的电压判断为1,那么在输入VIL–VLH这个范围的电压产生的VOUT后一级电路就不能判断当前是0还是1,有可能是0,有可能是1,不能准确预测它的输出。

    实际情况下,没有一个点来作为分界线,实际电路做不出来。实际上是高于VH才算1,低于VL才算0,VH>VL,也就是说高阈值VH和VL之间是由一段距离的。

    当输入数据不满足寄存器的建立时间和保持时间的时候,寄存器很可能捕捉到输入数据的电平在未定义的电平区间,就是亚稳态。

    不是每个违反寄存器建立时间和保持时间的信号翻转都会导致亚稳态。一个寄存器进入亚稳态和从亚稳态进入稳态的时间依赖与制造商的制造工艺和使用环境。大部分情况下,寄存器会很快的进入一个定义的稳态中。

    亚稳态的危害

    由于亚稳态的输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值,因此亚稳态除了导致逻辑误判之外,输出在0~1之间的中间电压值还会使下一级产生亚稳态(导致亚稳态的传播)。逻辑误判有可能通过电路的特殊设计减轻危害,亚稳态的传播扩大了故障面,难以处理。

    电平信号的逻辑误判一般只会对电路造成几个时钟的延时,后面还会稳定在需要的电平,不会造成逻辑错误。

    亚稳态信号的稳定时间通常比一个时钟周期要短的多。一般情况下不会超过一个或者两个周期,取决于触发器的性能。
    如果亚稳态超过一个或者两个周期,那么就会被下一个触发器采样到,这样就会造成亚稳态的传播。

    在这里插入图片描述
    上图的bdat1的亚稳态在下一个时钟沿还没稳定,就造成了亚稳态的传播。这里可以选择更快的触发器,减少亚稳态收敛的时间。

    亚稳态的量化公式
    设计人员采用平均故障间隔时间(MTBF:mean-time-between-failure)这个指标来估算从问题出现并导致故障的两个事件间的平均时间。MTBF越高,说明设计的稳定性越好。如果发生了故障,只是说明没有解决亚稳态的问题,并不是系统本身真的出现了问题。

    在这里插入图片描述
    C1和C2代表器件的相关的常数,器件的建立时间和保持时间越小,C2越小,MTBF就越大。所以可以通过更快的触发器,来减少亚稳态发生的概率。

    在这里插入图片描述
    数据变化频率越小,采样时钟越低,MTBF越大。

    减少亚稳态的方法
    亚稳态是不可避免的,是器件的固有属性。可以减少亚稳态的发生和传播,避免亚稳态带来的消极影响。

    减少亚稳态的方法有以下几种:
    (1)使用同步器:比如常用的2级或者多级FF打拍的方法
    (2)降低频率:如果能满足功能要求,降低频率能够减少亚稳态的发生。
    (3)避免变化过快或者过于频繁的信号进行跨时钟采样。
    (4)采用更快的触发器:更快的触发器,也可以亚稳态的产生

    同步器
    信号跨时钟边界,一般有两种场景:
    (1)信号跨时钟边界,可以漏掉某些值
    (2)信号跨时钟边界,不能漏掉任何值

    两级触发同步器
    在这里插入图片描述
    (1)如果亚稳态维持的时间不止一个周期,在下一个时钟上升沿没有稳定,那么第二级的FF也会进入亚稳态,这种情况的概率是1/MTBF

    (2)第一级亚稳态在下一个时钟上升沿稳定,但是被是识别为0,那么第二级的FF输出bq2_dat就是0,说明信号跨时钟采样失败。但是这种情况不会造成亚稳态的传播,也就是不会影响后面的设计。针对这种情况,一般会改变设计,不会让快时钟域的单cycle脉冲,跨时钟到慢的时钟内采样。

    三级或多级同步器
    在高速、超高速设计中,两级的MTBF可能还不够,为了保险会采样三级或多级同步器。
    3级FF的MTBF是2级FF的MTBF的7倍。

    同步器的输入:源时钟寄存
    采用同步器的另外一个要求:通常,需要跨时钟的信号,需要在源时钟经过一级FF进行寄存输出。即,跨时钟信号必须是寄存器的输出,中间不能有组合逻辑。如果输入不是寄存器的输出,是组合逻辑的输出,会是如下情况:
    在这里插入图片描述
    可以看到,adat是组合逻辑的输出,变化的频率更快了,根据MTBF公式:
    在这里插入图片描述
    数据变化太快,会减少MTBF,增加亚稳态发生的概率。如果adat是FF的输出,根据FF的特性,输出在一个时钟周期内是不会改变的,数据的变化频率不会超过时钟频率,这样就能降低跨时钟信号变化的频率,减少亚稳态发生的概率:
    在这里插入图片描述
    在使用同步信号时,要求理解了其中的原理,要求输入信号必须是源时钟域的寄存器输出。

    2. 跨时钟信号处理方法

    跨时钟域的信号可以分为单bit信号和多bit信号。

    单bit信号跨时钟域的处理
    信号跨时钟域,根据两个异步时钟之间的关系可以分为:
    (1)信号从快时钟域到慢时钟域
    (2)信号从慢时钟域到快时钟域

    单bit信号一般采用同步器来做CDC(clock domain crossing)。由于在CDC时,会在源时钟域做寄存器输出,所以信号的变化频率不会超过源时钟的频率,所以这里可用两个时钟间的快慢来分类。

    快时钟域到慢时钟域

    信号从快时钟域到慢时钟域CDC如下图所示:
    在这里插入图片描述
    当在aclk中生成的信号adat被送到了另一个时钟域bclk中采样,由于采样时间太靠近第二个时钟的上升沿,发生的同步失败。同步失败是由于输出bdat1变为亚稳态,而在bdat1再次被采样时没有收敛到合法的稳定状态。

    如果是电平信号进行CDC,不用考虑时钟快慢,直接用同步器就可以,因为总能被采样到。

    快时钟到慢时钟的(单bit)信号处理,主要问题是信号在快时钟域中,可能会多次改变,这样慢是可能来不及采样导致数据丢失。这个问题被称为信号宽度问题,在CDC检查工具中,如果快时钟的信号宽度不足,就会报出CDC违例。

    快时钟到慢时钟的(单bit)信号处理分为两种:
    (1)采样丢失是被允许的。单bit信号一般不会是这种情况,如果是,直接用同步器同步就行。
    (2)采样丢失不被允许。这样就用其他手段来保证数据不丢失。主要原理是保证快时钟与的信号宽度满足一定的条件,使得慢时钟域有足够时间采样到。

    信号宽度的“三时钟沿”要求
    比较安全的宽度是,快时钟域的信号宽度必须是慢时钟域周期的1.5倍以上。也就是要持续3个时钟沿以上(上升沿和下降沿都算)。这个被称为“三时钟沿”要求。

    下面是一个CDC信号只持续一个周期的例子:
    发送时钟域的频率高于接收时钟域,而CDC脉冲在发送时钟域只有一个周期宽,这样CDC信号可以在慢时钟上升沿之间变动,不会被捕获到慢时钟域。
    在这里插入图片描述

    如果CDC信号宽度超过慢时钟周期,但是不足1.5个周期,也会发生问题。
    在这里插入图片描述
    如上图所示,信号宽度超过了一个慢时钟周期,但是可能会setup和hold time违例,导致信号采样失败。

    信号宽度问题的解决方法:

    通过保证信号宽度满足超过慢时钟周期的1.5倍,来解决这个问题,这是最直接,也是跨时钟最快的方法。可以通过system verilog加“断言”的方式来检测是否满足条件。

    但实际中很少用这种方法,因为设计可能会变,设计人员在改变设计时,可能会忘记这个限制。

    所以,通常还是通过“握手”的方式来保证数据被采样到。

    通常的做法是:发送一个使能控制限号,将它同步到新的时钟域,然后通过另一个同步器将同步信号作为确认信号作为确认信号传回发送时钟域,如下图所示:

    在这里插入图片描述
    优点:
    同步反馈信号是一种非常安全的技术,可以识别第一个控制信号并将其采样到新的时钟域中。

    缺点:
    在允许控制信号改变之前,在两个方向上同步控制信号有相当大的延迟。也就是时候,在应答信号到来之前,是不允许源信号改变的。

    在实际的芯片设计中,脉冲(宽度有限)信号的同步都是采用这种握手机制来处理。

    慢时钟到快时钟域

    慢时钟域到快时钟域的CDC,直接使用信号同步器就可以了。

    目标时钟频率必须是源时钟频率1.5倍或者以上,才能算慢时钟到快时钟的CDC。
    只有满足快1.5倍以上,才能满足“三时钟沿要求”。才能保证快时钟域能够采样到慢时钟域的脉冲。

    如果目标时钟域只快一点,为保险起见,还是用握手机制。

    有的设计中为了保险和以后修改的方便,或者不清楚时钟之间的关系,都会按照握手机制来处理。

    多个信号跨时钟的处理

    不同同步器的芯片上的走线也可能不同,导致延时不一样。会导致后端走线难度增大。

    在CDC检查的时候,会有专门的规则来检查是否采样了多bit信号用同步器聚合使用的情况。

    多个信号CDC策略可以分为以下几种:
    (1)多个信号合并,在可能的情况下,将多个CDC合并为1位的CDC信号
    (2)多周期路径发。使用同步负载信号安全地传递多个CDC位。
    (3)使用格雷码传递多个CDC位。
    (4)使用异步FIFO来传递多位信号
    (5)使用DMUX电路结构进行多位信号传递

    多个信号合并

    有时候并不需要将多个信号做CDC。下面是将两个信号合并为1位信号做CDC。

    下图中,接收时钟域中的寄存器需要加载信号和使能信号崔你那个将数据值加载到急促器中。如果负载和使能信号都是在同一个发送时钟边缘上驱动的。那么控制信号之间的小偏差就有可能导致两个信号在接收时钟域中同步到不同的时钟周期。在这种情下,数据不会被加载到寄存器中,就会出问题。
    在这里插入图片描述
    解决方法是,将控制吸纳后b_load和b_en合起来;b_lden = b_load & b_en同步到aclk时钟域中。

    下面这个例子中,显示了两个使能信号,aen1和aen2,它们从发送时钟域依次驱动到接收时钟域,以控制流水线数据寄存器的使能输入。问题是同步器并不能保证两个cycle一定能同步过来,下面的同步器花了3个cycle才tongue完成数据,导致流水线寄存器不能“流水”起来。

    在这里插入图片描述
    该问题的解决方案是只向接收时钟域发送一个控制信号,并在接收时钟域内生成第二个相移流水线使能信号。

    在这里插入图片描述在这里插入图片描述

    多周期路径(Multi-Cycle Path,MCP)
    下图显示在时钟域之间传递两个编码控制信号。如果这两个编码信号在采样时略有偏差,则在接收时钟域中的一个时钟周期内可能会产生错误的解码输出。

    在这里插入图片描述
    多位数据问题可以用“多周期路径法(MCP)”来解决。
    MCP方法是指直接不同步将数据发生到目标时钟域,但是同时送一个同步过的控制信号到目标时钟域。数据和控制信同时发送,允许数据在目标寄存器的输入端进行设置,同时控制信号在到达目标寄存器的负载输入端之前做同步。

    MCP优点:
    (1)不需要在发送时钟域计算适当的脉冲宽度
    (2)发送时钟域只需要将enable toggle到接收时钟域,表示数据已经被传递完成,已经准备好被加载,使能吸纳后不需要返回到初始逻辑电平。

    MCP方法的实质是,不同步多位的数据,只同步一位的控制信号,通过握手保证控制信号能够正确传输,然后在目标时钟域通过控制信号来采样数据。

    MCP需要用到“同步脉冲器”:
    在这里插入图片描述
    同步脉冲器的符号表示如下:在这里插入图片描述

    多周期路径法有两种方法来传递多位信号:在这里插入图片描述
    多周期路径法的思想十分有用,但是实际中用来传递多位信号比较少见,因为逻辑过于复杂。但是MCP方法用来传递单bit的信号却十分有用。

    格雷码

    对于计数器的CDC,大部分是不需要的,如果需要,那就使用格雷码。

    格雷码每次只允许更改一个位,从而消除了跨时钟域同步更改多个CDC位所带来的问题。

    需要注意的是:格雷码必须是计数到2^n才是每次改变一个bit。

    如果计数器是从0-5计数,那么从5–0的计数就不止一个bit改变,就失去了只改变一个bit的初衷。

    格雷码最常见的应用是在异步fifo中,通常异步fifo的深度都是2^N。原因如上,就算浪费面积,也需要把FIFO深度设置为2 ^ N.

    异步FIFO(AFIFO)
    就是深度为2的AFIFO,来进行多bit数据的CDC. 如下图所示:

    在这里插入图片描述
    2个寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,逻辑简单,可以复用AFIFO代码(一般公司都有芯片验证过的AFIFO代码),而且延时也比MCP方法小。

    DMUX(数据分配器)
    有一个输入端和多个输出端1,其逻辑功能是一个输入端的信号发送到多个输出端中某一个,简称DMUX,作用与MUX正好相反。

    在这里插入图片描述

    3.SpyGlass CDC流程

    数字电路的集成度越来越高,设计也就越复杂。系统很少都只工作在一个时钟频率之下。一个系统中往往会存在多个时钟,这些时钟之间有可能是同步的,也有可能是异步的。一个系统中,异步时钟之间存在信号通道,则就会存在CDC(clock domain crossign)。

    下图中,CLKA和CLKB之间没有固定的相位关系,是异步时钟。前半部分设计属于时钟域CLKA,后半部分设计属于时钟域CLKB。DA信号从时钟域CLKA进入到时钟域CLKB,是一个跨时钟域的信号,这条路径被称为CDC path。

    在这里插入图片描述
    CDC(Clock Domain Crossing)是前端设计中最常见的问题。在RTL中要恰当的处理每个异步的控制信号和数据信号,否则就会出现亚稳态,造成严重的function false。

    SpyGalss是目前业界唯一可靠的RTL Sign off解决方案,可以帮助客户在设计早起发现潜在问题,保住产品质量,极大的减少设计风险,降低设计成本。

    包括五大模块:lint,CDC(跨时钟域检查),LP(低功耗),Constraint(约束),DFT(可测试性)。

    在这里插入图片描述
    SpyGlass CDC分析使你能够识别设计中的CDC问题。SpyGlass CDC tool是中Formal Check Methodology工具,相比写case跑仿真来找CDC问题,靠SpyGlass能更早,更全,更快的发现CDC问题。它能够:
    (1)管理是多时钟域设计
    (2)系统地处理CDC问题
    (3)检查和报告任何不同步的信号:时钟和复位

    SpyGlass CDC与静态时序分析相比:
    (1)STA对async interface不太好使,只适合sync模块分析
    (2)CDC paths总是需要设置成false paths
    (3)一般在design的后期能在netlist level做才有意义

    SpyGlass CDC与功能仿真相比:
    (1)黑盒测试很难穷举
    (2)白盒测试需要assertions
    (3)需要覆盖CDC的所有test branches
    (4)很难幸运的覆盖所有,一般只能发现部分问题
    (5)一般在design后期才发现问题

    当soc design设计的clock domain太多,用到很多第三方IP,及设计人员水平参差不齐时,用SpyGlass CDC来检查保证RTL质量是十分必要的。

    在工程的block-level和SOC集成的两个不同阶段,所用的CDC Goal也是有所不同的。Block-level关心的是模块内部,只有模块内部检查没问题后才能做deliver,而SOC集成主要关心的是模块间interface 的CDC问题。

    展开全文
  • FPGA跨时钟域设计

    2016-12-19 09:46:56
    但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法...
  • 跨时钟域处理

    2018-08-30 09:00:05
    跨时钟域处理是FPGA和ASIC中非常常见的问题,这里有详细的文档介绍了6中跨时钟域处理的中文文档。
  • FPGA跨时钟域双口RAM设计,Vivado仿真工程
  • 为了达到可靠的数据传输,借助存储器来完成跨时钟域通信也是很常用的手段。
  • FPGA设计中的跨时钟域问题.pdf
  • 跨时钟域电路设计方法

    千次阅读 2021-03-08 14:26:04
    如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常。并且,由跨时钟域处理不当引发的问题可能是偶现的,通常很难复现和定位问题。综上,CDC(Clock Domain ...

            在数字电路设计过程中 ,难免会遇到某个信号需要跨越不同时钟域的情况。 如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常。并且,由跨时钟域处理不当引发的问题可能是偶现的,通常很难复现和定位问题。综上,CDC(Clock Domain Crossing,跨时钟域)处理,是数字设计中基本而又重要的一个课题。

    亚稳态

            信号输入触发器时,如果在时钟的触发沿(Tsetup+Thold)时间窗口内发现了变化,会导致触发器采集到逻辑0与1之间的中间电平,采集到的值处于不确定状态,触发器的输出也会处于振荡状态,电路无法正常工作,如下图所示。 

    图 1 亚稳态电路时序图

    2.单bit信号CDC

    2.1长信号

            对于图1中的情况,单bit长信号CDC的基本方法是,采用 2 位同步器(俗称打拍),降低亚稳态发生的概率,如果电路时序允许,可以做多位同步器, 通常情况下采用 2 位同步器(保险起见,可多打一拍).图2中,F2的输出B有较大概率发送振荡,经过一个时钟周期后,在下一个时钟的上升沿,F3采集B时,B 仍然振荡的概率已经大为降低,有较大可能性已经处于一个稳定的状态(0或者1)。 如果再多打一拍,则F4采集到F3输出C振荡的概率已经微乎其微了。

    图 2 采用2位同步器电路

    图 3  2位同步器时序图 

    2.2脉冲信号

    慢时钟域跨快时钟域

            对于慢时钟域的脉冲信号,其脉冲长度大于快时钟域2倍及以上周期的,用本小节方法做CDC处理,脉冲长度大于1倍小于2倍的,按下一小节,做展宽处理再CDC.

    图 4 慢时钟域脉冲信号跨快时钟域

    图4中,先将data_a直接在clkb打2拍,再检测data_a_b_d1的上升沿(data_a_b_d1==1’b1 && data_a_b_d2==1’b0),得到clkb下一个时钟周期长度的脉冲信号data_b。

    快时钟域跨慢时钟域

            快时钟域脉冲信号跨到慢时钟域,可能无法被慢时钟采集到,如图5所示

    图 5 快时钟脉冲信号无法被慢时钟采集

            图5中,clka时钟频率是clkb时钟频率的三倍。clka时钟域下的信号data_a有很大概率无法被clk_b采集到。可以考虑将data_a在clka下展宽,然后打拍同步到clkb下。展宽信号在clkb下必须做边沿采集处理,回复出clkb域下的脉冲信号。时序如图6所示。

    图 6 快时钟脉冲展宽CDC

            图6中,先将data_打5拍,将其与5拍延迟信号相或,用时序逻辑,得到触发器data_a_expand.

    data_a_expand在clk_b内打2拍,同步到clkb下。Data_b取data_a_expand_b_d1的上升沿,得到data_b.

    注意三点:

    1. 根据香浓采样定律,需将快时钟域脉冲信号展宽到慢时钟域两个时钟周期以上的长度,才能保证展宽信号被慢时钟域采集到。
    2. 展宽信号data_a_expand必须是时序逻辑。组合逻辑信号不允许跨时钟域。(因为组合逻辑信号容易产生毛刺,更大概率引发亚稳态)
    3. 展宽信号跨时钟域后,必须采集其上升沿或者下降沿,恢复出一个周期的脉冲信号。

    Toggle方法(推荐)

            对于脉冲信号,无论快跨慢还是慢跨快,均可以用本方法做CDC处理。方法如图7所示。

    图 7 toggle方法CDC

            图7中,在clka内根据data_a的脉冲产生翻转信号toggle,即在data_a为1时,翻转toggle寄存器的值。toggle是单Bit长信号。将该信号在clkb打2拍,得到toggle_b_d1,再检测toggle_b_d1的上升沿以及下降沿,恢复出脉冲信号data_b。

    3.多bit信号CDC

            多bit信号跨时钟域,不能采用打拍的方法处理。原因如下。

    图 8 多bit数据CDC后信号重聚合

            图8中,dataa从2’b00跳变到2’b11,且不考虑信号CDC后的长度问题,单看CDC后的数值,也有可能发生错误。

    T3时刻,dataa在clkb的Tsu+Thold时间窗口内发生了变化,有可能发生高bit在T3时刻被采样为0而低bit被采样为1,这样,dataa跨时钟域后,出现了一个异常值2’b01。这会带来错误。

    多bit数据最常用的跨时钟域方法是异步fifo.

    3.1异步FIFO

    格雷码

            格雷码是一种编码方式,其特点是,对于递增的数值,其相邻的数值之间只有1bit发生了改变.该特性使得格雷码被用于多bit数值的跨时钟域中.图9是4bit 二进制码与格雷码的对比.

    图 9 4bit 二进制码与格雷码

    二进制码与格雷码的转换关系如下:

    assign gray=bin^(bin>>1);

    即二进制码和二进制码逻辑右移一位相异或,得到格雷码.

    异步FIFO

    异步FIFO的基本设计思路是,

    1. 将数据按照递增地址,写入(读出)memory类型变量中,读写使能位于不同时钟域,数据本身进入memory,不涉及跨时钟问题.
    2. 将读/写地址(指针)转换成格雷码,通过打拍方法,跨越到写/读时钟域下,与写/读时钟域下的写/读地址(指针)格雷码做比较,判断空满状态.

     

    异步FIFO读空判定条件:写指针格雷码同步到读时钟域后,等于读指针

    异步FIFO写满判定条件:读指针格雷码同步到写时钟域后,高2bit与写指针高2bit相反,剩余低bit相同.

     

    FIFO的数据位宽为DW,FIFO地址位宽AW,FIFO深度DEEP=2AW

    如图9所示,以地址位宽为3为例,理解判断空满的条件

    假设有如下读写过程:

    1. 开始写入和读出地址均为0000,此时FIFO写入8个数据,写地址变为1000(gray:1100),读地址为0000(gray:0000),这就是写满的条件.
    2. 执行8次读操作,使得读地址为1000(gray:1100),这就是读空的条件.
    3. 执行8次写操作,使得写地址等于0000(gray:0000),但读地址仍然为1000(gray:1100),又达到FIFO写满条件.

    注意,指针位宽是AW+1,memory地址位宽是AW.

    4.异步复位同步化

    异步复位的同步化处理,遵循”异步复位,同步释放”原则.异步复位信号的时钟同步方法,如图 10所示,

    图 10 异步复位,同步释放电路图

    经过同步化后的复位信号时序图如图11所示:

    图 11异步复位,同步释放时序图

    代码如图12所示

    图 12异步复位,同步释放代码

     

    展开全文
  • 跨时钟域传输和Verilog代码

    千次阅读 2021-07-18 10:30:06
    结绳法处理单bit信号跨时钟域二、多bit控制信号跨时钟域同步三、多bit数据流跨时钟域同步 前面我们谈到了亚稳态的产生与处理,在异步信号进行跨时钟域传输时,很大概率会产生亚稳态的问题,那么该如何解决跨时钟域...


    前面我们谈到了 亚稳态的产生与处理,在异步信号进行跨时钟域传输时,很大概率会产生亚稳态的问题,那么该如何解决跨时钟域信号传输的问题呢?跨时钟域信号分为单bit控制信号、多比特控制信号和多bit数据流传输,依照这个进行分类处理。

    基本概念

    同步电路:即电路中所有受时钟控制的单元(寄存器和触发器)全部由一个统一的全局时钟控制。

    异步电路:电路中数据传输可以在任何时间发生,电路中没有一个全局或局部的控制时钟。

    时钟域:所谓的同一个时钟域和跨时钟域都是针对时钟源点来说的。

    同步时钟:如果有好几个时钟,它们都是从同一个锁相环(PLL)出来的,那么这些时钟之间的相位和倍数都是确定的,这些时钟称为同步时钟。

    异步时钟:不是从同一个PLL出来的时钟,它们之间的相位和倍数都不可控,称为异步时钟。

    一、单bit信号

    单bit控制信号在传输时,需要两种情况讨论:快时钟域信号同步到慢时钟域、慢时钟域信号同步到快时钟域。为什么要进行这两种分类呢?因为快时钟是肯定可以采样到慢时钟信号的有效边沿,而慢时钟却可能没办法采集到快时钟域的信号边沿,因此需要做另外的处理。

    1.慢时钟域信号同步到快时钟域

    慢时钟域的单bit控制信号在同步快时钟域时,只需要使用边沿检测同步器即可,用两级触发器打两拍同步信号。
    在这里插入图片描述

    module asy_1bit_slow2fast(
    	input  clk1, //慢时钟
    	input  clk2, //快时钟
    	input  rstn,
    	input  data,
    	output dout
    );
    reg       q1,q2,q3;
    
    assign dout = q2 & (~q3);
    //------同步打拍-------
    always@(posedge clk2 or negedge rstn) begin
    	if(!rstn)begin
    		{q3,q2,q1} <= 3{1'b0};
        end
    	else begin
    		{q3,q2,q1} <= {q2,q1,data};
    	end
    end
    endmodule
    

    上图中,data是来自慢时钟域的单比特信号,clk2是快时钟域的时钟。时序图如下所示,经过两级触发器同步两拍后,会产生一个AND(A)信号波形,再经过后一级触发器同步,会产生一个AND(B)的信号,两个信号经过逻辑电路处理,产生一个Output信号脉冲,信号宽度为快时钟域一个时钟周期宽度。
    在这里插入图片描述

    总结:单比特信号在经过边沿检测同步器同步后,会将慢时钟域下宽频的信号脉冲搬移并缩小为快时钟域下一个时钟周期的同步脉冲。
    使用条件:使用边沿检测同步器进行单比特信号的跨时钟同步是有一定的条件,只有满足条件,才能进行有效同步。

    • 慢时钟域下的单比特信号的脉冲宽度,必须要大于或等于快时钟域下2个时钟周期。这样才能保证慢时钟域的脉冲信号是足够保持到被快时钟域的同步器拿到。

    2.快时钟域信号同步到慢时钟域

    由于快时钟域信号频率变化快,导致慢时钟域的时钟信号可能采样不到快时钟域下有效的信号的边沿。这时,就需要使用脉冲同步器进行同步。
    脉冲同步器的结构和时序图如下:
    在这里插入图片描述

    module asy_1bit_fast2slow(
    	input  clk1, //快时钟
    	input  clk2, //慢时钟
    	input  rstn,
    	input  din,
    	output dout
    );
    reg       toggle;
    reg       q1,q2,q3;
    //------产生Toggle信号------
    always@(posedge clk1 or negedge rstn) begin
    	if(!rstn)begin
    		toggle <= 1'b0;
        end
    	else if(din) begin
    		toggle <= ~toggle;
    	end
    	else begin
    		toggle <= toggle;
    	end
    end
    
    //------同步打拍-------
    assign dout = q2 ^ q3; //输出同步后的脉冲信号
    always@(posedge clk2 or negedge rstn) begin
    	if(!rstn)begin
    		{q3,q2,q1} <= 3{1'b0};
        end
    	else begin
    		{q3,q2,q1} <= {q2,q1,toggle};
    	end
    end
    
    endmodule
    

    在这里插入图片描述
    解释一下上面两张图:

    1. 首先,脉冲同步器的作用就是:在快时钟域取出一个单时钟周期宽度的脉冲,然后在经过慢时钟域两级同步和后一级触发器打拍,逻辑异或后产生一个慢时钟下单时钟周期宽度的同步脉冲。
    2. 因为慢时钟很有可能采样不到快时钟,所以需要通过快时钟域下的翻转电路,将快时钟域下前后间隔较多个周期的两个有效脉冲进行标定,形成上图所示的Toggle信号脉冲。
    3. 然后,先通过同步电路将Toggle信号进行同步,形成上图所示的A、B信号波形。
    4. 最后用组合电路做A^B,得到慢时钟域下两个有效的单周期脉冲。

    脉冲同步器同步信号的使用限制

    • 快时钟域下的两个输入脉冲的间隔必须大于或等于慢时钟域2个时钟周期。换做图中的Toggle信号来说,就是Toggle信号脉冲必须要维持两个慢时钟域周期。

    为什么要对间隔有严格要求?

    • 因为如果快时钟域下的两个输入脉冲过近,则会使慢时钟域中同步后的两个输出脉冲紧密相连,输出时钟的宽度会比慢时钟域的单时钟宽度要宽。

    3.结绳法处理单bit信号跨时钟域

    上面所介绍的无论是慢时钟域到快时钟域,还是快时钟域到慢时钟域的处理方式,都具有比较严格的要求。而结绳法是一种适合任何时钟域的过渡的方式,下面将简单介绍一下结绳法来处理单比特信号的从快时钟域到慢时钟域。

    原理:将快时钟域的信号脉冲展宽,等到慢时钟域的同步器采样后,再解绳将信号脉冲还原为原来的周期宽度。

    如下,是典型的结绳法的电路结构:在这里插入图片描述
    PS:以下代码参考:单比特跨时钟域一文。

    module pusle_extend(
        input   clka,     //快时钟域
        input   clkb,	  //慢时钟域
        input   rstn,
        input   din,      //输入信号
        output  dout,     //输出信号
    );
    //--------------------------------------------------------
    reg         din_reg;
    reg			a1,a2; //同步到快时钟域
    reg         q1,q2; //同步到慢时钟域
    
    /**********************************************
    *    慢时钟域内对信号脉冲展宽
    **********************************************/
    always @(posedge clka or negedge rst_n)begin
        if(!rst_n)begin
            din_reg <= 1'b0;
        end
        else if(din) begin     //检测信号有效
            din_reg <= 1'b1;   //信号展宽
        end
        else if(a2) begin      //同步到b后同步回a
            din_reg <= 1'b0;   //拉低,展宽使命完成
        end
    end
    
    /**********************************************
    *    展宽信号同步到慢时钟域,再同步回快时钟域
    **********************************************/
       //1.将展宽信号同步到慢时钟域
    always @(posedge clkb or negedge rst_n)begin
        if(!rst_n)
            {q2,q1} <= 2{1'b0};
        else 
            {q2,q1} <= {q1,din_reg};
    end
       //2.慢时钟域收到后,再把展宽结束的信号同步回快时钟域
    always @(posedge clkb or negedge rst_n)begin
        if(!rst_n)
            {a2,a1} <= 2{1'b0};
        else 
            {a2,a1} <= {a1,q2};
    end
    
    /**********************************************
    *   慢时钟域内同步的脉冲信号
    **********************************************/
    assign dout = ~q2 & q1;
    
    endmodule
    

    解释:

    1. 数据信号Din_clkA作为触发器的时钟,当数据信号脉冲的上升沿到来时,DFF1的输出将会稳定在高电平,此时等待慢时钟clkB的采样同步。
    2. 当clkB采样同步完成后,DFF4会输出高电平。若在DFF4输出高电平期间,此时Din_clkA为低电平,经过组合逻辑会给DFF1复位,开始下一次采样等待。

    总结

    • 结绳法适合采样数据少(信号脉冲间隔大)的信号;
    • 脉冲间隔应该大于3个慢时钟域时钟周期(因为要同步打三拍);
    • 等待3拍后,才能完成复位,允许下一个输入脉冲同步。

    这里解释一下为什么要大于3个慢时钟域时钟周期?当数据上升沿来临时,慢时钟clkB需要等待3拍才会在DFF4上输出高电平,并完成输入端触发器的复位。所以如果快时钟域下的数据信号Din_clkA 变化太快,持续时间短语3个clkB,那么Din_clkA 的变化就无法被采样到,同步出错。

    二、多bit控制信号跨时钟域同步

    多比特信号的跨时钟域传输不能通过简单的同步器同步打拍解决。比如下图,要想另一个时钟域同时传递两个信号(b_load和b_en),因为考虑到时钟偏斜(skew)的可能,将会导致两个信号在另一个时钟域出现一个时间差,这就与原来的逻辑不匹配了。
    在这里插入图片描述
    处理方法:

    • 如果两个信号可以合并,可以在原来的时钟域先将两个信号合并成一个脉冲信号,再进行跨时钟域传输。
    • 如果两个信号不能合并,如译码信号,可以加一个控制信号,在两个信号都稳定后,再通知另一个时钟域采样。

    三、多bit数据流跨时钟域同步

    数据流与多比特控制信号不同,因为数据流具有连续性(及背靠传输)。所以一般直接使用异步FIFO,调节上下游的数据吞吐量。

    展开全文
  • CDC:跨时钟域处理

    千次阅读 多人点赞 2020-12-10 17:10:23
    CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免的。我们采用同步设计的方法保证亚稳态不会...

    前言(还未整理好)

    CDC(clock domain crossing)检查(跨时钟域的检查)是对电路设计中同步电路设计的检查。非同步时钟没有固定的相位关系,这样Setup/Hold不满足而产生了亚稳态是无法避免的。我们采用同步设计的方法保证亚稳态不会无序的在电路中传播,从而导致功能问题。

    随着当今SOC设计的规模越来越大,时钟越来越多,工作模式越来越复杂。跨时钟域电路不但多,而且非常复杂。 在当今的电路设计中我们通常使用多级同步,异步FIFO,握手等同步设计来保证亚稳态信号不会在电路中无序的传播。

    但同步设计中,同步处理不当依然会出现glitch,多路扇出等问题导致电路实际运行出现故障。
    目前我们的数字设计大部分是基于RTL设计的,直接通过RTL检查"跨时钟域的同步设计" 很难做到100%覆盖的检查,特别是当今SOC中集成大量IP,直接通过RTL检查几乎不可能的。 电路设计中同步电路设计的检查都是使用专门的EDA工具做静态的CDC检查。常用的CDC检查工具有Conformal CDC 和 Spyglass CDC。

    此外CDC检查也是前端sign off 重要项目和数字IC设计工程师的必备的技能。

    第一讲 时钟域

    1.1 什么是时钟

    · 时钟信号是一个按一定电压幅值、一定时间间隔连续发出的脉冲信号

    • 脉冲信号之间的时间间隔称为周期;
    • 将单位时间(如1秒)内所产生的脉冲个数称为频率。

    · 每一次脉沖到来,芯片内的晶体管就改变一次状态,让整个芯片完成一定任务

    · 时钟相当于芯片的脉搏,心脏跳动
    在这里插入图片描述

    时钟偏斜(clock skew)

    时钟偏斜,指的是同一个时钟信号到达两个不同寄存器之间的时间差值,Skew的定义就是时钟最长路径减去最短路径的值
    在这里插入图片描述

    时钟抖动(jitter)

    时钟抖动,指的是两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关。

    1.2 什么是时钟源

    数字电路里一般用晶振提供基本的时钟信号。晶振是晶体振淓器( Quartz Crystal OSC)的简称。
    在这里插入图片描述

    ・有些芯片的一部分时钟来自于其他芯片。它的时钟源就是外部芯片的输出信号。比如芯片12C、SPI接口时钟就来自外部芯片。
    在这里插入图片描述

    • 下面这个电路图就是两个时钟源(CLKA是外部时钟源、clk_osc是晶体振荡器提供的)
      在这里插入图片描述

    1.3 同步时钟

    • 同源,比如分频
    • 有固定的相位关系
      在这里插入图片描述
      右下角的图中:如果C1和C2是一个时钟源,则为同步时钟。

    ASIC中的时钟结构

    在这里插入图片描述

    FPGA中的时钟结构

    • MMCM( Mixed- Mode Clock Manager)混合模式时钟管理器

    • High-performance Clock

    • BUFG(全局时钟缓冲器)

    • BUFH( horizontal clock buffers横向BANK时钟绶冲器)

    • BUFR(用于纵向BANK时钟缓冲器)

    • BUFMR (multi-clock region buffers)

    • BUFIO(用于IO输入输出缓冲)
      在这里插入图片描述

    1.4 异步时钟

    • 不同源
    • 没有固定的相位关系

    下图中,CLKA和CLK_OSC就是异步时钟。
    在这里插入图片描述
    问题:有两个不同频率的时钟A和B。A:clk0 为100MHz,B:clk1为99MHz。他们两个是不是异步时钟?
    不一定!
    问题:有两个相同频率的时钟A和B,他们无固定相位,他们两个是不是同步时钟?
    不是同步时钟!

    1.5 什么是时钟域

    时钟域(Clock Domain)是以捕获时钟划分时钟域

    单时钟(Single clock domain):数据发送和接收一个时钟
    多时钟(Multiple clock domain):数据发送和接收不是一个时钟
    在这里插入图片描述

    1.6 跨时钟域问题

    跨时钟域

    • 若一个电路 launch时钟和 capture时钟不是同一个时钟,就是跨时钟电路
    • 若两个时钟是同步时钟就是同步时钟域
    • 若两个时钟是异步时钟就是异步时钟
      在这里插入图片描述
    • 跨时钟域的例子
    • 单个模块:switches, UART receivers, USB-FPGA interfacing
    • 整个系统:Different clock in a large design, e.g., Socs

    跨时钟域问题

    在这里插入图片描述
    CLK1与CLK2来自不同的时钟源。
    由于时钟源不同,对REG2和REG3来讲,在同一时刻,一个认为REG1的输出是1,另一个认为是0,这必定造成电路判断出现错误。

    第二讲 亚稳态

    2.1 建立时间和保持时间

    • 建立时间t(su)(setup time)

    • 对任何一种触发器,在时钟触发沿前后的一个小时向窗口内,输入信号必须稳定。

    • 触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(假设上升沿有效)T时间到达芯片,这个T就是建立时间 Setup time。如不满足setup time,这个正确的数据(或稳定后的数据)就不能被这一时刻时钟打入触发器
      在这里插入图片描述

    • 保持时间t(H)(hold time)

    • 保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果 hold time不够,数据同样不能被正确打入触发
      在这里插入图片描述

    2.2 什么是亚稳态

    亚稳态

    触发器无法在某个规定时间段内达到一个可确认的状态。亚稳态会带来功能的错误

    亚稳态时

    既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。触发器输岀一些中间级电平,或者可能处于振荡状态。

    亚稳态传播

    这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去
    在这里插入图片描述

    2.3 如何处理亚稳态

    • ①降低系统时钟
    • ②用反应更快的FF
    • ③引入同步机制,防止亚稳态传播
    • ④改善时钟质量,用边沿变化快速的时钟信号

    2.4 二级寄存器

    使用同步器降低亚稳态发生的概率:
    1.亚稳态需要一段时间才能到达稳态
    2.二级寄存器可以增加一个 clock cycle的时间使亚稳态稳定

    在这里插入图片描述

    2.5 MTBF

    平均故障间隔时间MTBF (Mean Time Between Failure )

    在这里插入图片描述
    使用同步器降低亚稳态发生的概率
    两级并不能完全隔离亚稳态危害,但极大的概率隔离了亚稳态发生概率。
    在这里插入图片描述

    第三讲 跨时钟域设计——单比特信号的跨时钟域处理

    3.1 慢时钟域信号同步到快时钟域的处理方法

    两级触发器同步

    慢时钟信号进入到更快的时钟域时(频率相差2倍以上),此时不用考虑快时钟域信号采样的丢失,可以考虑使用两级触发器进行同步处理

    边沿检测同步器

    慢时钟信号进入到更快的时钟域时(频率相差2倍以上),为了避免快时钟多次采样到有效信号,快时钟域需要对信号进行边沿检测。需要使用边沿检测同步器

    握手处理

    当一个慢时钟域的单比特信号进入到更快的时钟域,但是两个时钟频率相差不大(频率相差2倍下),为了避免快时钟采样丢失,需要进行握手的同步处理

    3.2 信号上升沿检测

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号取反与同步信号做与逻辑,得到信号的上升沿
    在这里插入图片描述

    3.3 信号下降沿检测

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延迟,延迟后的信号与取反同步信号后做与逻辑,得到脉冲信号的下降沿
    在这里插入图片描述

    3.4 双沿检测器

    快时钟先将输入信号进行两级同步处理,再进行一个时钟的延退,延迟后的信号与同步信号做异或逻辑,就可得到信号的双沿脉冲。
    在这里插入图片描述

    3.5 快时钟域信号同步到慢时钟域的处理方法

    电平拓展

    如果已知慢时钟域的时钟频率,可以考虑将快时钟域的信号进行电平扩展,使其足以被慢时钟域采样。

    脉冲同步器

    快时钟域中需要同步的信号是脉冲信号,它触发原时钟域的反转电路,每当翻转电路收到脉冲时,电路翻转一次慢时钟域的同步器对翻转后的信号进行采样,和边沿检测,重新在本时钟域恢复出脉冲信号

    握手处理

    当一个快时钟域的单比特信号进入到慢的时钟域,同样可以使用握手的方式进行同步处理

    3.6 脉冲同步器(快时钟域到慢时钟域)

    脉冲同步器的使用中,快时钟域的有效信号需要时单脉冲信号,且两个有效信号的时间间隔需要大于等于两个同步器的时钟周期,否则无法恢复出有效信号
    在这里插入图片描述

    3.7 典型电路案例分析(此处再看)

    对跨时钟域的 Timing path如果不处理容易导致亚稳态。如果做了同步处理,但同步处理不当俨然会出现 glitch,多路扇出,Re-convergence,Datahold等问题导致电路实际运行出现故障

    CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等因素导致的传播延迟Td会使A&B存在一个 Glitch。而由于CLKB和CLKA为两个 clock domain,之间不存在固定的相位关系,假设这个 Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题。
    在这里插入图片描述
    错误解决方案
    跨时钟域的多个相关连的单比特信号不可以通过打拍的方式同步到目的时钟域

    第四讲 跨时钟域设计——多比特信号的跨时钟域处理

    4.1 两级触发器的问题

    两级触发器用来处理多比特信号的同步的问题

    • 如果简单的按照单比特信号穿越方法各bit打两拍单独穿越,则会造成各个bit穿越时间不一致(寄存器
      对于每个信号的延迟时间不ー样),则会造成另一个时钟域里面有一些被前一个时钟沿采到了,有些
      被后面的采到了,导致目的时钟域采到的值错误,造成中间态无意义的数据。

    在这里插入图片描述

    两级触发器同步多比特信号的解决方法

    如果多比特信号之间存在逻辑相关性。可以在源时钟域将信号合成一个单一的控制信号然后进行两级寄存器同步
    在这里插入图片描述

    4.2 多比特信号跨时钟域的处理方法

    格需码编码

    通过编码的方式将多位信号转化为每次只有一位变化的信号,将“多比特”的跨时钟域变换成“单比特”进行处理。

    异步FFO

    异步FIFO融合了寄存器同步,格雷码编码,握手控制等处理方式,是处理跨时钟域数据传输最常用的方式。

    握手处理

    所谓握手,是指通信双方使用了专用控制信号进行数据收发的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。类似于DMA与外设模块的通信,会用到dma_req,dma_ack

    4.3 格雷码编码处理跨时钟域

    什么是格雷码

    • 是一种特殊的二进制编码方式,在一定程度上优于二进制编码
    • 可以通过算法与二进制编码进行相互转换
    • 相邻两个编码之间只有一位不同
      在这里插入图片描述

    格码编码的跨时钟域处理

    格雷码的特点是相邻的两个编码之间只有1位不同,消除了在同一个时钟沿,多比特信号或者数据同时变化所带来的跨时钟域问题
    应用局限:只有在数据在相数值间连续变化的情况下才有用,不适用于大多数信号传输或者数据传输的情况。
    在这里插入图片描述

    4.4 异步FIFO

    异步FIFO的特点

    • 异步FIFO的特点是拥有两个相互独立的读写时钟,允许两个独立时钟的频率有较大的差距
    • 跨时钟域的读写地址传输采用格雷码编码,然后加上两级寄存器同步的方式。
    • “满”逻辑用来控制写信号,将读时钟域的读指针同步到写时钟域,在写时钟域进行比较。
    • “空”逻辑用来控制读信号,将写时钟域的写指针同步到读时钟域,在读时钟域进行比较。

    异步FIFO的结构

    • 写控制逻:控割写操作与满信号(wfuI)的判断与产生。
    • 读控制逻辑:控割读操作与空信号(empy)的判断与产生
    • RAM:双端口RAM
    • 二进制码与格雷码转换模块:用于将读写地址二进剖码转成格番码。
    • 跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步
      在这里插入图片描述

    在这里插入图片描述

    4.5 多比特跨时钟域的握手处理

    握手方式的原理

    • 握手方式处理跨时钟域数据传输,需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。
    • 在具体实现中,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应笞。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤后也相应撤销ack信号,此时完成一次正常握手通信。
    • 握手方式是一种稳定可靠的同步处理方式,但控制信号握手检测会消耗通信双方较多的时间。
      在这里插入图片描述

    第五讲 跨时钟域设计——握手处理

    5.1 握手的原理

    握手,即通信双方使用约定的控制信号进行数据传输的状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的。

    5.2 什么时候使用握手同步处理

    • 通信过程需要保障数据的稳定可靠,并能允许通信过程消耗双方较多的时间
    • 当通信双方不能预知相互的响应时间时,握手能让两个时钟域间实现有效的通信
    • 方式一般使用在总线数据的传输上

    5.3 握手电路的实现

    • 双方对握手信号(req和ack)分别使用脉冲检测方法进行同步。
    • 接收方利用脉冲有效沿对传输的数据进行锁存。
    • 完成数据锁存后通知接收方。
      在这里插入图片描述

    第六讲 跨时钟域设计——异步FIFO

    6.1 异步FIFO的应用

    异步FIFO的作用

    解决两个不同时钟域之间批量数据的高效传递。

    异步FIFO的应用

    数据速率的转换,比如突发速率转换为线性均匀速率( burst write and single read).
    不同时钟域数据快速传输与緩存。
    不同数据位宽的数据接口的匹配。

    6.2 异步FFO的结构

    异步FIFO的一般结构

    • 双端口RAM:用于存储效据。
    • 读控制逻辑:控制读操作与空信号( empty)的判断与产生,属于读时钟域。
    • 写控制逻辑:控制写操作与满信号(wfull)的判断与产生,属于写时钟域。
    • 二进制码与格雷码转换模块:用于将读写地址二进制码转成格雷码。
    • 跨时钟同步模块:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。

    异步FIFO处理的核心问题

    • FIFO深度的计算。
    • 读写地址的编码
    • 控制信号、读写地址的跨时钟域同步
    • 读写控制信号的产生。

    经典异步FIFO的结构一

    将读时钟域的读地址(经格雷码转换后),再同步到写时钟域,进行逻辑比较
    将写时钟域的写地址(经格雷码转换后),再同步到读时钟域,进行逻辑比较
    在这里插入图片描述

    经典异步FFO的结构二

    将读写地址(经格雷码转换后)同步到一个组合逻辑电路中(异步比较)直接比较空满,然后将空满信号同步到各自对应的模块中。
    在这里插入图片描述

    6.3 异步FIFO深度的计算

    异步FIFO深度的计算

    • 计算异步FIFO的深度,需要综合考虑读、写的时钟频率,读、写数据的位宽,读、写的频率等。
    • 写快读慢的情况下,突发 burst写入的数据减去该 burst时间内读出的数据,多余的数据需要能缓冲下来,让接收端在剩下空闲的时间能从容地把多余的数据读出来。
    • 读快写慢的情况下,FIFO的深度最小可以设置为1.

    异步FIFO深度的计算示例1

    • FIFO读、写位宽都为8,写时钟 wclk为100MHz,读时钟rclk为95MHz,写入数据的总长为4Kbit,且两次写操作之间的时间间隔足够大。每一个rclk读取一个数据。求FIFO的深度。

    • 写入的突发长度: burst_length=4K/8=500字节(即T时间内写入了500字节的数据)

    • 要保证FIFO不溢出,那么在T时间内,500字节数据要被全部读出。T=500/100MHz.

    • T时间段读取的数据量为:T95MHz=475字节,FIFO的深度至少要大于等于25

    • 公式总结:fifo_depth= burst_ length-( burst_ length /w_clk)r_cIkX/Y

    • 这里X、Y代表的意思:每Y个rclk会有X个数据读出FIFO

    异步FIFO深度的计算示例2

    • FIFO读、写位宽都为8,写时钟wclk为80MHz,读时钟rclk为40MHz,写入数据的总长为120byte,每2个写时钟写入一个数据,每4个读时钟读取一个数据。求FIFO的深度。

    • 写入的突发长度: burst length=120字节(即T时间内写入了120字节的数据)

    • 等效的写时钟频率wclk=80/2=40M

    • 等效的读时钟频率rclk=40/4=10M

    • 要保证FIFO不溢出,那么在T时间内,120字节数据要被全部读出。T=120/40MHz

    • T时间段读取的数据量为:T*10MHz=30字节,FIFO的深度至少要大于等于90字节

    6.4 异步FIFO读写地址的编码

    异步FIFO读写地址的格雷码编码

    • FIFO的读写地址都是连续的。采用格雷码编码,每次地址的变化,都只有1位数据跳变,有利于信号的跨时钟域同步。

    二进制码转换成格雷码

    转换规则:从最右边一位起(最低位开始),依次与前一位“异或",作为该位的输出,最高位不变

    module BINARY_TO_GRAY(binarycode,graycode);
    	parameter n = 4;
    	
    	input 		[n-1:0]	binarycode;
    	output	reg	[n-1:0]	graycode;
    	
    	integer i;
    	
    	always@(binarycode)begin
    		graycode[n-1] = binary[n-1];
    		for(i=0;i<n;i++)
    			graycode[i] = binarycode[i]^binarycode[i-1];
    	end
    endmodule
    

    格雷码转换成二进制码

    转换规则:最高位不变,从最左边起将产生的每一位二进制码,与下一位相邻的格雷码"异或”,作为二进制码的下一位。

    module GRAY_TO_BINARY(graycode,binarycode);
    	parameter n = 4;
    	
    	input 		[n-1:0]	graycode;
    	output	reg	[n-1:0]	binarycode;
    	
    	integer i;
    	
    	always@(graycode)begin
    		binarycode[n-1] = graycode[n-1];
    		for(i=0;i<n;i++)
    			binarycode[i] = graycode[i]^graycode[i-1];
    	end
    endmodule
    

    6.5 异步FIFO读写时钟域的信号同步

    异步FIFO的跨时钟域信号同步

    • 满”信号控制写逻辑,在写时钟域产生。“满控制信号不需要同步到读时钟域。只需要将写地址进行跨时钟域的同步。
    • “空信号控制读逻辑,在读时钟域产芏。“空”控制信号不需要同步到写时钟域。只需要将读地址进行跨时钟域的同步。
    • 跨时钟域地址同步:将读地址的格雷码与wclk同步;将写地址的格雷码与rclk同步。主要操作就是两级寄存器同步。

    为什么使用两级寄存器同步多比特位宽的地址信号?

    • 异步FIFO读写地址都是连续变化的,在进行两级寄存器同步之前,进行格雷码编码,可以将多比特变化的信号变成每次只有单一比特変化的信号进行同步。

    6.6 异步FFO满空信号的产生

    异步FIFO空满信号的产生

    • 读写控制信号判断与产生是通过对读写地址指针的比较判断出来的
    • 二进制比较:因为跨时钟域同步后的地址是格雷码,需要在本时钟域对地址进行二进制转换
    • 格雷码直接比较:省去了二进制的转换,直接将本时钟域的格雷码编码地址与同步过来的格雷码地址进行比较

    传统二进制比较

    当wren有效,写地址=读地址-1或者写地址=读地址+ FIFO_DEP,full为1.写指针超越读指针
    当rden有效,读地址=写地址-1或者读地址=写地址+FIFO_DEP, empty为1;读指针超越写指针

    格需码直接比较产生空满信号

    • 假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
    • 如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指针,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
    • 如果读指针的最高位为1,而写指针的最高位为0,说明写指针发生了回转,这时如果读写指针指向同一存储空间(次高位相异),则可判断为full
    • 当读指针完全与写指针相同时,则判断为 empty
      在这里插入图片描述

    格码直接比较产生空满信号举例

    • 假如FIFO的深度为8,我们用宽度为4的指针对FIFO进行寻址
    • 起初初始化时。Wr_ptr_bin=“0000,rd_ptr_bin=0000、此时,FIFO空”
    • 首先执行8次写操作。Wr_ptr_bin=1100,rd_ ptr bin=0000此时,FIFO满。
    • 然后执行8次读操作。Wr_ptr_bin=“1100,rd_ptr_bin=21100.此时,FIFO空”。
    • 最后执行8次写操作。Wr_ptr_bin=0000,rd_ptr_bin=1100,此时,FIFO满。

    6.7 异步FIFO读写时钟快慢对信号同步的影响

    读写指针的两级寄存器同步所带来的延迟,对空满信号的判断有影响吗

    • 将写指针同步到读时钟域再和读指针比较进行FIFO空状态判断时,因为在同步写指针时需要时间,而在这个同步的时间内有可能还会写入新的数据,因此同步后的写指针一定是小于或者等于当前实际的写指针,所以此时如果FIFO为空”,则实际的写指针可能仍然大于读指针,FIFO并不是真的“空。这样可能会影响FIFO的性能,但是并不会出错。
    • 将读指针同步到写时钟域再和写指针比较进行FIFO满状态判断,同步后的读指针一定是小于或者等于当前的读指针所以此时判断FIFO为满不一定是真满
    • 总结来说异步逻辑转到同步逻辑不可避免需要额外的时钟开销,这会导致满空趋于保守,但是保守并不等于错误,这么写会稍微有性能损失,但是不会出错。

    异步FFO读写时钟频率相差很大,对空满信号的判断有影响吗

    • 假设异步fifo,写时钟500M,读时钟100M,相差5倍。
    • 满信号的判断是在写时钟域,比较同步过来的读指针,由于写时钟500M大于读时钟100M,快时钟采样慢信号,满的判断不会有间题。
    • 空”信号的判断是在读时钟域,比较同步过来的写指针,由于读时钟频率低,采样的写指针可能是离散值(3,6,9).但是采样到的写指针,必定小于写时钟域的写指针。所以判断出来的空”信号,是一个保守的“空”信号。在实际应用中没有问是题。

    第七讲 跨时钟域设计——复位同步问题

    7.1 同步复位和异步复位的特点

    同步复位

    • 复位信号只有在时钟上升沿到来时,オ能有效。复位时间需要大于系统周期,否则,无法完成对系统
      的复位工作。
    • 同步复位可以滤除高于时钟频率的毛刺。是完整的同步设计,有利于时序分析。
    • 同步复位会耗费较多的逻辑资源,并会产生组合逻辑路径延时,复位延时等。

    异步复位

    • 只要综合工艺库有可异步复位的触发器,那么该触发器的数据输入通道就不需要额外的组合逻辑
    • 无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
    • 异步复位设计简单,可以很方便的实现系统的全局复位。

    7.2 异步复位的问题

    异步复位的问题

    • 最大的问题在于它属于异步逻辑,间题出现在复位释放时,如果复位释放接近时钟有效沿,则触发器
      的输出可能进入亚稳态,从而使复位失败
    • 可能因为噪声或者毛刺造成虚假复位信号

    如何解决异步复位的问题

    异步复位同步释放

    7.3 异步复位同步释放

    • 复位信号是异步有效的,即复位的发生与clk无关。后半句“同步释放”是指复位信号的撤除的时侯收到时钟信号的同步(同步释放)。
    • rst_async_n异步复位后, rst_sync_n将拉低,即实现异步复位。当复位信号rst_async_n撤除时,由于双緩冲电路(两级蝕发器)的作用, rst_sync_n复位信号不会随着 rst_async_n的撤除而撤除。
      在这里插入图片描述

    第八讲 跨时钟域设计——跨时钟的代码检查

    8.1 Spyglass功能

    Spyglass

    • Lint
      在RTL阶段对代码的语法,可综合性,结构进行深入分析,并且对代码的错误提供完整、可调试的修改方案
    • SDC
      帮助设计人员在设计的整个流程中生成,验证和管理他们的约東文件。
    • CDC
      提供了业界最完整的多时钟域解决方案,能自动识别各种同步手段(包括 Handshake,FIFO),能采用 Formal引擎验证同步方法在功能上的正确性
    • DFT
      提供了能的骭测ATPG的测试覆盖率分析的能力,基于这个选项,用户可以很容易地预计所作设计的可测试性并且利用工具提供的指导来提高设计的可测试性。
    • Power
      能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。

    Spyglass优势

    Spyglass的检查验证处在设计的前段RTL阶段,枏比较于后端的时序分析和网表验证, spyglass前能更早的发现问题并修正。
    能够让用户能够快速分析出设计中的功耗效率问题,从而在还没有达到后端工序的情况下快速地进行功耗的优化,用户甚至可以在不进行逻辑综合和物理实现的情况下对功耗进行量化的计算。

    Spyglass CDC的特点

    Spyglass CDC检查可以发现仿真、FPGA测试中很难发现的潜在的跨时域处理问题。
    可以检查出复位、时钟是否使用正确,对跨时域设计进行评估检查。

    8.2 Spyglass CDC使用流程

    Spyglass CDC使用方式

    • TCL脚本的方式,TCL方便快捷省去了UI界面上的繁琐操作。
    • 软件UI界面操作,跨时域设计一般设计到的层次较多,界面方式 debug较直观。
    • 通常我们会用脚本启动 Spyglass,走流程,然后在UI界面里面 Debug

    Spyglass CDC所需文件

    • Filelist.f:用户RTL的文件列表。
    • spyglass. sgc: spyglass用的sgdc约東文件。
    • spyglass.tcl:如果是脚本方式启动需要准备tcl脚本文件,并在脚本中对CDC的Goal做声明。

    Spyglass CDC界面方式

    下面是界面方式的使用流程:

    • 建立好文件夹,准备好们elst. spyglass. sgc文件。
    • 打开 Terminal,输入命令: spyglass&。启动 spyglass。
    • 点击 Add File(s),添加filelist和 spyglass.sgdc文件。并点击OK确认。

    8.3 CDC rules check1

    8.4 CDC rules check2

    第九讲 跨时钟域设计——时钟域的综合处理

    9.1时钟的定义

    9.2.同步时钟的约束

    9.3.异步时钟的约束

    9.4.DC的综合处理

    9.5. DC timing分析

    9.6.FPGA的综合处理

    后记

    文章中未展开说明的部分,不是小编目前关注的点。供大家参考。

    展开全文
  • 说到异步时钟域的信号处理,想必是一个FPGA设计中很关键的技术,也是令很多工程师对FPGA望而却步的原因。
  • FPGA跨时钟域处理方法

    2021-07-17 20:19:16
    前提条件是 快时钟域到慢时钟域,原因有两个,1)只有快时钟域到慢时钟域,才能保证慢时钟域的脉冲信号能被快时钟域采样到。2)两级寄存器的主要作用是消除亚稳态(不能完全消除亚稳态,但可以使亚稳态出现的概率...
  • 随着 FPGA 系统设计的复杂化, 系统内部的各个功能模块往往需要工作在不同频率的异步时钟域中, 因此系统内核心功能模块与外设的通信设计无法避免地会涉及到跨时钟域的数据与信号的传递问题 尽管跨时钟域的同步问题...
  • 跨时钟域处理的3大方法,讲的很细,很清楚,很适合初学者的学习
  • Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog 外文经典
  • IC面试中常被问到——跨时钟域信号如何处理IC面试中常被问到——跨时钟域信号如何处理IC面试中常被问到——跨时钟域信号如何处理
  • CDC跨时钟域处理方法

    2018-08-14 09:37:05
    根据各种应用场景,详细介绍了各种CDC跨时钟域电路的处理方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,681
精华内容 3,072
关键字:

跨时钟域