(Clock Domain Crossing)跨时钟域信号的处理 (自我总结)

news2025/1/12 15:54:55

CummingsSNUG2008Boston_CDC.pdf
参考:
跨时钟域处理方法总结–最终详尽版 - love小酒窝 - 博客园
跨时钟域(CDC)设计方法之单bit信号篇(一) | 电子创新网赛灵思社区
孤独的单刀_Verilog语法,FPGA设计与调试,FPGA接口与协议-CSDN博客
跨时钟域传输总结(包含verilog代码|Testbench|仿真结果)-腾讯云开发者社区-腾讯云

异步时序定义

异步时序设计指的是在设计中有两个或以上的时钟, 且时钟之间是同频不同相或不同频率的关系。而异步时序设计的关键就是把数据或控制信号正确地进行跨时钟域传输。

亚稳态

每一个触发器都有其规定的建立(setup)和保持(hold)时间参数, 在这个时间参数内, 输入信号在时钟的上升沿是不允许发生变的。 如果在信号的建立时间中对其进行采样, 得到的结果将是不可预知的,即亚稳态


MTBF(mean time between failures) : 平均故障间隔时间
通常,MTBF越大说明系统采样失败的可能越小。可见,对于高速的设计,MTBF是更容易发生的。对于一个典型的 0.25µm 工艺的 ASIC 库中的一个触发器,我们取如下的参数:
tr = 2.3ns, τ = 0.31ns, T0 = 9.6as, f=100MHZ, a = 10MHZ, MTBF = 2.01 days
也就是说触发器以100MHZ工作,假设异步事件触发的频率,也就是数据变化的频率跟采样时钟频率相同。我们用10MHZ的频率去不停地采它的数据,每个上升沿数据都会发生变化,则每两天就可能采集到一次亚稳态(个人理解,如有误请指正)。如果使用单锁存器同步,b的时钟上升沿采集a的数据时很可能采到亚稳态数据。

单bit跨时钟域处理

信号从源时钟域跨到目的时钟域后,需要在目的时钟的“指挥”下进行操作,这一过程可视为用目的时钟对被处理后的信号进行“采集”,既然是采集,则必须满足奈奎斯特采样定理,也就是说目的时钟频率需要至少是源时钟频率的2倍。

电平信号

电平信号进行CDC时,由于可以将电平信号看作一个频率很低的脉冲信号,所以不需要考虑时钟快慢,使用两级DFF就能够实现信号的同步

慢时钟域到快时钟域的脉冲信号

首先需要约定的是,所谓快时钟频率应该至少是慢时钟频率的两倍
72fbb4f4a26d43cad58fcf6e1102939.jpg

从快时钟域到慢时钟域的脉冲信号 降频

从快时钟域到慢时钟域会出现漏采的情况,所以需要通过降频的方法实现对数据的扩展


既然脉冲信号频率高于目的时钟才导致的漏采,那么我将脉冲信号拓宽到一定的程度不就可以保证采集到了吗?这一方法的本质实质上是降频,也就是将问题转换为我们已经能解决的用较快的时钟来采集较慢的时钟。如下图:
将信号adat扩宽为3倍aclk后,脉冲信号成为了一个较慢的信号,而目的时钟成为了一个较快的时钟,这样我们就可以使用2级同步器的方法来对被CDC信号进行同步。

module quicktoslow # (
  parameter CLK_QUICK = 50k,
            CLK_SLOW  = 5k ,
)
(
	input i_quick_clk,
  input i_quick_rst,
  input i_a,

  input i_slow_clk,
  input i_slow_rst,
  output o_a
)
  parameter CLK_DIV = CLK_QUICK / CLK_SLOW;
	reg ri_a;
  reg [1:0] ro_a;
  assign o_a = ro_a[1];
	reg [5:0] r_clk_cnt;
  always @(posedge i_quick_clk, posedge i_quick_rst) begin
    if(i_quick_rst) begin
      r_clk_cnt <= 'd0;
    end else if (r_clk_cnt == CLK_DIV - 1) begin
      r_clk_cnt <= 'd0;
    end else if (r_clk_cnt || ri_a) begin
      r_clk_cnt <= r_clk_cnt + 1;
    end else begin
      r_clk_cnt <= r_clk_cnt;
    end
  end
  always @(posedge i_quick_clk, posedge i_quick_rst)begin
    if (i_quick_rst) begin 
        ri_a <= 'd0;
    end else if (i_a) begin
        ri_a <= 'd1;
    end else if (r_clk_cnt == CLK_DIV - 1) begin 
        ri_a <= 'd0;
    end else begin
        ri_a <= ri_a;
    end
  end

  always @(posedge i_slow_clk, posedge i_slow_rst) begin
    if(i_slow_rst) begin
      ro_a <= 'd0;
    end else begin
      ro_a[0] <= ri_a		;
      ro_a[1] <= ro_a[0];
    end
  end

endmodule

缺点:

  1. 若需要同步的两个脉冲信号距离很近,则第一个脉冲信号的扩宽可能会覆盖第二个脉冲信号,从而导致第二个脉冲信号的漏采;
  2. 脉冲信号的扩宽是以目的时钟为参考的,但是若不知道目的时钟的频率,则该方法可能失效,也就是说该方法不具备普遍性。

从快时钟域到慢时钟域 握手

为了探寻一种具备普遍性的方法,我们可以使用握手法来进行CDC。握手法的本质是负反馈,通俗来讲,就是我先将被CDC信号展宽,展宽后将其同步到目的时钟域,在目的时钟域生成指示信号,该指示信号用来指示此时信号已经被目的时钟域接收,然后将指示信号反馈到源时钟域(反馈过程),源时钟域接收到这个反馈信号后将被CDC信号拉低,从而确定了展宽长度,也通过”发送--反馈--操作“这一握手过程完成了一次CDC传输。

截图_20230914142554.png
上图是典型的握手过程来进行CDC:

  1. 源时钟域aclk下的信号adt1信号是要进行CDC的信号;
  2. adt1先是在源时钟域aclk下被展宽,然后通过两级同步器被同步到目的时钟域bclk下,分别为bq1_dat,bq2_dat;
  3. bq2_dat作为指示信号(反馈信号,也可以通过bq1_dat和bq2_dat来生成新的指示信号)又被反馈到了目的时钟域aclk下,并进行同步,分别为aq1_dat,aq2_dat;
  4. aq2_dat的拉高则说明反馈信号的同步完成,此时可以将adt1拉低(结束展宽过程);
  5. adt1拉低(结束展宽过程)后表示一次CDC操作结束。
//单比特快到慢“握手协议”
module cdc_sbit_handshake(
    input 		aclk,	//快时钟
    input 		arst_n,	//快时钟域复位信号
    input 		signal_a,//快时钟域信号
    input 		bclk,	//慢时钟
    input 		brst_n,	//慢时钟域复位信号
    output 		signal_b//慢时钟域输出信号
    );
                             
//慢时钟域信号展宽直至反馈信号回来再恢复
reg   req;//寄存慢时钟域展宽信号
reg   ack_r0;//反馈信号
always@(posedge aclk or negedge arst_n) begin
    if(!arst_n) begin
        req <= 1'b0;
    end
    else if(signal_a) begin
        req <= 1'b1;	//信号展宽
    end
    else if(ack_r0) begin
        req <= 1'b0; 	//反馈信号到来时恢复
    end
end

//展宽信号跨时钟同步至慢时钟域
reg   req_r0;
reg   req_r1; 
reg   req_r2;                          
always@(posedge bclk or negedge brst_n) begin
    if(!brst_n)begin
        {req_r2,req_r1,req_r0} <= 3'b0;
    end
    else begin        
        {req_r2,req_r1,req_r0} <=  {req_r1,req_r0,req};
    end
end

//生成反馈信号并同步至快时钟域
reg   ack;                          
always@(posedge aclk or negedge arst_n) begin
    if(!arst_n) begin
        {ack_r0,ack} <= 2'b0;
    end
    else begin
        {ack_r0,ack} <=  {ack,req_r1}; 
    end
end

//信号上升沿检测,让输出持续一个慢时钟周期
assign signal_b = ~req_r2 & req_r1;

endmodule

多bit跨时钟域处理

信号的跨时钟域传输可能会引入亚稳态问题,那么就需要想办法对其进行处理,从而降低亚稳态发生的概率(即提高MTBF)。
跨时钟域处理方法可以分为两个大类:单Bit信号跨时钟域处理、多Bit信号跨时钟域处理。分类的原因是多bit信号的传递不光只有亚稳态这一个问题,还可能会因为多个信号之间由于工艺、PCB布局等因素导致的信号传输延时(skew)的存在,从而导致信号被漏采或者错采。

通过合并控制信号实现问题的简化

在下面的例子中,数据的读取需要载入信号load和使能信号en同时置位,但是这两个信号之间存在一个小偏差(skew),在分别进行单bit的跨时钟域同步时,由于小skew的存在,导致这两个信号在被同步到目的时钟域后有一个时钟周期的偏差,而这个偏差直接导致数据无法被读取。


现在不妨问自己:这两个信号是否都必须传递?实际上不是必须的,应用中我们可以把两个信号合并为一个控制信号,这样就将多bit信号的跨时钟域传递转换成了单bit信号的跨时钟域传递。如下:

同源时钟与不同源时钟的跨时钟域

同步和异步跨时钟域示例分析
同步时钟、异步时钟----概念解析_一点一点的进步的博客-CSDN博客

格雷码

FPGA跨时钟域处理之gray码_哔哩哔哩_bilibili
跨时钟域传输的黄金搭档:异步FIFO与格雷码_格雷码跨时钟域处理 csdn 变两位_城外南风起的博客-CSDN博客

数据流的跨时钟域处理

FPGA跨时钟域之数据流跨时钟域
所谓数据流跨时钟域即:时钟不同但是时间段内的数据量一定要相同。
常用的数据流跨时钟域可以使用fifo或者ram实现。fifo的实现我们之前文章中fifo资源的介绍中已经详细讲解过了,xilinx FIFO 硬核的结构如下:
ceaecad6aaa559dae80026334b8aa0a8.png

但是FIFO实现有一个问题,由于没有地址控制,需要固定时延是不方便,另外就是xilinx IP的fifo深度较大,可能存在资源浪费。
第二种方法就是使用ram自己搭建跨时钟域模块。我们使用bram做数据流跨时钟域。
例示代码如下 ,代码时钟比例为5:4,a时钟每5个clk写入4个数据,b时钟每个clk输出,代码中有两个点要注意:
1、0地址的写是能;
2、有一个防抖处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于ABB机器人的IO创建和设置

首先要链接网线&#xff0c;请求写权限 关于ABB机器人的默认地址位10有的是63.31看你硬接线 ABB机器人分配好信号机器人控制柜要重启 可以把机器人分配的信号导出为EIO 类似与发那科机器人IO

支付宝支付对接-附带完整代码!!

支付宝对接 文章目录 支付宝对接1、大纲1.1 整体业务流程图1.2、开发流程图1.3、核心参数1.4、支付宝开放平台1.5、支付应用场景1.6、支付宝入驻 2、环境准备2.1 首先注册自己的支付宝账号2.2 沙箱环境2.3 支持产品列表 3、项目实现3.1、项目代码地址3.2、 代码层级3.3、快速启…

【产品运营】如何提升B端产品的竞争力(上)

B端产品的核心竞争力不是只有产品功能丰富度、易用度这些维度&#xff0c;判断产品核心竞争力应该基于产品所定位解决的问题场景。 B端产品的成交因素很多&#xff0c;包括产品本身、公司品牌、客情关系、成功案例、产品定价、客户成熟度、需求匹配度等&#xff0c;本文只谈产品…

大数据(九):数据可视化(一)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

网站整站优化-网站整站优化工具

您是否曾为您的网站在搜索引擎中的排名而感到焦虑&#xff1f;是否苦苦思考如何提高流量、吸引更多用户&#xff1f; 什么是整站优化。简而言之&#xff0c;它是一项用于提升网站在搜索引擎中排名的策略和技巧。通过对网站的内容、结构、速度等方面进行优化&#xff0c;可以使…

Acer宏碁暗影骑士5笔记本AN517-54原装出厂Win10系统工厂模式

宏基电脑原厂WINDOWS10系统自带所有硬件的驱动、NITROSENSE风扇键盘控制中心、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access等预装程序 链接&#xff1a;https://pan.baidu.com/s/1Ovui_CvsUaF-TX0NbuhEVg?pwdcrmv 提取码&#xff1a;crmv 所需要工…

第1讲:前后端分离思想

什么是前端 前端其实是个很大的范畴。 简单点说&#xff0c;针对浏览器的开发&#xff0c;浏览器呈现出来的页面就是前端。它的实质是前端代码在浏览器端被编译、运行、渲染。前端代码主要由三个部分构成&#xff1a;HTML&#xff08;超文本标记语言&#xff09;、CSS&#xf…

[CISCN 2019 初赛]Love Math 通过进制转换执行命令

目录 hex2bin bin2hex base_convert 动态函数 第一种解法 通过get获取参数 绕过 第二种解法 读取请求头 getallheaders echo a,b 第三种解法 异或获得更多字符 这道题也是很有意思&#xff01; 通过规定白名单和黑名单 指定了 函数为数学函数 并且参数也只能是规…

角度回归——角度编码方式

文章目录 1.为什么研究角度的编码方式&#xff1f;1.1 角度本身具有周期性1.2 深度学习的损失函数因为角度本身的周期性&#xff0c;在周期性的点上可能产生很大的Loss&#xff0c;造成训练不稳定1.3 那么如何处理边界问题呢&#xff1a;&#xff08;以θ的边界问题为例&#x…

Bartender for Mac菜单栏图标自定义

Bartender 是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 以下是 Bartender 的主要特点&#xff1a; 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时…

【Vue3 源码讲解】nextTick

nextTick 是 Vue 3 中用于异步执行回调函数的函数&#xff0c;它会将回调函数延迟到下一个微任务队列中执行。其中&#xff0c;Vue 更新 DOM 是异步的。下面是对 nextTick 函数的详细解释&#xff1a; export function nextTick<T void, R void>(this: T,fn?: (this:…

【已解决】ModuleNotFoundError: No module named ‘torchnet‘

问题描述 今天在复现Chinese-Chatbot-PyTorch-Implementation的时候出现了一些问题&#xff1a;包括且不限于ModuleNotFoundError: No module named torchnet&#xff0c;ModuleNotFoundError: No module named fire&#xff0c;ModuleNotFoundError: No module named jieba和E…

9.22 QT作业

widget.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMessageBox> #include <QDebug> #include "second.h" //第二个界面头文件 #include "third.h" //注册界面头文件#include <QSqlDatabase&g…

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境方法一方法二 后端服务器Django环境配置微信小程序环境 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于MovieLens数据集&#xff0c;并采用TensorFlow中的2D文本卷积网络模型。它结合…

软件设计师笔记系列(三)

&#x1f600;前言 随着计算机技术的日益发展&#xff0c;操作系统作为计算机系统的核心组件&#xff0c;其重要性不言而喻。操作系统不仅管理和控制计算机硬件和软件资源&#xff0c;还为用户和其他软件提供服务&#xff0c;使得复杂的计算机系统能够高效、安全和方便地运行。…

网络监控应用程序

在过去的几十年中&#xff0c;网络监控应用稳步发展&#xff0c;以适应不断变化的市场需求和期望。多年来&#xff0c;停机成本飙升&#xff0c;客户对停机的耐心比以往任何时候都低&#xff0c;不仅仅是正常运行时间&#xff0c;正常运行时间的质量也变得很重要。 另一个发展…

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama 2进行微调是我们常用的一个方法&#xff0c;但是在微调时会遇到各种各样的问题&#xff0c;所以在本文中&#xff0c;将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的&#xff0c;大多数注释都是针对所涉及的开源库以及所使用的方法和…

Vue之vue-cli搭建SPA项目

目录 ​编辑 前言 一、vue-cli简介 1. 什么是vue-cli 2. vue-cli的重要性 3. vue-cli的应用场景 二、Vue-cli搭建SPA项目 1. 构建前提&#xff08;node.js安装完成&#xff09; 2. 安装vue-cli 3. 使用脚手架vue-cli(2.X版)来构建项目 4. 分析创建spa项目的八个问题 …

康耐视Visionpro-单ToolBlock工具规范与脚本测量规范案例分享

目录 项目要求:测试红框内的宽度显示效果第一步:建立变量第二步:建立命名空间第三步:初始化和关联工具第四步:业务逻辑和标签建立第五步:图层添加标签全部代码项目要求:测试红框内的宽度 显示效果 使用工具输入输出变量解析: 变量分析:变量Select1强制此ToolBLock输出…

2022年贵州省职业院校技能大赛中职组网络安全赛项规程

2022年贵州省职业院校技能大赛中职组 网络安全赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 赛项归属&#xff1a; 信息技术类 二、竞赛目的 为检验中职学校网络信息安全人才培养成效&#xff0c;促进网络信息安全专业教学改革&#xff0c;培养大批既满足国家网络…