当前位置: 首页 > news >正文

跨时钟信号处理方法

1. 背景

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

        不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者处理不当,可能导致:

  1. 数据丢失,无法采到预期中的信号;
  2. 亚稳态的产生。

        跨时钟域的信号可以分为单bit信号和多bit信号,处理方法有所不同。

2. 单bit

2.1 快时钟域到慢时钟域

2.1.1 问题

        下图显示了当在一个时钟域(aclk)中生成的信号adat被送到了另一个时钟域(bclk)中采样,由于采样时间太靠近第二个时钟的上升沿时,发生的同步失败。同步失败是由于输出bdat1变为亚稳态,而在bdat1再次被采样时没有收敛到合法的稳定状态。

        这里注意一下,如果是电平信号进行CDC, 那么不用考虑时钟快慢,直接用同步器就可以了,因为总能被采样到。所以,下面考虑的主要是信号位宽有限的CDC。

        快时钟到慢时钟的(单bit)信号处理,主要问题就是信号在快时钟域中,可能会多次改变,这样慢时钟可能来不及采样,导致丢失数据。这个问题被称为信号宽度问题,在CDC检查工具中,如果快时钟的信号宽度不足,会报出CDC违例。

        快时钟到慢时钟的(单bit)信号处理分为两种:

  1. 采样丢失是被允许的。单bit信号一般不会是这种情况,如果是这种情况,直接用同步器同步就可以了。
  2. 采样丢失不被允许。这样就要采样其他手段来保证数据不丢失。主要原理是保证快时钟域的信号宽度满足一定的条件,使得慢时钟域有足够时间采样到。

2.1.2 信号宽度的“三时钟沿”要求

        那么信号在快时钟域到底需要多宽,才能保证在慢时钟域安全的被采样到呢?比较安全的宽度是,快时钟域的信号宽度必须是慢时钟域时钟周期的1.5倍以上。也就是要持续3个时钟沿以上(上升沿和下降沿都算)。这个被称为:“三时钟沿”要求。

        下面是一个CDC信号只持续一个周期的例子。发送时钟域的频率高于接收时钟域,而CDC脉冲在发送时钟域中只有一个周期宽,这样CDC信号可以在慢时钟上升沿之间变动,不会被捕获到慢时钟域,如下图所示

        如果CDC信号宽度超过慢时钟周期,但是不足1.5个周期,也会发生问题。如下图所示

        如上图所示,信号宽度超过了一个慢时钟周期,但是可能会setup和hold time违例,导致信号采样失败。

2.1.3 信号宽度问题的解决方法

        一种最简单的方法是,通过保证信号宽度满足超过慢时钟的时钟周期1.5倍,来解决这个问题。这种方法是最直接,也是跨时钟最快的方法。可以通过system Verilog加“断言”的方式来检测是否满足条件。

        但是实际中很少用这种方式,因为设计可能会变,设计人员在改变设计时,可能会忘记这个限制,以为是一个通用的解决方法。所以,常用的还是通过“握手”的方式来保证数据被采样到。

        通常的做法是:是发送一个使能控制信号,将它同步到新的时钟域,然后通过另一个同步器将同步信号作为确认信号传回发送时钟域。如下图所示:

        优点:

        同步反馈信号是一种非常安全的技术,可以识别第一个控制信号并将其采样到新的时钟域。

        缺点:

        在允许控制信号改变之前,在两个方向上同步控制信号可能会有相当大的延迟。也就是说,在应答信号到来之前,是不允许源信号改变的。

        在实际的芯片设计中,脉冲(宽度有限)信号的同步都是采用这种握手机制来处理。

2.2 慢时钟到快时钟域

        慢时钟域到快时钟域的CDC, 直接使用信号同步器就可以了。很多人可能会问,为什么是两级DFF呢?一级或者三级DFF行不行呢?这里有一个平均失效间隔时间MTBF(Mean Time Between Failure)的考虑。MTBF时间越长,出现亚稳态的概率就越小,但是也不能完全避免亚稳态。注意采样时钟频率越高,MTBF可能会迅速减小。

        有文献给出的数据:对于一个采样频率为200Mhz的系统,如果不做同步MTBF是2.5us,一级DFF同步的MTBF大概是23年,两级DFF同步的大约MTBF大概是640年,MTBF越长出错的概率越小。所以一级看上去不太稳,二级差不多够用了,至于三级可能会影响到系统的性能,而且增加面积,所以看上去没什么必要。

        但是,这里有一点要指出来,那就是怎么才算慢时钟域到快时钟域的CDC呢?这里和平常理解的有点不一样。

        目标时钟频率必须是源时钟频率1.5倍或者以上,才能算慢时钟到快时钟的CDC.

        这也很好理解,只有满足快1.5倍以上,才能满足“三时钟沿”的要求,才能保证快时钟域保证能够采样到慢时钟域的脉冲。如果目标时钟域只快一点,比如1~1.5倍之内,为了保险起见,请按照1.1中快时钟到慢时钟域的处理方法来处理。

        另外,有的设计中为了保险和以后修改的方便;或者还不清楚时钟之间的关系;都会按照1.1中的方式来进行单bit的CDC处理。

3. 多bit

        在两个时钟域之间传递多个信号,简单的同步器已经不能满足要求。工程师经常容易犯的错误是,直接用简单同步器来同步多个信号。

        这里列出两个信号分别通过同步器同步后,在目标时钟域聚合后使用的场景。问题是两个同步器,跨时钟的延时可能不一样,比如信号从2’b00->2’b11, 上面的同步器花了2个周期同步到了目标时钟域;下面的同步器花了3个周期才同步到目标时钟域。那么在第二和第三周期之间,就出现了2’b10的值了,即出现了错误的采样信号,这样功能有可能就不正确了。

        另外,不同同步器的芯片上的走线也可能不同,导致延时不一样。即使我们完美的控制后端不同bit同步信号的走线长度一样,同一个die上面不同芯片之间或者不同制程之间的偏差,都可能引入差异,导致多bit信号的延时不同。而且这样对后端走线难度增大。

        考虑到以上两点,多个信号的CDC一般不用简单同步器的方法。在CDC检查时,会有专门的规则来检查是否采样了多bit信号用同步器同步聚合使用的情况。

        为了避免多位CDC倾斜采样的情况,多个信号CDC策略可以分为三种:

  1. 多周期路径法。使用同步负载信号安全地传递多个CDC位。
  2. 使用格雷码传递多个CDC位。
  3. 使用异步FIFO来传递多位信号。

3.1 多周期路径(Multi-Cycle Path, MCP)

        下图中显示了在时钟域之间传递的两个编码控制信号。如果这两个编码信号在采样时略有偏差,则在接收时钟域中的一个时钟周期内可能会产生错误的解码输出。

        多位数据问题可以用“多周期路径法(MCP)”来解决。MCP方法是指直接不同步将数据发送到目标时钟域,但是同时送一个同步过的控制信号到目标时钟域。数据和控制信号同时发送,允许数据在目标寄存器的输入端进行设置,同时控制信号在到达目标寄存器的负载输入端之前做同步。

        MCP方法的优点:

  1. 不需要在发送时钟域计算适当的脉冲宽度
  2. 发送时钟域只需要将enable toggle到接收时钟域,表示数据已经被传递完成,已经准备好被加载。使能信号不需要返回到初始逻辑电平。

        MCP方法的实质就是,不同步多位的数据,只同步一位的控制信号,通过握手保证控制信号能够正确传输,然后在目标时钟域通过控制信号来采样数据。MCP需要用到“同步脉冲器”:

        同步脉冲器的符号表示如下:

        多周期路径法有两种方法来传递多位信号:

3.1.1 带反馈的MCP

3.1.2 带应答反馈的MCP

        多周期路径法的思想十分有用,但是实际中用来传递多位信号比较少见,因为逻辑过于复杂。但是MCP方法用来传递单bit的信号却十分有用。这里就不展开讲了,有兴趣的可以参考最后的参考文档中的描述。

3.2 格雷码

        对于计数器的CDC, 大部分是不必要的。如果一定需要,那么可以使用格雷码。格雷码每次只允许更改一个位,从而消除了跨时钟域同步更改多个CDC位所带来的问题。格雷码和二进制码之间的转换是一种很成熟的技术,很容易就能找到现成的代码,这里就不在详细描述。

        需要注意的是:格雷码必须是计数到2^n才是每次改变一个bit。

        如果计数器是从0~5计数,那么从5->0的计数,不止一个bit改变,就失去了只改变一个bit的初衷。格雷码最常见的应用是在异步FIFO中,通常异步FIFO的深度都是2^N,原因就是上面说的。所以,就算浪费面积,也需要把FIFO深度设置为2^N。

3.3 通过AFIFO进行多位信号CDC

        多位信号CDC的工程上的一般做法都是采用异步FIFO,这里有一个特殊的应用,那就是深度为2的AFIFO,来进行多bit数据的CDC. 如下图所示:

        2个寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,逻辑简单,可以复用AFIFO代码,而且延时也比MCP方法小。所以多bit仅仅跨时钟域,不需要进行数据吞吐率匹配(FIFO的重要功能之一)的情况,推荐用深度为2的AFIFO来实现,而不是MCP方法。

相关文章:

跨时钟信号处理方法

1. 背景 现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会…...

OD(13)之Mermaid饼图和象限图

OD(13)之Mermaid饼图和象限图使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍‌⁡…...

基于springboot+vue的智能无人仓库管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…...

【PHP进阶】Rabbitmq的实际使用

RabbitMQ是一个流行的消息队列中间件,它提供了可靠的消息传递机制。在使用RabbitMQ时,有几个重要的概念需要了解: 消息队列(Message Queue):RabbitMQ中的核心概念之一。它是消息的缓冲区,用于存…...

如何解决机器视觉高速图像处理软件的加密需求?

高速图像处理在机器视觉中的应用重要性 在机器视觉行业中,高速图像处理软件的作用至关重要,它使得机器能够迅速分析和处理成千上万的图像数据。这种能力在制造业、安防系统、交通监控等多个领域发挥着核心作用,如在制造业中,高速…...

Linux的条件变量

条件变量 条件变量本身不是锁,但是它可以造成线程阻塞。通常于互斥锁配合使用。给多线程提供一个会和的场合。 使用互斥量保护共享数据使用条件变量可以造成线程阻塞,等待某个条件的发生,当条件满足的时候解除阻塞。 条件变量的两个动作&a…...

【Python笔记-设计模式】状态模式

一、说明 状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…...

Pytorch 复习总结 5

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 卷积神经网络。 本文先介绍了 Pytorch 语法汇总: Pytorch 张量的常见运算、…...

Codeforces Round 930 (Div. 2)

Codeforces Round 930 (Div. 2) Codeforces Round 930 (Div. 2) A. Shuffle Party 题意: 给出长度为n的整数数组a, a i a_i ai​ i,对于k>2的下标进行运算,设d为k除本身外最大的除数, 操作为交换( a k a_k ak​…...

c语言求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m21/m(m1)21/(m1)⋯n21/n。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。 输出格式: 在一行中按照“sum S”的格式输出部分和…...

Vue-4

自定义创建项目 目标:基于 VueCli 自定义创建项目架子 大致步骤: 安装脚手架创建项目 vue create 项目名称选择自定义 选择 Manually select features 这一项 step-1:按下空格 : 选择/取消--勾选请选择:Babel、Router、CSS、Linterstep-2…...

【Acwing】差分矩阵

图1&#xff1a;a和b数组映射表 由于a是b的前缀和数组&#xff0c;因此改变b[ x1][ y1]之后&#xff0c;受到影响的a中元素如右半图所示 图2&#xff1a;求b数组的前缀和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…...

Linux系统加固:如何有效管理系统账号

Linux系统加固&#xff1a;如何有效管理系统账号 1.1 口令重复次数限制1.2 避免系统存在uid相同的账号1.3 空密码的帐户1.4 口令复杂度1.5 口令生存期1.6 登录失败次数锁定策略 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux系统中…...

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…...

助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…...

linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)

当我写了如下汇编时 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…...

Linux系统——Nginx负载均衡模式

目录 一、Nginx优点 二、Nginx配置项——Conf Upstream 模块 三、Nginx负载均衡 1.负载均衡策略 1.1轮询 1.2IP_hash 1.3URL_hash 1.4Least_conn 1.5Weight 1.6Fair 2.Nginx负载均衡配置状态参数 3.什么是会话保持 3.1会话保持有什么作用呢 3.2Nginx会话保持 3…...

【自然语言处理之语言模型】讲解

自然语言处理之语言模型 1. 前言2. 传统语言模型3. 神经语言模型4. 训练语言模型5. 评估语言模型6. 总结 1. 前言 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学、人工智能和语言学交叉的一个领域&#xff0c;它研究计算机和人…...

输入一个整数n,输出这个整数的二进制的0和1的个数

输入一个整数n&#xff0c;输出这个整数的二进制的0和1的个数:除二取余法 代码&#xff1a; #include <cstdio> int main() {int n;scanf_s("%d", &n);int arr[2] { 0 };while (n) {int yu n % 2;arr[yu];n n / 2;}printf("0的个数是&#xff1a…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...