https://www.cnblogs.com/digital-wei/p/5925502.html

一、前言

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  在数字芯片设计中常常涉及不同的工作时钟域,在异步时钟域间控制交互、数据交互又涉及异步电路设计。良好、健壮的异步电路设计可提高系统的稳定性、可靠性、健壮性。本博文介绍异步电路中的脉冲同步设计方法。

二、应用

  在设计开发过程中,经常会有如下的应用: 时钟域A的脉冲信号需同步到时钟B中使用,其中时钟A与时钟B在不同场景下有不确定的关系,如下图(1)、(2)所示。

  (1) 慢时钟域到快时钟域的脉冲同步

  异步信号同步问题1:单向同步及问题所在 随笔 第1张

(2) 快时钟域到慢时钟域的脉冲同步

 

  异步信号同步问题1:单向同步及问题所在 随笔 第2张

三、简单的脉冲同步器

  基于以上应用,设计一个简单的脉冲同步器如下图所示:

  (1) 将src_clk时钟域的输入脉冲转换为src_clk时钟域的电平信号src_state;

  (2) 对src_data电平信号进行打拍(一般可打2拍)同步到dst_clk时钟域;

  (3) 对dst_clk时钟域的电平信号进行边沿检测,产生dst_clk时钟域的脉冲;

  异步信号同步问题1:单向同步及问题所在 随笔 第3张 

  代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 //-- ====================================================================================-- // THIS FILE IS PROVIDED IN SOURCE FORM FOR FREE EVALUATION, FOR EDUCATIONAL USE OR FOR // PEACEFUL RESEARCH.  DO NOT USE IT IN A COMMERCIAL PRODUCT . IF YOU PLAN ON USING THIS // CODE IN A COMMERCIAL PRODUCT, PLEASE CONTACT justforyou200@163.com TO PROPERLY LICENSE // ITS USE IN YOUR PRODUCT. // // Project      : Verilog Common Module // File Name    : pulse_sync. v // Creator(s)   : justforyou200@163.com // Date         : 2015 /12/01 // Description  : A sample pulse sync // // Modification : // (1) Initial design  2015-12-01 // // //-- ====================================================================================--   module PULSE_SYNC      (          src_clk     , //source clock          src_rst_n   , //source clock reset (0: reset)          src_pulse   , //source clock pulse in          dst_clk     , //destination clock          dst_rst_n   , //destination clock reset (0:reset)          dst_pulse     //destination pulse out      );    //PARA   DECLARATION     //INPUT  DECLARATION input               src_clk     ; //source clock input               src_rst_n   ; //source clock reset (0: reset) input               src_pulse   ; //source clock pulse in   input               dst_clk     ; //destination clock input               dst_rst_n   ; //destination clock reset (0:reset)   //OUTPUT DECLARATION output              dst_pulse   ; //destination pulse out   //INTER  DECLARATION reg                 src_state   ; reg                 state_dly1  ; reg                 state_dly2  ; reg                 dst_state   ; wire                dst_pulse   ;   //-- ========================MODULE SOURCE CODE==========================--   always @(posedge src_clk or negedge src_rst_n) begin      if (src_rst_n == 1'b0)          src_state   <= 1'b0 ;      else if (src_pulse)          src_state   <= ~src_state ; end   always @(posedge dst_clk or negedge dst_rst_n) begin      if (dst_rst_n == 1'b0)          begin              state_dly1  <= 1'b0 ;              state_dly2  <= 1'b0 ;              dst_state   <= 1'b0 ;          end      else          begin              state_dly1  <= src_state ;              state_dly2  <= state_dly1;              dst_state   <= state_dly2;          end end   assign dst_pulse = dst_state ^ state_dly2 ;   endmodule

  由于该同步器使用单向同步机制,存在如下问题:

  (1) 对src_clk域dst_clk关系较为敏感,当src_clk与dst_clk时钟频率差别很大时可能不适应;

  (2) 由于没有完整的握手机制,当多个src_pulse之间间隔较短时,可能存在脉冲同步丢失情况。

  (3) 当dst_clk时钟域出现无时钟或复位时,src_clk时钟域将丢失。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄