在数字电路设计过程中 ,难免会遇到某个信号需要跨越不同时钟域的情况。 如果对跨时钟域的信号不做妥善的处理,跨越时钟域后,信号可能发生亚稳态,传播亚稳态,导致电路工作异常。并且,由跨时钟域处理不当引发的问题可能是偶现的,通常很难复现和定位问题。综上,CDC(Clock Domain Crossing,跨时钟域)处理,是数字设计中基本而又重要的一个课题。

亚稳态

信号输入触发器时,如果在时钟的触发沿(Tsetup+Thold)时间窗口内发现了变化,会导致触发器采集到逻辑0与1之间的中间电平,采集到的值处于不确定状态,触发器的输出也会处于振荡状态,电路无法正常工作,如下图所示。

图 1 亚稳态电路时序图

2.单bit信号CDC

2.1长信号

对于图1中的情况,单bit长信号CDC的基本方法是,采用 2 位同步器(俗称打拍),降低亚稳态发生的概率,如果电路时序允许,可以做多位同步器, 通常情况下采用 2 位同步器(保险起见,可多打一拍).图2中,F2的输出B有较大概率发送振荡,经过一个时钟周期后,在下一个时钟的上升沿,F3采集B时,B 仍然振荡的概率已经大为降低,有较大可能性已经处于一个稳定的状态(0或者1)。 如果再多打一拍,则F4采集到F3输出C振荡的概率已经微乎其微了。

图 2 采用2位同步器电路

图 3  2位同步器时序图

2.2脉冲信号

慢时钟域跨快时钟域

对于慢时钟域的脉冲信号,其脉冲长度大于快时钟域2倍及以上周期的,用本小节方法做CDC处理,脉冲长度大于1倍小于2倍的,按下一小节,做展宽处理再CDC.

图 4 慢时钟域脉冲信号跨快时钟域

图4中,先将data_a直接在clkb打2拍,再检测data_a_b_d1的上升沿(data_a_b_d1==1’b1 && data_a_b_d2==1’b0),得到clkb下一个时钟周期长度的脉冲信号data_b。

快时钟域跨慢时钟域

快时钟域脉冲信号跨到慢时钟域,可能无法被慢时钟采集到,如图5所示

图 5 快时钟脉冲信号无法被慢时钟采集

图5中,clka时钟频率是clkb时钟频率的三倍。clka时钟域下的信号data_a有很大概率无法被clk_b采集到。可以考虑将data_a在clka下展宽,然后打拍同步到clkb下。展宽信号在clkb下必须做边沿采集处理,回复出clkb域下的脉冲信号。时序如图6所示。

图 6 快时钟脉冲展宽CDC

图6中,先将data_打5拍,将其与5拍延迟信号相或,用时序逻辑,得到触发器data_a_expand.

data_a_expand在clk_b内打2拍,同步到clkb下。Data_b取data_a_expand_b_d1的上升沿,得到data_b.

注意三点:

  1. 根据香浓采样定律,需将快时钟域脉冲信号展宽到慢时钟域两个时钟周期以上的长度,才能保证展宽信号被慢时钟域采集到。
  2. 展宽信号data_a_expand必须是时序逻辑。组合逻辑信号不允许跨时钟域。(因为组合逻辑信号容易产生毛刺,更大概率引发亚稳态)
  3. 展宽信号跨时钟域后,必须采集其上升沿或者下降沿,恢复出一个周期的脉冲信号。

Toggle方法(推荐)

对于脉冲信号,无论快跨慢还是慢跨快,均可以用本方法做CDC处理。方法如图7所示。

图 7 toggle方法CDC

图7中,在clka内根据data_a的脉冲产生翻转信号toggle,即在data_a为1时,翻转toggle寄存器的值。toggle是单Bit长信号。将该信号在clkb打2拍,得到toggle_b_d1,再检测toggle_b_d1的上升沿以及下降沿,恢复出脉冲信号data_b。

3.多bit信号CDC

多bit信号跨时钟域,不能采用打拍的方法处理。原因如下。

图 8 多bit数据CDC后信号重聚合

图8中,dataa从2’b00跳变到2’b11,且不考虑信号CDC后的长度问题,单看CDC后的数值,也有可能发生错误。

T3时刻,dataa在clkb的Tsu+Thold时间窗口内发生了变化,有可能发生高bit在T3时刻被采样为0而低bit被采样为1,这样,dataa跨时钟域后,出现了一个异常值2’b01。这会带来错误。

多bit数据最常用的跨时钟域方法是异步fifo.

3.1异步FIFO

格雷码

格雷码是一种编码方式,其特点是,对于递增的数值,其相邻的数值之间只有1bit发生了改变.该特性使得格雷码被用于多bit数值的跨时钟域中.图9是4bit 二进制码与格雷码的对比.

图 9 4bit 二进制码与格雷码

二进制码与格雷码的转换关系如下:

assign gray=bin^(bin>>1);

即二进制码和二进制码逻辑右移一位相异或,得到格雷码.

异步FIFO

异步FIFO的基本设计思路是,

  1. 将数据按照递增地址,写入(读出)memory类型变量中,读写使能位于不同时钟域,数据本身进入memory,不涉及跨时钟问题.
  2. 将读/写地址(指针)转换成格雷码,通过打拍方法,跨越到写/读时钟域下,与写/读时钟域下的写/读地址(指针)格雷码做比较,判断空满状态.

异步FIFO读空判定条件:写指针格雷码同步到读时钟域后,等于读指针

异步FIFO写满判定条件:读指针格雷码同步到写时钟域后,高2bit与写指针高2bit相反,剩余低bit相同.

FIFO的数据位宽为DW,FIFO地址位宽AW,FIFO深度DEEP=2AW

如图9所示,以地址位宽为3为例,理解判断空满的条件

假设有如下读写过程:

  1. 开始写入和读出地址均为0000,此时FIFO写入8个数据,写地址变为1000(gray:1100),读地址为0000(gray:0000),这就是写满的条件.
  2. 执行8次读操作,使得读地址为1000(gray:1100),这就是读空的条件.
  3. 执行8次写操作,使得写地址等于0000(gray:0000),但读地址仍然为1000(gray:1100),又达到FIFO写满条件.

注意,指针位宽是AW+1,memory地址位宽是AW.

4.异步复位同步化

异步复位的同步化处理,遵循”异步复位,同步释放”原则.异步复位信号的时钟同步方法,如图 10所示,

图 10 异步复位,同步释放电路图

经过同步化后的复位信号时序图如图11所示:

图 11异步复位,同步释放时序图

代码如图12所示

图 12异步复位,同步释放代码

跨时钟域电路设计方法相关推荐

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

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

  2. FPGA跨时钟域处理方法延迟法

    1.1 FPGA跨时钟域处理方法延迟法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA跨时钟域处理方法延迟法: 5)结束语. 1.1.2 本节引言 " ...

  3. FPGA跨时钟域处理方法FIFO

    1.1 FPGA跨时钟域处理方法FIFO 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA跨时钟域处理方法FIFO: 5)结束语. 1.1.2 本节引言 &quo ...

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

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

  5. 跨时钟域电路设计——多bit信号FIFO

    多个bit信号的跨时钟域仅仅通过简单的同步器同步时不安全的. 如下图: 虽然信号都同步到目的时钟域,可完成的功能却与设计的初衷不相符. 解决方案之一为对信号进行格雷码编码,但此方案只适用于连续变化的信 ...

  6. 跨时钟域处理方法总结

    目录 跨时钟域处理 1. 异步时序定义 2. 亚稳态 3. 同步策略 方法一:双锁存器 方法二:握手信号(结绳法) 方法三:异步双口RAM+格雷码 跨时钟域处理 为了彻底理解跨时钟域问题,多方搜集资料 ...

  7. 【读书笔记】Verilog的亚稳态现象和跨时钟域处理方法

    书※目:FPGA深度解析_第七章_樊继明著     高级FPGA设计结构.实现和优化_第六章_孟宪元译 文章目录 一.亚稳态 (1)跨时钟域的亚稳态现象 (2)亚稳态的多径传输 二.跨时钟域处理 2. ...

  8. 跨时钟域电路设计——结绳法

    信号从快时钟域到慢时钟域过渡时,慢时钟可能无法对快时钟变化太快的信号进行采样. 之前的同步器法对两个时钟间的关系有要求,结绳法适用于任何时钟域之间的过渡. 结绳法的原理是将快时钟信号的脉冲周期延长,等 ...

  9. 跨时钟域电路设计——单bit信号

    前面提到了简单的双电平锁存器,下面是一些单bit同步电路. 一.慢时钟域向快时钟域 边沿检测同步器 将慢时钟域的脉冲搬移并缩小为快时钟域的脉冲. 既可以检测上升沿,也可以检测下降沿. 如上图,慢时钟下 ...

最新文章

  1. 最短路径 - dijkstra
  2. Alphabet股价周五跌5.32%:三年最大单日跌幅
  3. 李彦宏被提名工程院院士,而美女教授颜宁落选,当选为美国院士
  4. 第二篇:cout和endl的用法
  5. uniapp 判断页面是否是横竖屏,解决微信小程序video组件全屏播放视频遮盖自定义播放控件问题
  6. Android之让代码跑在主线程(无context上下文)的封装
  7. idea黑色好还是白色好_白色牛仔裤,好看又好搭
  8. 三勾商城是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS + Android + 公众号 + H5 + 各种小程序
  9. python 大括号中括号小括号的区分
  10. Asp.Net 学习资源列表 [转]
  11. 微信小程序超级占内存_小程序丨微信小程序占内存大吗?微信小程序消耗流量大吗?...
  12. 《游戏大师Chris Crawford谈互动叙事》一第 6 章 数学之苦劳
  13. html设置word页脚,Word页码从任意页开始如何设置?
  14. 【JS】用JS实现系统常见日周月时间按钮切换效果
  15. Gut Microbes | 基于宏基因组发现猕猴肠道中的大量微生物新基因组
  16. php连接数据库的留言板,PHP+MySql实现简单的留言板功能
  17. 2022交易猫系统+带聊天/安心购/已验号模板+APP双端跳转
  18. Windows程序入口
  19. CISP-DSG证书有效期多久?是否需要续证?
  20. js全角半角空格记录

热门文章

  1. JS 常用的六种设计模式介绍
  2. 视频打开显示服务器运行失败,电脑打不开本地视频如何修复
  3. 猎曲奇兵soundhound的原理
  4. (C语言)即时通讯系统
  5. 斯坦福大学Tensorflow与深度学习实战课程
  6. DPI-1047:Cannot locate a 64-bit Oracle Client library:The specified module could not be found
  7. 90+高分拿下阿里云acp认证,附完整备考流程和考试资料
  8. 豆瓣电影api接口数据
  9. CSS3教程:Responsive框架常见的Media Queries片段
  10. python 截取指定mp4片段