跨时钟域问题

合集下载

cpu与fpga跨时钟域数据交换的实现问题

cpu与fpga跨时钟域数据交换的实现问题

munitis#1楼主:cpu与fpga跨时钟域数据交换的实现问题[精华]ARM与fpga(cyclone)之间进行数据传输,这应该属于跨时钟域的范畴,CPU与fpga之间采用三总线的方式进行连接,而CPU连接fpga的数据线、地址线、控制线进入fpga内部就属于异步信号了,该如何考虑呢?我看过一些关于跨时钟域的文献,上面说对于数据交换,实现方法有握手和fifo两种,我想,双口RAM是不是也算一种?另外,我看跨时钟域数据交换,都涉及到两侧的时钟信号,而对于CPU的三总线,并没有输出什么时钟信号,时钟输出是不是必须的呢?问题比较多,不知道说明白没有,请指教一二,谢谢了!riple #2这个问题,基本上很难。

开个玩笑,原理上简单,实现起来有许多要注意的地方,但是不难。

一个提示:从你使用的ARM芯片数据手册的接口时序图入手。

FPGA中的处理方法是可以改的,而接口时序是一定要遵守的。

泛泛而谈很难,把你的芯片接口时序图贴上来吧,主要是寄存器读、写时序,如果用到DMA的话,应该还有DMA读写的时序图。

munitis #3上面是ARM读写外设的时序图,时钟是CPU的,和fpga的内部时钟是两个时钟域,既需要有ARM写入给fpga 内部的寄存器,又需要有ARM读出fpga内部的值,该如何解决跨时钟域的问题呢?munitis #4ARM与fpga的接口是标准的总线型接口,包括DATA,CS,ADDR,RD,WR,这些信号由CPU的时钟控制,对于FPGA来说是异步信号,在进入FPGA内部是不是需要先进行同步,我看过一些文献,这种总线型的跨时钟域,是不能用多个同步器进行同步的,采用的方法有握手信号和FIFO,是不是这样的呢?riple #5我们一步一步来,先实现基本功能,然后优化性能。

第一、我觉得处理这样的接口,采用异步方式比较好。

因为同步接口对FPGA外部电路和内部配置的要求都比较高。

异步接口只要给出充分的时间,外部电路不存在信号完整性问题就很好解决。

FPGA设计中跨时钟域的问题与方法

FPGA设计中跨时钟域的问题与方法
/ —— — 、
图2 :反馈方式设计电路

— — —— — —— —驯

T l x l 一 一
M L _ _
+ l — — — 衄 l
+ .
n^ ^ ¨
【 关键词 】F P G A跨 时钟域 亚稳 态
3 . 2多结构 同步设计
对 于多位信 号在不 同的时钟域之 问传输 , 多路复用设计可 以保持跨 时钟 域传 输时的正确 Ar r a y), 即 现 场 可 编 程 门 阵 列 , 它 是 在 性 ,如下 图所示 。多路 复用 设计可以适用于如 P A L、GAL、C P L D 等可编 程期 间的基 础上进 下的设计 中,一组数据 需要 从一个 时钟域传输 步发展起 来的一种可编程 门阵列 。它是作 为 到另外一个时钟域 ;当断言时,有标 记的表明 专用 集成 电路 ( A S I c)领 用 中的一 种 半定制 数据信号稳定的一组信号 。 电路而 出现 的,既解决 了定制 电路 的不足 ,又 . 3握 手设 计 克服 了原 有可 编程 期 间 门 电路 数 目有 限的缺 3
误。
亚 稳态 现象 :数 字信 号通 过异 步 时钟域 时,如果时钟信号 不能满 足触发器的建立时 间 或保持时间 ,此时很可 能产生亚 稳态现象。 毛刺 现 象: 同步逻 辑 电路 中产 生毛 刺现 象主要取决 于数字 信号传播时延 ,这些毛刺有
可能会被成功锁存 ,也有可能导致错误脉冲在 同步装置 中输 出。 多扇 出现象 :在 同步 逻辑 电路 中,由于
握 手 设计 是基 于 以下协 议进 行 设计 的: 源 时钟域 向目的时钟域发 出请求 ,而且该请 求 信 号一直保持着,直到源时钟域接受到 目的时 钟 域的返回信号 ;目的时钟域接收到请求信 号 之 后,连 续不断地发送确认信号 ,直到其接 收 到源 时钟域是重复断言 的。握手机制可 以设计 为 简单 的反馈 同步器,也可 以设计为全握手机 制或者 半握手机 制。 3 . 3 . 1 反馈 同步 设计 对于图 2 所示 ,使 用 的是反 馈 同步 设计 实 现 的逻辑 电路。对 于 该 电路来 讲 ,时钟 A 和 时钟 B之间的频率差值是没有极 限要求 的, 时 钟 A 的频率 可 以比时钟 B的频 率低 ,也可 以 比时 钟 B 的频率 高。然 而该 电路 使用 的是 信 号 A 由一个 时钟 周期 组成 ,而且从 当 前脉 冲到下一个脉冲 的时 间间隔要 大于两倍的时钟 A和 两倍的时钟 B的时 间之和 。 3 - 3 . 2请求 . 应答 设计 请求和 回答 传输方式在 发送信 号 T x和 接 收信号 R x之间需要双 重 同步 ,而且数据 的保 持时间必 须保持 到发送信 号 T x收到确认无 效 之后,如图 3所示。

Xilinx FPGA 设计中的跨时钟域问题

Xilinx FPGA 设计中的跨时钟域问题

浅谈XLINX FPGA设计中跨时钟域的同步设计问题摘要本文介绍了FPGA设计中的同步设计原则并对FPG A设计中的触发器亚稳态问题进行了阐述本文通过具体的设计实例论证了跨时钟域同步处理的必要性并介绍了一种实现跨时钟域同步处理的方法和其具体电路关键字同步设计异步设计触发器亚稳态时序稳定一同步设计的原则尽量使用同步电路避免使用异步电路这句话是电路设计的几个原则之一同异步设计相比同步设计设计出来的电路更稳定可靠在XILINX FPGA设计中时常有设计人员遇到如下类似的问题设计的电路升级困难可移植性差也就是说一些原本工作正常的电路移植到高端的FPGA中就根本工作不起来了设计的电路一致性差同一电路设计每次布线后工作的结果不同设计的电路时序仿真正常但实际电路上却工作不起来设计的电路极易受毛刺的干扰通常这些类似的问题都于电路的异步设计有关二亚稳态图1 触发器的亚稳态示意图对于触发器当时钟沿到来时其输入要求是稳定的这时其输出也是稳定的但假如时钟沿到来时其输入也正在变化即翻转这时触发器会瞬时进入亚稳态通常触发器对输入信号都有一个建立时间的要求也即setup时间当这一建立时间得不到满足时触发器也会进入瞬时亚稳态如图1通常触发器即使进入亚稳态也会很快进入稳态但其输出值是不定的这有可能对使我们设计的FPGA模块尤其是哪些有复杂状态机的模块产生错误的逻辑对于亚稳态问题我们还应明白亚稳态问题并非指输出结果数据的不确定性而是指输出变化的时序不确定性遵循同步设计的原则有助于解决亚稳态问题使我们设计出稳定可靠的电路模块对于单时钟系统我们可以很方便地设计出稳定易于设计及仿真的同步单一时钟系统但在电信和数据通讯领域中我们设计的系统中往往具有多个时钟往往需要将数据或时序由一个时钟域传到另一个时钟域这类设计的难点在于实现不同时钟域之间数据和时序变化的稳定可靠地传递采用经验证的设计技术可以实现跨时钟域的同步设计进而设计出可靠工作的电路三跨时钟域的异步设计案例本人曾经设计过如下几个模块这些模块中的几个子模块分别工作在各自的时钟域中但在他们之间有着数据和时序的传递在设计这些模块的初始时并没有考虑到跨时钟域时序和数据传递的特殊性使得在系统上使用这些模块时出现过一些较为棘手的问题现把它们列举出来供大家研究模块一名称:芯片配置模块模块功能从平行口接收从PC 机下传的命令和参数产生相应的控制时序完成单板上芯片的配置模块结构框图图2 同步处理前芯片配置模块结构框图各子模块简介模块A 实现同PC 的平行接口PC 机控制程序通过操作并行口各个引脚把各个参数信息如数据地址信息传递到参数控制总线上并且发出相应的命令如start, write 等命令启动下层模块模块B 是一个状态机clk 是状态机的主时钟模块B 根据模块A 传来的命令启动相应的状态机完成从参数传递总线上获取参数信息或产生相应的配置时序完成芯片的正确配置在上图中模块A 中各寄存器都受控于并行口各引脚的状态它们在并行口引脚中stroble 引脚的上跳沿发生状态的迁移可以说stroble 引脚是模块A 的主时钟信号由上分析得模块A 和模块B 分属于两不同的时钟域时钟域A 和时钟域B中时钟域A 的主时钟为stroble, 时钟域B 的主时钟为clk 两时钟域的主时钟stroble 和clk 是不相关的它们之间的信号就为跨时钟域A 和时钟域B 之间的信号线其中write 信号线,start 信号线及回馈握手信号线用于实现控制时序的传递而参数传递总线用于实现数据的传递在如上的设计中没有对跨时钟域的时序控制线进行同步处理在系统使用此模块时出现如下的问题Parrel port with PCPC机上芯片配置命令并不能总是成功的启动模块B 中相应的状态机也即PC机上芯片配置命令并不能总是成功地实现芯片的正确配置芯片配置时序的不稳定性故障的偶然性故障的不可重复性模块二名称:突发调制器模块模块功能完成数据的突发调制模块结构框图图3 同步处理前突发调制器模块框图各子模块简介模块A 为突发调制器主控模块它的主时钟为CLKA它利用CLKA定时产生周期的Send_data信号去启动模块B中的状态机模块B为突发调制器时序控制模块它的主时钟是从专用调制器芯片送来的TXBITCLK时钟信号模块B根据模块A的触发信号启动相应的状态机产生相应的调制器控制时序专用调制芯片中的DPLL(数字锁相环)根据相应的设置参数以CLKB为参考时钟产生TXBITCLK时钟信号上图中R1R2为跳接电阻通过R1R2不同的焊剂方式可以改变CLKB时钟信号的时钟源在如上的设计中没有对跨时钟域的时序控制进行同步处理在系统使用此模块时出现如下的问题在R1短接R2断开情况下CLKA时钟信号和CLKB时钟信号共用一个时钟源晶体A,上述模块工作正常稳定在R1断开R2短接情况下CLKA 时钟信号的时钟源为晶体A CLKB 时钟信号的时钟源为晶体B 晶体A 和B 是两个独立不相关的晶体这时模块A 和模块B 工作于不同的时钟域(时钟域A 和时钟域B) 它们之间的信号就为跨时钟域A 和时钟域B 之间的信号线Send_data 信号和回馈握手信号线用于实现两时钟域之间控制时序的传递此时上述模块工作很不稳定模块B 中的状态机经常进入一种未知状态不能产生正确的调制器控制时序四 跨时钟域的同步设计的方法经对上述案例仔细地仿真和深入分析后笔者发现作成上述两模块工作不稳定的主要原因是没有按照同步设计的原则对跨时钟域的时序控制信号进行同步处理可以有好几种电路用于实现跨时钟域的时序控制信号的同步处理下面的电路模块Asy_syc 可以用于跨时钟域时序控制信号的同步处理Asy_inSyc_clkSyc_outTime periphery图4 Asy_syc 电路原理图上述电路的时序仿真图如下:图5 Asy_syc 时序仿真图由时序仿真图可以看出主时钟Syc_clk 的异步输入信号Asy_in 经该电路后输出同步于主时钟Syc_clk 的Syc_out 信号, 从而实现了异步信号的同步处理按照同步设计原则利用Asy_syc 模块对上述模块二(突发调制器模块)中跨时钟域的信号线Send_data 进行同步处理同步处理模块示意图如图6经实际电路验证得: 同步处理后突发调制器模块运行可靠稳定同样按同样的处理方式对上述模块一(芯片配置模块) 中跨时钟域的信号线进行同步处理经实际电路验证得: 同步处理后,芯片配置模块模块运行可靠稳定图6 同步处理后突发调制器模块框图五总结同步处理模块Asy_syc是一个很好的模块笔者用它和其它的简单模块实现了如下的功能:1. 上沿同步2. 脉冲同步3. 异步系统同步解决了好多Xilinx FPGA设计中棘手的问题参考资料XILINX FUNDATION3.1 TRAINING跨越异步时钟边界传输数据的解决方案 Peter Alfke。

fpga跨时钟域处理方法

fpga跨时钟域处理方法

fpga跨时钟域处理方法fpga 跨时钟域处理方法1.什么是FPGA跨时钟域处理?FPGA跨时钟域处理是指在FPGA中处理不同的时钟域的信号,把不同的时钟域的信号转换成成某种特定的格式或者特定算法,以便FPGA 能够处理这些不同的时钟域的信号。

2. FPGA跨时钟域处理的优势(1)更低的功耗,由于时钟频率较低,其功耗比信号时钟频率高的系统低得多。

(2)更高的可靠性,由于时钟频率较低,其硬件的可靠性比信号时钟频率更高。

(3)更快的切换和转换速度,在跨时钟域中,由于只需要处理少量的信号,因而切换和转换的速度会更快。

(4)更小的面积,由于少量的信号需要被转换,相应的FPAG占用的面积也会更少。

3. FPGA跨时钟域处理的实现(1)时间轴划分:第一步是将FPGA转换时钟域中需要处理的信号根据频率分类,并将其根据实际应用场景放置在不同的时间轴上,以便进行后续的处理。

(2)位转换和跨域转换:第二步是将这些处理过的信号转换为不同时钟频率域的信号,这种转换可以采用位级或字节级转换等,以便这些信号能够更好的处理。

(3)中转处理:第三步是将不同时钟频率域的信号做一个中转处理,将其转换成FPGA能够处理的信号,再对每个时钟域上的信号进行处理,完成跨时钟域处理。

4. FPGA跨时钟域处理的应用(1)通信领域:一些通信应用中会存在部分接收信号的处理只能在低频率的时钟域上完成,比如协议及协议解析。

采用FPGA跨时钟域处理,可以有效的提高系统的处理能力。

(2)信号处理领域:有不少信号处理应用一般要求高速处理,这就需要高频率的时钟域;而有些信号处理应用却完全不需要,而FPGA跨时钟域处理可以有效解决这个问题,同时又能提高系统的可靠性。

5.总结FPGA跨时钟域处理是将不同时钟域的信号转换为特定类型或特定算法,以便FPGA能够处理这些不同的时钟域的信号。

它具有更低的功耗、更高的可靠性、更快的切换和转换速度以及更小的面积等优势。

FPGA跨时钟域处理的具体步骤包括时间轴划分、位转换和跨域转换、中转处理等。

跨时钟域的处理

跨时钟域的处理

跨时钟域的处理很久不写东西了,因为这个空间里似乎都是做软件的,而我把ASIC/FPGA认为是硬件电路。

所以写的虽然也是代码,但是想的确实硬件电路。

这让我在这个软件人员居多的空间里显得格格不入。

写这个题目,其实是我有些忍不住了。

这十几年来,我面试过很多新人,也带过很多新人,他们之中很多人的成就都已经超越了我。

但是当我们偶尔回顾这个小小的跨越时钟域的问题时,仍然有很多的困惑和不理解。

我喜欢用这个题目作为我的面试题目,因为它不是一个简单的题目,而是涉及到ASIC设计本质的题目,如果细细研究起来,还非常复杂。

写这个东西,希望所有在做ASIC的人,能从一个更高的角度去审视它,并且能因此更深刻的体会做ASIC的严谨。

言归正传:题目:单根信号线,跨越时钟域,该怎么处理?1。

首先给一个最简单的答案:用寄存器打两拍这里其实有一个很本质的问题需要讨论,就是为什么要所存两拍?把这个问题插进来说说吧。

所有做ASIC的人,都要面对两个基本的概念:setup time 和 hold time。

如果寄存器不满足这两个时间,将会出现亚稳态。

很多新人以为亚稳态仅仅是逻辑上的障碍,其实亚稳态是实实在在的电路上的问题。

模拟电路中,三极管主要工作在其放大区间,而在数字电路却是要工作在截至态。

亚稳态非常类似模拟电路中的放大态,这个状态将使得器件的输出电流被放大,如果这个状态被传递,那么将导致更多的电路处在放大电路的工作状态中,这将引起巨大的电流和功耗,甚至烧毁芯片,所以,跨时钟域是一定会出现亚稳态的,但是我们必须要把亚稳态控制在一个很小的范围内。

这就是为什么要在其后面再用一个寄存器的原因。

它的功能就是把亚稳态仅仅限制在那一个寄存器的小区域。

好了,继续说逻辑上的事情。

这个两拍的电路很显然,只适合信号从低频时钟跨越到高频时钟,那么当高频时钟要跨越到低频时钟该怎么办呢?2. 高频信号要进入低频时钟域,最原始的想法就是展宽。

如果我们知道这两个时钟之间的频率差别,那么用一个计数器去将高频信号做适当的展宽,使其宽度大于低频时钟的一个周期,然后就可以继续用上述的方法跨域时钟域了。

快时钟到慢时钟跨时钟域处理

快时钟到慢时钟跨时钟域处理

快时钟到慢时钟跨时钟域处理随着现代电子技术的不断发展,各种智能设备越来越普及,而这些设备中都包含了各种不同的时钟。

面对不同的时钟,如何进行跨时钟域处理成为了一个重要的问题。

本文将围绕这个问题展开讨论。

一、时钟域时钟域是指在一个系统中,由于时钟信号的不同而形成的不同的时钟区域。

在一个系统中,可能会有多个时钟域,每个时钟域都由一个时钟信号驱动。

例如,一个处理器的时钟域和一个外设的时钟域就是两个不同的时钟域。

二、时钟域的跨越在一个系统中,不同的时钟域之间需要进行数据的传输和交互。

但是,由于不同的时钟域具有不同的时钟频率和时钟相位,因此在传输和交互数据时会遇到一些问题。

例如,如果一个时钟域的时钟频率是100MHz,而另一个时钟域的时钟频率是50MHz,那么在传输数据时就需要进行频率的转换。

又例如,如果一个时钟域的时钟相位发生了变化,那么在传输数据时就需要进行时钟相位的校准。

三、跨时钟域处理的方法为了解决跨时钟域处理的问题,有以下几种方法。

1.同步方法同步方法是指在不同的时钟域之间建立同步信号,使得数据能够在同步信号的边沿进行传输。

这种方法需要在两个时钟域之间建立同步电路,并且需要在同步电路中添加缓存器来保证数据的正确传输。

同步方法的优点是能够保证数据的正确性,缺点是需要额外的硬件开销。

2.异步方法异步方法是指在不同的时钟域之间使用异步传输协议进行数据的传输。

这种方法不需要建立同步电路,只需要使用异步传输协议即可。

异步方法的优点是不需要额外的硬件开销,缺点是在数据传输过程中可能会出现误码。

3.频率转换方法频率转换方法是指将一个时钟域的时钟频率转换成另一个时钟域的时钟频率。

这种方法需要使用时钟控制电路来实现,可以通过倍频或分频的方式实现。

频率转换方法的优点是不需要建立同步电路,缺点是会引入一定的时钟抖动。

4.时钟域转换方法时钟域转换方法是指将一个时钟域的时钟信号转换成另一个时钟域的时钟信号。

这种方法需要使用时钟域转换电路来实现。

跨时钟域信号处理

跨时钟域信号处理

跨时钟域信号处理跨时钟域信号处理是指在不同时钟域中传输的信号之间进行处理的技术。

在现代电子系统中,不同的模块或芯片可能使用不同的时钟频率,这就需要进行跨时钟域信号处理。

跨时钟域信号处理的主要问题是时序不同步。

由于不同的时钟频率,不同的模块或芯片在不同的时间点进行操作,这就导致了时序不同步的问题。

如果不进行处理,就会出现数据丢失、数据错误等问题。

为了解决这个问题,跨时钟域信号处理需要进行时序转换。

时序转换是指将一个时钟域中的信号转换成另一个时钟域中的信号。

在时序转换过程中,需要进行时钟同步、时钟域转换、数据缓存等操作。

时钟同步是指将不同时钟域中的时钟信号进行同步。

在时钟同步过程中,需要进行时钟频率的转换,使得不同时钟域中的时钟信号同步。

时钟域转换是指将一个时钟域中的信号转换成另一个时钟域中的信号。

在时钟域转换过程中,需要进行时序转换,使得不同时钟域中的信号同步。

数据缓存是指将不同时钟域中的数据进行缓存,以便进行时序转换。

跨时钟域信号处理的应用非常广泛。

在数字信号处理、通信系统、计算机网络等领域中,都需要进行跨时钟域信号处理。

例如,在通信系统中,不同的通信模块可能使用不同的时钟频率,这就需要进行跨时钟域信号处理。

在计算机网络中,不同的计算机可能使用不同的时钟频率,这就需要进行跨时钟域信号处理。

总之,跨时钟域信号处理是一项非常重要的技术。

它可以解决不同时钟域中的信号处理问题,保证数据的正确性和可靠性。

随着电子系统的不断发展,跨时钟域信号处理技术将会得到更加广泛的应用。

跨时钟域处理方法

跨时钟域处理方法

跨时钟域处理方法跨时钟域处理(Cross-ClockDomainProcessing)也被称为跨时钟域通信(CCDC),是一种在不同的时钟芯片或部件间实现通信的方法。

它可以帮助企业减少制造时间,降低成本,提高性能和灵活性,并允许更快地向市场投入新产品。

跨时钟域处理技术可以减少能耗,更有效地为更多的应用程序和处理任务提供高效的解决方案。

它还能减少误码和数据传输失败的可能性,提高系统的可靠性。

跨时钟域处理可以用来支持不同的芯片,例如处理器,存储器,收发器,传感器和控制器,以及他们之间的交互。

在某些情况下,它还可以用来将外部固件与主CPU和内部芯片相结合,以便在主CPU芯片和外部芯片之间传输数据,从而形成更复杂的系统集成解决方案。

跨时钟域处理可以采用端口技术来使不同频率的时钟芯片能够正常工作。

每个芯片都有一个专用端口,它可以产生和接受数据,而不受另一个芯片的时钟频率的限制。

例如,如果一个芯片使用的是200MHz的时钟,而另一个芯片使用的是2GHz的时钟,那么使用端口就可以让这两个芯片能够正常工作,而不用担心后者会干扰前者的时钟。

另一种常用的跨时钟域处理技术是串行总线技术。

它允许多个晶体管和元件在共享的串行总线上通信,而无需考虑他们之间的时钟频率和时差。

这种技术允许用户更容易地访问和控制每个芯片的信号,而无需考虑时钟延时的问题。

最后,要注意的是,跨时钟域处理技术的实施必须保证其精确性和可靠性。

这可能会需要使用适当的补偿和专用控制系统,以确保系统中的所有芯片能够正常工作并保持稳定性,从而实现最佳性能和可靠性。

总之,跨时钟域处理是一种令人印象深刻的技术,可以有效地减少成本,并提高系统性能,提高可靠性和性能。

此外,它还可以帮助更快地推向市场新产品,提高市场竞争力。

企业应该利用跨时钟域处理技术,以更有效的方式来解决问题,实现更多的目标。

CDC跨时钟域处理

CDC跨时钟域处理

单信号:慢时钟域快时钟域
• 如果我们仍然使用同样的参数,则第2级触发器 的MTBF为9.57 *10^9(years) 。这个值已经足以 使系统长期稳定。
总结
• 问题1:为何直接对异步信号进行采样会不稳 定? • 问题2:要使用几级寄存器进行同步最合适? • 问题3:同步寄存器电路可以防止亚稳态产生 吗?
单信号:快时钟域慢时钟域
• 当快时钟域的信号跳变太快,导致目标时 钟域无法采样时,应如何处理? • 1.拉伸快时钟域信号的脉冲宽度使其足以被 正确采样 • 2.结绳法(脉冲同步器)
① 脉冲拉伸法
脉冲拉伸同步电路
② 结绳法 • 信号从快时钟域向慢时钟域过渡时,慢时钟 将可能无法对变化太快的信号实现正确采样。
• “结绳法”原理:将快时钟信号的脉冲周期 延长,等到慢时钟同步采样后再“解绳”还 原为原来的脉冲周期宽度。
单信号:快时钟域慢时钟域 结绳同步电路
Synopsys DW库内的推荐电路
脉冲同步器使用规则 • 1. 总线数据不能对每个信号单独使用同步 器,会导致数据无法同时有效。 • 2.输入的信号必须是单周期脉宽,否则无法 成功进行“结绳”操作 • 3.输入脉冲之间的最小间隔必须等于两个同 步器时钟周期。如果输入脉冲相邻太近, 则同步器就不能检测到每个脉冲。
主要内容
• • • • 1.单一信号跨时钟域处理 2.总线数据的跨时钟域处理 3.数据流的跨时钟域处理 4.相关时钟系统数据同步
相关时钟系统
• 如果两个时钟分别为同一个源时钟的分频或倍 频时钟,则称为相关时钟 • 相关时钟的相位是可以通过工具进行对齐的 • 跨越的时钟域为相关时钟,这时可以用更简便 的处理方式,简化同步电路
工艺器件映射
• 在DC将两个触发器映射到一个目标库上时,综 合工具会选择能够满足时序限制条件的最小面 积的单元,而不是对同步最好的触发器 • 因此通常想要通过手动方式或通过脚本方式用 已知的“亚稳态强化”触发器来替代这些触发 器 • 自DC2009版本开始,可以指定一个或多个“亚 稳态强化”触发器用在上述DW库中的CDC组件。 • 方法:通过将相关器件赋给 “synlib_preferred_ffs”变量实现特定寄存器的 调用

快时钟到慢时钟跨时钟域verilog处理

快时钟到慢时钟跨时钟域verilog处理

快时钟到慢时钟跨时钟域verilog处理一、前言时钟在数字电路中扮演着至关重要的角色,它是同步电路的基础。

而时钟域则是指在不同的时钟频率下,电路中的寄存器和逻辑单元所处的不同时钟区域。

跨越不同时钟域的数据传输需要进行特殊处理,否则会导致数据错误。

本文将介绍如何使用Verilog语言处理快时钟到慢时钟跨时钟域问题。

二、什么是时钟域1. 时钟在数字电路中,为了保证各个模块之间能够协调工作而不会发生冲突,需要引入一个基准信号来进行同步。

这个基准信号就是我们常说的“时钟”。

2. 时钟域由于数字电路中可能存在多个时钟信号,每个时钟信号都有自己的频率和相位。

因此,在数字电路中会形成多个互相独立的“时间区域”,也就是我们所说的“时钟域”。

三、快慢时钟之间数据传输问题当两个模块处于不同的时钟域中,并且这两个模块需要进行数据传输或共享一个寄存器/内存单元等操作,就会出现跨越不同时间区域(时钟域)的数据传输问题。

在不同的时钟域之间进行数据传输,需要考虑以下问题:1. 时序关系由于不同的时钟信号具有不同的频率和相位,因此在进行跨时钟域数据传输时,需要考虑这两个模块之间的时序关系。

通常情况下,我们会使用一些特殊技术来解决这个问题,例如手动插入缓冲器或者FIFO 等。

2. 数据同步由于不同的时钟信号具有不同的频率和相位,因此在进行跨时钟域数据传输时,可能会出现数据丢失、错误或者抖动等问题。

为了解决这个问题,我们通常会使用一些特殊技术来进行数据同步。

例如手动插入缓冲器、FIFO、双缓存技术等。

四、Verilog语言如何处理跨越不同时钟域的问题在Verilog语言中,我们可以使用$setup()和$hold()函数来解决跨越不同时间区域(时钟域)的数据传输问题。

1. $setup()$setup()函数用于检查从一个寄存器到另一个寄存器之间是否存在时间上危险(setup time violation)。

如果存在,则该函数返回1;否则返回0。

同步跨时钟域的约束处理

同步跨时钟域的约束处理

同步跨时钟域的约束处理同步跨时钟域的约束处理是数字设计中一个非常重要的问题,涉及到两个或多个时钟域之间的数据传输。

由于不同的时钟域有各自的时钟频率和相位,因此在从一个时钟域向另一个时钟域传输数据时,可能会出现数据丢失、数据冲突或者不确定状态等问题。

为了解决这些问题,需要进行同步处理。

以下是一些同步跨时钟域的约束处理方法:1. 建立时钟域之间的同步关系:在两个时钟域之间建立同步关系,使得它们之间的数据传输能够有序进行。

常用的同步方法有使用FIFO(先进先出)队列、使用双缓冲区、使用握手协议等。

2. 避免数据冲突:在跨时钟域的数据传输中,如果接收端无法及时接收数据,可能会导致数据冲突。

为了避免这种情况,可以采用以下方法:* 使用具有足够缓冲区的FIFO队列,以容纳接收端暂时无法处理的数据。

* 使用双缓冲区技术,将接收端的数据存储在两个缓冲区中,以避免在一个缓冲区中积累过多的数据。

* 在数据传输前进行握手协议,确保接收端准备好接收数据。

3. 消除不确定状态:在跨时钟域的数据传输中,由于时钟域之间的时钟频率和相位可能不同,可能会导致数据状态不确定。

为了消除这种不确定状态,可以采用以下方法:* 使用分频或倍频技术,使得发送端和接收端的时钟频率相同或相近。

* 使用同步器或去抖动器,将接收端的数据同步到发送端的时钟域中。

4. 考虑时序约束:在数字设计中,时序约束是非常重要的。

在进行跨时钟域的约束处理时,需要考虑时序约束,以确保数据传输的正确性。

例如,在建立FIFO队列时,需要考虑读写时序的约束;在使用同步器或去抖动器时,需要考虑信号传输的时序约束等。

综上所述,同步跨时钟域的约束处理是数字设计中一个非常重要的问题,需要进行综合考虑和处理。

FPGA设计中的跨时钟域问题

FPGA设计中的跨时钟域问题

Copyright©博看网 . All Rights Reserved.
152
2014 年第 37 卷
现代电子技术
MTBF(Mean Time Between Failure,平均无故障时间)是
在一些高速的设计中,可能两级寄存器同步也无法
衡 量 一 个 设 计 的 可 靠 性 指 标,MTBF 的 值 越 大,则 出 现
Keywords:CDC;metastability;synchronization;simulation
0

立时间或保持时间要求),其输出信号就会在一段不可

预知长度的时间内处于一个非“0”非“1”的中间状态(这
在 FPGA(Field Programmable Gate Array,现场可编
段 时 间 称 为 亚 稳 态 恢 复 时 间),之 后 可 能 稳 定 在“1”状
保持稳定的时间。亚稳态(Metastability)现象就是如果
寄存器数据端的变化与时钟的有效沿很近(不能满足建
图1
亚稳态示意图
亚稳态现象是寄存器的一个固有特点,由于亚稳态
恢复时间的不确定性,不能根本的去除亚稳态的影响。
通过在设计中预留一定的亚稳态恢复时间,使信号恢复
收稿日期:2013⁃12⁃19
到 确 定 的 电 平 后 参 与 逻 辑 运 算 ,降 低 亚 稳 态 的 影 响 。
Abstract:With the increasing clock frequency in the FPGA design,the clock scheme is more and more complex,and the
issue of crossing the clock domain becomes a key point in design and verification. In order to correct the function error in FPGA

跨时钟域信号同步解决方案

跨时钟域信号同步解决方案

跨时钟域信号同步解决⽅案为了确保拥有多个异步时钟域的系统级芯⽚(SoC)能够可靠运⾏,设计⼈员必须使这些跨越了多个域的时钟和数据信号保持同步。

尽管这并不属于新提出的要求,但随着多时钟域越来越常见和复杂化,使得这⼀要求具备了新的重要意义。

⼤规模集成加上对性能的严格要求以及频率调节都导致在许多不同频率下发⽣了很多时钟域跨越现象-就像⼀场数字化的“完美风暴”。

跨时钟域(CDC)问题会以许多种形式出现,其评估难度相当⾼。

幸好,Synopsys DesignWare库产品提供了许多卓越的CDC解决⽅案,这些⽅案应⽤简便,设计⼈员只需掌握在何时以及何处应⽤它们即可。

本⽂解释了在时钟和数据信号从⼀个时钟域跨越到另⼀个时钟域时所发⽣的许多类型的同步问题。

在任何情况下,本⽂所包含的问题都涉及到相互异步的时钟域。

随着每⼀个问题的提出,本⽂将概述⼀个或多个DesignWare解决⽅案。

这些主题和解决⽅案包括:●基本同步—DW_sync●临时事件同步—DW_pulse_sync, DW_pulseack_sync●简单数据传输同步—DW_data_sync, DW_data_sync_na,DW_data_sync_1c●数据流同步—DW_fifo_s2_sf, DW_fifo_2c_df,DW_stream_sync●复位排序—DW_reset_sync●相关时钟系统数据同步—DW_data_qsync_hl,DW_data_qsync_lh1基本同步问题当来⾃⼀个时钟系统的信号将⽤作另⼀个与其不同步的时钟系统的输⼊时,就需要对信号进⾏同步以达成。

⽽不进⾏同步就⽆法达成时序收敛。

图1所⽰为采⽤⼀个单寄存器来同步⾄⽬的时钟域的异步输⼊。

伴随这种⽅法会出现的⼀个问题是,当⼀个触发器的数据输⼊处于逻辑0⾄逻辑1之间的过渡过程当中时,发给这个触发器时钟信号时有可能产⽣亚稳态现象。

亚稳态现象也有可能发⽣在触发器的建⽴时间或保持时间出现违反现象时。

跨时钟域信号同步的IP解决方案

跨时钟域信号同步的IP解决方案

跨时钟域信号同步的IP解决方案为了确保拥有多个异步时钟域的系统级芯片(Soc)能够可靠运行,设计人员必须使这些跨越了多个域的时钟和数据信号保持同步。

尽管这并不属于新提出的要求,但随着多时钟域的越来越常见和复杂化,使得这一要求具备了新的重要意义。

大规模集成加上对性能的严格要求以及频率调节都导致在许多不同频率下发生了很多时钟域跨越现象-就像一场数字化的―完美风暴‖。

跨时钟域(CDC)问题会以许多种形式出现,其评估难度相当高。

幸好,Synopsys DesignWare库产品提供了许多卓越的CDC解决方案,这些方案应用简便,设计人员只需掌握在何时以及何处应用它们即可。

本文解释了在时钟和数据信号从一个时钟域跨越到另一个时钟域时所发生的许多类型的同步问题。

在任何情况下,本文所包含的问题都涉及到相互异步的时钟域。

随着每一个问题的提出,本文将概述一个或多个DesignWare解决方案。

这些主题和解决方案包括:• 基本同步— DW_sync• 临时事件同步— DW_pulse_sync, DW_pulseack_sync• 简单数据传输同步— DW_data_sync, DW_data_sync_na, DW_data_sync_1c• 数据流同步— DW_fifo_s2_sf, DW_fifo_2c_df, DW_stream_sync• 复位排序— DW_reset_sync• 相关时钟系统数据同步— DW_data_qsync_hl, DW_data_qsync_lh基本同步问题当来自一个时钟系统的信号将用作另一个与其不同步的时钟系统的输入时,就需要对信号进行同步以达成。

而不进行同步就无法达成时序收敛。

图1所示为采用一个单寄存器来同步至目的时钟域的异步输入。

伴随这种方法会出现的一个问题是,当一个触发器的数据输入处于逻辑0至逻辑1之间的过渡过程当中时,发给这个触发器时钟信号时有可能产生亚稳态现象。

亚稳态现象也有可能发生在触发器的建立时间或保持时间出现违反现象时。

跨时钟域处理

跨时钟域处理

快时钟域信号到慢时钟域有可能的情况是:快时钟域信号宽度比慢时钟信号周期窄,导致漏采。

解决的方法有:1.将快时钟域信号延长,至少有慢时钟周期的一到两个周期宽2.使用反馈的方法,快时钟域信号有效直到慢时钟域有反馈信号,表示已经正确采样此信号,然后快时钟域信号无效。

通过反馈的方式很安全,但是从上图可以看出来延时是非常大的。

慢时钟采快时钟信号,然后反馈信号再由快时钟采。

以上是简单的单个信号同步器的基本方法。

多个信号跨时钟域多个控制信号跨时钟域仅仅通过简单的同步器同步有可能是不安全的。

简单举例,b_load和b_en同步至a_clk时钟域,如果这两个信号有一个小的skew,将导致在a_clk时钟域中两个信号并不是在同一时刻起作用,与在b_clk中的逻辑关系不同。

解决的方法应该比较简单,就是将b_load和b_en信号在b_clk时钟域中合并成一个信号,然后同步至a_clk中。

如果遇到不能合并的情况,如译码信号。

如下图如果Bdec[0]、bdec[1]间存在skew将导致同步至a_clk中后译码错误,出现误码。

在这种情况下,建议加入另一个控制信号,确保bdec[0]、bec[1]稳定时采。

例如在bdec[0]、bec[1]稳定输出后一到两个周期b_clk域输出一个en信号,通知a_clk域此时可以采bdec[0]、bec[1]信号。

这样可确保正确采样。

数据路径同步对数据进行跨时钟域处理时,如果采用控制信号同步的方式进行处理的话,将是非常浩大的工程,而且是不安全的。

简单来说,数据同步有两种常见的方式:1.握手方式2.FIFO简要说下握手方式,无非就是a_clk域中首先将data_valid信号有效,同时数据保持不变,然后等待b_clk中反馈回采样结束的信号,然后data_valid信号无效,数据变化。

如有数据需要同步则重复上述过程。

握手方式传输效率低,比较适用于数据传输不是很频繁的,数据量不大的情况。

FIFO则适合数据量大的情况,FIFO两端可同时进行读/写操作,效率较高。

信号跨时钟域的几种方法

信号跨时钟域的几种方法

在数字电路中,信号跨越不同时钟域时可能会引起时序问题。

以下是处理信号跨时钟域的几种常见方法:1. **双同步FIFO(First-In-First-Out):**- 使用双口RAM实现的FIFO,一个端口用于每个时钟域,允许数据在两个时钟域之间进行安全的同步传输。

- 数据从一个时钟域写入FIFO,在另一个时钟域被读取。

这样可以避免直接跨越时钟域传输信号,减少时序问题。

2. **同步器(Synchronizer):**- 使用两个触发器(寄存器)级联,将信号从一个时钟域同步到另一个时钟域。

第一个触发器使用源时钟域的时钟,第二个触发器使用目标时钟域的时钟。

- 这种方法可以帮助减少时序问题,但需要注意,过多的级联同步器可能会引入潜在的冒险条件和时序不确定性。

3. **双触发器同步器(Dual-Flip-Flop Synchronizer):**- 这种同步器使用两个同步器,但其中一个同步器的时钟源于目标时钟域的时钟。

- 这种方法可以提供更好的稳定性和抖动抑制。

4. **手动握手协议(Handshaking Protocols):**- 在两个时钟域之间建立一种通信协议,通过在数据传输前后进行握手来确保数据的正确性和同步性。

- 这种方式可以通过协议规定好的状态转换确保数据在不同时钟域之间的有效传输。

5. **异步FIFO:**- 异步FIFO允许在不同时钟域之间传输数据,不过需要特殊的异步FIFO设计,通常会引入更复杂的电路结构。

在处理信号跨时钟域时,确保采用合适的方法并考虑到不同时钟域之间的时序关系至关重要。

同时,最好在设计中尽量减少跨时钟域的信号传输,以减少潜在的时序问题。

【精品博文】高级FPGA设计——第四章:跨时钟域问题

【精品博文】高级FPGA设计——第四章:跨时钟域问题

【精品博文】高级FPGA设计——第四章:跨时钟域问题在FPGA设计中,不太可能只用到一个时钟。

因此跨时钟域的信号处理问题是我们需要经常面对的。

跨时钟域信号如果不处理的话会导致2个问题:(1) 若高频率时钟区域输出一个脉冲信号给低频率时钟区域,则该脉冲很有可能无法被采样到,示意图如下,clk2根本采样不到pulse(2) 亚稳态问题在说明亚稳态之前,我们需要先了解什么是建立时间和保持时间建立时间:在时钟沿到来前,被采样信号应该提前一段时间就进入稳定状态,这个时间称为建立时间保持时间:在时钟沿到来后,被采样的信号应该保持稳定一段时间,这个时间称为保持时间而亚稳态就是建立时间和保持时间不满足导致的。

如下图所示,就是建立时间不满足,造成dout是个不确定值,即亚稳态。

亚稳态会造成严重的后果。

就像将军发命令一样,若其发出的是一个亚稳态的命令,士兵A可能判定这个命令为进攻,士兵B可能判定这个命令为撤退,这将引起极大的混乱。

解决方案:1,握手操作针对问题1中所描述的情况,即快时钟域传递一个脉冲信号到慢时钟域,慢时钟域很有可能采样不到该脉冲。

这时就需要采用握手操作来解决了。

首先,快时钟域应该将脉冲信号转换为一个持续信号,慢时钟域采样到该持续信号后,返回一个反馈信号,告知块时钟域将持续信号拉低。

2,相位控制:考虑下面2种情况,情况1:情况2:上面2种情况中,数据是随着慢时钟所变化的,现将该数据发送到快时钟模块。

两种情况唯一的区别在于时钟相位的不同,但这就导致情况1满足建立与保持时间,但情况2不满足建立时间。

因此,跨时钟域的时钟相位控制是决定跨时钟域功能正常的关键因素。

这种情况一般出现在我们使用DCM模块时,这时候才能控制输入与输出的相位关系。

建议无特殊要求下,相位选择0,从而避免因相位问题导致的跨时钟域问题。

3,双跳技术(打两拍)在很多情况下,设计者是无法控制两个时钟间的相位关系的,因此方案1并不太适用。

若跨时钟信号为单比特信号,我们可以采用双跳技术来解决。

跨时钟域问题(Clock Domain Crossing)

跨时钟域问题(Clock Domain Crossing)

跨时钟域问题(Clock Domain Crossing) –同两个时钟域打交道!引言:设计者有时候需要将处于两个不同时钟域的系统对接,由于接口处是异步(会产生setuptime 和holdtime violation,亚稳态以及不可靠的数据传输)的,因此处理起来较同步逻辑更棘手,需要寻求特殊处理来进行接口界面的设计。

任意的两个系统如果满足以下条件之一,就可称其为异步的:(1)工作在不同的时钟频率上;(2)工作频率相同,但是相位不相同;处理跨时钟域的数据传输,有两种实现方案:(1)采用握手信号来交互(2)以异步FIFO来实现1.1、以握手信号交互:假设系统A以这种方式向系统B传递数据,握手信号分别为req和ack。

握手协议:Transmitter asserts the req (request) signal, asking the receiver to accept the data on the data bus.Receiver asserts the ack (acknowledge) signal, asserting that it has accepted the data.这种处理跨时钟域的方式很直接,但是也最容易产生亚稳态,由于系统A发送的req信号需要系统B中的时钟去sample,而系统B发出的ack信号又需要系统A中的时钟去sample,这样两边都存在着setup time和hold time violation的问题。

为了避免由于setup time和hold time vilation所造成的亚稳态,通常我们可以将异步时钟域交互的信号用local system的时钟打两级甚至三级寄存器,以此来消除亚稳态的影响。

下图以系统A发送到系统B的req信号示例消除亚稳态的方法:当然,这种处理方式是以损失传输速率为代价的,加入两到三级寄存器同步异步时钟域的信号,会有许多时钟周期浪费在了系统的“握手”。

xilinx 跨时钟域设计 概述及解释说明

xilinx 跨时钟域设计 概述及解释说明

xilinx 跨时钟域设计概述及解释说明1. 引言:1.1 概述跨时钟域设计是现代电路设计中一个重要且复杂的问题。

在集成电路中,不同的模块可能会使用不同频率的时钟信号进行操作,这就导致了时钟信号之间存在着不同的域。

在进行数据传输或者协同工作时,跨越不同时钟域之间的数据传输问题变得非常重要。

1.2 文章结构本文将首先介绍跨时钟域设计的概念和相关背景知识。

接下来,我们将详细讨论为什么需要对时钟域进行划分以及Xilinx跨时钟域设计的意义。

然后,我们将介绍跨时钟域设计的原理与方法,包括同步与异步信号传输方式、锁存器与触发器的使用注意事项以及时序约束设置与优化策略。

此外,我们还会提供一些实际案例来演示Xilinx跨时钟域设计的实践应用和效果展示。

最后,我们将总结文章,并提出对于跨时钟域设计在Xilinx器件中应用前景的展望。

1.3 目的本文的目标是为读者提供关于Xilinx跨时钟域设计相关知识和技术方案,并通过实例和案例展示,帮助读者更好地理解并应用这些技术。

同时,我们也希望引起读者对跨时钟域设计的重视,并认识到其在现代电路设计中的重要性和必要性。

通过本文的阅读,读者将能够掌握Xilinx跨时钟域设计的基本原理与方法,并应用于实际工程项目中,提高电路的可靠性和性能。

2. 跨时钟域设计概述:2.1 什么是时钟域:时钟域是指由一个主时钟信号驱动的一组逻辑电路。

在数字电路设计中,系统通常包含多个时钟域,每个时钟域都有独立的主时钟信号。

由于不同时钟域之间存在着频率和相位差异,因此跨越不同时钟域的信号传输需要特殊的设计策略和技术支持。

2.2 时钟域划分的必要性:在复杂的数字系统中,为了提高系统性能和可靠性,常常需要将整个系统划分为多个独立的时钟域。

这种划分可以使各模块按照不同的时间精度进行操作,并且能够减少信号互联、功耗消耗以及故障引入等问题。

同时,通过合理地划分和管理时钟域,能够降低系统开发复杂度,并确保数据在稳定状态下进行正确传输。

跨时钟域信号同步方法6种

跨时钟域信号同步方法6种

跨时钟域信号同步方法6种ASIC中心1 引言基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统。

但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。

如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。

本文总结出了几种同步策略来解决跨时钟域问题。

2 异步设计中的亚稳态触发器是FPGA设计中最常用的基本器件。

触发器工作过程中存在数据的建立(setup)和保持(hold)时间。

对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前,触发器数据端数据保持稳定的最小时间。

而保持时间是时钟上升沿到来之后,触发器数据端数据还应该继续保持稳定的最小时间。

我们把这段时间成为setup-hold时间(如图1所示)。

在这个时间参数内,输入信号在时钟的上升沿是不允许发生变化的。

如果输入信号在这段时间内发生了变化,输出结果将是不可知的,即亚稳态 (Metastability)图1一个信号在过渡到另一个时钟域时,如果仅仅用一个触发器将其锁存,那么采样的结果将可能是亚稳态。

这也就是信号在跨时钟域时应该注意的问题。

如图2所示。

信号dat经过一个锁存器的输出数据为a_dat。

用时钟b_clk进行采样的时候,如果a_dat正好在b_clk的setup-hold时间内发生变化,此时b_ dat 就既不是逻辑"1",也不是逻辑"0",而是处于中间状态。

经过一段时间之后,有可能回升到高电平,也有可能降低到低电平。

输出信号处于中间状态到恢复为逻辑"1"或逻辑"0"的这段时间,我们称之为亚稳态时间。

触发器进入亚稳态的时间可以用参数MTBF(Mean Time Between Failures)来描述,MTBF即触发器采样失败的时间间隔,表示为:其中fclock表示系统时钟频率,fdata代表异步输入信号的频率,tmet代表不会引起故障的最长亚稳态时间,C1和C2分别为与器件特性相关的常数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

跨时钟域问题(Clock Domain Crossing) –同两个时钟域打交道!
引言:设计者有时候需要将处于两个不同时钟域的系统对接,由于接口处是异步(会产生setuptime 和holdtime violation,亚稳态以及不可靠的数据传输)的,因此处理起来较同步逻辑更棘手,需要寻求特殊处理来进行接口界面的设计。

任意的两个系统如果满足以下条件之一,就可称其为异步的:
(1)工作在不同的时钟频率上;
(2)工作频率相同,但是相位不相同;
处理跨时钟域的数据传输,有两种实现方案:
(1)采用握手信号来交互
(2)以异步FIFO来实现
1.1、以握手信号交互:
假设系统A以这种方式向系统B传递数据,握手信号分别为req和ack。

握手协议:
Transmitter asserts the req (request) signal, asking the receiver to accept the data on the data bus.
Receiver asserts the ack (acknowledge) signal, asserting that it has accepted the data.
这种处理跨时钟域的方式很直接,但是也最容易产生亚稳态,由于系统A发送的req信号需要系统B中的时钟去sample,而系统B发出的ack信号又需要系统A中的时钟去sample,这样两边都存在着setup time和hold time violation的问题。

为了避免由于setup time和hold time vilation所造成的亚稳态,通常我们可以将异步时钟域交互的信号用local system的时钟打两级甚至三级寄存器,以此来消除亚稳态的影响。

下图以系统A发送到系统B的req信号示例消除亚稳态的方法:
当然,这种处理方式是以损失传输速率为代价的,加入两到三级寄存器同步异步时钟域的信号,会有许多时钟周期浪费在了系统的“握手”。

有时候,我们也会对数据多打两拍reg来同步,但通常情况下,我们并不会采取这种方式,它不仅需要较多逻辑,而且收效甚微。

通常对数据的同步是以异步FIFO来实现的。

下图给出了1bit数据传输打两拍reg所做的同步,从中可以发现,与前面的握手信号处理完全一致。

1.2 结合实际工作谈谈以握手信号处理的跨时钟域问题
由于所在项目的逻辑设计相当庞大,超出了最初的预估,同时也鉴于产品化方向考虑可以单独流片,因此对整个逻辑结构进行了划分,在做FPGA原型验证的时候,将这两块逻辑分别映射到不同的器件单元中,这里暂且称它们为wrapper0和wrapper1。

实践结果表明,wrapper0和wrapper1的相位需要存在180度的反相,弥补板级走线的延迟影响。

这样一来,在wrapper0和wrapper1主交互界面的信号就横跨时钟域,存在着亚稳态问题的困扰了。

由于个人对此处亚稳态问题的认识程度不充分,当时没有对界面上的信号做处理,而是将精力放在了对pin脚延迟的处理上,结果收效甚微。

设计的功能是视频编码相关的,测试的结果就会发现:一开始,经过前处理的数据写入到SDRAM内部也是正常的,编码出来的图像经过AP(Application Program)实时播放显示也是正常的,而且有早期测试的基础放在那里,显然不可能是编码内核本身出了差错;在间隔一段时间后,可以明显看到AP实时播放的图像出现了绿色的竖状条,而且随着时间的累积,这些竖条会逐步扩展,移动。

这种现象很明显地告诉设计人员:前处理后的数据与SDRAM通信时存在着bug!
SDRAM controller模块,或者说总线仲裁模块(我们的设计并不是采用SOC 方案,而是以纯ASIC的方案进行,总线仲裁和流水线调度都放在了SDRAM controller中)的问题排查是比较好解决的。

一来,该模块中集成了SDRAM 自测试逻辑,可以很方便地检测对SDRAM的读写是否存在着误差;二来,编码内核本身从SDRAM取数据也进行了旁路设计,就是说编码的数据可以是以测试模式来处理,而并非实际外接的数据源,这样就可以在长时间编码时查看AP 是否同样会出现上述症况。

在本人和项目组其他同仁以上述方案进行了探索性测试后,确定了前面所述的结论:问题的根源肯定不是发现在编码内核,而是前处理后的数据与SDRAM 通信时存在着bug!但,令人沮丧的是,我们走了一条错误的道路,认为问题的根源在于板级延迟造成的,而不是跨时钟域的问题,直到走到死胡同里才发现:哟,原来刚才那条小道才是出路!
实践也确实检验了处理亚稳态的理论:wrapper0和wrapper1的交互信号在做了两级寄存器同步后,整个系统安全稳定的运行!
所以说,看本文的各位同仁,千万要记得在处理跨时钟域问题时多留神,不要被这个看似不大不小的问题折腾得食不甘味、夜不能寐啊,哈哈,有些小夸张
2.1 以异步FIFO应对跨时钟域设计
对性能要求较高而不太计较资源,或者不期望浪费时间在握手信号的处理上时,通常会采用异步FIFO来处理跨时钟域可能引入的亚稳态问题。

异步FIFO的两个界面分别完成数据的写入和读取,两个界面的时钟是不一致的(当然,如果一致的话也就无从谈异步FIFO了)。

这里假设系统A向异步FIFO写入数据,系统B从异步FIFO中读取数据。

为了对可能引入的错误操作进行处理(例如,没有空间了,却还有数据要写入,或者是相反,完全腾空了,却有读取数据的操作),我们引入了FIFO空、满(empty, full)信号,这两个信号都是产生于相对应的时钟域,也就是说,这两个信号是处在不同的时钟域当中的!
例如:FIFO full信号由系统A产生(当FIFO写满时,我们不期望系统A有数据要写入,否则,会发生数据丢失),或者说该信号是有写入时钟驱动的;类似地,FIFO empty信号受读取时钟驱动(当FIFO读空时,我们也不期望系统B有读数据的请求,否则,会读取错误的数据)。

如何设计异步FIFO不是本文所要探讨的问题,不过我希望提醒大家的是:对FIFO空、满信号的处理一定要多加注意,上面以及提到,这两者是处于不同时钟域中的,会造成亚稳态问题。

2.2 结合实际工作谈谈以异步FIFO处理的跨时钟域问题
无论是做数据通信、音视频处理、图形图像,还是做网络安全、数据存储,都无法避开的问题就是和各种各样的数据总线协议打交道。

通常来讲,我们的设计不可能碰巧刚刚好和总线协议的时钟同时钟域,或者总线协议支持多种时钟域驱动,因此一来,对数据的传输通道而言,始终都无法避开的一个问题就是:跨时钟域数据交互!
以异步FIFO来处理跨时钟域的数据传输是通用的解决手段,需要特别注意的则是对FIFO空、满信号的处理。

拿所设计的项目中一条传输通路为例,其数据写入是从SDRAM中吐出的,其数据读取符合某一种总线协议,其时钟频率与内核不一致。

这样对于写入端而言,需要对FIFO空信号进行如下处理:
首先,在SDRAM中没有数据时,不要发送要数据的请求;
其次,保证FIFO的深度适当,使得发出FIFO空信号时,SDRAM中不会发生数据覆盖现象;
对于取数据端而言,类似地,需要对FIFO满信号进行如下处理:
首先,保证FIFO满信号能够尽量有规律地发出,保证传输通道以及上层处理程序能够有效响应;
其次,对FIFO满信号(实际处理时的中断信号正是由此信号再作处理得来)以及每次传输得包大小能够调节,保证数据传输得稳定性;
简单来讲,FIFO空了,就有要数据的权利;FIFO满了,就有吐数据的权利;但是,在处理这种空、满信号时又需要考虑周全,什么样的情形下,即使时饿了也不能立刻给吃的;什么样的情形下,即使是饱了也不能立刻离席!而且这个筵席是两方当事人所摆设的,要顾全双方的感受!
打了上述这个小小的比方,不知道是否得当,大家看时权且一笑而过,心领神会就可~~
P.S.:其实,在逻辑设计中,跨时钟域、亚稳态影响正越来越凸现,我们的设计日益复杂,需要交互的接口繁多,如何提高设计的可靠性,保证数据传输以及信号交互的稳定,将是一个
重要的设计议题。

本文抛砖引玉,希望有更多高手予以探讨!此外,本人不才,准备将收集到的一些有关跨时钟域的问题整理好、翻译好后与大家一同分享。

相关文档
最新文档