跨时钟域总结
跨时钟域总结
秋招学习跨时钟域
总结一下吧
异步电路
设计中有两个频率不同的时钟(也可能多个),而有数据在两组时钟之间传输
单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跨时钟域 慢时钟域数据-> 快时钟域 方法 : 使用两个锁存器 (打两拍) 数据跨时钟域同步过程中,脉冲宽度会改变,不影响同步结…...
富婆和富公子都在看的负载均衡和Haproxy大全
一.负载均衡 1.1:什么是负载均衡 负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...
VScode找python环境 (conda)
第一步 CtrlshiftP 第二步 框框里输入:Python:Select Interpreter...
C# Winform序列化和反序列化
在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化,为解决此问题,采用System.Text.Json进行序列化,注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …...
crc原理概述
CRC(循环冗余校验)是一种错误检测技术,用于确保数据在传输或存储过程中没有发生变化。它通过将数据视为一个多项式,利用二进制除法得到一个校验码(CRC值)。接收方使用相同的算法验证数据和CRC值是否匹配&am…...
C++要求或禁止在堆中产生对象
有时你想这样管理某些对象,要让某种类型的对象能够自我销毁,也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候你想获得一种保障:“不在堆中分配对象,从而保证某种类型的类不会发生内存泄…...
为什么阿里开发手册推荐用静态工厂方法代替构造器?
🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…...
前端写法建议【让项目更加易于维护】
背景 标题前提条件: 没有字典接口、或其他原因,需要前端手动维护的情况 示例环境:vue2,其他项目同理 示例 如果项目有某种类别,前端和后端约定好了,某些情况下,需要前端写死时。 比如有字段…...
EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明
虽然最之前是在其他地方看到的,但最终因缘巧合下找到了原文,还是尊重一下原作者。 参考引用了这位佬的博客,确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...
C语言学习笔记 Day10(指针--中)
Day10 内容梳理: 目录 Chapter 7 指针 7.4 指针 & 数组 (1)指针操作数组元素 (2)指针加减运算 1)加法 2)减法 (3)指针数组 7.5 多级指针 Chapter 7 指针 …...
网页显示打印 pdf
文件服务使用 minio,使用 nginx 反向代理。 将文件存放在 minio 上,如果是公开的文件,则统一放到一个桶,设置为公开只读。 如果是私有文件,则使用临时链接,给有权限的用户查看和打印。 要实现在 html 页…...
1948-2024.5金融许可信息明细数据
1948-2024.5金融许可信息明细数据 1、时间:1948-2024.5 2、指标:来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、所属城市、所属省份、邮政编码、发证日期、批准日期、发证机关、流水号、是…...
【笔记】从零开始做一个精灵龙女-画贴图阶段(终)
这篇主要是细节,包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗,不然前后关系体现不出来 脸 1. 忘了有uv缝了,记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹: 2.再加亮色,亮…...
从MySQL到Elasticsearch:创建酒店索引案例
在现代的数据管理中,Elasticsearch(简称ES)因其强大的搜索功能和灵活的索引结构而受到广泛欢迎。本篇博客将介绍如何根据MySQL数据库中的酒店表定义,创建一个相应的Elasticsearch索引。 MySQL与Elasticsearch的对比 在开始之前&…...
Webkit与Web Push API:提升用户体验的推送技术
Web Push API是一种允许网站向用户发送通知的Web技术,即使用户没有打开网站也能接收到信息。这项技术可以显著提升用户的参与度和满意度。Webkit,作为Safari和其他浏览器的内核,对Web Push API的支持情况如何?本文将深入探讨Web P…...
Java线程池的拒绝策略
在 Java 线程池中,常见的拒绝策略: AbortPolicy(中止策略) 特点:直接抛出 RejectedExecutionException 异常来拒绝新任务的提交。应用场景:适用于对系统的稳定性要求较高,不希望丢失任务&#…...
【C++进阶】继承
【C进阶】继承 🥕个人主页:开敲🍉 🔥所属专栏:C🥭 🌼文章目录🌼 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模…...
立体相机镜面重建(一)镜面标定
无论是单目、双目或者是多屏幕镜面重建,都需要事先对屏幕和相机的相对位置进行标定,求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢?接下来是标定流程。 (一)准备: 1)…...
【如何有效解决前端Vue中的常见难题】
🐟作者简介:一名大三在校生,喜欢编程🪴 🐙个人主页🥇:Aic山鱼🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-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 …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
