CDC问题的解决方案总结

CDC(不同时钟之间传数据)问题是ASIC/FPGA设计中最头疼的问题。CDC本身又分为同步时钟域和异步时钟域。这里要注意,同步时钟域是指时钟频率和相位具有一定关系的时钟域,并非一定只有频率和相位相同的时钟才是同步时钟域。异步时钟域的两个时钟则没有任何关系。这里假设数据由clk1传向clk2。

单bit传输时,同步时钟域因为频率和相位关系都是已知的,可以推导的,所以不需要采用额外的硬件电路就可以解决CDC问题,只需要源数据在clk1端保持足够长时间即可。让其保持足够长时间有两个好处:即便出现亚稳态,也可以在两个clk2时钟周期后数据变得稳定下来,从而采到正确的结果。还可以防止低频采高频时,因为频率跟不上而导致数据丢失。

单bit传输时,异步时钟域的传输就必须使用额外的电路模块(同步器)来保证数据正确的传输。最基本的同步器是双锁存结构的电平同步器,其余的同步器都是由其衍生而来。该同步器的基本原理,也是让数据至少在clk2的时钟下保存两个周期,消除亚稳态。当然同步器能解决异步时钟域的同步问题,自然也可以拿来解决同步时钟域的问题,毕竟同步时钟域更简单一些。

实际的电路设计中,才不会管那么多细节,不管你是同步时钟域还是异步时钟域,只要是不同的时钟之间传数据,就加上同步器的结构,这当然是一种偷懒的解决办法。脉冲同步器就是这么一种万能的结构,对于单bit跨时钟域传输而言,使用脉冲同步器就够了,不需要区分时钟有没有关系,也不需要区分是高频采低频还是低频采高频,毕竟也很少有人能掌握这么全的细节。

对于多bit传输,不能采用单bit传输的方法。原因在于,单bit传输时,不能确定该数据到底经过1个clk2时钟周期之后有效还是两个clk2时钟周期之后才有效。所以对多个bit各自采用单bit的同步机制,会导致输出一些错误的中间状态。对于多bit传输,只能使用握手信号或者异步fifo。

 总结如下:

      1、有关系的时钟之间传单bit数据,理论上只需要源数据保持足够长的时间(clk2的两个周期)即可;

      2、无关系的时钟之间传单bit数据,必须要使用同步器;

       3、不管有无关系的时钟进行单bit传输,脉冲同步器都可以解决这个问题;

       4、多bit传输只能使用握手机制或者异步fifo;

       5、低频采高频,为防止数据不丢失,应当让源数据变慢,多保持一些周期;高频采低频则不需要,但是高频采低频得到的结果可能带有很多冗余。

CDC问题的解决方案总结,布布扣,bubuko.com

时间: 2024-10-23 02:41:14

CDC问题的解决方案总结的相关文章

在进行USB CDC类开发时,无法发送64整数倍的数据

1 前言 本文将基于STM32F4DISCOVERY板,介绍如何使用USB的CDC类进行开发,以及在开发过程中碰到发送64整数倍数据时会失败的问题分析及解决方案. 2 硬件介绍 在创建工程之前,我们首先即将使用的硬件进行必要的介绍. 如上图所示,USB电路使用PA11,PA12,全速USB OTG,当然,这里只做device,英雌只需要看上图的下面部分. 如上图,本例中将使用到1个用户按键,PA0,按下时为1电平. 另外,晶振使用的是外部HSE 8M晶振. 3 创建CubeMx工程 打开Cube

窗口和控件闪烁解决方案

对于MFC程序员来说做UI开发是痛苦的事情,不过大多数情况下我们都需要做这件事情,因为MFC自带的控件实在是太简陋了.这时候我们多半会涉及到自绘控件,随之而来的很可能就是窗口和控件的闪烁问题.这篇文章希望对MFC的窗口和控件闪烁问题做一个尽量全面的总结. 一.闪烁的原因 引起闪烁的原因很多,以至于网上有n多种解决闪烁问题的方法:如果你按照某一种方法做了仍然没有解决你的问题,请不要认定这个方法有问题,而是你没有对上号.如果你对这个解释不满意的话,我们就来深究一下到底是什么引起了闪烁.从原理上讲,闪

[ATL/WTL]_[中级]_[原生的复选框(checkbox button)和单选按钮(radio button)实现透明背景效果解决方案]

场景: 1. mfc,wtl的原生控件都是通过父窗口拦截 WM_CTLCOLORSTATIC 事件来修改子控件的颜色和背景色,CStatic可以通过返回HOLLOW_BRUSH来绘制透明背景: m_HollowBrush = AtlGetStockBrush(HOLLOW_BRUSH); 但是如果使用manifest文件使用最新 外观样式的话,返回HOLLOW_BRUSH对checkbox和radio button没有任何效果,原背景还是存在.虽然通过自绘一个checkbox和radio but

ODI修改主键后刷新失败解决方案

ODI增量刷新,修改主键值后,会导致刷新失败.解决办法:使用表中值固定不定的列作为增量刷新的依据列. 演示如下: 如上,源表和目标表有相同的记录.现修改源表主键信息 执行数据同步刷新后,目标表数据如下 发现,源表在update主键时,执行同步后,会向目标表新插入一条记录,原主键值记录仍保留在库中. 解决方案:从源表中找出一列(一组)固定不定的字段,目标表中以源表固定不变的字段建立主键,作为更新的依据. 如下: 源表ORDTASK2,主键为ORDNO,METHODCODE:在做数据集成时,我们认为

SQL 2008 R2数据库变为REPLICATION,日志不断增长而且不能截断和收缩的解决方案

 运行环境:windows server2003,sql server2008 R2,数据库上布置CDC 用户反应系统报错是日志已满,系统不能运行.查看日志文件时,发现日志文件已经达到15G,后来为了解决问题,干脆把数据库移到另一个F盘,D盘专门放日志文件,空间有80G.当时想这80G至少保证系统运行一周吧!谁知道系统刚运行两天,日志文件已爆涨到80G,D盘空间仅剩余10MB,数据库做任何动作都不可以.又一次为了应急把日志文件直接删除(先停掉服务,删除日所文件,再通过DBCC CheckDB

关于OrangePI 串口通讯解决方案

前段时间因为需要做一个物联网项目,需要使用到OrangePi, 定下里的方案是使用gpio通讯,但是发现香橙派没有通用的gpio驱动,所以只得这种选择串口通信.网上找了一波,使用RS232+USB通信是最便宜的解决方案,驱动的话使用开源库UsbSerial.也有之前Google 维护的库,但我觉着不好用.所以在这里献丑写上一篇博客. 导入 添加jitpack仓库到你的build.gradle文件 allprojects { repositories { jcenter() maven { url

前端异常监控解决方案研究

摘要: 异常监控不复杂也不简单啊... 原文:前端异常监控解决方案研究 作者:frustigor 前端监控包括行为监控.异常监控.性能监控等,本文主要讨论异常监控.对于前端而言,和后端处于同一个监控系统中,前端有自己的监控方案,后端也有自己等监控方案,但两者并不分离,因为一个用户在操作应用过程中如果出现异常,有可能是前端引起,也有可能是后端引起,需要有一个机制,将前后端串联起来,使监控本身统一于监控系统.因此,即使只讨论前端异常监控,其实也不能严格区分前后端界限,而要根据实际系统的设计,在最终的

window.open被浏览器拦截的解决方案

现象 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,搞得人无比郁闷啊,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多小白根本不知道发生了啥,不知道在哪里看被拦截的页面,简直悲催啊~~. 另外,可以发现,当window.open为用户触发事件内部或者加载时,不会被拦截,一旦将弹出代码移动到ajax或者一段异步代码内部,马上就出现被拦截的表现了. 原因分析&深入研究 当浏览器检测到非用户操作产生的新弹出窗口,则会对其进行阻

关于Eclipse报:" cannot be read or is not a valid ZIP file"的解决方案

原因 使用Eclipse+maven构建项目build完之后,会在项目顶上显示一个叹号. 打开problem显示 原因为对应的jar包损坏. 如图: 解决方案 使用别的版本的jar包 自己上网找到没问题的jar包进行替换 补充 关于有人说可以在.classpath文件中删除这个对应的依赖来解决问题实质是治标不治本.不建议采用.