本帖最后由 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; |