搞高速数据采集系统,ZYNQ+AD7626这个组合我用了不下十次,每次都能稳定跑到10MSPS的吞吐率。先说说硬件配置的坑:黑金AC7020核心板默认Bank35是3.3V电平,但AD7626的LVDS接口是2.5V电平标准。第一次调试时没注意这个细节,结果数据眼图直接糊成一片。正确的做法是在Vivado的XDC约束文件里加上这行:
tcl复制set_property IOSTANDARD LVDS_25 [get_ports {Bank35_*}]
实际接线时要注意LVDS差分对的等长走线,建议控制在5mil误差以内。我习惯用红色杜邦线接D+,蓝色接D-,这样排查问题时一眼就能分辨极性。AD7626的供电也有讲究,模拟部分最好用线性稳压器单独供电,实测开关电源会引入约3LSB的噪声。
这颗ADC的LVDS接口有两种玩法:自时钟模式和回波时钟模式。新手容易在这里栽跟头——我当初就白白浪费了两天时间。回波时钟模式(DCO模式)更适合高速场景,它在输出数据的同时会返回一个同步时钟,相位误差只有0-1ns。但要注意引脚配置:
在Verilog里配置EN0和EN1引脚时,有个隐藏知识点:EN1=1/EN0=0的组合会禁用内部基准源,这时候REFIN引脚必须接1.2V外部基准。我用ADR4525基准源芯片实测,比用内部基准时INL指标能改善0.5LSB。
AD7626的时序控制就像跳舞,得严格踩着节奏来。我把它分解成四个阶段:
用250MHz时钟驱动时,对应的计数器值分别是:
verilog复制parameter tCYC_CNT_MAX = 50; // 200ns/4ns
parameter tCNVH_CNT_MAX = 5; // 20ns/4ns
parameter tMSB_CNT_MAX = 25; // 100ns/4ns
关键技巧是在MMCM里生成250MHz时钟,比直接用100MHz主时钟能更精确控制时序。注意mmcm_lock信号要作为全局复位,否则可能遇到时钟不稳的情况。
Xilinx的SelectIO资源用起来有门道,分享几个实战经验:
数据采集部分的代码要特别注意位拼接顺序:
verilog复制always@(posedge ad7626_dco)
Data <= {Data[14:0], ad7626_d}; // 移位寄存实现串并转换
遇到过最诡异的问题是数据位错位,后来发现是PCB上D+和D-走线长度差达到了300mil。解决办法是在FPGA里添加IDELAYE2原语做延时校准:
verilog复制IDELAYE2 #(
.IDELAY_TYPE("FIXED"),
.DELAY_SRC("IDATAIN"),
.IDELAY_VALUE(5)
) delay_D0 (
.IDATAIN(D_P),
.DATAOUT(D_P_delayed)
);
用ILA抓取信号时,要设置好触发条件。我常用的触发组合是:
在Vivado Hardware Manager里可以看到完整的时序波形。如果发现数据不稳定,可以尝试:
对于需要更高精度的场景,建议:
实测这套方案在工业现场连续运行三个月,数据丢包率低于0.001%。最后提醒大家,每次上电后的第一次转换数据要丢弃,这是AD7626芯片的特性决定的。