ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AD9680与JESD204B高速数据采集:寄存器配置、链路建立与FPGA数据解析实战

AD9680与JESD204B高速数据采集:寄存器配置、链路建立与FPGA数据解析实战 1. 项目缘起与整体设计思路AD9680 这颗芯片在高速数据采集圈子里算是老面孔了14 位分辨率、双通道、最高 1 GSPS 采样率配合 JESD204B 高速串行接口基本上做雷达、软件无线电、医疗成像或者高速示波器的团队都会碰到它。我第一次接触这个项目的时候需求很直接前端模拟信号经过 AD9680 采样后通过 JESD204B 链路把数据送到 FPGA再在 FPGA 内部完成解帧、对齐、解析最终拿到原始的 14 位采样值。听起来链路清晰但真正动手之后才发现从寄存器配置到链路建立再到数据解析每一步都有不少细节能把人卡住。这个项目的核心目标可以拆成三块第一把 AD9680 的寄存器配置对让芯片按照预期的工作模式输出数据第二把 JESD204B 链路建立起来包括时钟、同步、通道对齐第三在 FPGA 侧正确解析 JESD204B 帧结构还原出双通道的 14 位采样数据。这三块环环相扣任何一块出问题最终拿到的数据要么是乱的要么根本出不来。为什么选择 JESD204B 而不是传统的并行 LVDS 接口这个问题我在方案评审时被问过很多次。简单说当采样率上到 GSPS 级别、通道数增加时并行接口的走线数量会爆炸式增长PCB 布线难度和信号完整性风险都急剧上升。JESD204B 用高速串行差分对替代了大量并行数据线一根 lane 的线速率可以跑到 12.5 GbpsAD9680 在 1 GSPS、14 位、双通道的配置下通常用 4 条 lane 就能搞定布线压力小了很多。代价就是协议复杂度上来了链路建立过程需要严格的状态机配合。整体设计上我采用的思路是先确保时钟树干净再配置 AD9680 进入 JESD204B 模式然后 FPGA 侧用 JESD204B IP 核或者自己写的接收逻辑完成链路同步最后做数据解析和后续处理。这个顺序不能乱因为时钟不稳后面全是白搭链路没同步解析出来的数据就是随机数。注意AD9680 的 JESD204B 链路对参考时钟的抖动非常敏感尤其是 lane rate 跑到 10 Gbps 以上时时钟的相位噪声直接决定链路能否稳定建立。这一点在项目初期就必须要重视不然后面调试会非常痛苦。2. AD9680 寄存器配置的核心细节2.1 寄存器配置的整体流程与关键寄存器AD9680 的寄存器是通过 SPI 接口访问的通常 FPGA 或者 MCU 作为 SPI MasterAD9680 作为 Slave。配置流程一般分为几步先做软复位然后配置时钟相关寄存器接着配置 JESD204B 链路参数最后启动链路并检查状态。关键寄存器我整理了一个表方便对照寄存器地址名称作用典型值0x000SPI ConfigSPI 配置软复位0x81 复位0x011Clock Config时钟分频与选择根据时钟方案0x200JESD204B Config链路模式选择0x01 使能0x201Link Configlane 数量与速率根据设计0x202Device ID设备标识0x000x203Bank IDBank 标识0x000x204Lane Assignmentlane 分配0x0F 四 lane0x205Scramble加扰使能0x010x206Frames per Multiframe每多帧的帧数0x1F0x207Lanes per Link每链路 lane 数0x030x208Subclass子类选择0x01 Subclass 10x209RX Buffer Delay接收缓冲延迟根据延迟计算0x20ALane Ratelane 速率配置根据采样率这些寄存器的值不是随便填的每一个都要根据系统时钟方案和采样率来算。比如 lane rate 的计算假设采样率 1 GSPS14 位双通道4 条 lane那么总数据率是 1G × 14 × 2 28 Gbps分摊到 4 条 lane每条 lane 是 7 Gbps。但 JESD204B 有 8b/10b 编码开销实际线速率是 7 × 10/8 8.75 Gbps。这个计算过程必须提前做好因为 lane rate 决定了参考时钟的选择和 FPGA 侧 GT 的配置。2.2 时钟方案的选择与计算AD9680 的时钟输入通常有两种方案一种是外部直接提供采样时钟另一种是通过片内 PLL 从参考时钟倍频。我一般倾向于外部直接提供低抖动采样时钟因为片内 PLL 虽然方便但相位噪声性能通常不如外部专用时钟芯片。采样时钟的频率就是采样率比如 1 GHz。JESD204B 的 lane rate 需要另一个时钟通常是采样时钟经过分频或者倍频得到。AD9680 内部有一个时钟分频器可以把采样时钟分频后作为 JESD204B 的帧时钟。具体分频比要看 lane rate 和采样率的关系。举个例子采样率 1 GHzlane rate 8.75 GbpsJESD204B 的帧时钟通常是 lane rate 除以 40因为 8b/10b 编码后每 10 位对应一个字节每帧通常 4 个字节所以 40 位对应一帧。8.75G / 40 218.75 MHz。这个帧时钟需要和 FPGA 侧的 JESD204B IP 核配置一致否则链路无法同步。提示时钟方案确定后一定要用示波器或者频谱仪实测时钟的抖动和相位噪声不要只看芯片手册的标称值。实际 PCB 走线、电源噪声都会影响时钟质量。2.3 SPI 配置的实操要点SPI 配置看起来简单但有几个坑我踩过。第一AD9680 的 SPI 时序要求比较严格SCLK 频率不能太高一般建议在 10 MHz 以下尤其是上电初期。第二配置顺序很重要必须先做软复位等复位完成后才能写其他寄存器否则写入的值可能不生效。第三有些寄存器是只读的写进去没反应不要以为是 SPI 通信有问题。我通常的做法是写一个 SPI 配置状态机按照手册推荐的初始化序列一步步来每一步都读回寄存器值做校验。如果读回的值和写入的不一致就报错并重试。这个校验机制在调试阶段非常有用能快速定位是 SPI 通信问题还是寄存器配置问题。// SPI 配置状态机简化示例 module spi_config_fsm ( input wire clk, input wire rst_n, output reg spi_cs_n, output reg spi_sclk, output reg spi_mosi, input wire spi_miso, output reg config_done ); // 状态定义 localparam IDLE 0; localparam RESET 1; localparam WRITE_REG 2; localparam READ_REG 3; localparam CHECK 4; localparam DONE 5; // ... 状态机实现 endmodule这段代码只是示意实际实现时要注意 SPI 的时钟极性和相位AD9680 支持 SPI 模式 0 和模式 3具体用哪个要看硬件设计。我一般用模式 0即 CPOL0CPHA0数据在 SCLK 上升沿采样。3. JESD204B 链路建立与 FPGA 侧实现3.1 JESD204B 协议的关键概念JESD204B 协议的核心概念有几个必须搞清楚lane、link、frame、multiframe、subclass。lane 是物理上的高速串行通道link 是逻辑上的连接一个 link 可以包含多条 lane。frame 是数据组织的基本单位通常包含多个字节的采样数据。multiframe 是多个 frame 的集合用于对齐和同步。subclass 决定了同步机制Subclass 1 使用 SYSREF 信号做确定性延迟Subclass 0 不用。AD9680 通常工作在 Subclass 1 模式因为确定性延迟对多通道同步采集非常重要。SYSREF 信号需要和采样时钟保持确定的相位关系FPGA 侧要正确捕获 SYSREF 并用于链路对齐。3.2 FPGA 侧 JESD204B IP 核的配置FPGA 侧我一般用 Xilinx 或者 Intel 的 JESD204B IP 核这些 IP 核已经封装好了复杂的链路状态机只需要配置参数即可。关键参数包括lane 数量、lane rate、参考时钟频率、帧结构参数F、K、M、N、N、S、L、HD 等。这些参数的含义F 是每帧的字节数K 是每多帧的帧数M 是转换器数量N 是采样精度N 是传输精度S 是每帧每转换器的采样数L 是 lane 数量HD 是高清模式使能。AD9680 在双通道、14 位、4 lane 的典型配置下这些参数通常是M2N14N16S1L4F2K32HD1。配置这些参数时必须和 AD9680 寄存器里写的值完全一致否则链路无法建立。我遇到过因为 F 和 K 不匹配导致链路一直处于 CGSCode Group Synchronization状态的情况查了好久才发现是参数写错了。3.3 链路建立的状态机与调试JESD204B 链路建立分为几个阶段CGS代码组同步、ILA初始通道对齐、数据阶段。CGS 阶段接收端发送 SYNC 信号发送端收到后开始发送 K28.5 字符接收端检测到足够数量的 K28.5 后进入 ILA 阶段。ILA 阶段发送端发送 ILA 序列接收端根据 ILA 序列对齐各条 lane。对齐完成后进入数据阶段开始正常数据传输。调试链路时我通常会在 FPGA 侧加一些调试计数器统计 CGS 和 ILA 阶段的错误次数。如果 CGS 一直不通过通常是 lane rate 或者参考时钟有问题如果 ILA 不通过通常是 lane 之间的偏斜太大或者 SYSREF 相位不对。注意SYSREF 的捕获是 Subclass 1 模式的关键。SYSREF 必须满足建立时间和保持时间要求否则捕获到的相位不确定导致链路无法对齐。我一般会用 FPGA 的 IDELAY 或者 MMCM 来调整 SYSREF 的采样相位直到链路稳定。3.4 数据解析与对齐链路建立后FPGA 收到的数据是经过 8b/10b 解码后的字节流。需要按照 JESD204B 的帧结构解析出每个转换器的采样值。以 AD9680 双通道、14 位、4 lane 为例每帧 2 个字节每个转换器每帧 1 个采样4 条 lane 上分布着两个转换器的数据。解析时要注意字节顺序和位顺序。JESD204B 通常是大端模式高位字节在前。14 位采样值在 16 位传输精度中通常低 14 位有效高 2 位是填充位或者控制位。解析出来的 14 位数据还需要根据 AD9680 的输出格式偏移二进制或者二进制补码做转换。// 数据解析简化示例 module jesd204b_parser ( input wire clk, input wire rst_n, input wire [31:0] lane_data, // 4 lane 拼接 output reg [13:0] ch0_data, output reg [13:0] ch1_data, output reg data_valid ); // 根据帧结构解析 always (posedge clk or negedge rst_n) begin if (!rst_n) begin ch0_data 14d0; ch1_data 14d0; data_valid 1b0; end else begin // 解析逻辑 ch0_data lane_data[13:0]; ch1_data lane_data[29:16]; data_valid 1b1; end end endmodule实际解析逻辑要比这个复杂因为要考虑多帧对齐、lane 间偏斜补偿等因素。我一般会先用一个简单的解析逻辑把数据抓出来用 ChipScope 或者 SignalTap 观察波形确认数据格式正确后再做后续处理。4. 常见问题与排查技巧实录4.1 链路无法建立的典型原因链路建立失败是最常见的问题我整理了一个排查表现象可能原因排查方法CGS 一直不通过lane rate 配置错误检查 AD9680 和 FPGA 的 lane rate 是否一致CGS 一直不通过参考时钟频率错误测量参考时钟频率和抖动ILA 不通过lane 间偏斜过大检查 PCB 走线等长调整 IDELAYILA 不通过SYSREF 相位不对调整 SYSREF 采样相位数据阶段错误帧参数不匹配核对 F、K、M、N 等参数数据阶段错误加扰配置不一致检查加扰使能是否一致4.2 数据错乱的排查思路数据阶段出错通常表现为数据跳变、噪声大或者完全不对。我的排查思路是先确认链路状态是否稳定如果链路本身不稳定数据肯定不对然后检查数据解析逻辑用已知的测试信号比如正弦波输入观察解析出来的波形是否正常最后检查数据格式转换偏移二进制和补码搞反了也会导致数据看起来不对。有一次我遇到数据每隔一段时间就跳一下查了很久发现是 SYSREF 的周期和 multiframe 周期不匹配导致周期性失步。后来调整了 SYSREF 的分频比问题解决。4.3 时钟与电源的注意事项高速 ADC 对电源噪声非常敏感AD9680 的模拟电源和数字电源要分开供电并且要做好滤波。我一般会在电源引脚附近放多个不同容值的电容比如 100nF、1uF、10uF 组合覆盖不同频率的噪声。时钟方面采样时钟的抖动要尽可能低建议使用专用时钟芯片比如 LMK 系列或者 HMC 系列。时钟走线要包地避免和其他信号交叉。提示调试高速 ADC 时建议先用一个低频、低抖动的时钟源把链路跑通再逐步提高频率。这样可以把时钟问题和链路问题分开排查。4.4 FPGA 侧 GT 的配置要点FPGA 的 GTGigabit Transceiver配置直接影响链路质量。关键参数包括TX/RX 均衡、预加重、差分电压摆幅等。这些参数需要根据 PCB 走线长度和损耗来调整。我一般会先用默认配置如果链路误码率高再逐步调整均衡和预加重。GT 的参考时钟质量也很重要建议使用专用时钟芯片提供并且参考时钟的抖动要满足 GT 的要求。如果参考时钟抖动太大GT 的 CDR时钟数据恢复可能无法锁定。5. 实操心得与经验总结这个项目做下来我最大的体会是高速 ADC 加 JESD204B 的调试三分靠配置七分靠调试。配置虽然繁琐但只要按照手册一步步来一般不会出大问题。真正花时间的是调试尤其是链路建立和数据解析阶段。我建议在项目初期就做好调试规划比如预留足够的测试点、准备好调试工具示波器、频谱仪、逻辑分析仪、在 FPGA 侧加足够的调试计数器。这样遇到问题时能快速定位而不是盲目试错。另外AD9680 的寄存器配置最好做成参数化方便不同采样率和 lane 配置之间切换。我一般会把寄存器配置写成一个查找表根据不同的工作模式选择不同的配置这样后期改需求时不用重新写代码。最后分享一个小技巧JESD204B 链路调试时可以先用 FPGA 内部产生一个已知的测试图案通过链路发送到接收端对比接收到的数据是否正确。这个方法可以快速验证链路本身是否正常排除数据源的问题。这个项目后续还可以扩展的方向包括多片 AD9680 的同步采集、更高采样率的配置、以及基于采集数据的实时信号处理。这些扩展都需要在现有链路基础上做进一步优化但核心的 JESD204B 链路建立和数据解析逻辑是通用的。
返回列表