文章目录

  • 一、同步器——快时钟域到慢时钟域
  • 二、握手——快时钟域到慢时钟域

一、同步器——快时钟域到慢时钟域

脉冲同步器的基本原理:

  1. 将src_clk时钟域的输入脉冲转换为src_clk时钟域的电平信号src_state
  2. 对src_state电平信号进行打拍(打两拍)同步到dst_clk时钟域
  3. 对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. 同步电路与跨时钟域电路设计1——单bit信号的跨时钟域传输(同步器)

    同步电路与全局异步电路 同步电路 同步电路的定义 即电路中的所有受时钟控制的单元(如触发器Flip Flop.寄存器Register),全部由一个统一的全局时钟控制. 例子: 两个触发器都受同一个时钟 ...

  2. 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)

    目录 1.跨时钟域方法的原因 2.跨时钟处理的两种思路 3.跨时钟域分类--单比特信号跨时钟 3.1.1慢时钟---快时钟.(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟---快时钟.( ...

  3. FPGA跨时钟域信号处理之亚稳态问题

    FPGA跨时钟域信号处理之亚稳态问题学习笔记 跨时钟域会导致"亚稳态"的问题,信号的上升沿和下降沿并不是瞬间被拉高或拉低的,而是有一个倾斜变化的过程,如图中的tx信号的上升沿和下降 ...

  4. 基于FPGA的跨时钟域信号处理——专用握手信号

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_253787.HTM 在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域 ...

  5. 跨时钟域信号处理——专用握手信号

    下图是一个基本的握手通信方式.所谓握手,意即通信双方使用了专用控制信号进行状态指示.这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式 使用握手协议方式处理跨时钟 ...

  6. VL48-使用Verilog解决多bit MUX同步器—慢时钟域同步到快时钟域(多bit跨时钟域),快时钟同步使能端并通过该使能端控制输出数据

    多bit MUX同步器:慢时钟域同步到快时钟域(多bit跨时钟域) 第一部分,题目描述及要求 1,题目要求 2,解题思路 第二部分,代码 1,RTL代码 2,RTL代码生成的门级网表 3,测试代码 4 ...

  7. 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)

    需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...

  8. 跨时钟域信号如何处理(一、单bit信号)

    文章目录 背景 两级DFF同步器 脉冲展宽同步 握手协议 背景 一颗芯片上会有许多不同的信号工作在不同的时钟频率下.比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工 ...

  9. 漫谈时序设计(1)跨时钟域是设计出来的,而非约束出来的!

    目录 亚稳态(Metastability) 单比特信号同步 慢时钟域到快时钟域 快时钟域到慢时钟域 多比特信号同步 Handshake Mechanism 异步FIFO 参考链接 写在最后 这篇博文在 ...

  10. 异步fifo_数字IC校招基础知识点复习(五)——跨时钟域涉及part2(异步FIFO)

    1.跨时钟域设计(CDC)-part 2 在上一篇中我们主要关注的是单比特的控制信号,而对于多比特信号的跨时钟域传输则需要一些其他的手段. 首先需要明确的是,一般不采用对多比特信号中的每个比特单独使用 ...

最新文章

  1. 设计模式——3单例模式(Singleton)
  2. 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )
  3. python字符串连接优先使用jion而非+
  4. vue项目使用mint-ui库
  5. python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界
  6. Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx
  7. w ndows无法完成格式化,windows无法完成格式化,小编教你解决windows无法完成格式化U盘...
  8. 今天生日回想这难忘的一年(应届大学生2019-2020一年的总结)
  9. Sftp和ftp 区别、工作原理等(汇总ing)
  10. Flash常用源代码大全
  11. html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件
  12. 杭州随笔之欲把西湖比西子
  13. centos7.8 swoole安装和使用
  14. 自媒体怎么赚钱!自媒体怎么做收益比较高!
  15. 【论文阅读】(2022)A goal-driven ruin and recreate heuristic for the 2D variable-sized bin packing prob...
  16. ftok函数的作用:
  17. 读《半生烟雨,半世落花:李清照传》小感
  18. url中传递中文参数时的转码与解码
  19. 中兴回应被列入被执行人名单;摩拜否认裁员 30%;LG 支持韩国对高通罚款 9 亿美元 | 雷锋早报... 1
  20. html刷新某块区域,javascript如何实现局部刷新?

热门文章

  1. html背景图片如何自动平铺,html怎么设置背景图片全屏平铺?
  2. c语言计算火车运行图调整暂停发售,详解铁路12306列车运行图调整,暂停发售
  3. Android单点触摸与多点触摸
  4. wincc报表日报表实例_wincc报表例程
  5. AUTOCAD——设置颜色
  6. 基于HMM的拼音输入法
  7. 谷歌拼音 输入法设置
  8. java 视频比特率_java – 为MediaCodec设置的有效比特率是多少
  9. 报错:When executing step qmake
  10. c语言乒乓球对手算法,乒乓球学生论文,关于例c语言教学案例设计相关参考文献资料-免费论文范文...