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

一、前言

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

二、应用

  在设计开发过程中,经常会有如下的应用: 时钟域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  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时钟域将丢失。

 

posted @ 2016-10-10 22:00  digital-world  阅读(5033)  评论(1编辑  收藏  举报