打印

AD采样数据同步问题

[复制链接]
7226|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
以前设计中将AD的时钟是FPGA使用DCM分频产生的30M,而FPGA内部采集数据的时钟也是使用同一个时钟分频产生的30M,在截取AD采集的数据时没有出现不同步的问题。
       现在由于要提高指标,将AD的时钟换为低抖动的30M晶振,而FPGA内部还是使用一般晶振分频产生的30M做为采集时钟,发现数据偶尔会出现不正常,现象是AD输出数据的最高位与其他位出现了不同步,原来大概估计到了不同步的情况,以为数据出现不同步是FPGA产生的30M时钟的上升沿刚好出现在AD数据输出的亚稳态部分,使用DCM调制输出30M时钟的相位即可,但是实际现象是采样保障了低11位,而最高位没有保证,现象大体如下,大家有什么好一点的办法!!!

错误是采集到的数据


最高位错误

相关帖子

沙发
liqaz| | 2012-3-21 20:52 | 只看该作者
嗯      ,讲的很精彩      
图文并茂      ,很好的资料      
感谢楼主分享

使用特权

评论回复
板凳
iampeter|  楼主 | 2012-3-21 22:51 | 只看该作者
2# liqaz
大哥我是来求教的!!!

使用特权

评论回复
地板
bityoung| | 2012-3-21 22:56 | 只看该作者
AD的晶振和FPGA的晶振不是一个,对吧?那这样的话,就算是异时钟域的问题了吧?

使用特权

评论回复
5
bityoung| | 2012-3-21 23:06 | 只看该作者
不同的两个晶振产生的时钟不同,即便都是30Mhz,也无法保证都严格等于30Mhz;还有虽然你把其中一个30Mhz的时钟调节相位,但是两个时钟的相位一样会随着时间逐渐偏移;也就说两个时钟之间的相对相位是变化的!---个人意见,仅供参考

使用特权

评论回复
6
Backkom80| | 2012-3-21 23:08 | 只看该作者
如果不是同源就杯具了。同源的话还有办法
还有一个就是PCB布线时,AD出来的11位线是不是等长了?

使用特权

评论回复
7
iampeter|  楼主 | 2012-3-22 09:48 | 只看该作者
同意五楼说的有一些东西,不过就没有办法了吗,我现在可以损失最高位,把AD变为11位!!!

使用特权

评论回复
8
bityoung| | 2012-3-22 09:54 | 只看该作者
7# iampeter 我所知有限,6楼说的“同源时钟”是个解决方法!

使用特权

评论回复
9
zuphen| | 2012-3-22 10:22 | 只看该作者
本帖最后由 zuphen 于 2012-3-22 10:31 编辑

赞同5L的说法,首先时钟应该同源。
补救方法么,LZ你可以试试看在AD接口处加上IODELAY单元,MSB和其他位用不同的delay值来测试,看看能不能有所改善。(只能试试看,这个方法主要能够解决PCB布线线长不等长的,说不定有奇效。但如果是因为时钟不同源的问题引起的,这个方法无效)。
要不要附上一段IODELAY的代码?附上吧,供参考,注意我这里所有通道用的是同样的delay(CHA_IDELAY),你需要对不同的数据线用不同的延迟。
        ------------------------------------------------------------------------------------------
        --------------------------------------------------------------------------------------------
        -- ADC 的输入数据通道A,分别经过ibufds\iodelaye1\iddr.完成整个流程后输出的数据为cha_sdr[13:0]                        --
        -- 使用时钟域clk_ab_61_44MHz                                                                                                                                                                                --
        adc_data_a: for i in 0 to 6 generate

          -- Differantial input buffer with termination (LVDS)
          adc_cha_ibufds_inst : ibufds
          generic map (
                 IOSTANDARD => "LVDS_25",
                 DIFF_TERM  => TRUE
          )
          port map (
                 i  => cha_p(i),
                 ib => cha_n(i),
                 o  => cha_ddr(i)
          );

          -- Input delay
          adc_cha_iodelay_inst : iodelaye1
          generic map (
                 IDELAY_TYPE    => "VAR_LOADABLE",
                 IDELAY_VALUE   => CHA_IDELAY,
                 SIGNAL_PATTERN => "DATA",
                 DELAY_SRC      => "I"
          )
          port map (
                 idatain     => cha_ddr(i),
                 dataout     => cha_ddr_dly(i),
                 c           => sysclk_100MHz,
                 ce          => '0',
                 inc         => '0',
                 datain      => '0',
                 odatain     => '0',
                 clkin       => '0',
                 rst         => delay_update,
                 cntvaluein  => cha_cntvaluein,
                 cntvalueout => cha_cntvalueout(i),
                 cinvctrl    => '0',
                 t           => '1'
          );

          -- DDR to SDR
          adc_cha_iddr_inst : iddr
          generic map (
                 DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
          )
          port map (
                 q1 => cha_sdr(2*i),
                 q2 => cha_sdr(2*i+1),
                 c  => clk_ab_61_44MHz,
                 ce => '1',
                 d  => cha_ddr_dly(i),
                 r  => '0',
                 s  => '0'
          );

        end generate;

使用特权

评论回复
10
bityoung| | 2012-3-22 10:27 | 只看该作者
9楼的方法很好啊!坦白说,这个方法还真没用过,学习了。多谢9楼同学

使用特权

评论回复
11
xwj| | 2012-3-22 10:47 | 只看该作者
明显是时钟不同源造成锁存相位错位了,看LZ的图异常数据试试时有时无的,也就是说相位死抖动的,所以固定延时是没用的。
所以只能从时钟同源着手,将AD和FPGA使用相同的时钟。

使用特权

评论回复
12
xwj| | 2012-3-22 10:58 | 只看该作者
正确的做法应是:
“现在由于要提高指标,将AD的时钟换为低抖动的30M晶振”后,FPGA使用 “AD的时钟”作为基准 PLL锁相环升频;
如果FPGA的频率比ADC高几倍的话,也可以将“AD的时钟”作为采集的异步时钟,用“AD的时钟”来同步采样,但这时的相位误差就很大了,要考虑相位余量。

使用特权

评论回复
13
dan_xb| | 2012-3-22 14:00 | 只看该作者
直接把AD时钟引到FPGA是比较靠谱的方法

使用特权

评论回复
14
dan_xb| | 2012-3-22 14:02 | 只看该作者
也有办法就是用高频时钟去采集低频时钟,但是这样就复杂了,不好

使用特权

评论回复
15
iampeter|  楼主 | 2012-3-22 15:15 | 只看该作者
FPGA时钟输出抖动太大了!!!实在没办法了再说吧!!!

使用特权

评论回复
16
y595906642| | 2012-3-22 15:24 | 只看该作者
FPGA使用低抖动的晶振,再分频给AD 不可以嘛?
楼上说的把AD的晶振引给FPGA也是这个道理。

使用特权

评论回复
17
yxf236| | 2012-3-22 15:38 | 只看该作者
16楼,FPGA的IO输出的时钟 抖动挺大的,不能作为AD的时钟。

30M的频率对布线等长基本没要求吧,当然不能太离谱。
感觉还是将AD和FPGA用同一个时钟吧,要不然总会有隐患的

使用特权

评论回复
18
y595906642| | 2012-3-22 17:03 | 只看该作者
17楼
那用AD时钟分给FPGA的前端采集部分,再用FIFO同步到FPGA的内部时钟,这样就没问题了吧?
似乎麻烦了点,有没有简单的办法呢?

使用特权

评论回复
19
iampeter|  楼主 | 2012-3-22 17:31 | 只看该作者
比如使用周期抖动为4ps的晶振,使用DCM后抖动就很大了!!!还是可以进过DCM?或者FPGA使用低抖动时钟直接使用bufg缓冲后输出给AD和其他模块?

使用特权

评论回复
20
iampeter|  楼主 | 2012-3-22 17:39 | 只看该作者
再发个AD时钟抖动影响信噪比的图吧!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

138

帖子

1

粉丝