跨时钟域处理 & 亚稳态处理

1.问题产生

现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工作在另一个时钟频率下,而普通的信号又会工作在另外的时钟频率下。这3个不同时钟频率下工作的信号往往需要相互沟通和传递信号。

不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者处理不当,如下图所示的时钟域CLK_A的数据信号A可能无法满足时钟域CLK_B的setup/hold时间,可能导致:

1.数据丢失,无法采到预期中的信号;

2.亚稳态的产生。

.
.

2.概述

常见的跨时钟域信号处理方法都有哪些呢?有如下的三种:

(1)两级DFF同步器
(2)握手协议
(3)异步FIFO

.
.

3.两级DFF同步器

单比特信号处理通常采用两级DFF串联进行同步
单比特信号处理通常采用两级DFF串联进行同步
单比特信号处理通常采用两级DFF串联进行同步
(!!!!!重要的事说三遍!!!!!)
最简单的单比特信号处理通常采用两级DFF串联进行同步,如下图所示:

从时钟域A(CLKA)传过来的信号a_in, 直接用时钟域B CLKB采用很容易产生亚稳态,用两级DFF 敲过后再使用就可以把亚稳态概率降到一个合理的值。

错误1 :时钟域A的组合逻辑信号直接敲两级DFF同步到时钟域B
如下图(1)所示虽然时钟域A的逻辑信号c0 传输到时钟域B的时候,也用了两级DFF 同步器,但我们知道组合逻辑电路各个输入信号的不一致性以及组合逻辑内部路径的延时时间不一样,运算后的信号存在毛刺如图(2),而我们又无法预先知道CLKB 的上升沿何时会到来,CLKB 采样到的信号就无法预知,这显然不是我们想要的结果。

因此,要想CLKB 能采到稳定的信号,时钟域A的信号必须是经过CLKA 敲过,在一个时钟周期内是稳定的信号,如图(3)所示:

补充说明建立时间和保持时间,建立时间(Tsu:set up time)是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器;保持时间(Th:hold time)是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。
.
.

4.两级DFF同步器代码示例demo

通常在慢时钟域到块时钟域的单bit信号,我们直接打两拍即可进行传输。但是在快时钟到慢时钟进行传输的时候,如果传输的是脉冲信号,那么直接打拍传输的话就很有可能会导致一些脉冲信号没法采集到,从而丢失数据。

为解决上面单bit脉冲信号从快时钟到慢时钟传输的问题,我们可以:1.将脉冲信号在快时钟下进行扩宽。当慢时钟采集到信号后再进行复位。 2.将扩宽后的信号同步至慢时钟域。 3.在慢时钟域进行打两拍操作,去除亚稳态以及防止数据丢失,同时在慢时钟域进行输出。 4.将打拍后的数据在快时钟下进行反馈,直接在快时钟下打两拍反馈,生成扩宽信号的复位信号。

RTL代码:

module clock_h_or_l(input    rst_n,input clka,   //快时钟input  clkb,   //慢时钟input  pulse_ina,output    pulse_outb,output   signal_outb
);reg   signal_a;reg        signal_b;reg        [1:0]   signal_a_r;reg      [1:0]   signal_b_r;//在clka时钟下将signal_a展宽
always @(posedge clka or negedge rst_n) beginif(!rst_n)signal_a <= 1'b0;else if(pulse_ina == 1'b1)signal_a <= 1'b1;else if(signal_a_r[1] == 1'b1)signal_a <= 1'b0;elsesignal_a <= signal_a;
end     //在clkb下同步signal_a
always @(posedge clkb or negedge rst_n) beginif(!rst_n)signal_b <= 1'b0;elsesignal_b <= signal_a;
end//在clkb下打两拍signal_b. 生成脉冲和输出信号
always @(posedge clkb or negedge rst_n) beginif(!rst_n)signal_b_r <= 2'b00;elsesignal_b_r <= {signal_b_r[0], signal_b};end
assign pulse_outb = ~signal_b_r[1] & signal_b_r[0];
assign signal_outb = signal_b_r[1];//在clka下采集signal_b_r[1],生成signal_a_r,用于反馈拉低signal_a
always @(posedge clka or negedge rst_n) beginif(!rst_n)signal_a_r <= 2'b00;elsesignal_a_r <= {signal_a_r[0], signal_b_r[1]};
endendmodule

testbench的代码

module clock_h_or_l_tb();reg     rst_n;reg   clka, clkb;reg      pulse_ina;wire  pulse_outb;wire     signal_outb;initial beginrst_n = 1'b0;clka = 1'b1;clkb = 1'b1;pulse_ina = 1'b0;#20rst_n = 1'b1;#50pulse_ina = 1'b1;#10pulse_ina = 1'b0;#2000pulse_ina = 1'b1;#50pulse_ina = 1'b0;#5000$stop;
end always #5 clka = ~clka;
always #23 clkb = ~clkb;clock_h_or_l t1(.rst_n(rst_n),.clka(clka),.clkb(clkb),.pulse_ina(pulse_ina),.pulse_outb(pulse_outb),.signal_outb(signal_outb)
);endmodule

异步bus交互(一)— 两级DFF同步器相关推荐

  1. 异步FIFO的设计详解(格雷码计数+两级DFF同步)

    文章目录 一.异步FIFO介绍 1.1.空满判断 1.2.跨时钟域问题 1.3.格雷码转换 1.4.格雷码计数器 二.代码code 一.异步FIFO介绍   FIFO有同步和异步两种,同步即读写时钟相 ...

  2. 两级同步为什么能解决亚稳态问题?

    前言 不知道大家有没有一个疑惑,为什么两级同步电路结构能够解决亚稳态问题,之前一直疑惑的地方在于,当第一级DFF发生亚稳态时,他的输出呈现不确定性,会出现0或者1任意一个值.若输入是1,第一级DFF亚 ...

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

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

  4. iOS: JS和Native交互的两种方法,iosjsnative交互

    iOS: JS和Native交互的两种方法,iosjsnative交互 背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)string ...

  5. SpringBoot 集成 layering-cache 实现两级缓存调研与实践

    前言 对于系统查多改少的数据,可以通过缓存来提升系统的访问性能.一般情况下我们会采用 Redis ,但是如果仅仅依赖 Redis 很容易出现缓存雪崩的情况.为了防止缓存雪崩可以通过 Redis 高可用 ...

  6. 2022-2028全球两级旋片泵行业调研及趋势分析报告

    据恒州诚思调研统计,2021年全球两级旋片泵市场规模约 亿元,2017-2021年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2028年市场规模将接近 亿元,未来六年CAGR为 % ...

  7. 单根信号跨时钟域——两级D触发器消除亚稳态

    meta_harden 这个模块是在Xilinx的例程工程Wave Generator中看到的,来看一下有什么用. 描述 在源文件注释中有描述到,这是一个基础的亚稳态固化方法:通过两级的时钟同步,将异 ...

  8. 【Caffeine进阶】Redis+Caffeine 两级缓存实战,性能爆缸

    往期回顾 博主前面发过一篇[缓存框架Caffeine]初级篇,主要介绍了Caffeine的入门级使用!地址https://blog.csdn.net/Number_oneEngineer/articl ...

  9. Redis+Caffeine两级缓存

    1.前言 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库.在提升 ...

  10. Bi-level error correction for PacBio long reads. PacBio长读数的两级纠错

    Bi-level error correction for PacBio long reads. PacBio长读数的两级纠错 作者: Liu Yuansheng; Lan Chaowang; Blu ...

最新文章

  1. 机器学习类别/标称(categorical)数据处理:独热编码(One Hot Encoding)
  2. windows中端口号(port id)和port的区别,如何通过端口查看进程pid,如何通过pid查看程序,如何通过pid查看端口?
  3. NIO--Buffer
  4. mysql online ddl和pt_MySQL变更之:Online DDL 和 PT-OSC 该选谁?
  5. 云计算设计模式(五)——计算资源整合模式
  6. 组件开发之Asp.net服务器控件Collection[集合]属性的设计时支持--编辑、保存
  7. Python 告诉你:8.3 分口碑炸裂!潘粤明版《鬼吹灯》到底好看在哪儿?
  8. python基本执行方式_Python开发的3种命令执行方法
  9. c++ vector排序_儿童时间管理课6:便利贴时间排序法
  10. 恒生校招java笔试数据库语法_2015恒生电子校招笔试题
  11. SwiftUI Core ML 基础教程
  12. 伦敦艺术大学创意计算机学院,伦敦艺术大学专业详细设置
  13. 数据库索引的填充因子
  14. Centos7配置ssh、rsh免密互信集群服务
  15. 大数据面试重点之kafka(七)
  16. sql文件反向生成物理概念模型
  17. android 原生分享文件,Android原生文件分享
  18. Spring框架下载最新地址
  19. 如何设计一个简单的网页
  20. Kindle4RSS - 好用的Kindle RSS新闻文章推送服务

热门文章

  1. Fingerprint指纹识别学习
  2. 计算机教学问卷调查,信息技术在数学课堂教学中的应用:数学课堂信息技术应用调查问卷...
  3. ftp免费空间,1种适合小白级别的搭建ftp免费空间的方法
  4. php notice错误是什么意思,PHP中Notice错误常见解决方法
  5. 毕设看的硕博士论文速记
  6. imap接收邮件服务器,配置 Outlook 从 IMAP 服务器接收邮件
  7. 金九银十,果然如此,这个九月有点折腾
  8. 高数 | 【多元函数微分学】全微分不变性、隐函数求导辨析
  9. jquery衬衣产品内容详情页
  10. 在VMware16中安装 Win10操作系统