随着设计规模的不断攀升,各种接口外设琳琅满目,时钟“满天飞”就不可避免(注意这里的“满天飞”不是滥用,意指时钟频率多、时钟扇出多)。而一个设计中,不同时钟频率之间你来我往更是在所难免。那么,这就出现了题目中的跨时钟域的同步问题?怎么办?十年不变的老难题。为了获取稳定可靠的异步时钟域送来的信号,一种经典的处理方式就是双寄存器同步处理(double synchronizer)。那为啥要双寄存器呢,一个不就够了吗?

先来看看,这张老得掉牙,经典得不能再经典的示意图。Aclk和bclk是两个不同的时钟域,bclk比aclk要稍微慢一点(哦,我的天哪,要用慢时钟采集快时钟的数据,又是一个难),与aclk同步的数据adat某个时钟周期拉高了(注意,只保持了1个时钟周期)。接下来,要用bclk时钟去采集只保持了一个aclk时钟周期的adat数据。理论上,这不符合奈奎斯特定律,很难成功,但是大家不要较真,这里重点不在这里。我们要关注的其实是那个不偏不倚bclk采样时(bclk时钟上升沿)正好对准了adat的下降沿(上升沿也类似),好开心,奈奎斯特老爷爷的定律被打破了。

数据采是采到了,但是不稳定,从模拟信号的角度看,bclk采集到的数据就是一个中间电平,到低最终判定是1还是0,很抱歉,看上去好像都不是。数字电路终归还是一个模拟电路搭起来的,真实世界都是骨感的(模拟的)。所以,你就看到,bclk时钟域的第一级采样时钟bq1_dat的输出波形起起伏伏,好在最终还是稳在了数字电平1或接近1的位置。如果bq1_dat直接在bclk时钟域被正常使用,后端就一个驱动扇出或许还好,可能就和示意图里第二级锁存bq1_dat的寄存器bq2_dat一样稳定了。但是,实际情况,可能我们要用这个bq1_dat去驱动多个扇出,那就十有八九要出问题,这个bq1_dat上的亚稳态恐怕还要继续传播给某些后级的寄存器,而这不是我们希望看到的。

那怎么办?解决方案有一个,用专门的寄存器bq2_dat对bq1_dat再锁存一拍,这么一来,就基本是稳定的了。还有一个问题,为啥就这么容易稳定了?前面提到了,bq1_dat的输出波形虽然起起伏伏,但最终一般还是会稳在要么接近0要么接近1的位置(在下一个时钟周期bq2_dat去锁存它的时候,更容易满足bq2_dat寄存器对建立和保持时间的要求),所以如果它本身的扇出路径单一的情况下,后级采样寄存器基本就能正常输出了。

另外,不得不再提一下MTBF(mean time between failures)的概念,一个基本的思想,就是同步寄存器级别越多,MTBF的概率越低,越不容易出问题。关于这个部分,大家可以去搜一下特权同学早期的文章,作为补充阅读。

https://www.eefocus.com/ilove314/blog/11-09/231565_715ed.html

最后,再来看看类似的跨时钟域的亚稳态在这2级寄存器同步后的个各种可能状况。

bq1_dat采样到adat的上升沿,最终bq1_dat稳定在0,bq2_dat也输出稳定的0。


q1_dat采样到adat的上升沿,最终bq1_dat稳定在1,bq2_dat也输出稳定的1。

1_dat采样到adat的下降沿,最终bq1_dat稳定在0,bq2_dat也输出稳定的0。

bq1_dat采样到adat的下降沿,最终bq1_dat稳定在1,bq2_dat也输出稳定的1。

最后,从特权同学的经验和实践的角度聊一下。

跨时钟域的信号同步到底需要1级还是2级,完全取决于具体的应用。如果设计中这类跨时钟域信号特别多,增加1级寄存器就等于增加逻辑资源,增加money。如果设计中的跨时钟域信号并非像前面的例子那样快速或实时变化,或者采样时钟频率远高于采样数据,并且我们也并不在意采样数据第1拍的取值,1级寄存器足矣。而对于控制信号,要特别谨慎,通常是比较建议采用2级寄存器同步。

另一个问题,按照判断应该采取2级寄存器的同步设计,设计中就用1级去实现,会怎样?一天、两天、一年、两年,或许都没有问题出现,如何解释?这本身是一个概率的问题,也和跨时钟域信号的故障敏感性有关(所谓故障敏感性,就是它真的出了问题,对系统的影响有多大,设计中是否有机制去检测)。但是,俗话说“常在河边走哪有不湿脚”,问题终究还是要暴露的,有时就像幽灵般转瞬即逝。

“鲁棒性”和“不过设计”都是一个优秀设计不可或缺的因素,我们还是建议认真审查设计,允许1级同步的就绝不堆料(浪费资源),需要2级同步的就不吝啬。

跨时钟域为什么要双寄存器同步相关推荐

  1. 跨时钟域信号传输问题之握手同步

    所谓握手,即通信双方使用了专用控制信号进行状态指示,这个控制信号既有发送域给接受域的也有接收域给控制域的,有别于单向控制信号方式.        使用握手协议方式处理跨时钟域数据传输时,只需要对双方的 ...

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

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

  3. 异步时钟引起的亚稳态问题和跨时钟域电路设计

    本文总结由数字电路设计的异步时钟引起的亚稳态问题,并针对亚稳态问题提出的处理方法和跨时钟域电路设计方法.重点是分析由异步时钟引起的跨时钟域CDC问题,后续将会总结由复位引起的电路亚稳态问题. 一.亚稳 ...

  4. 同步电路与跨时钟域电路设计1——单bit信号的跨时钟域传输(同步器)

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

  5. 跨时钟域的数据同步,亚稳态,和相关电路设计方法

    目录 同步时钟: 亚稳态: 双锁存器同步电路 单bit信号跨时钟域传播 边沿检测同步电路(慢时钟到快时钟) 脉冲同步器电路(快时钟到慢时钟) 结绳法1 结绳法2 结绳法3 多bit信号跨时钟域传播 多 ...

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

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

  7. 异步fifo_跨时钟域同步(异步FIFO)

    本文使用 Zhihu On VSCode 创作并发布 跨时钟域同步(异步FIFO) 之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处 ...

  8. FPGA跨时钟域异步时钟设计的几种同步策略

    1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免.如果对 ...

  9. FPGA笔记2——跨时钟域同步信号方法

    亚稳态 触发器是FPGA设计中最常用的基本器件.触发器工作过程中存在数据的建立(setup)和保持(hold)时间.对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前,触发器数据端数据保 ...

最新文章

  1. 网络推广计划浅析外链发布要遵循的几点小技巧!
  2. 汇编指令 DUP指令
  3. 别找了,这才是 Pyecharts 的正确打开方式!
  4. Vue项目中使用svg文件
  5. linux通过c语言编程访问远程mysql
  6. Vue2.0项目中使用sass(踩坑之路)
  7. 基于SharePoint 的企业信息平台架构
  8. bzoj4974: [Lydsy1708月赛]字符串大师
  9. 【sklearn第二十八讲】验证曲线
  10. 数据结构一些自己没搞懂的点
  11. Axure 8 团队协作
  12. 关于音频EQ、DRC、等响度、3D环绕音、虚拟低音、变音、AEC、AGC、ANS等解释
  13. java 回调方法是什么意思_java什么是回调
  14. execl函数的用法
  15. 羊皮卷-选择的力量(二)
  16. 阿里云服务器被入侵执行MoneroOcean(门罗币)挖矿脚本
  17. chrome浏览器的下载地址
  18. HTML中em标签的用法
  19. 英特尔 CPU 惊天漏洞事件完全详解
  20. 因果分析系列7--分组和虚拟变量回归

热门文章

  1. System.out.print(我爱你)
  2. 2019 年 2 月份文章汇总
  3. 如何将QQ音乐SQ品质FLAC格式转换成MP3音乐
  4. 高级职称17计算机,(高级职称计算机考试.doc
  5. AD 设置1比1打印
  6. 四、微信小程序之简单计算器(学习记录)
  7. 快速傅立叶变换(FFT)
  8. 1.Postman之发送get请求
  9. Unity游戏开发客户端面经——网络(初级)
  10. 长亮科技发布2018年报:营收首破十亿元,直面蚂蚁金服竞争压力