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