一、前言
在数字芯片设计中常常涉及不同的工作时钟域,在异步时钟域间控制交互、数据交互又涉及异步电路设计。良好、健壮的异步电路设计可提高系统的稳定性、可靠性、健壮性。本博文介绍异步电路中的脉冲同步设计方法。
二、应用
在设计开发过程中,经常会有如下的应用: 时钟域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时钟域将丢失。