原创 源同步信号跨时钟域采集的两种方法

2011-9-22 16:38 6894 31 42 分类: 消费电子

源同步信号跨时钟域采集的两种方法

 

         对于数据采集接收的一方而言,所谓源同步信号,即传输待接收的数据和时钟信号均由发送方产生。FPGA应用中,常常需要产生一些源同步接口信号传输给外设芯片,这对FPGA内部产生时钟或数据的逻辑和时序都有较严格的要求。而对于一些FPGA采集信号的应用中,常常也有时钟和数据均来自外设芯片的情况,此时对数据和时钟的采集也同样需要关注FPGA内部的逻辑和时序。当然,无论何种情况,目的只有一个,保证信号稳定可靠的被传送或接收。

 

         对于一个如图1所示的某视频芯片产生的源同步信号,当FPGA对其进行采集同步到另一个时钟域时,特权同学通常的做法有两种,特权同学称之为脉冲边沿检测采集法和异步FIFO采集法。下面简单的对这两种方法做一些讨论和说明。

 

1.jpg

图1

 

脉冲边沿检测采集法

 

脉冲边沿检测采集法,顾名思义,一定是应用了经典的脉冲边沿检测法来帮助或者直接采集信号。对于脉冲边沿检测法,大家可以参考特权同学的《深入浅出玩转FPGA》或者用gooogle摆渡一下。而这里尤其需要提醒大家注意的是,著名的奈奎斯特采样定理告诉我们:要从采样信号中无失真的恢复原信号,采样频率应大于两倍信号最高频率。而特权同学通过实践得出的结论与此相仿:若想稳定有效的采集到脉冲(数字信号)变化的边沿,采样频率应大于被采样脉冲最大频率的3倍。注意是要大于3倍,甚至若是可能尽量采用4倍以上的采样频率才能够达到稳定的状态。至于为什么,我想深谙此道(脉冲边沿检测法)的聪明人看完结论就已经明白了,无需特权同学再废话解释一番。

 

         而具体的做法也很简单,把图1理想化就如图2所示。其中,待采集信号时钟Tx Clock,待采集数据使能信号Enable Signal,待采集数据总线Data Bus。FPGA内部信号采集时钟为Rx Clock,该时钟为待采集时钟的4倍。

 

2.jpg

图2

        

采用脉冲边沿检测法,使用Rx Clock去采集Tx Clock,Rx Clock reg1和Rx Clock reg2分别为第一级和第二级Tx Clock锁存信号。Tx Clock上升沿对应的一个有效指示信号Tx Clock pos每个Tx Clock时钟周期产生一个Rx Clock脉宽的有效高电平使能信号。从图3中可以看到,此时若用Tx Clock pos作为FPGA内部采样使能信号,虽然Tx Clock pos处于第7个Tx Clock,但是真正采集Data Bus其实已经是第8个Tx Clock上升沿了。很明显,第8个Tx Clock上升沿对准的不是Data Bus的稳定信号中央,数据很可能采集到错误值。

 

3.jpg

图3

        

因此,通过上面的分析,还是可以采取一些变通的方式来保证第8个Tx Clock上升沿采集到Data Bus的中央值。如图4所示,采用同样的方式对Data Bus做两级信号锁存,那么第8个Tx Clock上升沿就能够在Data Bus reg2的中央采集数据了。这样做只有一点小问题,相应的需要多付出2组寄存器来锁存Data Bus。

 

4.jpg

图4

 

异步FIFO采集法

        

再说异步FIFO采集法,其实这种方法没什么新奇,只不过充分利用异步FIFO的同步特性来完成跨时钟域的数据交互。但是其中还是有几个非常关键的要点需要提醒设计者注意,无论如何FIFO的输入端数据和时钟信号(包括控制信号,如有效使能信号等)必须符合FIFO的数据锁存有效建立和保持时间,这个最重要的条件除了需要靠数据源端来保证外,还需要靠数据锁存端(FPGA内部)设计者做好时序上的约束和分析,否则到源端再nice的波形恐怕都无法保证能够可靠的被FIFO锁存。

 

异步FIFO的基本通讯时序波形如图5所示。我们关心的是FIFO的写入。由图中不难发现,写入时钟wrclk的每个上升沿会判断写入请求信号wrreq是否有效,若是有效则FIFO会相应的锁存当前的写入数据data。简单来看,从基本时序上分析,wrclk的上升沿需要对准wrreq和data的中央,这是外部传输过来的源信号必须满足的基本关系。无论如何,即便是绞尽脑汁,也要想办法让这个基本关系得到保证,否则,后面的rdclk、rdreq配合的再默契恐怕都不能得到稳定的q输出。

5.jpg

图5

        

原型开发的前期,设计者必须首先验证写入信号的关系,哪怕是不惜动用示波器(⊙﹏⊙b汗,连示波器都没有不要混了),源端给到FPGA输入端口的信号很多时候不是那么尽善尽美的,实践出真知,测试结果说了算。当然了,实在没有先进武器又想打胜仗的朋友恐怕只有不停的用代码测试采集到最稳定的数据了,这有点碰运气的成分在里面,不是非常推荐。

        

类似与开篇提到的应用,特权同学的实际信号采集如图6所示,把写入时钟Tx Clock和写入请求信号Enable Signal都先用同步时钟Rx Clock打了一拍,然后再输入FIFO中,而数据总线Data Bus则直接送往FIFO。这样从最终检测来看,能够保证时钟的上升沿对准数据和控制信号的中央,相对稳定和安全的把数据送往FIFO中。

6.jpg

图6

        

工程实践中往往不是一招一式的生搬硬套理论,一定要抓住最关键的设计要点,并采取各种有效的手段保证设计的实现。

 

文章评论11条评论)

登录后参与讨论

用户468979 2015-1-16 17:45

高速数字信号

用户1610239 2014-2-26 16:08

无线设备子电路的精确耗电测试,感谢分享

用户1587532 2011-9-26 17:18

谢谢HAx4和digitalvideo,尤其HAx4提出来的PLL调整方式确实是我没想到的。

用户1595327 2011-9-26 16:58

For source sync data transfer, you don't have to use a faster clock to sample the incoming data. A more generic solution for Altera FPGA is as following: (1) let the incoming clock going through a 1:1 PLL, which will remove all the jitters. Also, the PLL should be configured as "compensate for source sync" to compensate for the delay from IO PAD to FPGA fabric 2) Enalbe the "fast I/O" option for those pins involved. This option will register the data in IO pad instead of FPGA fabric. After fitting, check the resource section to make sure fitter has truly registered the data inside IO pad.

用户1587532 2011-9-26 13:00

我承认有很大的局限性,在我的这个例子中可以用,到另一个应用中未必可行。但是这个实例是在约束较紧的前提下,依然不对齐,所以才采取此下策

用户1322332 2011-9-25 15:42

回复huigenb,你可以看一下这个连接,我觉得比我理解的还要深入,我也在学习:P。 http://www.socvista.com/bbs/viewthread.php?tid=2110

用户1322332 2011-9-25 15:34

我认为多打这一拍没有什么好处。假如是没有对齐的情况,多打一拍未必会让它对齐,原因是你根本不知道源信号是怎样不对齐的。反而这多打的一拍有可能会让对齐的信号不对齐了。更何况Tx clk 和 Rx clk是不同步的(原文里没有说过同步),异步时钟打一拍的后果就是打过的时钟每次都不再和没打过的数据对齐了。对于这类时钟和数据没有中间对齐的问题,根本解决的方案是约束。文中打一拍的方法局限性比较大。

用户1587532 2011-9-25 11:32

之所以打一拍,博文中说得很明白了,我在采集端口得到的数据和时钟并非是很稳定的中央对其,不打一拍无法对其,采集到的数据有误。这是具体问题具体处理

40763529_613887482 2011-9-25 09:52

您好,可以详细说一下握手怎么做吗?谢谢

40763529_613887482 2011-9-25 09:26

楼主好,对于第二个用异步FIFO的做法,我有点疑问,为什么要把wrclk和wrreq打一拍呢,如果wrclk和wrreq和DATA是边沿对齐的,本来是要用第二个时钟去采样第一个数据,那么wrclk和wrreq往后延迟一点的话,第一个数据就没采到啊。
相关推荐阅读
用户1587532 2012-12-04 14:56
被忽略的硬件常识
          在特权同学的《都是IO弱上拉惹的祸》一文中,提及了Altera的CPLD在初始化时管脚通常会处于弱上拉状态。在实际示波器采样来看,就表现在上电初 期IO脚会有一个短暂(当时是持...
用户1587532 2012-12-04 14:56
都是IO弱上拉惹的祸
         开发的一款液晶驱动器,接收MCU过来的指令和数据进行图像显示。使用了一片可编程(带使能和PWM调节控制)的背光芯片。在CPLD设计中,上电复位状态将背光使能拉低(关闭),直到MC...
用户1587532 2011-12-29 09:39
四通道波形动态演示效果
 ">http:// http://v.youku.com/v_show/id_XMzM3MDY2NjYw.html   这效果,Cortex-M3可以吗?     ...
用户1587532 2011-12-21 12:54
高速绘图显示,还是FPGA给力
  示波器的效果,曾经以为难于上青天,殊不知咱用FPGA一样能够轻松效仿。目前只是单通道的显示效果,随后送上4通道独立或叠加的波形效果。          感兴趣的朋友不妨去看看他的详细参数:...
用户1587532 2011-10-12 10:23
Keil存储空间自定义分配
Keil存储空间自定义分配          看来Capital-Micro的软件支持包做得还不够到位啊,在51编程环境KeilC中使用Astro II器件光有个Capital Micro D...
我要评论
11
31
关闭 站长推荐上一条 /2 下一条