本文承接前面的AXI、DDR和高速接口系列,详细介绍FPGA与高速ADC/DAC之间常用的JESD204协议。内容包括JESD204A/B/C版本区别、协议分层、LMFS参数、线速率计算、确定性延迟、SYSREF与LMFC、链路建立过程、AMD/Xilinx JESD204 PHY与TX/RX IP配置、GT时钟与复位,以及MicroBlaze/Vitis环境下的嵌入式初始化和上板调试方法。
前言
低速ADC或DAC通常使用并行CMOS、LVDS或SPI接口。随着采样率、分辨率和通道数不断提高,并行接口会带来大量引脚、复杂的板级等长、较高的功耗,以及难以控制的多通道时序偏差。
JESD204就是为高速数据转换器与数字处理器之间的数据传输设计的串行接口标准。
一套典型系统如下:
#mermaid-svg-qzl4Tz9Oja7WGqxO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qzl4Tz9Oja7WGqxO .error-icon{fill:#552222;}#mermaid-svg-qzl4Tz9Oja7WGqxO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qzl4Tz9Oja7WGqxO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .marker.cross{stroke:#333333;}#mermaid-svg-qzl4Tz9Oja7WGqxO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qzl4Tz9Oja7WGqxO p{margin:0;}#mermaid-svg-qzl4Tz9Oja7WGqxO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster-label text{fill:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster-label span{color:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster-label span p{background-color:transparent;}#mermaid-svg-qzl4Tz9Oja7WGqxO .label text,#mermaid-svg-qzl4Tz9Oja7WGqxO span{fill:#333;color:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .node rect,#mermaid-svg-qzl4Tz9Oja7WGqxO .node circle,#mermaid-svg-qzl4Tz9Oja7WGqxO .node ellipse,#mermaid-svg-qzl4Tz9Oja7WGqxO .node polygon,#mermaid-svg-qzl4Tz9Oja7WGqxO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .rough-node .label text,#mermaid-svg-qzl4Tz9Oja7WGqxO .node .label text,#mermaid-svg-qzl4Tz9Oja7WGqxO .image-shape .label,#mermaid-svg-qzl4Tz9Oja7WGqxO .icon-shape .label{text-anchor:middle;}#mermaid-svg-qzl4Tz9Oja7WGqxO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .rough-node .label,#mermaid-svg-qzl4Tz9Oja7WGqxO .node .label,#mermaid-svg-qzl4Tz9Oja7WGqxO .image-shape .label,#mermaid-svg-qzl4Tz9Oja7WGqxO .icon-shape .label{text-align:center;}#mermaid-svg-qzl4Tz9Oja7WGqxO .node.clickable{cursor:pointer;}#mermaid-svg-qzl4Tz9Oja7WGqxO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .arrowheadPath{fill:#333333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qzl4Tz9Oja7WGqxO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qzl4Tz9Oja7WGqxO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qzl4Tz9Oja7WGqxO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster text{fill:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO .cluster span{color:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qzl4Tz9Oja7WGqxO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qzl4Tz9Oja7WGqxO rect.text{fill:none;stroke-width:0;}#mermaid-svg-qzl4Tz9Oja7WGqxO .icon-shape,#mermaid-svg-qzl4Tz9Oja7WGqxO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qzl4Tz9Oja7WGqxO .icon-shape p,#mermaid-svg-qzl4Tz9Oja7WGqxO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qzl4Tz9Oja7WGqxO .icon-shape .label rect,#mermaid-svg-qzl4Tz9Oja7WGqxO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qzl4Tz9Oja7WGqxO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qzl4Tz9Oja7WGqxO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qzl4Tz9Oja7WGqxO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JESD204高速串行
模拟输入
高速ADC
FPGA GT + JESD RX
DSP / DDR / UDP
DAC方向与之相反:
#mermaid-svg-lE89DwkXJz3zbQHa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lE89DwkXJz3zbQHa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lE89DwkXJz3zbQHa .error-icon{fill:#552222;}#mermaid-svg-lE89DwkXJz3zbQHa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lE89DwkXJz3zbQHa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lE89DwkXJz3zbQHa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lE89DwkXJz3zbQHa .marker.cross{stroke:#333333;}#mermaid-svg-lE89DwkXJz3zbQHa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lE89DwkXJz3zbQHa p{margin:0;}#mermaid-svg-lE89DwkXJz3zbQHa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lE89DwkXJz3zbQHa .cluster-label text{fill:#333;}#mermaid-svg-lE89DwkXJz3zbQHa .cluster-label span{color:#333;}#mermaid-svg-lE89DwkXJz3zbQHa .cluster-label span p{background-color:transparent;}#mermaid-svg-lE89DwkXJz3zbQHa .label text,#mermaid-svg-lE89DwkXJz3zbQHa span{fill:#333;color:#333;}#mermaid-svg-lE89DwkXJz3zbQHa .node rect,#mermaid-svg-lE89DwkXJz3zbQHa .node circle,#mermaid-svg-lE89DwkXJz3zbQHa .node ellipse,#mermaid-svg-lE89DwkXJz3zbQHa .node polygon,#mermaid-svg-lE89DwkXJz3zbQHa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lE89DwkXJz3zbQHa .rough-node .label text,#mermaid-svg-lE89DwkXJz3zbQHa .node .label text,#mermaid-svg-lE89DwkXJz3zbQHa .image-shape .label,#mermaid-svg-lE89DwkXJz3zbQHa .icon-shape .label{text-anchor:middle;}#mermaid-svg-lE89DwkXJz3zbQHa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lE89DwkXJz3zbQHa .rough-node .label,#mermaid-svg-lE89DwkXJz3zbQHa .node .label,#mermaid-svg-lE89DwkXJz3zbQHa .image-shape .label,#mermaid-svg-lE89DwkXJz3zbQHa .icon-shape .label{text-align:center;}#mermaid-svg-lE89DwkXJz3zbQHa .node.clickable{cursor:pointer;}#mermaid-svg-lE89DwkXJz3zbQHa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lE89DwkXJz3zbQHa .arrowheadPath{fill:#333333;}#mermaid-svg-lE89DwkXJz3zbQHa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lE89DwkXJz3zbQHa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lE89DwkXJz3zbQHa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lE89DwkXJz3zbQHa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lE89DwkXJz3zbQHa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lE89DwkXJz3zbQHa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lE89DwkXJz3zbQHa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lE89DwkXJz3zbQHa .cluster text{fill:#333;}#mermaid-svg-lE89DwkXJz3zbQHa .cluster span{color:#333;}#mermaid-svg-lE89DwkXJz3zbQHa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lE89DwkXJz3zbQHa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lE89DwkXJz3zbQHa rect.text{fill:none;stroke-width:0;}#mermaid-svg-lE89DwkXJz3zbQHa .icon-shape,#mermaid-svg-lE89DwkXJz3zbQHa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lE89DwkXJz3zbQHa .icon-shape p,#mermaid-svg-lE89DwkXJz3zbQHa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lE89DwkXJz3zbQHa .icon-shape .label rect,#mermaid-svg-lE89DwkXJz3zbQHa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lE89DwkXJz3zbQHa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lE89DwkXJz3zbQHa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lE89DwkXJz3zbQHa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JESD204高速串行
波形数据
FPGA JESD TX + GT
高速DAC
模拟输出
JESD204工程比普通SPI或AXI接口复杂,因为它同时涉及:
- ADC/DAC采样参数;
- 多Lane高速收发器;
- 8b/10b或64b/66b线路编码;
- Device Clock、GT Reference Clock和Core Clock;
- SYSREF与确定性延迟;
- 多Lane对齐和Lane Mapping;
- FPGA IP寄存器与转换器SPI寄存器的一致性;
- 时钟芯片、转换器和FPGA之间严格的初始化顺序。
很多JESD问题并不是"IP核没工作",而是链路两端对L/M/F/S/K/N/N'的理解不一致,或者SYSREF、GT参考时钟、Lane Mapping和复位顺序存在错误。
本文以当前常用的XCKU5P-FFVB676-2-I + Vivado + MicroBlaze/Vitis平台为背景,但不绑定某一款ADC或DAC。实际配置值必须来自目标转换器数据手册中的JESD Operating Mode表。
一、JESD204解决了什么问题
1.1 并行接口的问题
假设一个14 bit、1 GSPS的ADC直接以并行方式输出,即使采用DDR,也需要大量高速数据引脚和时钟引脚:
text
ADC D[13:0] ──► FPGA普通IO
ADC DCO ──► FPGA采样时钟
ADC FCO ──► 帧时钟
当系统包含4个或8个ADC通道时,引脚、布线和时序收敛压力会迅速增加。
JESD204把多路采样数据映射到少量高速差分Lane:
text
多通道采样数据
│
▼
帧映射 → 扰码 → 线路编码 → SerDes
│
├── Lane 0 P/N
├── Lane 1 P/N
├── Lane 2 P/N
└── Lane 3 P/N
1.2 JESD204的主要优势
- 减少FPGA和转换器之间的引脚数量;
- 降低大量并行IO同时翻转造成的噪声;
- 允许多Lane高速传输;
- 支持Lane间偏差补偿;
- 支持多器件同步和确定性延迟;
- 更容易扩展到高采样率、高分辨率和多通道系统;
- 适合通过标准化IP复用不同ADC/DAC。
1.3 它不负责什么
JESD204负责的是数字采样数据的高速串行传输,不负责:
- ADC模拟前端增益和带宽;
- DAC输出重构滤波;
- 转换器电源时序;
- SPI寄存器配置本身;
- 采样时钟芯片的PLL配置;
- FPGA内部FFT、DDC、DUC或滤波算法。
这些模块虽然不属于JESD协议,但必须共同工作才能建立有效的数据链路。
二、典型应用场景
2.1 软件无线电与通信
高速ADC采集射频或中频信号,FPGA完成数字下变频、滤波、解调和波束形成;发送方向由FPGA完成数字上变频,再通过高速DAC输出。
2.2 相控阵雷达
多通道ADC/DAC要求通道间相位关系稳定。JESD204 Subclass 1配合低抖动时钟和SYSREF,可以实现多次启动后可重复的链路延迟,是阵列相位一致性的重要基础。
2.3 示波器、频谱仪和采集卡
JESD204把高速ADC数据送入FPGA,后续进入触发、抽取、FFT、DDR缓存或PCIe/UDP传输模块。
2.4 任意波形发生器
波形数据从DDR或实时算法模块进入JESD TX,再送到高速DAC。此时重点是连续吞吐、插值模式、确定性延迟和欠载保护。
2.5 超导量子测控电子学
量子比特读出通常需要多通道高速ADC,控制信号生成需要多通道高速DAC。JESD204可用于:
- 多路读出信号采集;
- 多路微波控制波形生成;
- 多板卡同步;
- 确保采集与输出链路延迟可重复;
- 将采样数据送入FPGA实时解调、积分和判决逻辑。
这里需要注意:JESD链路的确定性延迟只保证数字接口路径具有可重复关系,并不自动消除模拟通道、时钟树、混频器和线缆造成的相位偏差。
三、JESD204A、JESD204B和JESD204C
| 版本 | 线路编码 | 典型最高线速率 | 同步能力 | 工程特点 |
|---|---|---|---|---|
| JESD204A | 8b/10b | 较低 | 早期多Lane支持 | 新项目较少采用 |
| JESD204B | 8b/10b | 标准常见上限12.5 Gb/s | Subclass 0/1/2 | 应用最广,资料和器件丰富 |
| JESD204C | 64b/66b、64b/80b等 | 可支持更高线速率 | 更完善的高线速率同步机制 | 适合更高采样率和更多通道 |
AMD当前JESD204 PHY支持8B10B与64B66B相关配置;JESD204C LogiCORE面向更高线速率,并可配置为TX或RX。具体可用Lane数和线速率由FPGA器件、GT类型、Speed Grade、IP版本和配置共同决定。
3.1 为什么JESD204B仍然很常用
- 大量高速ADC/DAC原生支持;
- 8b/10b链路调试方法成熟;
- CGS、ILAS和Data阶段容易分层定位;
- 12.5 Gb/s以内可以覆盖很多仪器和通信系统;
- FPGA厂商与转换器厂商提供大量参考工程。
3.2 什么时候考虑JESD204C
- 单Lane速率超过JESD204B常用范围;
- 希望以更少Lane传输更大数据量;
- 新ADC/DAC主要面向JESD204C;
- FPGA具备满足线速率的高速GT;
- 系统能够接受更复杂的时钟、链路编码和调试要求。
不能只因为JESD204C"更新"就直接选C。若器件速率不高、JESD204B已经满足带宽,并且现有软硬件更成熟,B可能更容易落地。
四、JESD204协议分层
JESD204链路可以从上到下分为Transport Layer、Data Link Layer和Physical Layer。
#mermaid-svg-yIxdSu3NpTmCh4FX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yIxdSu3NpTmCh4FX .error-icon{fill:#552222;}#mermaid-svg-yIxdSu3NpTmCh4FX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yIxdSu3NpTmCh4FX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yIxdSu3NpTmCh4FX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yIxdSu3NpTmCh4FX .marker.cross{stroke:#333333;}#mermaid-svg-yIxdSu3NpTmCh4FX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yIxdSu3NpTmCh4FX p{margin:0;}#mermaid-svg-yIxdSu3NpTmCh4FX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster-label text{fill:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster-label span{color:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster-label span p{background-color:transparent;}#mermaid-svg-yIxdSu3NpTmCh4FX .label text,#mermaid-svg-yIxdSu3NpTmCh4FX span{fill:#333;color:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX .node rect,#mermaid-svg-yIxdSu3NpTmCh4FX .node circle,#mermaid-svg-yIxdSu3NpTmCh4FX .node ellipse,#mermaid-svg-yIxdSu3NpTmCh4FX .node polygon,#mermaid-svg-yIxdSu3NpTmCh4FX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yIxdSu3NpTmCh4FX .rough-node .label text,#mermaid-svg-yIxdSu3NpTmCh4FX .node .label text,#mermaid-svg-yIxdSu3NpTmCh4FX .image-shape .label,#mermaid-svg-yIxdSu3NpTmCh4FX .icon-shape .label{text-anchor:middle;}#mermaid-svg-yIxdSu3NpTmCh4FX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yIxdSu3NpTmCh4FX .rough-node .label,#mermaid-svg-yIxdSu3NpTmCh4FX .node .label,#mermaid-svg-yIxdSu3NpTmCh4FX .image-shape .label,#mermaid-svg-yIxdSu3NpTmCh4FX .icon-shape .label{text-align:center;}#mermaid-svg-yIxdSu3NpTmCh4FX .node.clickable{cursor:pointer;}#mermaid-svg-yIxdSu3NpTmCh4FX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yIxdSu3NpTmCh4FX .arrowheadPath{fill:#333333;}#mermaid-svg-yIxdSu3NpTmCh4FX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yIxdSu3NpTmCh4FX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yIxdSu3NpTmCh4FX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yIxdSu3NpTmCh4FX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yIxdSu3NpTmCh4FX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yIxdSu3NpTmCh4FX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster text{fill:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX .cluster span{color:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yIxdSu3NpTmCh4FX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yIxdSu3NpTmCh4FX rect.text{fill:none;stroke-width:0;}#mermaid-svg-yIxdSu3NpTmCh4FX .icon-shape,#mermaid-svg-yIxdSu3NpTmCh4FX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yIxdSu3NpTmCh4FX .icon-shape p,#mermaid-svg-yIxdSu3NpTmCh4FX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yIxdSu3NpTmCh4FX .icon-shape .label rect,#mermaid-svg-yIxdSu3NpTmCh4FX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yIxdSu3NpTmCh4FX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yIxdSu3NpTmCh4FX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yIxdSu3NpTmCh4FX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用采样数据
Transport Layer:样本映射
Data Link Layer:帧、多帧、扰码与对齐
Physical Layer:编码、SerDes与GT
高速差分Lane
4.1 Transport Layer
Transport Layer负责把多个Converter的样本映射成Octet,再分配到不同Lane和Frame中。
它决定:
- 一个Link包含多少Converter;
- 每个Sample占多少bit;
- Control Bit和Padding如何插入;
- 每Lane每Frame包含多少Octet;
- 多个Sample怎样排列到Lane上。
如果这一层参数错误,链路可能显示同步成功,但还原出的ADC数据顺序仍然错误。
4.2 Data Link Layer
JESD204B中,Data Link Layer主要完成:
- Scrambling;
- 8b/10b编码;
- Code Group Synchronization;
- Initial Lane Alignment Sequence;
- Frame和Multiframe对齐;
- Lane Alignment与错误检测。
4.3 Physical Layer
Physical Layer负责:
- 串并转换;
- 差分发送与接收;
- 时钟数据恢复CDR;
- PLL和参考时钟;
- 预加重、摆幅、均衡;
- Comma检测和字节对齐;
- PRBS与GT环回测试。
在AMD FPGA中,这一层通常由JESD204 PHY IP与GTH/GTY等高速收发器完成。
五、最重要的JESD参数
JESD数据手册经常用一组字母描述工作模式,例如:
text
L=4, M=4, F=2, S=1, K=32, N=14, N'=16, CS=0, HD=0
5.1 参数表
| 参数 | 含义 | 常见理解 |
|---|---|---|
L |
每个Link的Lane数量 | 1、2、4、8等 |
M |
每个Link包含的Converter数量 | 不一定等于芯片物理通道数 |
F |
每Lane每Frame的Octet数 | 决定Frame宽度 |
S |
每个Converter每Frame的Sample数 | 常见1或更大 |
K |
每Multiframe包含的Frame数 | JESD204B常见32 |
N |
ADC/DAC实际分辨率 | 例如14 bit |
N' |
传输接口中的Sample位宽 | 常见补齐为16 bit |
CS |
每Sample的Control Bit数 | 由转换器模式决定 |
CF |
每Frame的控制字相关参数 | 并非所有模式使用 |
HD |
High Density Format标志 | 影响样本跨Octet的打包方式 |
SCR |
Scrambling使能 | 链路两端必须一致 |
Subclass |
同步与延迟模式 | 常见Subclass 0或1 |
5.2 M不一定等于ADC通道数
Converter是JESD Transport Layer中的逻辑转换器。一个双通道ADC在某些工作模式下可能有M=2,但经过数字下变频、复数I/Q拆分或多路虚拟转换后,M也可能变成4或更大。
所以不能仅根据"芯片有几路ADC"填写M,必须查器件的JESD模式表。
5.3 N与N'的区别
一个14 bit ADC可能使用N=14、N'=16:
text
ADC有效数据:14 bit
JESD传输样本:16 bit
额外2 bit:控制位或尾部补齐,具体看器件模式
FPGA输出的Transport Layer数据通常按照N'组织,用户逻辑再提取真实的N位样本。
5.4 参数一致性关系
在常见JESD204B模式下,每个Frame携带的数据需要满足:
F × L × 8 = M × S × N ′ F\times L\times8=M\times S\times N' F×L×8=M×S×N′
因此:
F = M × S × N ′ 8 × L F=\frac{M\times S\times N'}{8\times L} F=8×LM×S×N′
若计算结果不是整数,说明当前参数组合无法按普通格式形成完整Octet,需要调整模式或确认是否采用High Density等特殊打包规则。
六、Lane Rate计算
6.1 JESD204B线速率
JESD204B采用8b/10b编码,每8 bit有效数据在串行线上占10 bit。因此单Lane线速率为:
L a n e R a t e = M × N ′ × f s L × 10 8 LaneRate=\frac{M\times N'\times f_s}{L}\times\frac{10}{8} LaneRate=LM×N′×fs×810
其中f_s为每个Converter的Sample Rate。
6.2 计算实例
假设:
text
M = 4
N' = 16 bit
fs = 250 MSPS
L = 4
则:
L a n e R a t e = 4 × 16 × 250 MHz 4 × 10 8 = 5 Gb/s LaneRate=\frac{4\times16\times250\ \text{MHz}}{4}\times\frac{10}{8} =5\ \text{Gb/s} LaneRate=44×16×250 MHz×810=5 Gb/s
这意味着每个GT Lane需要工作在5 Gb/s。
6.3 JESD204C线速率
采用64b/66b编码时,可按以下方式估算:
L a n e R a t e ≈ M × N ′ × f s L × 66 64 LaneRate\approx\frac{M\times N'\times f_s}{L}\times\frac{66}{64} LaneRate≈LM×N′×fs×6466
实际还要考虑JESD204C工作模式、编码方式、命令通道和协议参数,应使用转换器厂商提供的Mode表或JESD配置工具确认。
6.4 为什么不能只看FPGA GT最高速率
即使GT标称速率高于计算值,也要继续确认:
- 该速率是否落在所选CPLL/QPLL支持范围;
- 参考时钟和分频组合是否存在;
- 当前封装是否引出足够GT Lane;
- Lane是否位于可共享同一QPLL和参考时钟的Quad;
- IP版本是否支持目标编码和线速率;
- PCB插损、连接器和转换器输入输出指标是否满足;
- Speed Grade是否满足要求。
6.5 有效载荷效率
| 编码 | 编码效率 | 典型特点 |
|---|---|---|
| 8b/10b | 80% | 调试成熟、控制字符直观 |
| 64b/66b | 约96.97% | 开销更低,适合更高线速率 |
线速率不是ADC有效数据速率。做带宽预算时,要把编码开销算进去。
七、Frame、Multiframe、LMFC和LEMC
7.1 Frame
Frame是Transport Layer映射的基本时间单元。每个Lane每Frame包含F个Octet。
text
Lane 0:| Frame 0 | Frame 1 | Frame 2 | ... |
Lane 1:| Frame 0 | Frame 1 | Frame 2 | ... |
7.2 Multiframe
JESD204B中,每个Multiframe包含K个Frame:
M u l t i f r a m e B y t e s P e r L a n e = F × K Multiframe\ Bytes\ Per\ Lane=F\times K Multiframe Bytes Per Lane=F×K
7.3 LMFC
LMFC全称Local Multiframe Clock。它不是必须从芯片引脚输出的一根普通时钟,而是设备内部用于标记Multiframe边界的周期基准。
其频率可理解为:
f L M F C = F r a m e R a t e K f_{LMFC}=\frac{FrameRate}{K} fLMFC=KFrameRate
Subclass 1中,发送端和接收端利用SYSREF把各自LMFC边界对齐到共同时间基准。
7.4 JESD204C中的LEMC
JESD204C的64b/66b模式使用Multiblock和Extended Multiblock等结构,对应会看到LEMC等概念。调试时不能把JESD204B的K、ILAS、LMFC流程机械套到所有JESD204C模式中。
八、Subclass和确定性延迟
8.1 什么是确定性延迟
确定性延迟并不是说链路"绝对零抖动"或"延迟数值一定很小",而是指链路经过复位、重新同步或重新上电后,采样时刻到FPGA数据输出时刻之间的延迟能够保持可重复关系。
这对于以下系统很重要:
- 相控阵多通道相位一致性;
- 多ADC同步采集;
- 多DAC同步输出;
- 量子测控中触发、波形和采集的固定时序;
- 需要离线校准固定延迟的仪器。
8.2 Subclass对比
| Subclass | 同步参考 | 确定性延迟 | 工程特点 |
|---|---|---|---|
| 0 | 无SYSREF要求 | 通常不保证跨复位可重复 | 最简单,适合不要求固定延迟的系统 |
| 1 | SYSREF | 支持确定性延迟 | 最常用,需要严格设计SYSREF与Device Clock |
| 2 | SYNC相关机制 | 支持确定性延迟 | 使用较少,器件与IP支持情况需确认 |
8.3 SYSREF是什么
SYSREF是Subclass 1系统中的时间参考信号。它与Device Clock具有确定关系,用来对齐转换器和FPGA内部的LMFC/LEMC。
#mermaid-svg-WlkylW3PdgCMi3cd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WlkylW3PdgCMi3cd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WlkylW3PdgCMi3cd .error-icon{fill:#552222;}#mermaid-svg-WlkylW3PdgCMi3cd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WlkylW3PdgCMi3cd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WlkylW3PdgCMi3cd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WlkylW3PdgCMi3cd .marker.cross{stroke:#333333;}#mermaid-svg-WlkylW3PdgCMi3cd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WlkylW3PdgCMi3cd p{margin:0;}#mermaid-svg-WlkylW3PdgCMi3cd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WlkylW3PdgCMi3cd .cluster-label text{fill:#333;}#mermaid-svg-WlkylW3PdgCMi3cd .cluster-label span{color:#333;}#mermaid-svg-WlkylW3PdgCMi3cd .cluster-label span p{background-color:transparent;}#mermaid-svg-WlkylW3PdgCMi3cd .label text,#mermaid-svg-WlkylW3PdgCMi3cd span{fill:#333;color:#333;}#mermaid-svg-WlkylW3PdgCMi3cd .node rect,#mermaid-svg-WlkylW3PdgCMi3cd .node circle,#mermaid-svg-WlkylW3PdgCMi3cd .node ellipse,#mermaid-svg-WlkylW3PdgCMi3cd .node polygon,#mermaid-svg-WlkylW3PdgCMi3cd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WlkylW3PdgCMi3cd .rough-node .label text,#mermaid-svg-WlkylW3PdgCMi3cd .node .label text,#mermaid-svg-WlkylW3PdgCMi3cd .image-shape .label,#mermaid-svg-WlkylW3PdgCMi3cd .icon-shape .label{text-anchor:middle;}#mermaid-svg-WlkylW3PdgCMi3cd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WlkylW3PdgCMi3cd .rough-node .label,#mermaid-svg-WlkylW3PdgCMi3cd .node .label,#mermaid-svg-WlkylW3PdgCMi3cd .image-shape .label,#mermaid-svg-WlkylW3PdgCMi3cd .icon-shape .label{text-align:center;}#mermaid-svg-WlkylW3PdgCMi3cd .node.clickable{cursor:pointer;}#mermaid-svg-WlkylW3PdgCMi3cd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WlkylW3PdgCMi3cd .arrowheadPath{fill:#333333;}#mermaid-svg-WlkylW3PdgCMi3cd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WlkylW3PdgCMi3cd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WlkylW3PdgCMi3cd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WlkylW3PdgCMi3cd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WlkylW3PdgCMi3cd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WlkylW3PdgCMi3cd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WlkylW3PdgCMi3cd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WlkylW3PdgCMi3cd .cluster text{fill:#333;}#mermaid-svg-WlkylW3PdgCMi3cd .cluster span{color:#333;}#mermaid-svg-WlkylW3PdgCMi3cd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WlkylW3PdgCMi3cd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WlkylW3PdgCMi3cd rect.text{fill:none;stroke-width:0;}#mermaid-svg-WlkylW3PdgCMi3cd .icon-shape,#mermaid-svg-WlkylW3PdgCMi3cd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WlkylW3PdgCMi3cd .icon-shape p,#mermaid-svg-WlkylW3PdgCMi3cd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WlkylW3PdgCMi3cd .icon-shape .label rect,#mermaid-svg-WlkylW3PdgCMi3cd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WlkylW3PdgCMi3cd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WlkylW3PdgCMi3cd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WlkylW3PdgCMi3cd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 低抖动时钟芯片
ADC/DAC采样时钟
FPGA GT参考时钟
SYSREF → 转换器
SYSREF → FPGA
8.4 SYSREF不是越多越好
常见SYSREF方式:
- One-shot:初始化时产生一个或有限个脉冲;
- Gapped Periodic:按需要输出一组脉冲;
- Periodic:持续周期输出。
连续SYSREF可能把耦合噪声带入采样系统。若设备支持,工程中常使用One-shot或Gapped Periodic,在链路建立时触发,稳定后停止。但具体策略必须与ADC/DAC和IP配置一致。
8.5 SYSREF时序要求
SYSREF必须相对于Device Clock满足建立和保持要求。如果SYSREF落在采样边沿附近,可能出现:
- 偶发多一个或少一个LMFC周期;
- 每次上电延迟不一致;
- 多器件对齐偶发失败;
- Link正常但通道相位跳变。
应使用时钟芯片的SYSREF Delay、FPGA输入延时或器件内部延时功能,把SYSREF采样点移动到稳定窗口中,并通过多次复位统计延迟重复性。
九、JESD204B链路建立过程
JESD204B接收链路一般经历CGS、ILAS和Data三个阶段。
#mermaid-svg-5JAWXyGp10ktGA2E{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5JAWXyGp10ktGA2E .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5JAWXyGp10ktGA2E .error-icon{fill:#552222;}#mermaid-svg-5JAWXyGp10ktGA2E .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5JAWXyGp10ktGA2E .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5JAWXyGp10ktGA2E .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E .marker.cross{stroke:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5JAWXyGp10ktGA2E p{margin:0;}#mermaid-svg-5JAWXyGp10ktGA2E defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-5JAWXyGp10ktGA2E g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-5JAWXyGp10ktGA2E g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-5JAWXyGp10ktGA2E g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-5JAWXyGp10ktGA2E g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-5JAWXyGp10ktGA2E .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-5JAWXyGp10ktGA2E .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-5JAWXyGp10ktGA2E .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-5JAWXyGp10ktGA2E .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-5JAWXyGp10ktGA2E .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-5JAWXyGp10ktGA2E .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-5JAWXyGp10ktGA2E .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-5JAWXyGp10ktGA2E .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5JAWXyGp10ktGA2E .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5JAWXyGp10ktGA2E .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5JAWXyGp10ktGA2E .edgeLabel .label text{fill:#333;}#mermaid-svg-5JAWXyGp10ktGA2E .label div .edgeLabel{color:#333;}#mermaid-svg-5JAWXyGp10ktGA2E .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-5JAWXyGp10ktGA2E .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-5JAWXyGp10ktGA2E .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-5JAWXyGp10ktGA2E .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5JAWXyGp10ktGA2E .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5JAWXyGp10ktGA2E #statediagram-barbEnd{fill:#333333;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5JAWXyGp10ktGA2E .cluster-label,#mermaid-svg-5JAWXyGp10ktGA2E .nodeLabel{color:#131300;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-5JAWXyGp10ktGA2E .note-edge{stroke-dasharray:5;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-note text{fill:black;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram-note .nodeLabel{color:black;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagram .edgeLabel{color:red;}#mermaid-svg-5JAWXyGp10ktGA2E #dependencyStart,#mermaid-svg-5JAWXyGp10ktGA2E #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-5JAWXyGp10ktGA2E .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5JAWXyGp10ktGA2E :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} GT就绪
Code Group同步
Lane对齐与参数检查
同步丢失或严重错误
RESET
CGS
ILAS
DATA
9.1 CGS:Code Group Synchronization
接收端通过SYNC~请求发送端发送同步字符。发送端重复发送K28.5,即/K/字符。接收端完成:
- CDR锁定;
- Comma检测;
- 10 bit字符边界识别;
- 8b/10b解码同步。
如果一直停在CGS,优先检查:
- Lane差分极性;
- Lane顺序;
- TX与RX线速率;
- GT参考时钟;
- 8b/10b设置;
SYNC~方向和极性;- 转换器JESD发送器是否真正启用。
9.2 ILAS:Initial Lane Alignment Sequence
CGS完成后,发送端进入ILAS。JESD204B的ILAS通常包含4个Multiframe,其中携带Lane对齐字符和链路配置数据。
接收端可以从ILAS检查:
- DID/BID/LID;
- L/M/F/K/N/N'等参数;
- Scrambling和Subclass配置;
- 各Lane是否属于同一Link;
- Lane间偏差是否能被弹性缓冲吸收。
如果CGS通过但ILAS失败,通常说明物理链路已经基本工作,应重点检查两端参数、Lane Mapping和Multiframe配置。
9.3 Data阶段
ILAS完成后进入用户数据阶段:
text
ADC Sample
↓
Transport Mapping
↓
Scrambler
↓
8b/10b + GT
↓
FPGA解码、去扰、Transport还原
进入Data阶段不等于采样数据一定正确。还要检查样本位宽、符号位、通道顺序、Tail Bit、Control Bit和HD打包。
十、JESD204C链路需要关注什么
JESD204C提高了编码效率与支持线速率,并引入64b/66b相关的Block、Multiblock和Extended Multiblock同步结构。
10.1 与JESD204B调试思路的差异
| JESD204B 8b/10b | JESD204C 64b/66b |
|---|---|
| 关注Comma与K字符 | 关注Sync Header与Block Lock |
| CGS/ILAS/Data | Block同步、Multiblock/Extended Multiblock同步、Data |
| 20%编码开销 | 约3.03%编码开销 |
| LMFC | LEMC等扩展边界概念 |
常见SYNC~链路控制 |
控制和错误机制依所选模式变化 |
10.2 不要混用IP配置
转换器设置为JESD204C 64b/66b,而FPGA仍使用JESD204B 8b/10b IP时,即使Lane Rate相同也不可能建立链路。
必须同步确认:
- 标准版本;
- 线路编码;
- Lane Rate;
- Lane数量;
- FEC是否涉及;
- Multiblock/Extended Multiblock参数;
- Subclass和SYSREF方式。
十一、JESD系统中的时钟
JESD工程至少会遇到四类时钟。
11.1 Converter Device Clock
它决定ADC采样或DAC更新时刻。其抖动直接影响转换器SNR和相位噪声性能。
11.2 GT Reference Clock
GT参考时钟用于产生串行Lane Rate。它必须进入FPGA专用MGT参考时钟引脚,并连接到目标GT Quad允许的参考时钟资源。
11.3 JESD Core Clock
JESD Link Layer与PHY并行数据接口使用Core Clock。Core Clock与Lane Rate、线路编码和GT内部并行宽度有关。
例如8b/10b模式下,若每Lane的PHY并行接口每拍处理4 Byte,则可粗略理解为:
C o r e C l o c k = L a n e R a t e 10 × 4 CoreClock=\frac{LaneRate}{10\times4} CoreClock=10×4LaneRate
真实关系必须以JESD204 PHY生成配置中的GT Data Width和PG198说明为准。
11.4 AXI4-Lite管理时钟
AXI4-Lite寄存器接口通常使用较低速的稳定时钟,例如100 MHz。它可以与JESD Core Clock不同,但IP内部或系统连接必须包含正确CDC。
11.5 推荐时钟树
#mermaid-svg-JcJYelnRG1jw2sbA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JcJYelnRG1jw2sbA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JcJYelnRG1jw2sbA .error-icon{fill:#552222;}#mermaid-svg-JcJYelnRG1jw2sbA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JcJYelnRG1jw2sbA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JcJYelnRG1jw2sbA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JcJYelnRG1jw2sbA .marker.cross{stroke:#333333;}#mermaid-svg-JcJYelnRG1jw2sbA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JcJYelnRG1jw2sbA p{margin:0;}#mermaid-svg-JcJYelnRG1jw2sbA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JcJYelnRG1jw2sbA .cluster-label text{fill:#333;}#mermaid-svg-JcJYelnRG1jw2sbA .cluster-label span{color:#333;}#mermaid-svg-JcJYelnRG1jw2sbA .cluster-label span p{background-color:transparent;}#mermaid-svg-JcJYelnRG1jw2sbA .label text,#mermaid-svg-JcJYelnRG1jw2sbA span{fill:#333;color:#333;}#mermaid-svg-JcJYelnRG1jw2sbA .node rect,#mermaid-svg-JcJYelnRG1jw2sbA .node circle,#mermaid-svg-JcJYelnRG1jw2sbA .node ellipse,#mermaid-svg-JcJYelnRG1jw2sbA .node polygon,#mermaid-svg-JcJYelnRG1jw2sbA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JcJYelnRG1jw2sbA .rough-node .label text,#mermaid-svg-JcJYelnRG1jw2sbA .node .label text,#mermaid-svg-JcJYelnRG1jw2sbA .image-shape .label,#mermaid-svg-JcJYelnRG1jw2sbA .icon-shape .label{text-anchor:middle;}#mermaid-svg-JcJYelnRG1jw2sbA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JcJYelnRG1jw2sbA .rough-node .label,#mermaid-svg-JcJYelnRG1jw2sbA .node .label,#mermaid-svg-JcJYelnRG1jw2sbA .image-shape .label,#mermaid-svg-JcJYelnRG1jw2sbA .icon-shape .label{text-align:center;}#mermaid-svg-JcJYelnRG1jw2sbA .node.clickable{cursor:pointer;}#mermaid-svg-JcJYelnRG1jw2sbA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JcJYelnRG1jw2sbA .arrowheadPath{fill:#333333;}#mermaid-svg-JcJYelnRG1jw2sbA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JcJYelnRG1jw2sbA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JcJYelnRG1jw2sbA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JcJYelnRG1jw2sbA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JcJYelnRG1jw2sbA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JcJYelnRG1jw2sbA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JcJYelnRG1jw2sbA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JcJYelnRG1jw2sbA .cluster text{fill:#333;}#mermaid-svg-JcJYelnRG1jw2sbA .cluster span{color:#333;}#mermaid-svg-JcJYelnRG1jw2sbA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JcJYelnRG1jw2sbA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JcJYelnRG1jw2sbA rect.text{fill:none;stroke-width:0;}#mermaid-svg-JcJYelnRG1jw2sbA .icon-shape,#mermaid-svg-JcJYelnRG1jw2sbA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JcJYelnRG1jw2sbA .icon-shape p,#mermaid-svg-JcJYelnRG1jw2sbA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JcJYelnRG1jw2sbA .icon-shape .label rect,#mermaid-svg-JcJYelnRG1jw2sbA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JcJYelnRG1jw2sbA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JcJYelnRG1jw2sbA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JcJYelnRG1jw2sbA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 低相噪参考源
JESD时钟芯片/PLL
ADC/DAC Device Clock
FPGA GT Reference Clock
SYSREF
GT + JESD PHY
JESD Core Clock
Device Clock与GT Reference Clock不一定频率相同,但必须满足系统频率规划和确定性关系。不要把普通板载100 MHz逻辑时钟默认当成满足相噪要求的ADC采样时钟。
十二、FPGA端JESD IP组成
以AMD/Xilinx UltraScale/UltraScale+架构为例,工程通常包含以下模块:
text
ADC方向:
ADC TX差分Lane
↓
FPGA GTH Receiver
↓
JESD204 PHY RX
↓
JESD204B/C RX Link Core
↓
Transport Layer
↓
多通道Sample / AXI-Stream
DAC方向:
Sample / AXI-Stream
↓
Transport Layer
↓
JESD204B/C TX Link Core
↓
JESD204 PHY TX
↓
FPGA GTH Transmitter
↓
DAC RX差分Lane
12.1 JESD204 PHY IP
JESD204 PHY主要封装GT相关能力:
- GT Lane配置;
- CPLL/QPLL;
- TX/RX Reset;
- Line Rate切换;
- 8b/10b或64b/66b相关并行接口;
- DRP;
- PRBS测试;
- GT Pattern Generator;
- 收发器状态和Debug。
12.2 JESD204 TX/RX Link IP
Link IP主要处理:
- 链路状态机;
- CGS、ILAS或JESD204C同步过程;
- Scrambling;
- Lane Alignment;
- Frame/Multiframe边界;
- SYSREF捕获;
- AXI4-Lite配置与状态;
- 用户数据接口。
12.3 Transport Layer
部分ADC/DAC厂商参考工程提供专用Transport Layer,也可以根据LMFSHD参数自行编写。它负责JESD Octet与用户样本之间的打包和解包。
Transport Layer错误常表现为:
- 通道互换;
- 高低字节颠倒;
- 符号位位置错误;
- 每隔若干Sample出现错位;
- Link状态完全正常但波形不正确。
12.4 JESD IP的数据接口是不是普通AXIS
部分JESD IP使用AXI4-Stream形式的数据口,但高速转换器的数据流通常是连续的,并不一定支持任意反压。
text
普通AXIS:Sink可通过TREADY暂停Source
ADC采样:ADC不会因为FPGA FIFO满而停止模拟世界的时间
因此必须查清IP端口是否包含TREADY以及反压语义。若接收链路没有反压能力,应保证下游每拍接收,并使用足够深的FIFO处理后级短时拥塞。DAC方向若数据不足,则需要定义输出零值、重复样本、告警或关闭链路等欠载策略。
十三、Vivado中配置JESD204 IP
13.1 第一步:从转换器Mode表抄参数
建立配置记录表:
| 项目 | ADC/DAC配置 | FPGA IP配置 | 是否一致 |
|---|---|---|---|
| JESD版本 | B或C | B或C | □ |
| 编码 | 8b/10b或64b/66b | 同左 | □ |
L |
□ | ||
M |
□ | ||
F |
□ | ||
S |
□ | ||
K |
□ | ||
N/N' |
□ | ||
CS/CF/HD |
□ | ||
| Scrambling | □ | ||
| Subclass | □ | ||
| Lane Rate | □ | ||
| Lane Mapping | □ |
不要凭经验填写。先选定ADC/DAC的Mode ID,再把整行参数原样转录到设计记录中。
13.2 第二步:配置JESD204 PHY
重点参数:
- TX、RX或Duplex方向;
- Lane数量;
- 线路编码;
- Lane Rate;
- GT Reference Clock频率;
- GT类型和位置;
- CPLL/QPLL选择;
- Shared Logic放在Core还是Example Design;
- DRP和AXI4-Lite接口;
- 是否需要Line Rate动态切换。
对于XCKU5P-FFVB676-2-I,还要在Device视图确认目标GTH Channel、Common/QPLL和参考时钟引脚确实在封装中可用。
13.3 第三步:配置JESD TX或RX Core
重点参数:
- TX/RX方向;
- JESD204B或C;
L/F/K及相关链路参数;- Subclass;
- Scrambling;
- SYSREF模式;
- 用户数据宽度;
- AXI4-Lite管理接口;
- 错误报告与中断;
- 每个Link的Lane数量。
13.4 第四步:确定Shared Logic位置
很多AMD IP会提供:
text
Include Shared Logic in Core
Include Shared Logic in Example Design
单实例初次开发时,把Shared Logic包含在Core中更容易连接;多实例共享QPLL、参考时钟和复位资源时,需要统一规划Shared Logic,避免重复驱动同一个GT Common。
13.5 第五步:生成Example Design
Example Design非常重要,它展示:
- GT参考时钟缓冲;
- Core Clock生成;
- PHY与Link Core连接;
- 复位顺序;
- AXI4-Lite寄存器访问;
- SYSREF连接;
- Testbench与数据检查;
- GT和Lane约束。
推荐先独立运行Example Design,再把已经验证的时钟、复位和PHY Wrapper迁移到自己的工程。
十四、Block Design工程架构
14.1 ADC接收工程
#mermaid-svg-8Goakt9s7Ib4Zf06{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8Goakt9s7Ib4Zf06 .error-icon{fill:#552222;}#mermaid-svg-8Goakt9s7Ib4Zf06 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8Goakt9s7Ib4Zf06 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .marker.cross{stroke:#333333;}#mermaid-svg-8Goakt9s7Ib4Zf06 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8Goakt9s7Ib4Zf06 p{margin:0;}#mermaid-svg-8Goakt9s7Ib4Zf06 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster-label text{fill:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster-label span{color:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster-label span p{background-color:transparent;}#mermaid-svg-8Goakt9s7Ib4Zf06 .label text,#mermaid-svg-8Goakt9s7Ib4Zf06 span{fill:#333;color:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .node rect,#mermaid-svg-8Goakt9s7Ib4Zf06 .node circle,#mermaid-svg-8Goakt9s7Ib4Zf06 .node ellipse,#mermaid-svg-8Goakt9s7Ib4Zf06 .node polygon,#mermaid-svg-8Goakt9s7Ib4Zf06 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .rough-node .label text,#mermaid-svg-8Goakt9s7Ib4Zf06 .node .label text,#mermaid-svg-8Goakt9s7Ib4Zf06 .image-shape .label,#mermaid-svg-8Goakt9s7Ib4Zf06 .icon-shape .label{text-anchor:middle;}#mermaid-svg-8Goakt9s7Ib4Zf06 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .rough-node .label,#mermaid-svg-8Goakt9s7Ib4Zf06 .node .label,#mermaid-svg-8Goakt9s7Ib4Zf06 .image-shape .label,#mermaid-svg-8Goakt9s7Ib4Zf06 .icon-shape .label{text-align:center;}#mermaid-svg-8Goakt9s7Ib4Zf06 .node.clickable{cursor:pointer;}#mermaid-svg-8Goakt9s7Ib4Zf06 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .arrowheadPath{fill:#333333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8Goakt9s7Ib4Zf06 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8Goakt9s7Ib4Zf06 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8Goakt9s7Ib4Zf06 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster text{fill:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 .cluster span{color:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8Goakt9s7Ib4Zf06 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8Goakt9s7Ib4Zf06 rect.text{fill:none;stroke-width:0;}#mermaid-svg-8Goakt9s7Ib4Zf06 .icon-shape,#mermaid-svg-8Goakt9s7Ib4Zf06 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8Goakt9s7Ib4Zf06 .icon-shape p,#mermaid-svg-8Goakt9s7Ib4Zf06 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8Goakt9s7Ib4Zf06 .icon-shape .label rect,#mermaid-svg-8Goakt9s7Ib4Zf06 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8Goakt9s7Ib4Zf06 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8Goakt9s7Ib4Zf06 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8Goakt9s7Ib4Zf06 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ADC JESD TX
JESD PHY RX / GTH
JESD RX Link
RX Transport
AXIS Async FIFO
DSP / DDR DMA / UDP
MicroBlaze
AXI SmartConnect
SPI控制器
14.2 DAC发送工程
#mermaid-svg-B8pIVfAI69F3HMZS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B8pIVfAI69F3HMZS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B8pIVfAI69F3HMZS .error-icon{fill:#552222;}#mermaid-svg-B8pIVfAI69F3HMZS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B8pIVfAI69F3HMZS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B8pIVfAI69F3HMZS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B8pIVfAI69F3HMZS .marker.cross{stroke:#333333;}#mermaid-svg-B8pIVfAI69F3HMZS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B8pIVfAI69F3HMZS p{margin:0;}#mermaid-svg-B8pIVfAI69F3HMZS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-B8pIVfAI69F3HMZS .cluster-label text{fill:#333;}#mermaid-svg-B8pIVfAI69F3HMZS .cluster-label span{color:#333;}#mermaid-svg-B8pIVfAI69F3HMZS .cluster-label span p{background-color:transparent;}#mermaid-svg-B8pIVfAI69F3HMZS .label text,#mermaid-svg-B8pIVfAI69F3HMZS span{fill:#333;color:#333;}#mermaid-svg-B8pIVfAI69F3HMZS .node rect,#mermaid-svg-B8pIVfAI69F3HMZS .node circle,#mermaid-svg-B8pIVfAI69F3HMZS .node ellipse,#mermaid-svg-B8pIVfAI69F3HMZS .node polygon,#mermaid-svg-B8pIVfAI69F3HMZS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B8pIVfAI69F3HMZS .rough-node .label text,#mermaid-svg-B8pIVfAI69F3HMZS .node .label text,#mermaid-svg-B8pIVfAI69F3HMZS .image-shape .label,#mermaid-svg-B8pIVfAI69F3HMZS .icon-shape .label{text-anchor:middle;}#mermaid-svg-B8pIVfAI69F3HMZS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B8pIVfAI69F3HMZS .rough-node .label,#mermaid-svg-B8pIVfAI69F3HMZS .node .label,#mermaid-svg-B8pIVfAI69F3HMZS .image-shape .label,#mermaid-svg-B8pIVfAI69F3HMZS .icon-shape .label{text-align:center;}#mermaid-svg-B8pIVfAI69F3HMZS .node.clickable{cursor:pointer;}#mermaid-svg-B8pIVfAI69F3HMZS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B8pIVfAI69F3HMZS .arrowheadPath{fill:#333333;}#mermaid-svg-B8pIVfAI69F3HMZS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B8pIVfAI69F3HMZS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B8pIVfAI69F3HMZS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B8pIVfAI69F3HMZS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B8pIVfAI69F3HMZS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B8pIVfAI69F3HMZS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B8pIVfAI69F3HMZS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B8pIVfAI69F3HMZS .cluster text{fill:#333;}#mermaid-svg-B8pIVfAI69F3HMZS .cluster span{color:#333;}#mermaid-svg-B8pIVfAI69F3HMZS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B8pIVfAI69F3HMZS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B8pIVfAI69F3HMZS rect.text{fill:none;stroke-width:0;}#mermaid-svg-B8pIVfAI69F3HMZS .icon-shape,#mermaid-svg-B8pIVfAI69F3HMZS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B8pIVfAI69F3HMZS .icon-shape p,#mermaid-svg-B8pIVfAI69F3HMZS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B8pIVfAI69F3HMZS .icon-shape .label rect,#mermaid-svg-B8pIVfAI69F3HMZS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B8pIVfAI69F3HMZS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B8pIVfAI69F3HMZS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B8pIVfAI69F3HMZS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} DDR / DDS / 波形发生器
AXIS FIFO
TX Transport
JESD TX Link
JESD PHY TX / GTH
DAC JESD RX
MicroBlaze
AXI SmartConnect
SPI控制器
14.3 推荐控制面与数据面分离
text
控制面:MicroBlaze → AXI-Lite → JESD PHY/Link状态寄存器
→ SPI → Clock/ADC/DAC寄存器
数据面:ADC/DAC ↔ GT ↔ JESD Link ↔ Transport ↔ AXIS ↔ DSP/DDR
控制面运行频率可以较低;数据面必须满足连续采样吞吐。
14.4 与当前DDR和UDP工程结合
text
ADC JESD RX
↓ Sample AXIS
数字下变频 / 滤波
↓ AXIS
DDR AXIS DMA
↓ AXI4 Full
MIG DDR4
↓ AXIS读出
UDP协议栈
↓ RGMII
上位机
时钟域可能至少包括:
- JESD RX Core Clock域;
- DSP处理时钟域;
- MIG
ui_clk域; - UDP 125 MHz域;
- AXI-Lite管理时钟域。
不能因为其中几个时钟频率相近就直接跨域传输多位样本。建议在模块边界使用AXIS Async FIFO,并对状态信号进行专门CDC处理。
十五、GT参考时钟、引脚与约束
15.1 GT Lane必须连接专用收发器引脚
JESD高速差分Lane不是普通LVDS SelectIO。必须连接到器件的GT TX/RX差分引脚。
text
ADC TXP/TXN ──► FPGA GTH RXP/RXN
FPGA GTH TXP/TXN ──► DAC RXP/RXN
15.2 GT参考时钟
GT参考时钟必须连接到对应Quad可用的MGTREFCLK差分引脚。配置前检查:
- 参考时钟频率;
- P/N极性;
- 输入摆幅和终端;
- AC/DC耦合方式;
- 与目标GT Channel的可达关系;
- 是否需要共享QPLL;
- 时钟芯片输出格式。
15.3 Lane极性和Lane Mapping
PCB为方便布线可能交换P/N或Lane顺序:
text
ADC Lane 0 → FPGA GT Lane 2
ADC Lane 1 → FPGA GT Lane 0
ADC Lane 2 → FPGA GT Lane 3
ADC Lane 3 → FPGA GT Lane 1
只要器件和IP支持,可在GT或Transport层配置极性反转和Lane重映射。但必须形成明确表格,不能同时在多个层重复交换。
| 逻辑Lane | ADC/DAC引脚 | PCB网络 | FPGA GT Channel | 极性翻转 |
|---|---|---|---|---|
| 0 | 否/是 | |||
| 1 | 否/是 | |||
| 2 | 否/是 | |||
| 3 | 否/是 |
15.4 不要随意修改IP生成约束
JESD PHY和GT Wizard会生成时钟、False Path和位置相关约束。用户主要需要完成:
- GT Channel位置;
- MGT Reference Clock位置;
- SYSREF与SYNC引脚;
- 外部SPI、Reset和Alarm引脚;
- 板级时钟周期;
- 跨时钟域结构。
不要为了消除时序报错,直接把整个JESD模块设为False Path。
十六、JESD复位结构
16.1 不能只用一个总复位同时释放全部模块
推荐依赖关系:
#mermaid-svg-YuqCJCfsYlPdN7do{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YuqCJCfsYlPdN7do .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YuqCJCfsYlPdN7do .error-icon{fill:#552222;}#mermaid-svg-YuqCJCfsYlPdN7do .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YuqCJCfsYlPdN7do .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YuqCJCfsYlPdN7do .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YuqCJCfsYlPdN7do .marker.cross{stroke:#333333;}#mermaid-svg-YuqCJCfsYlPdN7do svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YuqCJCfsYlPdN7do p{margin:0;}#mermaid-svg-YuqCJCfsYlPdN7do .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YuqCJCfsYlPdN7do .cluster-label text{fill:#333;}#mermaid-svg-YuqCJCfsYlPdN7do .cluster-label span{color:#333;}#mermaid-svg-YuqCJCfsYlPdN7do .cluster-label span p{background-color:transparent;}#mermaid-svg-YuqCJCfsYlPdN7do .label text,#mermaid-svg-YuqCJCfsYlPdN7do span{fill:#333;color:#333;}#mermaid-svg-YuqCJCfsYlPdN7do .node rect,#mermaid-svg-YuqCJCfsYlPdN7do .node circle,#mermaid-svg-YuqCJCfsYlPdN7do .node ellipse,#mermaid-svg-YuqCJCfsYlPdN7do .node polygon,#mermaid-svg-YuqCJCfsYlPdN7do .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YuqCJCfsYlPdN7do .rough-node .label text,#mermaid-svg-YuqCJCfsYlPdN7do .node .label text,#mermaid-svg-YuqCJCfsYlPdN7do .image-shape .label,#mermaid-svg-YuqCJCfsYlPdN7do .icon-shape .label{text-anchor:middle;}#mermaid-svg-YuqCJCfsYlPdN7do .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YuqCJCfsYlPdN7do .rough-node .label,#mermaid-svg-YuqCJCfsYlPdN7do .node .label,#mermaid-svg-YuqCJCfsYlPdN7do .image-shape .label,#mermaid-svg-YuqCJCfsYlPdN7do .icon-shape .label{text-align:center;}#mermaid-svg-YuqCJCfsYlPdN7do .node.clickable{cursor:pointer;}#mermaid-svg-YuqCJCfsYlPdN7do .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YuqCJCfsYlPdN7do .arrowheadPath{fill:#333333;}#mermaid-svg-YuqCJCfsYlPdN7do .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YuqCJCfsYlPdN7do .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YuqCJCfsYlPdN7do .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YuqCJCfsYlPdN7do .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YuqCJCfsYlPdN7do .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YuqCJCfsYlPdN7do .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YuqCJCfsYlPdN7do .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YuqCJCfsYlPdN7do .cluster text{fill:#333;}#mermaid-svg-YuqCJCfsYlPdN7do .cluster span{color:#333;}#mermaid-svg-YuqCJCfsYlPdN7do div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YuqCJCfsYlPdN7do .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YuqCJCfsYlPdN7do rect.text{fill:none;stroke-width:0;}#mermaid-svg-YuqCJCfsYlPdN7do .icon-shape,#mermaid-svg-YuqCJCfsYlPdN7do .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YuqCJCfsYlPdN7do .icon-shape p,#mermaid-svg-YuqCJCfsYlPdN7do .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YuqCJCfsYlPdN7do .icon-shape .label rect,#mermaid-svg-YuqCJCfsYlPdN7do .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YuqCJCfsYlPdN7do .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YuqCJCfsYlPdN7do .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YuqCJCfsYlPdN7do :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 参考时钟稳定
GT PLL Reset释放
等待PLL Lock
GT TX/RX Reset释放
等待ResetDone
释放JESD PHY
释放JESD Link Core
使能Converter Link
16.2 常见状态信号
不同IP版本端口名不同,但调试时通常要观察:
text
qpll*_lock / cpll_lock
tx_reset_done
rx_reset_done
gtpowergood
rxbyteisaligned
rxcommadet
phy_ready
link_reset_done
sync_status
lane_align
link_up
16.3 复位超时
嵌入式软件中的所有等待都应有超时:
c
if (wait_mask(REG_PHY_STATUS, PHY_READY, PHY_READY, 1000000U)) {
printf("JESD PHY ready timeout\r\n");
return -1;
}
禁止使用永久while()等待。否则一旦参考时钟未锁定,系统会卡在初始化阶段且无法输出后续诊断信息。
十七、嵌入式初始化的总体原则
JESD初始化不是只配置FPGA IP。至少包含三个设备:
text
1. Clock Chip:Device Clock、GT Ref Clock、SYSREF
2. ADC/DAC:采样模式、数字路径、JESD参数、Lane与Subclass
3. FPGA:GT PHY、JESD Link、Transport和数据通路
17.1 推荐初始化顺序
#mermaid-svg-XkXcYsOEmdWJENDn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XkXcYsOEmdWJENDn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XkXcYsOEmdWJENDn .error-icon{fill:#552222;}#mermaid-svg-XkXcYsOEmdWJENDn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XkXcYsOEmdWJENDn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XkXcYsOEmdWJENDn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XkXcYsOEmdWJENDn .marker.cross{stroke:#333333;}#mermaid-svg-XkXcYsOEmdWJENDn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XkXcYsOEmdWJENDn p{margin:0;}#mermaid-svg-XkXcYsOEmdWJENDn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XkXcYsOEmdWJENDn .cluster-label text{fill:#333;}#mermaid-svg-XkXcYsOEmdWJENDn .cluster-label span{color:#333;}#mermaid-svg-XkXcYsOEmdWJENDn .cluster-label span p{background-color:transparent;}#mermaid-svg-XkXcYsOEmdWJENDn .label text,#mermaid-svg-XkXcYsOEmdWJENDn span{fill:#333;color:#333;}#mermaid-svg-XkXcYsOEmdWJENDn .node rect,#mermaid-svg-XkXcYsOEmdWJENDn .node circle,#mermaid-svg-XkXcYsOEmdWJENDn .node ellipse,#mermaid-svg-XkXcYsOEmdWJENDn .node polygon,#mermaid-svg-XkXcYsOEmdWJENDn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XkXcYsOEmdWJENDn .rough-node .label text,#mermaid-svg-XkXcYsOEmdWJENDn .node .label text,#mermaid-svg-XkXcYsOEmdWJENDn .image-shape .label,#mermaid-svg-XkXcYsOEmdWJENDn .icon-shape .label{text-anchor:middle;}#mermaid-svg-XkXcYsOEmdWJENDn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XkXcYsOEmdWJENDn .rough-node .label,#mermaid-svg-XkXcYsOEmdWJENDn .node .label,#mermaid-svg-XkXcYsOEmdWJENDn .image-shape .label,#mermaid-svg-XkXcYsOEmdWJENDn .icon-shape .label{text-align:center;}#mermaid-svg-XkXcYsOEmdWJENDn .node.clickable{cursor:pointer;}#mermaid-svg-XkXcYsOEmdWJENDn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XkXcYsOEmdWJENDn .arrowheadPath{fill:#333333;}#mermaid-svg-XkXcYsOEmdWJENDn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XkXcYsOEmdWJENDn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XkXcYsOEmdWJENDn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XkXcYsOEmdWJENDn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XkXcYsOEmdWJENDn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XkXcYsOEmdWJENDn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XkXcYsOEmdWJENDn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XkXcYsOEmdWJENDn .cluster text{fill:#333;}#mermaid-svg-XkXcYsOEmdWJENDn .cluster span{color:#333;}#mermaid-svg-XkXcYsOEmdWJENDn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XkXcYsOEmdWJENDn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XkXcYsOEmdWJENDn rect.text{fill:none;stroke-width:0;}#mermaid-svg-XkXcYsOEmdWJENDn .icon-shape,#mermaid-svg-XkXcYsOEmdWJENDn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XkXcYsOEmdWJENDn .icon-shape p,#mermaid-svg-XkXcYsOEmdWJENDn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XkXcYsOEmdWJENDn .icon-shape .label rect,#mermaid-svg-XkXcYsOEmdWJENDn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XkXcYsOEmdWJENDn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XkXcYsOEmdWJENDn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XkXcYsOEmdWJENDn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 板级电源和复位
初始化SPI/I2C/GPIO
配置时钟芯片并等待Lock
复位并配置ADC/DAC
保持Converter JESD Link关闭
配置并复位FPGA JESD PHY
等待GT PLL和ResetDone
配置JESD TX/RX Link
准备SYSREF捕获
使能Converter Link
触发SYSREF
轮询CGS/ILAS/Data或C链路状态
检查数据与确定性延迟
不同ADC/DAC对"先使能Link还是先产生SYSREF"的要求可能不同。最终顺序必须以转换器数据手册、时钟芯片手册和AMD IP Product Guide的共同要求为准。
17.2 为什么先配置时钟
如果GT参考时钟、Device Clock或SYSREF尚未稳定:
- GT PLL无法锁定;
- ADC/DAC内部数字模块无法可靠复位;
- LMFC/LEMC相位不确定;
- SYSREF可能在错误时刻被采样;
- 后续软件读到的Link错误没有诊断价值。
17.3 为什么转换器Link先保持关闭
先完成转换器寄存器配置,但暂不启动JESD数据发送,可以避免FPGA GT尚未就绪时产生不确定的链路状态。待双方参数和时钟稳定后,再按规范启动同步流程。
十八、嵌入式软件分层设计
推荐的软件目录:
text
src/
├── board/
│ ├── board_clock.c # 板级参考源和复位
│ └── board_gpio.c
├── drivers/
│ ├── clock_chip.c # 时钟芯片SPI寄存器
│ ├── converter.c # ADC或DAC SPI寄存器
│ ├── jesd_phy.c # JESD PHY AXI-Lite访问
│ └── jesd_link.c # JESD TX/RX AXI-Lite访问
├── jesd/
│ ├── jesd_config.h # LMFS、线速率和Lane映射
│ ├── jesd_bringup.c # 初始化顺序
│ └── jesd_monitor.c # 状态、错误和重同步
└── main.c
18.1 统一配置结构
c
typedef enum {
JESD_DIR_RX = 0, /* ADC -> FPGA */
JESD_DIR_TX = 1 /* FPGA -> DAC */
} jesd_direction_t;
typedef struct {
jesd_direction_t direction;
unsigned int version; /* 204B or 204C */
unsigned int lanes; /* L */
unsigned int converters; /* M */
unsigned int octets_frame; /* F */
unsigned int samples_frame; /* S */
unsigned int frames_mf; /* K */
unsigned int resolution; /* N */
unsigned int sample_width; /* N' */
unsigned int subclass;
unsigned int scrambling;
unsigned long long sample_rate_hz;
unsigned long long lane_rate_hz;
} jesd_config_t;
同一份配置应同时用于:
- 计算并检查Lane Rate;
- 选择时钟芯片配置表;
- 配置ADC/DAC;
- 检查JESD IP编译参数;
- 打印启动日志;
- 上位机记录测试配置。
18.2 不要把所有寄存器写在main.c
不推荐:
c
spi_write(0x0001, 0x81);
spi_write(0x0010, 0x24);
spi_write(0x0011, 0x03);
/* 数百行没有解释的Magic Number */
推荐使用带名称的配置表:
c
typedef struct {
uint16_t addr;
uint8_t value;
uint16_t delay_us;
} spi_reg_cfg_t;
static const spi_reg_cfg_t adc_mode_cfg[] = {
{ ADC_REG_SOFT_RESET, ADC_RESET_VALUE, 1000 },
{ ADC_REG_JESD_LANES, ADC_JESD_L4, 0 },
{ ADC_REG_JESD_SUBCLASS,ADC_JESD_SUBCLASS_1, 0 },
{ ADC_REG_JESD_SCRAMBLE,ADC_SCRAMBLE_ENABLE, 0 },
};
上面的宏是结构示例,不对应任何具体器件。真实寄存器地址和值必须替换为目标ADC/DAC数据手册内容。
十九、通用AXI-Lite寄存器访问代码
不同版本JESD IP的寄存器偏移可能变化,因此本文使用符号名,不硬编码假定的地址。
c
#include <stdint.h>
#include "xil_io.h"
static inline void jesd_wr(uintptr_t base, uint32_t reg,
uint32_t value)
{
Xil_Out32(base + reg, value);
}
static inline uint32_t jesd_rd(uintptr_t base, uint32_t reg)
{
return Xil_In32(base + reg);
}
static int jesd_wait_mask(uintptr_t base,
uint32_t reg,
uint32_t mask,
uint32_t expected,
uint32_t timeout)
{
while (timeout-- != 0U) {
if ((jesd_rd(base, reg) & mask) == expected)
return 0;
}
return -1;
}
19.1 寄存器偏移从哪里来
应该来自:
- 当前Vivado版本生成的Product Guide;
- IP的Address Map;
xparameters.h中的Base Address;- 厂商提供的驱动头文件;
- IP Example Design中的软件示例。
不要把网上另一版本的0x004/0x00C等偏移直接复制到当前工程。
二十、通用JESD初始化代码框架
下面代码展示MicroBlaze裸机程序中的初始化组织方式。函数名表示职责,不绑定某一款时钟芯片、ADC或DAC。
c
int jesd_system_init(const jesd_config_t *cfg)
{
int ret;
/* 1. 初始化控制接口 */
ret = board_gpio_init();
if (ret != 0)
return JESD_ERR_GPIO;
ret = board_spi_init();
if (ret != 0)
return JESD_ERR_SPI;
/* 2. 暂停数据面并复位转换器 */
jesd_datapath_enable(0);
converter_hw_reset_assert();
jesd_link_disable();
/* 3. 配置低抖动时钟树 */
ret = clock_chip_program(cfg);
if (ret != 0)
return JESD_ERR_CLOCK_CONFIG;
ret = clock_chip_wait_lock(CLOCK_LOCK_TIMEOUT);
if (ret != 0)
return JESD_ERR_CLOCK_UNLOCKED;
/* 4. 复位并配置ADC/DAC,但先不启动JESD Link */
converter_hw_reset_release();
delay_us(CONVERTER_RESET_DELAY_US);
ret = converter_check_chip_id();
if (ret != 0)
return JESD_ERR_CONVERTER_ID;
ret = converter_program(cfg);
if (ret != 0)
return JESD_ERR_CONVERTER_CONFIG;
converter_link_enable(0);
/* 5. 配置FPGA JESD PHY */
jesd_phy_reset_assert();
ret = jesd_phy_program(cfg);
if (ret != 0)
return JESD_ERR_PHY_CONFIG;
jesd_phy_reset_release();
ret = jesd_phy_wait_ready(PHY_READY_TIMEOUT);
if (ret != 0)
return JESD_ERR_PHY_TIMEOUT;
/* 6. 配置并释放JESD Link Core */
jesd_link_reset_assert();
ret = jesd_link_program(cfg);
if (ret != 0)
return JESD_ERR_LINK_CONFIG;
jesd_link_clear_errors();
jesd_link_reset_release();
/* 7. 准备Subclass 1同步 */
if (cfg->subclass == 1U) {
clock_chip_sysref_enable(0);
converter_arm_sysref();
jesd_link_arm_sysref();
}
/* 8. 启动转换器链路 */
converter_link_enable(1);
jesd_link_enable();
/* 9. 触发SYSREF */
if (cfg->subclass == 1U) {
clock_chip_generate_sysref_pulses(SYSREF_PULSE_COUNT);
}
/* 10. 等待链路进入DATA状态 */
ret = jesd_link_wait_data(LINK_TIMEOUT);
if (ret != 0) {
jesd_dump_status();
return JESD_ERR_LINK_TIMEOUT;
}
/* 11. 清除建立过程中允许出现的旧状态,再观察新错误 */
jesd_link_clear_errors();
jesd_datapath_enable(1);
return JESD_OK;
}
20.1 为什么每一步都检查返回值
若时钟芯片没有锁定,继续配置JESD PHY只会产生大量次生错误。初始化程序应在最接近故障源的位置停止,并打印:
- 当前步骤;
- 期望状态;
- 实际寄存器值;
- 超时时间;
- Clock/Converter/PHY/Link各层状态。
20.2 初始化失败后不要无限复位
自动重试可以保留,但必须:
- 限制次数;
- 保存每次失败阶段;
- 在重试前完整清除链路状态;
- 不要只复位Link Core而忽略GT或转换器状态;
- 多次失败后进入可诊断的Error状态。
二十一、ADC接收链路初始化
ADC是JESD发送端,FPGA是JESD接收端。
text
ADC JESD TX ─────► FPGA JESD RX
ADC接收SYNC~ ◄──── FPGA输出SYNC~
21.1 推荐步骤
- 配置时钟芯片并确认Device Clock与GT Reference Clock有效;
- ADC硬复位;
- 配置ADC模拟通道、采样率、DDC和数字输出格式;
- 配置ADC的JESD版本、LMFS、K、Scrambling、Subclass和Lane Mapping;
- ADC Link保持关闭;
- 复位并启动FPGA JESD PHY RX;
- 等待GT CDR、PLL和RX ResetDone;
- 启动JESD RX Core并使其请求同步;
- 启动ADC JESD TX;
- Subclass 1下触发SYSREF;
- 观察CGS、ILAS、Lane Alignment和Data状态;
- 启用Transport和后级FIFO。
21.2 使用ADC测试模式
链路进入Data后,不要立即用真实模拟信号判断位序。先启用ADC内部数字测试Pattern:
- 固定码;
- Ramp;
- Checkerboard;
- PN9/PN23等伪随机序列;
- 通道ID或Deskew Pattern。
测试模式可以把模拟前端与JESD数字链路分开。若Ramp顺序正确而模拟波形异常,再检查ADC前端、采样时钟和DSP。
二十二、DAC发送链路初始化
FPGA是JESD发送端,DAC是JESD接收端。
text
FPGA JESD TX ─────► DAC JESD RX
FPGA接收SYNC~ ◄──── DAC输出SYNC~
22.1 推荐步骤
- 配置时钟芯片并确认DAC Device Clock与GT Reference Clock;
- DAC硬复位;
- 配置插值、NCO、数据路径和模拟输出安全状态;
- 配置DAC JESD版本、LMFS、K、Scrambling、Subclass和Lane Mapping;
- 保持DAC模拟输出静音或关闭;
- 准备稳定的FPGA测试数据源;
- 启动JESD PHY TX并等待PLL Lock、TX ResetDone;
- 启动JESD TX Core;
- 让DAC请求同步并进入CGS/ILAS;
- Subclass 1下触发SYSREF;
- 等待DAC报告Lane与Link正常;
- 检查错误计数后再解除DAC静音。
22.2 防止DAC数据欠载
DAC无法像普通AXIS Sink一样无限等待数据。JESD TX应持续发送有效链路字符和样本。建议在用户数据不足时:
- 输出0或中点码;
- 输出最后一个样本,若系统允许;
- 切换到内部测试Pattern;
- 记录Underflow并上报;
- 必要时重新初始化数据通路。
具体策略取决于DAC数据格式和系统安全要求。
二十三、状态监控与错误处理
23.1 建议的软件状态机
#mermaid-svg-ULW9if7PTn3GDy1L{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ULW9if7PTn3GDy1L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ULW9if7PTn3GDy1L .error-icon{fill:#552222;}#mermaid-svg-ULW9if7PTn3GDy1L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ULW9if7PTn3GDy1L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ULW9if7PTn3GDy1L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L .marker.cross{stroke:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ULW9if7PTn3GDy1L p{margin:0;}#mermaid-svg-ULW9if7PTn3GDy1L defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-ULW9if7PTn3GDy1L g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-ULW9if7PTn3GDy1L g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-ULW9if7PTn3GDy1L g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-ULW9if7PTn3GDy1L g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-ULW9if7PTn3GDy1L .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-ULW9if7PTn3GDy1L .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-ULW9if7PTn3GDy1L .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-ULW9if7PTn3GDy1L .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ULW9if7PTn3GDy1L .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-ULW9if7PTn3GDy1L .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-ULW9if7PTn3GDy1L .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-ULW9if7PTn3GDy1L .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ULW9if7PTn3GDy1L .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ULW9if7PTn3GDy1L .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ULW9if7PTn3GDy1L .edgeLabel .label text{fill:#333;}#mermaid-svg-ULW9if7PTn3GDy1L .label div .edgeLabel{color:#333;}#mermaid-svg-ULW9if7PTn3GDy1L .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-ULW9if7PTn3GDy1L .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-ULW9if7PTn3GDy1L .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-ULW9if7PTn3GDy1L .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ULW9if7PTn3GDy1L .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ULW9if7PTn3GDy1L #statediagram-barbEnd{fill:#333333;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ULW9if7PTn3GDy1L .cluster-label,#mermaid-svg-ULW9if7PTn3GDy1L .nodeLabel{color:#131300;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-ULW9if7PTn3GDy1L .note-edge{stroke-dasharray:5;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-note text{fill:black;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram-note .nodeLabel{color:black;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagram .edgeLabel{color:red;}#mermaid-svg-ULW9if7PTn3GDy1L #dependencyStart,#mermaid-svg-ULW9if7PTn3GDy1L #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-ULW9if7PTn3GDy1L .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ULW9if7PTn3GDy1L :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 严重错误
重同步
超过重试次数
人工复位
POWER_UP
CLOCK_READY
PHY_READY
LINK_SYNC
RUN
RECOVER
ERROR
23.2 建议记录的状态
| 层次 | 状态或计数 |
|---|---|
| Clock | PLL Lock、SYSREF次数、失锁次数 |
| Converter | Chip ID、Alarm、JESD状态、SYSREF捕获 |
| GT | QPLL/CPLL Lock、ResetDone、CDR、PRBS错误 |
| Link | CGS、ILAS、Lane Align、Link Up、同步丢失 |
| Protocol | Disparity、Not-in-Table、Unexpected K、Block错误 |
| Data | FIFO Overflow/Underflow、Pattern Error、Sample计数 |
| System | 重试次数、最近错误步骤、启动耗时 |
23.3 错误分级
text
Warning:偶发可恢复错误,记录但不立即停机
Recoverable:请求重同步或复位Link
Fatal:参考时钟丢失、GT无法Lock、持续数据错误,停止数据面
不要看到任意一个计数器加1就无条件复位整套系统。应区分链路建立阶段的历史状态与运行阶段的新错误。
二十四、JESD仿真方法
24.1 先运行IP Example Design
验证顺序:
- JESD PHY Example Design中的GT/并行环回;
- JESD TX/RX Link Example Design;
- Transport Layer样本打包与解包;
- 完整ADC/DAC行为模型;
- DDR、DSP和UDP系统集成。
24.2 Transport Layer单元测试
构造容易识别的数据:
text
Converter 0:0x0000, 0x0001, 0x0002, ...
Converter 1:0x1000, 0x1001, 0x1002, ...
Converter 2:0x2000, 0x2001, 0x2002, ...
Converter 3:0x3000, 0x3001, 0x3002, ...
检查每个Frame、Lane和Octet的映射,能够很快发现:
- Converter顺序错误;
- Lane顺序错误;
- Sample高低字节交换;
- N与N'提取错误;
- HD模式跨字节拼接错误。
24.3 链路状态仿真
至少覆盖:
- 正常CGS→ILAS→Data;
- 某Lane延迟几个字符;
- 某Lane极性或数据错误;
- ILAS参数不一致;
- SYSREF缺失或错相;
- Link运行中丢同步;
- 下游FIFO反压或满;
- 复位在不同阶段到来。
二十五、上板调试顺序
JESD调试应从物理层向上逐级进行。
25.1 第0层:电源、SPI和器件ID
- ADC/DAC所有电源正常;
- 时钟芯片、ADC/DAC SPI可读写;
- Chip ID与Revision正确;
- Reset引脚时序正确;
- 温度和Alarm寄存器正常。
25.2 第1层:时钟
- 时钟芯片PLL Lock;
- ADC/DAC Device Clock频率正确;
- FPGA GT Reference Clock存在;
- SYSREF频率、脉冲数和相位符合配置;
- 各输出格式和摆幅正确。
25.3 第2层:GT
- QPLL/CPLL Lock;
- TX/RX ResetDone;
- GT内部Near-end或Far-end Loopback;
- PRBS发送接收无错误;
- 观察眼图或IBERT结果;
- 检查Lane极性。
25.4 第3层:JESD链路
JESD204B按顺序检查:
text
是否收到K28.5
↓
CGS是否完成
↓
ILAS是否出现
↓
ILAS参数是否匹配
↓
Lane是否对齐
↓
是否进入Data
JESD204C则检查Block Lock、Multiblock/Extended Multiblock同步和相应错误状态。
25.5 第4层:Transport数据
- 开启ADC Ramp或DAC测试Pattern;
- 检查Converter顺序;
- 检查样本位宽和符号;
- 检查每拍样本数;
- 检查FIFO Overflow/Underflow;
- 检查AXIS帧边界是否为系统自定义含义。
25.6 第5层:确定性延迟
至少重复以下过程100次:
- 复位JESD Link;
- 重新触发SYSREF;
- 建立链路;
- 测量共同触发到样本到达或DAC输出的延迟;
- 记录结果分布。
Link每次都能建立,不代表延迟每次都相同。
25.7 第6层:系统数据链
text
JESD Sample
↓
DSP
↓
DDR DMA
↓
UDP或PCIe
↓
上位机波形与频谱
逐层增加模块,并在每个边界保留计数器和ILA观察点。
二十六、ILA信号建议
26.1 JESD RX
text
gt_rx_reset_done
gt_pll_lock
rx_sync
rx_cgs_state
rx_ilas_state
rx_lane_aligned
rx_link_up
rx_disparity_error
rx_notintable_error
rx_tdata
rx_tvalid
sysref_capture
fifo_overflow
26.2 JESD TX
text
gt_tx_reset_done
gt_pll_lock
tx_sync
tx_link_state
tx_tdata
tx_tvalid
sysref_capture
fifo_underflow
26.3 ILA时钟选择
每个ILA应使用与被观察信号相同的时钟域。不要用100 MHz AXI-Lite时钟直接抓取高速JESD Core Clock域中的多位数据。
二十七、常见故障与定位
| 现象 | 优先检查 | 常见原因 |
|---|---|---|
| GT PLL不锁定 | GT参考时钟与PLL配置 | 时钟缺失、频率错误、CPLL/QPLL组合错误 |
| ResetDone不拉高 | GT复位顺序 | PLL未锁、复位时钟不存在、状态机顺序错误 |
| 一直停在CGS | Lane Rate、极性、SYNC~ | 两端速率不同、P/N反、发送器未启动 |
| CGS通过但ILAS失败 | LMFSK与Lane Mapping | 两端参数不一致、Lane顺序错误 |
| Link Up但数据乱码 | Transport参数 | N/N'、HD、字节序、Converter映射错误 |
| 只有部分Lane正常 | GT通道和PCB | 某Lane焊接、极性、均衡或参考资源问题 |
| 偶发掉Link | SI、时钟、电源 | 眼图裕量不足、参考时钟抖动、误码 |
| 每次复位延迟不同 | SYSREF与Subclass | SYSREF未捕获、相位在采样窗口边缘 |
| 多ADC通道相位随机 | LMFC/Device Clock | SYSREF分发、时钟同步或延迟补偿错误 |
| DAC输出偶发毛刺 | 数据欠载 | TX FIFO Underflow或启动时过早解除静音 |
| ADC数据周期性错位 | F/S/HD映射 | Frame边界或样本打包错误 |
| AXIS FIFO溢出 | 后级吞吐不足 | 把连续ADC流错误当成可随意反压的AXIS |
| 软件卡在初始化 | 无超时轮询 | 某状态永远不满足且没有诊断出口 |
27.1 一个实用定位原则
text
GT不Ready → 不要调LMFS和Transport
CGS不通过 → 先查物理层、速率、极性和SYNC~
CGS通过ILAS失败 → 重点查参数和Lane Mapping
Link Up数据错误 → 重点查Transport和样本格式
数据正确延迟漂移 → 重点查SYSREF、LMFC和时钟树
二十八、不同ADC/DAC更换后FPGA侧需要改什么
28.1 通常可复用
- AXI4-Lite控制框架;
- JESD PHY Wrapper的大体结构;
- 状态监控与错误日志;
- AXIS FIFO、DDR DMA和UDP数据通路;
- SPI控制器底层驱动;
- 通用初始化状态机;
- PRBS和Pattern Checker。
28.2 通常需要修改
- JESD版本与编码;
- LMFSK、N/N'、CS/CF/HD;
- Lane Rate和参考时钟;
- GT Lane数量与位置;
- Lane Mapping和极性;
- Transport Layer;
- ADC/DAC SPI寄存器表;
- SYSREF模式和时序;
- Converter Alarm与Link状态解析;
- ADC DDC、DAC插值和NCO设置。
28.3 推荐设备适配层
text
rtl/
├── jesd_common/
│ ├── jesd_phy_wrapper.v
│ ├── jesd_link_wrapper.v
│ ├── axis_sample_fifo.v
│ └── jesd_status_cdc.v
├── transport/
│ ├── adc_xxx_transport_rx.v
│ └── dac_xxx_transport_tx.v
└── board/
├── ku5p_jesd_top.v
└── ku5p_gt_clock_reset.v
software/
├── jesd_bringup.c
├── jesd_monitor.c
├── clock_xxx.c
├── adc_xxx.c
└── dac_xxx.c
协议公共层与器件私有Transport/SPI配置分离后,更换转换器不会影响DDR、UDP等后级模块。
二十九、工程配置实例
下面给出一个不绑定具体ADC型号的JESD204B RX配置例子:
text
方向:ADC → FPGA
标准:JESD204B
编码:8b/10b
Subclass:1
Scrambling:Enable
M:4
L:4
N:14
N':16
S:1
F:2
K:32
Sample Rate:250 MSPS
Lane Rate:5 Gb/s
29.1 参数验证
Frame关系:
F = M × S × N ′ 8 × L = 4 × 1 × 16 8 × 4 = 2 F=\frac{M\times S\times N'}{8\times L} =\frac{4\times1\times16}{8\times4}=2 F=8×LM×S×N′=8×44×1×16=2
Lane Rate:
L a n e R a t e = 4 × 16 × 250 MHz 4 × 10 8 = 5 Gb/s LaneRate=\frac{4\times16\times250\ \text{MHz}}{4}\times\frac{10}{8} =5\ \text{Gb/s} LaneRate=44×16×250 MHz×810=5 Gb/s
每Lane每Multiframe的Octet数:
F × K = 2 × 32 = 64 Octet F\times K=2\times32=64\ \text{Octet} F×K=2×32=64 Octet
29.2 FPGA IP配置
text
JESD204 PHY:
Direction = RX
Lanes = 4
Encoding = 8B10B
Line Rate = 5.0 Gb/s
Reference Clock = 按合法GT PLL组合选择
JESD204 RX Core:
L = 4
F = 2
K = 32
Subclass = 1
Scrambling = Enabled
Transport RX:
M = 4
S = 1
N = 14
N' = 16
HD = 0
29.3 数据输出
每个采样周期产生4个14 bit Converter样本。实际AXIS位宽可按Core Clock和并行化程度打包,例如每拍输出多个时间点的样本。具体宽度不是只由M×N决定,还要结合JESD PHY并行宽度和Transport实现。
三十、设计检查清单
协议参数
- ADC/DAC Mode ID已确定;
- JESD204B/C与编码一致;
-
L/M/F/S/K/N/N'/CS/CF/HD逐项一致; - Scrambling一致;
- Subclass一致;
- Lane Rate计算正确;
- Lane Rate在GT和IP支持范围内;
- Transport样本映射已按数据手册验证。
时钟与SYSREF
- Device Clock频率正确;
- GT Reference Clock频率和引脚正确;
- 时钟芯片PLL稳定锁定;
- SYSREF频率、类型和脉冲数正确;
- SYSREF相对Device Clock满足时序;
- 多器件SYSREF与时钟延迟经过规划;
- 多次复位后确定性延迟已统计验证。
FPGA IP与GT
- TX/RX方向正确;
- GT Lane与参考时钟位于可达Quad;
- CPLL/QPLL配置合法;
- Lane Mapping与PCB一致;
- P/N极性翻转只在一个位置处理;
- Shared Logic没有重复实例化;
- PHY、Link、Transport时钟频率匹配;
- Example Design已独立仿真或上板验证。
嵌入式初始化
- SPI/I2C/GPIO驱动正常;
- Clock Chip先配置并确认Lock;
- ADC/DAC Chip ID正确;
- 转换器JESD参数与FPGA一致;
- GT PLL Lock和ResetDone有超时检查;
- SYSREF在双方Arm后触发;
- CGS/ILAS/Data或JESD204C状态逐级检查;
- 初始化失败打印完整状态;
- 自动重试次数有限;
- 进入Data后清除旧错误再监控。
数据与系统验证
- ADC/DAC内部测试Pattern通过;
- Converter与Lane顺序正确;
- N/N'和符号位正确;
- RX无Overflow;
- TX无Underflow;
- JESD到DDR的CDC正确;
- DDR连续吞吐满足采样率;
- UDP/PCIe后级不会反向阻塞连续采样链路;
- 长时间误码和Link丢失统计为0或满足指标。
三十一、总结
JESD204不是一条简单的高速串口,而是一套连接高速数据转换器与FPGA的完整协议体系。它把多个Converter样本映射到Frame和Lane中,再通过数据链路层和高速SerDes传输。
本文最重要的结论如下:
- JESD204由Transport、Data Link和Physical三层组成,Link Up不代表Transport样本一定正确;
L/M/F/S/K/N/N'必须来自ADC/DAC Mode表,不能根据通道数和分辨率凭经验填写;- JESD204B使用8b/10b编码 ,线速率需要乘以
10/8开销; - JESD204C可使用64b/66b等编码,效率更高并支持更高线速率,但链路同步机制也不同;
- Subclass 1通过SYSREF对齐LMFC/LEMC以实现可重复延迟,SYSREF时序是系统级问题;
- AMD JESD204 PHY负责GT物理层,TX/RX Core负责链路层,Transport负责样本映射;
- JESD数据接口不能默认支持任意反压,ADC连续采样与DAC连续输出需要足够的FIFO和带宽;
- 初始化必须协调时钟芯片、ADC/DAC和FPGA IP,并对每个等待步骤设置超时;
- 调试顺序应为电源/SPI → 时钟 → GT → CGS/ILAS或Block Sync → Transport → 确定性延迟 → 系统数据链;
- 更换ADC/DAC时,GT与公共控制框架可以复用,但Transport、SPI表、LMFS和时钟配置通常需要修改。
对于当前KU5P数据采集系统,推荐采用以下分层:
text
ADC/DAC器件适配层
↕ JESD204高速Lane
JESD PHY + GT
↕ 并行PHY数据
JESD TX/RX Link Core
↕ Octet数据
器件专用Transport Layer
↕ Sample AXI-Stream
Async FIFO → DSP → DDR DMA → UDP
这种结构能够把转换器私有样本映射与通用DDR、UDP数据通路解耦,也便于后续增加不同型号ADC/DAC、多Link和多板同步功能。
参考资料
- AMD JESD204 PHY LogiCORE IP Product Guide(PG198)
- AMD JESD204C LogiCORE IP Product Guide(PG242)
- AMD JESD204 Product Guide(PG066,JESD204B)
- Analog Devices:Grasp the Critical Issues for a Functioning JESD204B Interface
- Analog Devices no-OS JESD204 RX Driver
- JEDEC JESD204系列标准入口
本文中的寄存器宏、配置表和初始化函数为工程结构示例,不对应某一款ADC/DAC。实际开发必须使用目标转换器、时钟芯片、AMD IP和Vivado版本对应的数据手册与Example Design。