- 传统方式
参考Xilinx官方文档xapp524。对于AD9253器件 - 125M采样率 - DDR模式,ADC器件的DCO采样时钟(500M Hz)和FCO帧时钟是中心对齐的,适合直接采样。但是DCO时钟不能直接被FPGA内部逻辑使用,需要经过BUFIO和BUFR缓冲后,得到s_bit_clk和s_frame_clk。此时,s_bit_clk和DCO时钟不是相位对齐的。如果s_bit_clk直接采样数据总线,则不能保证采样到正确的数据。故需要进行链路训练。
参考之前博客: AD9253 LVDS 高速ADC驱动开发_lvds adc-CSDN博客
step1:
大概流程为:s_bit_clk采样DCO时钟信号,通过调节IDELAY,配合ISERDES原语,先稳定得到8'b11111111或8'b00000000(根据ADC器件手册时钟和数据相位关系来选择),则表明s_bit_clk和DCO处于固定的相位关系,但不是边沿对齐。然后再调节IDELAY,使得s_bit_clk采样DCO时钟信号,得到的结果为一个不确定值,则表明DCO和FCO时钟信号已边沿对齐,即链路s_bit_clk和DCO时钟信号的相位关系已训练完毕。
step2:每个数据点比特位的链路训练,用于对齐采样时钟和每个数据点的比特顺序。
s_bit_clk采样FCO帧时钟信号,通过调节ISERDES的bitslip,使得采样到特定pattern,对于ADC9253器件而言,特定pattern为8'hf0。则表明每个数据点比特位的链路训练完毕。
- 本文方式
传统方式存在一个问题:需要DCO,FCO,多路DOUT走线和阻抗均需要保持完全一致,才能满足手册的时序关系。
在实际项目中,遇到一个问题:ADC9253的2个通道,有一个通道很稳定,另一个通道存在偶发的数据值跳变。于是修改训练方案:
核心思路是每路数据总线和采样时钟s_bit_clk配合来单独训练,从而可以避免不同通道的差异性。因为传统方法通过调节采样时钟s_bit_clk,使之与DCO对齐,这种调节类似于全局调节,DCO对每个通道都会起作用,如果两个通道存在硬件设计差异,就会导致上述问题。
Step1:AD9253器件配置为test mode模式,test pattern为标号1所示。
通过调节IDELAY,配合ISERDES原语(可以使用selectio这个IP更方便),使得采样时钟s_bit_clk能采样到稳定的值,比如10ms内采样值都不变。说明:该值通常不会恰好等于测试pattern。
step2:每个数据点比特位的链路训练,用于对齐采样时钟和每个数据点的比特顺序。
对于每路数据总线,通过调节ISERDES的bitslip,使得采样到预先设定的pattern,见标号1。当所有路数据总线均稳定采样到预先设定的pattern,则表明AD9253链路训练OK。
Step3:验证环节。AD9253器件配置为test mode模式,test pattern为标号2所示。因为链路已经训练OK,那么此时改变test pattern,所有通道,理论上也应该正确采样到该test pattern值。实际项目测试,也验证了该理论猜想。
- 补充说明:对于链路训练,通常只训练一次。但是如果受到温度等因素干扰,链路可能失效。此时需要自适应的检测到,并重新进入链路训练环节。链路失效检测方法:链路训练OK后,可以用采样时钟s_bit_clk采样FCO帧时钟信号,当采样值突然稳定的发生改变,不等于当前值,则表明链路失效。
- AD9253器件支持test mode。数据管脚可以输出固定的 test pattern序列。