• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

笔试|面试|FPGA知识点系列(10)跨时钟域问题解上

武飞扬头像
Dawn_yuan
帮助1


前言

嗨,今天来继续学习FPGA相关知识点~
微信关注《FPGA学习者》获取更多精彩内容


39.跨时钟域问题

CDC(Clock Domain Crossing,跨时钟域)[注,有的地方认为CDC为:Clock Domain Conversion]相关问题,一直是IC前端设计、FPGA设计的热点问题;曾经也困扰我许久,今天我争取一文解决CDC相关的各种问题;
……
如果一文解决不了怎么办?那就两文。

1️⃣从亚稳态入手

亚稳态(Metastablity),什么是亚稳态呢?从字面意思来理解就是一种不太稳定的状态;这种不太稳定的状态,短时间内的高低震荡、徘徊就是亚稳态;这其实是触发器的一个固有属性,在正常的采样情况下,也会经历亚稳态到稳态的过程;

但是如果触发器的输入电压采样时间过短,触发器需要花很长时间来实现输出逻辑达到标准电平,这就使得中间的亚稳态时间过长,电路反应迟钝,从而对系统的功能造成一定的影响。

其实在之前也提到过,不满足建立时间和保持时间的时序要求的话,就会产生亚稳态问题;该问题的分析在笔试|面试|FPGA知识点大全系列(8)之时序分析有详细解释,可参考。

亚稳态问题是时序复杂的电路中无法避免的问题,主要发生在异步信号检测、跨时钟域传输以及复位电路等常用设计中;我们只能在设计电路的过程中尽可能地去降低亚稳态发生的概率。

但是,本文的重点先来说说跨时钟域情况下的亚稳态问题。

在跨时钟域中,更容易出现亚稳态问题;所以我们跨时钟域处理的目的就是在降低亚稳态发生的概率的情况下使数据能够正确的传输。

2️⃣跨时钟域传输的几种情况

①单bit信号传输,多bit信号传输;
②快时钟域到慢时钟域,慢时钟域到快时钟域。
(注:单bit多为控制信号,多bit多为数据信号)
上述条件进行各种组合,可以产生出四种不同的情况:
学新通
不过分类虽然多,但是多bit信号传输方面,大多数都是使用比较大的同步隔离器,进行隔离缓冲数据,比如FIFO、RAM等等;下面先从单bit信号的跨时钟域传输入手。

3️⃣单bit信号的跨时钟域传输

接下来我们就正式的来看看怎么处理这些问题;

3.1单bit信号从慢时钟域到快时钟域传输

这是此类问题中相对来说比较简单的一种,只需要通过两级寄存器组成的同步器对异步信号进行同步就好了,因为快时钟域的时钟,一定能采集到异步的输入信号。
因为异步的输入信号至少保持一个慢时钟周期,而快时钟的周期比这个慢时钟周期短,所以在异步信号结束前一定会被快时钟采到。
两级寄存器组成的同步器,即使用寄存器打两拍的方式进行同步,所谓同步器就是采样一个异步信号,采样输出能够同步到本地或采样时钟模块。
两级寄存的同步器如图所示:
学新通
当然,第二个寄存器输出后可能还会有亚稳态存在,但是这种概率已经非常低了;使用这种同步器需要满足以下几点要求:

①级联的寄存器必须使用同一个采样时钟,不可以是不同的时钟沿;

②发送端时钟域寄存器输出和接收端异步时钟域级联寄存器输入之间不能有任何其他组合逻辑;

③同步器中级联的寄存器中除了最后一个寄存器之外,其他所有的寄存器只能有一个扇出,即只能驱动下一级寄存器的输入。
下面展示的是一些错误情况!
学新通
这种使用了不同的时钟沿的同步器是不行的,两个寄存器之间只有半个时钟周期,第二个寄存器很可能没有足够的时间来处理。
学新通
这种情况也是不行的,组合逻辑的存在有可能产生毛刺,同步器很可能采集到不需要的数据。

不过,下面这种情况是允许的:
学新通
只要同步器链处于同一个时钟域,寄存器链中寄存器可以存在组合逻辑。
在一些特定的高速设计的场合中,甚至可以使用三级触发器对异步信号进行同步处理,如下图所示:
学新通关于该同步器的设计,就不插入代码了,毕竟就是个简单的两级寄存器同步而已。
不过有一点,可能需要注意,慢时钟域到快时钟域的同步,有可能带来信号的冗余,即在快时钟下,多次采样到异步信号,从而使同步后的信号保持较长的时间;不过这也就是个小问题,如果想要得到单脉冲的快时钟域信号,对其进行上升沿检测即可。

3.2单bit信号从快时钟域到慢时钟域传输

既然是快时钟域到慢时钟域传输,那么快时钟域的异步信号最小可为快时钟信号的一个时钟周期,在慢时钟域,很有可能还没有采集到该异步信号,该信号就变化为0了。
学新通
上图所示:临界跨时钟域脉冲在跨时钟域传递时,违反目标寄存器的建立保持时间。
学新通
脉宽比较短的跨时钟域信号在同步过程中丢失数值。

怎么解决呢?

①脉冲同步器

所谓脉冲同步器,主要分为三个模块,如下图所示:
学新通
第一部分为脉冲-电平转换电路;

在快时钟域,接收到低电平的情况下,Q端输出保持信号,接收到高电平(即脉冲信号到来),状态翻转为高电平;再次接收到脉冲信号,状态翻转为低电平;如下图所示:
学新通
第二部分,打两拍进行信号同步;

通过第一部分的操作,相当于对快时钟域的窄脉冲信号进行了展宽,这样慢时钟域的时钟便可以采集到该信号。

第三部分,电平脉冲转换;

该部分本质上来说是一个双边沿检测电路,通过一个异或便可以解决,将此刻信号和前一时刻的信号相异或便可以转化为脉冲信号。

具体代码如下:

`timescale 1ns/1ns

module pulse_detect(
  input         clk_fast  , 
  input         clk_slow  ,   
  input         rst_n    ,
  input        data_in    ,

  output         dataout
);
    
    //第一部分,脉冲电平转换
    reg data_in_r;
    always@(posedge clk_fast or negedge rst_n)begin
        if(~rst_n) 
            data_in_r <= 1'b0;
        else if(data_in)
            data_in_r <= ~data_in_r;
        else
            data_in_r <= data_in_r;
    end
    
    //第二部分,两级同步
    reg data_in_rt0,data_in_rt1;
    always@(posedge clk_slow or negedge rst_n)begin
        if(~rst_n) begin
            data_in_rt0 <= 1'b0;
            data_in_rt1 <= 1'b0;
        end
        else begin
            data_in_rt0 <= data_in_r;
            data_in_rt1 <= data_in_rt0;
        end
    end
    
    //第三部分,电平转换脉冲(边沿检测)
    reg data_in_m;
     always@(posedge clk_slow or negedge rst_n)begin
        if(~rst_n)
            data_in_m <= 1'b0;
         else
             data_in_m <= data_in_rt1;
     end
    
    assign dataout = data_in_m ^ data_in_rt1;

endmodule
学新通

其实,该代码就是牛客网Verilog刷题进阶挑战的第25题,仿真如下图所示:
学新通
绿色框框为输入信号,红色框框为输出信号。

针对该脉冲同步器,有以下几点需要注意:

①输入信号的脉冲之间间隔要大于1.5倍的慢时钟周期,否则将会出现数据丢失问题,如下图,输入四个脉冲信号,只输出三个慢时钟域的脉冲(有一个被水印挡了)。
学新通
②该方法在慢时钟域到快时钟域也同样适用。如下图,慢时钟域到快时钟域仿真。
学新通

②窄脉冲捕捉电路

这是一个比较特殊的跨时钟域电路了,有时候,我们需要捕捉异步短脉冲控制信号,这个控制信号完全由前面的逻辑电路生成,与后面的电路信号无关,我们可以使用下面的窄脉冲捕捉电路来捕捉快时钟域产生的异步窄脉冲控制信号,电路图如下:
学新通
对应的verilog代码如下:


`timescale 1ns/1ns

module test(
  input         clk,  
  input          pluse,
  output    reg     dataout
);
  reg Q1,Q2;
  wire ctr;
  assign ctr = dataout & (~pluse);
  always@(posedge pluse or posedge ctr)begin
    if(ctr)
      Q1 <= 0;
    else
      Q1 <= 1;
  end
  always@(posedge clk)begin
    Q2 <= Q1;
    dataout <= Q2;
  end
endmodule
学新通

仿真如下:
学新通
这是利用了脉冲信号的上升沿进行输出脉冲信号,然后通过后面反馈回来的信号进行清零,从而为下一次脉冲控制信号做好准备。需要注意的是,窄脉冲控制信号的产生频率不能太快,也就是需要等到清零信号无效(三个触发器的延时)后才能发出下一个脉冲控制信号,不然后面的慢时钟域采样电路无法识别两次控制信号,而只当成一次控制信号处理。

写到这里也写挺多了,看来真的要分上下两个部分了;

下期预告:

在下期的内容中将会完完全全解决本文遗留的问题,主要涉及到以下解决方案(包括但不限于):
①单bit信号跨时钟域闭环传输(握手反馈机制);
②多bit信号传输握手协议;
③多bit信号传输的DMUX同步器设计;
④多bit信号传输的FIFO设计。
⑤其他相关问题。

本文参考:

微信关注“FPGA学习者”获取更多精彩内容


往期精彩

笔试|面试|FPGA知识点大全系列(1)
笔试|面试|FPGA知识点大全系列(2)
笔试|面试|FPGA知识点大全系列(3)
笔试|面试|FPGA知识点大全系列(4)
笔试|面试|FPGA知识点大全系列(5)
笔试|面试|FPGA知识点大全系列(6)
笔试|面试|FPGA知识点大全系列(7)之异步FIFO设计
笔试|面试|FPGA知识点大全系列(8)之时序分析
笔试|面试|FPGA知识点大全系列(9)FIFO深度计算详解

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfakgg
系列文章
更多 icon
同类精品
更多 icon
继续加载