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

跨时钟域总结

跨时钟域总结

秋招学习跨时钟域
总结一下吧

异步电路

设计中有两个频率不同的时钟(也可能多个),而有数据在两组时钟之间传输

单bit跨时钟域

慢时钟域数据-> 快时钟域

  • 方法 : 使用两个锁存器 (打两拍)

数据跨时钟域同步过程中,脉冲宽度会改变,不影响同步结果

`timescale 1ns/1ns//慢时钟数据跨时钟域到快时钟域
module cdc_slow2fast(input clk_s     ,input pluse_s   ,input clk_f     ,output pluse_f
);reg pluse_s_ff1 ;reg pluse_s_ff2 ; //慢时钟下的数据在快时钟下打两拍always @(posedge clk_f)beginpluse_s_ff1 <= pluse_s ;pluse_s_ff2 <= pluse_s_ff1 ;endassign pluse_f = pluse_s_ff2 ;
endmodule

快时钟域数据 -> 慢时钟域

  • 脉冲展宽+同步

那么将快时钟域的信号进行展宽,但是会出现毛刺

`timescale 1ns/1nsmodule cdc_fast2slow(input clk_f ,input clk_s ,input pulse_f,output pulse_s
);//在快时钟域下打两拍 //目的是为了将脉冲信号展宽,方便识别reg [2:0] pulse_f_ff;always @(posedge clk_f) beginpulse_f_ff <= {pulse_f_ff[1:0],pulse_f} ;endwire pulse_s_w ;assign pulse_s_w =  | pulse_f_ff ;//按位或reg pulse_s_ff1;reg pulse_s_ff2;always @(posedge clk_s) beginpulse_s_ff1 <= pulse_s_w  ;pulse_s_ff2 <= pulse_s_ff1 ;endassign pulse_s = pulse_s_ff2;
endmodule
  • 方法2 : 脉动电平检测+双触发器同步+边缘检测

    • 对快时钟域的电平设置检测信号(翻转)
    • 将翻转信号进行跨时钟域处理
    • 使用两次寄存器打节拍
    • 将两个寄存器信号做异或
`timescale 1ns/1nsmodule cdc_fast2slow_new(input clk_f ,input clk_s ,input pulse_f,output pulse_s
);//标志寄存器: 检测快时钟域中的脉冲信号reg  pulse_f_flag = 0;always @(posedge clk_f) beginif(pulse_f)beginpulse_f_flag <= ~pulse_f_flag ;end else beginpulse_f_flag <= pulse_f_flag  ;end endreg pulse_f_ff1;reg pulse_f_ff2;reg pulse_s_ff3;    //这里的第三拍为了异或操作//对标志寄存器做跨时钟域处理always @(posedge clk_s) beginpulse_f_ff1 <= pulse_f_flag  ;pulse_f_ff2 <= pulse_f_ff1 ;pulse_s_ff3 <= pulse_f_ff2 ;endassign pulse_s = pulse_s_ff3 ^ pulse_f_ff2;
endmodule

多bit跨时钟域处理

  • 多bit的跨时钟域为什么不能直接打两拍?

每一个寄存器中的数据在进行跨时钟域处理的时候,从源寄存器到目的寄存器之间的延迟可能会出现不同的路径长度,所以延迟也不能控制完全相等。

方法1 : 慢时钟域-> 快时钟域 : 格雷码+同步

采用格雷码。使相邻两个多bit数据传输过程中,只有一个bit发生改变。(多bit变化到单bit变化)降低亚稳态的产生。

格雷码只能在地址或者数值依次增加的情况下使用

数值不是依次增加,那么格雷码相邻的数值不止一个bit发生改变

`timescale  1ns/1ns//格雷码+同步的方法只适合两种情况
// 1. 多bit的跨时钟域数值(地址or数据)必须依次变化(增大 or 减小) 
// 2. 必须是慢时钟域数据到快时钟域数据module gray_cdc(input clk_s,input clk_f,input [3:0] data_in,output [3:0] data_out 
);//二进制2格雷码wire [3:0] gray_data;assign  gray_data = (data_in>>1) ^ data_in ;//跨时钟域处理reg [3:0] gray_data_ff1;reg [3:0] gray_data_ff2;//格雷码2二进制reg [3:0] out_data;//跨时钟域处理always @(posedge clk_f ) begingray_data_ff1 <= gray_data ;gray_data_ff2 <= gray_data_ff1 ;end//格雷码2二进制integer i;always @(*) beginout_data[3] <= gray_data_ff2[3];for(i=2;i>=0;i=i-1) beginout_data[i] = (gray_data_ff2[i] ^ out_data[i+1]);endendassign data_out =out_data; endmodule

方法2 : 快时钟域 -> 慢时钟域 : Dmux

格雷码+同步的方法只适合数值依次变化(累加or累减),并且是慢时钟域到快时钟域。

当快时钟域源数据向慢时钟域传输,数据可能被慢时钟域遗漏。
因此在Dmux方法中,需要快时钟域数据在快时钟域下保持几个时钟周期:满足源数据有足够时间传向目的数据

  • 条件:支持多bit跨时钟域处理(支持跳变的多bit数据),DMUX在源端的clk信号必须维持好几个目的断时钟周期时间(3-4个)
module dmux_cdc #(parameter tx_clk = 100,parameter rx_clk = 50 ,parameter DATA_WIDTH = 8
)
(input clk_f ,input clk_s ,input rst_n  ,input [DATA_WIDTH-1:0] data_in ,input valid_in ,output [DATA_WIDTH-1 :0] data_out,output valid_out
);reg [DATA_WIDTH-1:0] data_in_ff1;reg valid_in_ff1;//在快时钟域打一拍always @(posedge clk_f or negedge rst_n)beginif(!rst_n)begindata_in_ff1 <= 'd0;valid_in_ff1 <= 'd0;end else begindata_in_ff1 <= data_in;valid_in_ff1 <= valid_in ;endendreg valid_in_ff2;reg valid_in_ff3;//valid信号在慢时钟域打两拍always @(posedge clk_s)beginif(!rst_n)beginvalid_in_ff2<= 'd0;valid_in_ff3<= 'd0;end else beginvalid_in_ff2<= valid_in_ff1 ;valid_in_ff3<= valid_in_ff2 ;endend//选择器(MUX)reg [DATA_WIDTH-1 : 0] data_out_ff1;reg valid_out_ff1;always @(posedge clk_s)beginif(!rst_n)begindata_out_ff1<= 'd0;valid_out_ff1 <= 'd0;end else if(valid_in_ff3) begindata_out_ff1 <= data_in_ff1;valid_out_ff1 <= 'd1;end else begindata_out_ff1 <= data_out_ff1;valid_out_ff1 <= 'd0;endendassign data_out = data_out_ff1;assign valid_out = valid_out_ff1 ;endmodule

相关文章:

跨时钟域总结

跨时钟域总结 秋招学习跨时钟域 总结一下吧 异步电路 设计中有两个频率不同的时钟(也可能多个),而有数据在两组时钟之间传输 单bit跨时钟域 慢时钟域数据-> 快时钟域 方法 : 使用两个锁存器 (打两拍) 数据跨时钟域同步过程中,脉冲宽度会改变&#xff0c;不影响同步结…...

富婆和富公子都在看的负载均衡和Haproxy大全

一.负载均衡 1.1&#xff1a;什么是负载均衡 负载均衡&#xff1a; Load Balance &#xff0c;简称 LB &#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...

VScode找python环境 (conda)

第一步 CtrlshiftP 第二步 框框里输入&#xff1a;Python:Select Interpreter...

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …...

crc原理概述

CRC&#xff08;循环冗余校验&#xff09;是一种错误检测技术&#xff0c;用于确保数据在传输或存储过程中没有发生变化。它通过将数据视为一个多项式&#xff0c;利用二进制除法得到一个校验码&#xff08;CRC值&#xff09;。接收方使用相同的算法验证数据和CRC值是否匹配&am…...

C++要求或禁止在堆中产生对象

有时你想这样管理某些对象&#xff0c;要让某种类型的对象能够自我销毁&#xff0c;也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候你想获得一种保障&#xff1a;“不在堆中分配对象&#xff0c;从而保证某种类型的类不会发生内存泄…...

为什么阿里开发手册推荐用静态工厂方法代替构造器?

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…...

前端写法建议【让项目更加易于维护】

背景 标题前提条件&#xff1a; 没有字典接口、或其他原因&#xff0c;需要前端手动维护的情况 示例环境&#xff1a;vue2&#xff0c;其他项目同理 示例 如果项目有某种类别&#xff0c;前端和后端约定好了&#xff0c;某些情况下&#xff0c;需要前端写死时。 比如有字段…...

EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明

虽然最之前是在其他地方看到的&#xff0c;但最终因缘巧合下找到了原文&#xff0c;还是尊重一下原作者。 参考引用了这位佬的博客&#xff0c;确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...

C语言学习笔记 Day10(指针--中)

Day10 内容梳理&#xff1a; 目录 Chapter 7 指针 7.4 指针 & 数组 &#xff08;1&#xff09;指针操作数组元素 &#xff08;2&#xff09;指针加减运算 1&#xff09;加法 2&#xff09;减法 &#xff08;3&#xff09;指针数组 7.5 多级指针 Chapter 7 指针 …...

网页显示打印 pdf

文件服务使用 minio&#xff0c;使用 nginx 反向代理。 将文件存放在 minio 上&#xff0c;如果是公开的文件&#xff0c;则统一放到一个桶&#xff0c;设置为公开只读。 如果是私有文件&#xff0c;则使用临时链接&#xff0c;给有权限的用户查看和打印。 要实现在 html 页…...

1948-2024.5金融许可信息明细数据

1948-2024.5金融许可信息明细数据 1、时间&#xff1a;1948-2024.5 2、指标&#xff1a;来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、所属城市、所属省份、邮政编码、发证日期、批准日期、发证机关、流水号、是…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(终)

这篇主要是细节&#xff0c;包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗&#xff0c;不然前后关系体现不出来 脸 1. 忘了有uv缝了&#xff0c;记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹&#xff1a; 2.再加亮色&#xff0c;亮…...

从MySQL到Elasticsearch:创建酒店索引案例

在现代的数据管理中&#xff0c;Elasticsearch&#xff08;简称ES&#xff09;因其强大的搜索功能和灵活的索引结构而受到广泛欢迎。本篇博客将介绍如何根据MySQL数据库中的酒店表定义&#xff0c;创建一个相应的Elasticsearch索引。 MySQL与Elasticsearch的对比 在开始之前&…...

Webkit与Web Push API:提升用户体验的推送技术

Web Push API是一种允许网站向用户发送通知的Web技术&#xff0c;即使用户没有打开网站也能接收到信息。这项技术可以显著提升用户的参与度和满意度。Webkit&#xff0c;作为Safari和其他浏览器的内核&#xff0c;对Web Push API的支持情况如何&#xff1f;本文将深入探讨Web P…...

Java线程池的拒绝策略

在 Java 线程池中&#xff0c;常见的拒绝策略&#xff1a; AbortPolicy&#xff08;中止策略&#xff09; 特点&#xff1a;直接抛出 RejectedExecutionException 异常来拒绝新任务的提交。应用场景&#xff1a;适用于对系统的稳定性要求较高&#xff0c;不希望丢失任务&#…...

【C++进阶】继承

【C进阶】继承 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模…...

立体相机镜面重建(一)镜面标定

无论是单目、双目或者是多屏幕镜面重建&#xff0c;都需要事先对屏幕和相机的相对位置进行标定&#xff0c;求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢&#xff1f;接下来是标定流程。 &#xff08;一&#xff09;准备&#xff1a; 1&#xff09…...

【如何有效解决前端Vue中的常见难题】

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼&#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前端-Vue框架专栏…...

CLAMP-1靶机渗透测试

一、靶机下载地址 https://www.vulnhub.com/entry/clamp-101,320/ 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.145.0/24 -sn | grep -B 2 "00:0C:29:88:B4:BF" 2、端口扫描 # 使用命令 nmap 192.168.145.0/24 -p- -sV 3、指纹识别 # 使用命令 whatweb …...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...