跨时钟域问题

合集下载

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的时钟,那么使用端口就可以让这两个芯片能够正常工作,而不用担心后者会干扰前者的时钟。

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

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

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

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

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

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

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

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

  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.:其实,在逻辑设计中,跨时钟域、亚稳态影响正越来越凸现,我们的设计日益复杂,需要交互的接口繁多,如何提高设计的可靠性,保证数据传输以及信号交互的稳定,将是一个
重要的设计议题。

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

相关文档
最新文档