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

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

3天内不再提示

跨时钟域处理方法(一)

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

理论上讲,快时钟域的信号总会采集到慢时钟域传输来的信号,如果存在异步可能会导致出现时序问题,所以需要进行同步处理。 此类同步处理相对简单,一般采用为延迟打拍法,或延迟采样法。

延迟打拍法

最常用的同步方法是双级触发器缓存法,俗称延迟打拍法。 即,异步信号从一个时钟域进入另一个时钟域之前,将该信号用两级触发器连续缓存两次,可有效降低因为时序不满足而导致的亚稳态问题。 电路示意图如下。

图片

一般设计中使用两级触发器进行缓存即可满足设计时序需求。 大量实验研究表明,三级触发器缓存可解决 99% 以上的此类异步时序问题。

两级触发器延迟打拍并检测信号上升沿的 Verilog 描述如下:

module delay_clap(
    input       clk1,  //异步慢时钟
    input       sig1,  //异步信号


    input       rstn,  //复位信号
    input       clk2,  //目的快时钟域时钟
    output      sig2); //快时钟域同步后的信号


   reg [2:0]    sig2_r ;   //3级缓存,前两级用于同步,后两节用于边沿检测
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) sig2_r  <= 3'b0 ;
     else       sig2_r  <= {sig2_r[1:0], sig1} ;  //缓存
   end
   assign sig2 = sig2_r[1] && !sig2_r[2] ; //上升沿检测

延迟采样法

此方法主要针对多位宽的数据传输。

例如当两个异步时钟频率比为 5 时,可以先用延迟打拍的方法对数据使能信号进行 2 级打拍缓存,然后再在快时钟域对慢时钟域的数据信号进行采集。

该方法主要思想是保证安全采集的时刻,而不用同步多位宽的数据信号,可节省部分硬件资源。

利用打拍的方法进行延迟采样的 Verilog 模型描述如下。

//同步模块工作时钟为 100MHz 的模块
//异步数据对来自工作时钟为 20MHz 的模块
module delay_sample(
    input               rstn,
    input               clk1,
    input [31:0]        din,
    input               din_en,


    input               clk2,
    output [31:0]       dout,
    output              dout_en);


   //sync din_en
   reg [2:0]    din_en_r ;
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) din_en_r  <= 3'b0 ;
     else       din_en_r  <= {din_en_r[1:0], din_en} ;
   end
   wire din_en_pos = din_en_r[1] && !din_en_r[2] ;


   //sync data
   reg [31:0]           dout_r ;
   reg                  dout_en_r ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)
        dout_r         <= 'b0 ;
      else if (din_en_pos)
        dout_r         <= din ;
   end
   //dout_en delay
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)        dout_en_r      <= 1'b0 ;
      else              dout_en_r      <= din_en_pos ;
   end
   assign       dout    = dout_r ;
   assign       dout_en = dout_en_r ;


endmodule

该方法时序结果图如下所示。

显然,在 clk2 时钟域,t2 时刻对数据进行采样缓存比 t1 时刻要安全的多。

图片

但如果慢时钟域没有数据使能信号 din_en, 或数据使能信号一直有效,此时在快时钟域对数据使能信号上升沿进行检测的方法将会失效。 因为数据使能信号一直有效,除了第一个数据,快时钟域将无法检测到后继数据的传输时刻。

解决方法就是,在快时钟域对慢时钟信号的边沿进行检测。

如果两个时钟的频率相差较小,可能还需要对数据进行延迟缓存,以保证采集到的是当拍时钟的数据; 如果两个时钟的频率相差较大,数据采样时刻可以通过计数的方法获得,而不用对数据进行缓存。

利用计数延迟采样的方法对慢时钟边沿进行检测的 Verilog 模型描述如下。

//同步模块工作时钟为 100MHz 的模块
//异步数据对来自工作时钟为 999KHz 的模块
module delay_cnt_sample(
    input               rstn,
    input               clk1,
    input [31:0]        din,
    input               din_en,


    input               clk2,
    output [31:0]       dout,
    output              dout_en);


   //4级缓存:3级用于打拍同步,一级用于边沿检测
   reg [3:0]    edge_r ;
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) edge_r  <= 3'b0 ;
     else       edge_r  <= {edge_r[3:0], clk1} ;
   end
   wire edge_pos = edge_r[2] && !edge_r[3] ;


   //延迟计数器,检测到慢时钟上升沿时开始计数
   reg [5:0] cnt ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)                cnt <= 6'h3f ;
      else if (edge_pos && din_en)
                                cnt <= 6'h0 ;
      else if (cnt != 6'h3f)    cnt <= cnt + 1'b1 ;
   end


   //数据同步
   reg [31:0]           dout_r ;
   reg                  dout_en_r ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)
        dout_r         <= 'b0 ;
      else if (din_en && cnt == 47) //大约在慢时钟周期中间时刻采样
        dout_r         <= din ;
   end
   //数据使能信号较数据采样时刻延迟一个周期输出
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)        dout_en_r      <= 1'b0 ;
      else if (din_en && cnt==48)
                        dout_en_r      <= 1'b1 ;
      else              dout_en_r      <= 1'b0 ;
   end
   assign       dout    = dout_r ;
   assign       dout_en = dout_en_r ;


endmodule

频率相差较大的数据同步采样结果图如下。

由图可知,快时钟采样时刻在慢时钟周期中央时刻左右,此时是非常安全的。

图片

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

    关注

    11

    文章

    2639

    浏览量

    75388
  • 触发器
    +关注

    关注

    14

    文章

    1677

    浏览量

    60404
  • 时钟域
    +关注

    关注

    0

    文章

    49

    浏览量

    9455
  • 异步信号
    +关注

    关注

    0

    文章

    8

    浏览量

    6994
  • 时钟采样
    +关注

    关注

    0

    文章

    4

    浏览量

    3338
收藏 人收藏

    评论

    相关推荐

    三种时钟处理方法

    的三种方法时钟处理方法如下:  1. 打两拍;  2. 异步双口RAM;  3. 格雷码转换
    发表于 01-08 16:55

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

    时钟处理是FPGA设计中经常遇到的问题,而如何处理
    发表于 07-29 06:19

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

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

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

    这一章介绍一下CDC也就是跨时钟域可能存在的一些问题以及基本的跨时钟处理方法。跨时钟域的问题主要存在于异步
    的头像 发表于 11-30 06:29 6658次阅读
    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 3985次阅读

    时钟处理方法(二)

    时钟域采集从快时钟域传输来的信号时,需要根据信号的特点来进行同步处理。对于单 bit 信号,一般可根据电平信号和脉冲信号来区分。
    的头像 发表于 03-28 13:52 532次阅读
    跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(二)

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

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

    FPGA跨时钟处理方法(一)

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

    FPGA跨时钟处理方法(二)

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

    FPGA跨时钟处理方法(三)

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

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

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