首页 > 代码库 > 【设计开发】 典型异步电路设计-脉冲同步

【设计开发】 典型异步电路设计-脉冲同步

一、前言

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

二、应用

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

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

  技术分享

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

 

  技术分享

三、简单的脉冲同步器

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

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

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

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

  技术分享 

  代码如下:

//--====================================================================================--// 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  DECLARATIONinput               src_clk     ; //source clock input               src_rst_n   ; //source clock reset (0: reset)input               src_pulse   ; //source clock pulse ininput               dst_clk     ; //destination clock input               dst_rst_n   ; //destination clock reset (0:reset)//OUTPUT DECLARATIONoutput              dst_pulse   ; //destination pulse out//INTER  DECLARATIONreg                 src_state   ;reg                 state_dly1  ;reg                 state_dly2  ;reg                 src_state   ;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 ;endalways @(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;        endendassign dst_pulse = dst_state ^ state_dly2 ;endmodule

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

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

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

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

 

【设计开发】 典型异步电路设计-脉冲同步