跨时钟域脉冲信号处理——脉冲同步器
文章目录
- 一、同步器——快时钟域到慢时钟域
- 二、握手——快时钟域到慢时钟域
一、同步器——快时钟域到慢时钟域
脉冲同步器的基本原理:
- 将src_clk时钟域的
输入脉冲转换为src_clk时钟域的电平信号src_state
; 对src_state电平信号进行打拍(打两拍)同步到dst_clk时钟域
;- 对dst_clk时钟域的
电平信号进行检测,产生dst_clk时钟域脉冲
;
电路如下:
代码如下:
module pulse_sync(src_clk, src_rst_n, src_pulse, dst_clk, dst_rst_n, dst_pulse);input src_clk; //source clockinput src_rst_n; //source resetinput src_pulse; //source pulse ininput dst_clk; //destination clockinput dst_rst_n; //destination resetoutput dst_pulse; //destination pulse out//Internal singlesreg src_state;reg state_delay1;reg state_delay2;reg dst_state;wire dst_puase;//==============MODULE MAIN CODE=========================
//1.输入脉冲转成电平信号,确保时钟B可以采到always@(posedge src_clk or negedge src_rst_n)beginif(src_rst_n==0)src_state <= 0;else if(src_pulse)src_state <= ~src_state; end//2.//源时钟域的src时钟下电平信号转成时钟dst下的脉冲信号always@(posedge dst_clk or negedge dst_rst_n)beginif(dst_rst_n)beginstate_delay1 <= 0;state_delay2 <= 0;dst_state <= 0;endelse beginstate_delay1 <= src_state;state_delay2 <= state_delay1;dst_state <= state_delay2;endendassign dst_pulse = dst_state^state_delay2;endmodule
二、握手——快时钟域到慢时钟域
从上一部分的设计原理中,我们可以发现该同步器的控制传递是单向的,即仅从源时钟域到目的时钟域,目的时钟域并没有状态反馈。假设存在如下应用:
- 源时钟域中的第一个脉冲和第二个脉冲间隔过短,第一个脉冲未完成同步,第二脉冲又将状态清空,导致最终脉冲同步丢失。
要解决以上同步问题,需要引入异步握手机制,保证每个脉冲都同步成功,同步成功后再进行下一个脉冲同步。握手原理如下:
- sync_req: 源时钟域同步请求信号,高电平表示当前脉冲需要同步;
- sync_ack: 目的时钟域应答信号,高电平表示当前已收到同步请求;
完整同步过程分为以下4个步骤:
(1) 同步请求产生;当同步器处于空闲(即上一次已同步完成)时,源同步脉冲到达时产生同步请求信号sync_req;
(2) 同步请求信号sync_req同步到目的时钟域,目的时钟域产生脉冲信号并将产生应答信号sync_ack;
(3) 同步应答信号sync_ack同步到源时钟域,源时钟域检测到同步应答信号sync_ack后,清除同步请求信号;
(4) 目的时钟域检测到sync_req撤销后,清除sync_ack应答;源时钟域将到sync_ack清除后,认为一次同步完成,可以同步下一个脉冲。
代码如下:
module HANDSHAKE_PULSE_SYNC(src_clk , //source clock src_rst_n , //source clock reset (0: reset)src_pulse , //source clock pulse insrc_sync_fail , //source clock sync state: 1 clock pulse if sync fail.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 ininput dst_clk ; //destination clock
input dst_rst_n ; //destination clock reset (0:reset)//OUTPUT DECLARATION
output src_sync_fail ; //source clock sync state: 1 clock pulse if sync fail.
output dst_pulse ; //destination pulse out//INTER DECLARATION
wire dst_pulse ;
wire src_sync_idle ;
reg src_sync_fail ;
reg src_sync_req ;
reg src_sync_ack ;
reg ack_state_dly1 ;
reg ack_state_dly2 ;
reg req_state_dly1 ;
reg req_state_dly2 ;
reg dst_req_state ;
reg dst_sync_ack ;//--========================MODULE SOURCE CODE==========================--//--=========================================--
// DST Clock :
// 1. generate src_sync_fail;
// 2. generate sync req
// 3. sync dst_sync_ack
//--=========================================--
assign src_sync_idle = ~(src_sync_req | src_sync_ack );//report an error if src_pulse when sync busy ;
always @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)src_sync_fail <= 1'b0 ;else if (src_pulse & (~src_sync_idle)) src_sync_fail <= 1'b1 ;else src_sync_fail <= 1'b0 ;
end//set sync req if src_pulse when sync idle ;
always @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)src_sync_req <= 1'b0 ;else if (src_pulse & src_sync_idle) src_sync_req <= 1'b1 ;else if (src_sync_ack)src_sync_req <= 1'b0 ;
endalways @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)beginack_state_dly1 <= 1'b0 ;ack_state_dly2 <= 1'b0 ;src_sync_ack <= 1'b0 ; endelsebeginack_state_dly1 <= dst_sync_ack ;ack_state_dly2 <= ack_state_dly1 ;src_sync_ack <= ack_state_dly2 ; end
end//--=========================================--
// DST Clock :
// 1. sync src sync req
// 2. generate dst pulse
// 3. generate sync ack
//--=========================================--
always @(posedge dst_clk or negedge dst_rst_n)
beginif(dst_rst_n == 1'b0)beginreq_state_dly1 <= 1'b0 ;req_state_dly2 <= 1'b0 ;dst_req_state <= 1'b0 ;endelsebeginreq_state_dly1 <= src_sync_req ;req_state_dly2 <= req_state_dly1 ;dst_req_state <= req_state_dly2 ;end
end//Rising Edge of dst_state generate a dst_pulse;
assign dst_pulse = (~dst_req_state) & req_state_dly2 ; //set sync ack when src_req = 1 , clear it when src_req = 0 ;
always @(posedge dst_clk or negedge dst_rst_n)
beginif(dst_rst_n == 1'b0)dst_sync_ack <= 1'b0;else if (req_state_dly2) dst_sync_ack <= 1'b1;else dst_sync_ack <= 1'b0;
endendmodule
参考:https://www.cnblogs.com/digital-wei/p/6014450.html
跨时钟域脉冲信号处理——脉冲同步器相关推荐
- 同步电路与跨时钟域电路设计1——单bit信号的跨时钟域传输(同步器)
同步电路与全局异步电路 同步电路 同步电路的定义 即电路中的所有受时钟控制的单元(如触发器Flip Flop.寄存器Register),全部由一个统一的全局时钟控制. 例子: 两个触发器都受同一个时钟 ...
- 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)
目录 1.跨时钟域方法的原因 2.跨时钟处理的两种思路 3.跨时钟域分类--单比特信号跨时钟 3.1.1慢时钟---快时钟.(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟---快时钟.( ...
- FPGA跨时钟域信号处理之亚稳态问题
FPGA跨时钟域信号处理之亚稳态问题学习笔记 跨时钟域会导致"亚稳态"的问题,信号的上升沿和下降沿并不是瞬间被拉高或拉低的,而是有一个倾斜变化的过程,如图中的tx信号的上升沿和下降 ...
- 基于FPGA的跨时钟域信号处理——专用握手信号
转自:http://bbs.ednchina.com/BLOG_ARTICLE_253787.HTM 在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域 ...
- 跨时钟域信号处理——专用握手信号
下图是一个基本的握手通信方式.所谓握手,意即通信双方使用了专用控制信号进行状态指示.这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式 使用握手协议方式处理跨时钟 ...
- VL48-使用Verilog解决多bit MUX同步器—慢时钟域同步到快时钟域(多bit跨时钟域),快时钟同步使能端并通过该使能端控制输出数据
多bit MUX同步器:慢时钟域同步到快时钟域(多bit跨时钟域) 第一部分,题目描述及要求 1,题目要求 2,解题思路 第二部分,代码 1,RTL代码 2,RTL代码生成的门级网表 3,测试代码 4 ...
- 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)
需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...
- 跨时钟域信号如何处理(一、单bit信号)
文章目录 背景 两级DFF同步器 脉冲展宽同步 握手协议 背景 一颗芯片上会有许多不同的信号工作在不同的时钟频率下.比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工 ...
- 漫谈时序设计(1)跨时钟域是设计出来的,而非约束出来的!
目录 亚稳态(Metastability) 单比特信号同步 慢时钟域到快时钟域 快时钟域到慢时钟域 多比特信号同步 Handshake Mechanism 异步FIFO 参考链接 写在最后 这篇博文在 ...
- 异步fifo_数字IC校招基础知识点复习(五)——跨时钟域涉及part2(异步FIFO)
1.跨时钟域设计(CDC)-part 2 在上一篇中我们主要关注的是单比特的控制信号,而对于多比特信号的跨时钟域传输则需要一些其他的手段. 首先需要明确的是,一般不采用对多比特信号中的每个比特单独使用 ...
最新文章
- 设计模式——3单例模式(Singleton)
- 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )
- python字符串连接优先使用jion而非+
- vue项目使用mint-ui库
- python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界
- Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx
- w ndows无法完成格式化,windows无法完成格式化,小编教你解决windows无法完成格式化U盘...
- 今天生日回想这难忘的一年(应届大学生2019-2020一年的总结)
- Sftp和ftp 区别、工作原理等(汇总ing)
- Flash常用源代码大全
- html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件
- 杭州随笔之欲把西湖比西子
- centos7.8 swoole安装和使用
- 自媒体怎么赚钱!自媒体怎么做收益比较高!
- 【论文阅读】(2022)A goal-driven ruin and recreate heuristic for the 2D variable-sized bin packing prob...
- ftok函数的作用:
- 读《半生烟雨,半世落花:李清照传》小感
- url中传递中文参数时的转码与解码
- 中兴回应被列入被执行人名单;摩拜否认裁员 30%;LG 支持韩国对高通罚款 9 亿美元 | 雷锋早报... 1
- html刷新某块区域,javascript如何实现局部刷新?
热门文章
- html背景图片如何自动平铺,html怎么设置背景图片全屏平铺?
- c语言计算火车运行图调整暂停发售,详解铁路12306列车运行图调整,暂停发售
- Android单点触摸与多点触摸
- wincc报表日报表实例_wincc报表例程
- AUTOCAD——设置颜色
- 基于HMM的拼音输入法
- 谷歌拼音 输入法设置
- java 视频比特率_java – 为MediaCodec设置的有效比特率是多少
- 报错:When executing step qmake
- c语言乒乓球对手算法,乒乓球学生论文,关于例c语言教学案例设计相关参考文献资料-免费论文范文...