0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

跨时钟域处理方法(二)

CHANBAEK 来源:数字IC与好好生活的两居室 作者:除夕之夜啊 2023-03-28 13:52 次阅读

时钟域采集从快时钟域传输来的信号时,需要根据信号的特点来进行同步处理。 对于单 bit 信号,一般可根据电平信号和脉冲信号来区分。

电平信号同步

同步逻辑设计中,电平信号是指长时间保持不变的信号。 保持不变的时间限定,是相对于慢时钟而言的。 只要快时钟的信号保持高电平或低电平的时间足够长,以至于能被慢时钟在满足时序约束的条件下采集到,就可以认为该信号为电平信号。

既然电平信号能够被安全的采集到,所以从快时钟域到慢时钟域的电平信号也采用延迟打拍的方法做同步。

脉冲信号同步

同步逻辑设计中,脉冲信号是指从快时钟域输出的有效宽度小于慢时钟周期的信号。 如果慢时钟域直接去采集这种窄脉冲信号,有可能会采集不到。

假如这种脉冲信号脉宽都是一致的,在知道两个时钟频率比的情况下,可以采用“快时钟域脉宽扩展+慢时钟域延迟打拍”的方法进行同步。

如果有时窄脉冲信号又表现出电平信号的特点,即有时信号的有效宽度大于慢时钟周期而能被慢时钟采集到,那么对此类信号再进行脉冲扩展显然是不经济的。 此时,可通过“握手传输”的方法进行同步。

假设脉冲信号的高电平期间为有效信号期间,其基本原理如下。

(1) 快时钟域对脉冲信号进行检测,检测为高电平时输出高电平信号 pulse_fast_r。 或者快时钟域输出信号时,不要急于将信号拉低,先保持输出信号为高电平状态。

(2) 慢时钟域对快时钟域的信号 pulse_fast_r 进行延迟打拍采样。 因为此时的脉冲信号被快时钟域保持拉高状态,延迟打拍肯定会采集到该信号。

(3) 慢时钟域确认采样得到高电平信号 pulse_fast2s_r 后,再反馈给快时钟域。

(4) 快时钟域对反馈信号 pulse_fast2s_r 进行延迟打拍采样。 如果检测到反馈信号为高电平,证明慢时钟域已经接收到有效的高电平信号。 如果此时快时钟域自身逻辑不再要求脉冲信号为高电平状态,拉低快时钟域的脉冲信号即可。

此方法实质是通过相互握手的方式对窄脉冲信号进行脉宽扩展。

利用握手信号进行同步处理的 Verilog 模型描述如下。

//同步模块工作时钟大约为 25MHz 的模块
//异步数据对来自工作时钟为 100MHz 的模块
module pulse_syn_fast2s
  #( parameter          PULSE_INIT = 1'b0
   )
  (
   input                rstn,
   input                clk_fast,
   input                pulse_fast,
   input                clk_slow,
   output               pulse_slow);


   wire                 clear_n ;
   reg                  pulse_fast_r ;
   /**************** fast clk ***************/
   //(1) 快时钟域检测到脉冲信号时,不急于将脉冲信号拉低
   always@(posedge clk_fast or negedge rstn) begin
        if (!rstn)
           pulse_fast_r  <= PULSE_INIT ;
        else if (!clear_n)
           pulse_fast_r  <= 1'b0 ;
        else if (pulse_fast)
           pulse_fast_r  <= 1'b1 ;
   end


   reg  [1:0]           pulse_fast2s_r ;
   /************ slow clk *************/
   //(2) 慢时钟域对信号进行延迟打拍采样
   always@(posedge clk_slow or negedge rstn) begin
      if (!rstn)
        pulse_fast2s_r     <= 3'b0 ;
      else
        pulse_fast2s_r     <= {pulse_fast2s_r[0], pulse_fast_r} ;
   end
   assign pulse_slow = pulse_fast2s_r[1] ;


   reg [1:0]            pulse_slow2f_r ;
   /********* feedback for slow clk to fast clk *******/
   //(3) 对反馈信号进行延迟打拍采样
   always@(posedge clk_fast or negedge rstn) begin
      if (!rstn)
        pulse_slow2f_r  <= 1'b0 ;
      else
        pulse_slow2f_r  <= {pulse_slow2f_r[0], pulse_slow} ;
   end
   //控制快时钟域脉冲信号拉低
   assign clear_n = ~(!pulse_fast && pulse_slow2f_r[1]) ;


endmodule

testbench 描述如下。

`timescale 1ns/1ps


module test ;
   reg          clk_100mhz, clk_25mhz ;
   reg          rstn ;


   initial begin
      clk_100mhz = 0 ;
      clk_25mhz  = 0 ;
      rstn = 0 ;
      #11 rstn = 1 ;
   end
   always #(10/2)   clk_100mhz  = ~clk_100mhz ;
   always #(45/2)   clk_25mhz   = ~clk_25mhz ;


   reg [7:0]            cnt ;
   reg                  pulse_sig ;
   always @(posedge clk_100mhz or negedge rstn) begin
      if (!rstn) begin
         cnt     <= 'b0 ;
      end
      else begin
         cnt    <= cnt + 1'b1 ;
      end
   end


   //窄脉冲生成部分
   always @(posedge clk_100mhz or negedge rstn) begin
      if (!rstn) begin
         pulse_sig      <= 1'b0 ;
      end
      else if (cnt == 5 ||
               cnt == 40 || cnt == 42 ||
               cnt >= 75 && cnt <= 81 || cnt == 85 || cnt == 87 ) 
      begin
         pulse_sig      <= 1'b1 ;
      end
      else begin
         pulse_sig      <= 1'b0 ;
      end
   end


   pulse_syn_fast2s u_fast2s_pulse(
      .rstn             (rstn),
      .clk_fast         (clk_100mhz),
      .pulse_fast       (pulse_sig),
      .clk_slow         (clk_25mhz),
      .pulse_slow       ());


   initial begin
      forever begin
         #100;
         if ($time >= 10000)  $finish ;
      end
   end


endmodule // test

仿真结果如下,由图可知:

(1) 快时钟域单个窄脉冲信号被慢时钟域采集到,但是同步后的信号延迟较长,脉冲宽度较大。 信号延迟是因为延迟打拍和反馈清零决定的,无法避免。 脉宽问题,可以通过对慢时钟域的信号再进行打拍边沿检测的方法进行处理。

(2) 两个窄脉冲信号同步后的信号脉宽与单个窄脉冲没有差异,也就是说,同步电路漏掉了第二个窄脉冲的检测。 这也属于握手传输处理同步问题的特点,当快时钟域的脉冲信号变化速率过快时,该方法不能分辨相邻的脉冲。

(3) 当多个宽窄脉冲信号相邻较近时,虽然该同步方法不能分辨多个脉冲信号,但同步后的信号脉宽可能会相对大一些。

图片

多位宽数据同步

当多位宽数据进行同步时,如果该数据各 bit 位都可以看作电平信号,即相对一段时间内各 bit 位数据均可以保持不变以至于能被慢时钟采集到,可以消耗一些触发器资源对多位宽数据进行简单的延迟打拍同步。

但如果数据变化速率过快,就不能再使用延迟打拍采样的方法。 因为此时数据各 bit 位不再是电平信号,变化的时间也参差不齐,用异步时钟进行打拍采样,可能会采集到因路径延迟不停而导致的错误数据,即时序上存在 violation。

解决此类异步问题常用的方法是采用异步 FIFO (First In First Out)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号
    +关注

    关注

    11

    文章

    2640

    浏览量

    75390
  • 脉冲信号
    +关注

    关注

    6

    文章

    333

    浏览量

    36435
  • 时钟域
    +关注

    关注

    0

    文章

    49

    浏览量

    9455
  • 异步时钟
    +关注

    关注

    0

    文章

    17

    浏览量

    9366
  • 电平信号
    +关注

    关注

    3

    文章

    24

    浏览量

    9081
收藏 人收藏

    评论

    相关推荐

    三种时钟处理方法

    ,所以意义是不大的。  方法:异步双口RAM  处理多bit数据的时钟,一般采用异步双口R
    发表于 01-08 16:55

    如何处理好FPGA设计中时钟间的数据

    介绍3种时钟处理方法,这3种方法可以说是FPGA界最常用也最实用的
    发表于 07-29 06:19

    FPGA界最常用也最实用的3种跨时钟处理方法

    介绍3种跨时钟处理方法,这3种方法可以说是FPGA界最常用也最实用的方法,这三种方法包含了单
    发表于 11-15 20:08 1.3w次阅读

    cdc路径方案帮您解决跨时钟域难题

    这一章介绍一下CDC也就是跨时钟域可能存在的一些问题以及基本的跨时钟处理方法。跨时钟域的问题主要存在于异步
    的头像 发表于 11-30 06:29 6663次阅读
    cdc路径方案帮您解决跨<b class='flag-5'>时钟</b>域难题

    简谈异步电路中的时钟同步处理方法

    大家好,又到了每日学习的时候了。今天我们来聊一聊异步电路中的时钟同步处理方法。 既然说到了时钟的同步处理,那么什么是
    的头像 发表于 05-21 14:56 1.3w次阅读
    简谈异步电路中的<b class='flag-5'>时钟</b>同步<b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    揭秘FPGA跨时钟处理的三大方法

    时钟处理方法,这三种方法可以说是 FPGA 界最常用也最实用的方法,这三种方法包含了单 b
    的头像 发表于 12-05 16:41 1365次阅读

    介绍3种方法时钟处理方法

    介绍3种跨时钟处理方法,这3种方法可以说是FPGA界最常用也最实用的方法,这三种方法包含了单
    的头像 发表于 09-18 11:33 2.2w次阅读
    介绍3种<b class='flag-5'>方法</b>跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    详解RTL设计中多时钟域的处理方法

    数字IC系统逻辑设计这部分主要介绍两个方面,一个是RTL的设计基础;另一方面是verilog基本语法。这一篇文章主要介绍一下RTL的设计基础。
    的头像 发表于 05-17 13:52 1424次阅读

    三种跨时钟处理方法

    时钟处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者的必修课。如果是还在校生,跨时钟
    的头像 发表于 10-18 09:12 4005次阅读

    时钟处理方法(一)

    理论上讲,快时钟域的信号总会采集到慢时钟域传输来的信号,如果存在异步可能会导致出现时序问题,所以需要进行同步处理。此类同步处理相对简单,一般采用为延迟打拍法,或延迟采样法。
    的头像 发表于 03-28 13:50 1570次阅读
    跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(一)

    IC设计中的多时钟处理方法总结

    我们在ASIC或FPGA系统设计中,常常会遇到需要在多个时钟域下交互传输的问题,时序问题也随着系统越复杂而变得更为严重。
    的头像 发表于 04-06 10:56 465次阅读

    FPGA跨时钟处理方法(一)

    时钟域是FPGA设计中最容易出错的设计模块,而且一旦跨时钟域出现问题,定位排查会非常困难,因为跨时钟域问题一般是偶现的,而且除非是构造特殊用例一般的仿真是发现不了这类问题的。
    的头像 发表于 05-25 15:06 1242次阅读
    FPGA跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(一)

    FPGA跨时钟处理方法(二)

    上一篇文章已经讲过了单bit跨时钟域的处理方法,这次解说一下多bit的跨时钟方法
    的头像 发表于 05-25 15:07 633次阅读
    FPGA跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(二)

    FPGA跨时钟处理方法(三)

    所谓数据流跨时钟域即:时钟不同但是时间段内的数据量一定要相同。
    的头像 发表于 05-25 15:19 1244次阅读
    FPGA跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(三)

    异步电路中的时钟同步处理方法

    异步电路中的时钟同步处理方法  时钟同步在异步电路中是至关重要的,它确保了电路中的各个部件在正确的时间进行操作,从而使系统能够正常工作。在本文中,我将介绍一些常见的
    的头像 发表于 01-16 14:42 328次阅读