拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CameraLink转光口方案:FPGA与Aurora 8B10B协议核心实践

1. 项目背景与方案选型思路1.1 为什么需要 CameraLink 转光口做机器视觉和工业检测的工程师对 CameraLink 接口一定不陌生。这套接口标准在工业相机领域用了很多年特点是带宽高、稳定、确定性延迟好。以 Base 配置为例3 对 Channel Link 数据通道加上 1 对时钟通道工作在 85MHz 时理论带宽能达到 2.04GbpsMedium 和 Full 配置则能跑到 5.44Gbps 甚至更高。但实际工程里总会遇到一个尴尬问题——CameraLink 线缆传输距离太短。标准 CameraLink 线缆通常建议 3 米以内虽然加装中继器如 Basler 的 Camera Link Repeater能推到 10 多米但成本上来了而且线缆又粗又硬在运动平台、机械手臂这种场合走线极其痛苦。更麻烦的是有些产线工位之间距离几十米甚至上百米总不能把相机搬过去吧。这时候把 CameraLink 转成光口就非常有价值了。光纤传输距离动辄几百米到几公里信号衰减几乎可以忽略而且光纤线径细、重量轻、抗电磁干扰能力强。在医疗影像、交通抓拍、军工电子、平板检测这类场景里CameraLink 转光纤几乎是刚需。1.2 为什么选 Aurora 8B10B 协议做 CameraLink 转光口实现方案其实不止一种。完全自定义的 SerDes 协议、RapidIO、SRIO、Aurora 各有优劣但我最终选择 Aurora 8B10B主要看重它这几个特性。首先是协议开销低。Aurora 8B10B 属于轻量级链路层协议只负责数据拆分、链路初始化、通道绑定和错误检测不像 TCP/IP 协议栈那样有沉重的封装开销。对于 CameraLink 这种实时视频流来说延迟越低越好Aurora 正好满足。其次是 Xilinx 官方维护生态好、参考设计多。在 Vivado 里通过 GT Transceivers Wizard 生成高速收发器底层再用 Aurora 8B10B IP 核把链路控制逻辑打包好工程师不需要自己写 PCS 层的字节对齐、8B10B 编解码、时钟补偿这些复杂逻辑工作量能省不少。第三是兼容性强。Aurora 8B10B 在 Xilinx 官方文档 PG046 里有详细规范链路初始化状态机是开放的只要对端也按规范实现跨厂商跨芯片互通是可行的。而且 Aurora 8B10B 支持 1~16 条通道绑定Channel Bonding这对于 CameraLink Full 配置这种大带宽需求来说扩展空间很充裕。还有一点很关键8B10B 编解码自带 DC 平衡和游程长度限制对光模块这种交流耦合链路非常友好。不像 64B66B 那样对时钟恢复要求更苛刻也不像纯 NRZ 编码那样容易出现连续长 0 或长 1 导致 CDR 锁定异常。工业环境里稳定比什么都重要。1.3 整体架构图与数据流规划这套系统的顶层架构核心是一条流水线CameraLink 接口接收图像数据 → FPGA 逻辑将并行数据整理成用户数据流 → 经过 Aurora 发送端 FIFO 送入 GT Transceiver → SFP 光模块发出去。接收方向则刚好相反。下面我用文字把这幅数据流图描述清楚方便你对整体有个认识CameraLink 相机输出 → CameraLink 连接器/线缆 → 板卡上的 DS90CR288A/DS90UB914ACameraLink 解串器→ FPGA 的 IO 引脚接收 28bit 并行数据 4 个 LVDS 时钟 → FPGA 内做数据对齐与格式转换 → 写入异步 FIFO → Aurora 8B10B IP 核用户逻辑接口 → GT Transceivers Wizard 生成的收发器通道 → SFP 光模块 → 光纤 → 远端接收板。接收方向就是反向流程光信号进来后经过 SFP 光模块转成电信号GT 完成时钟恢复和串并转换Aurora 核做字节对齐和链路管理最后恢复出的数据在 FPGA 内重新映射成 CameraLink 并行时序通过 DS90CR287 驱动器输出给后端采集卡或显示器。这套架构的关键在于两端 FPGA 的程序要按同一套 Aurora 参数配置链路速率、通道数、数据接口位宽必须严格一致。否则链路初始化就会失败表现在现象上就是接收端 User Interface 的 RX 数据一直无效或者 LINK_UP 信号拉不起来。2. CameraLink 接口采集与预处理核心细节2.1 CameraLink 接口配置深度解析CameraLink 协议在物理层其实就是 Channel Link 技术的扩展。标准的 Channel Link 是 4 对数据 LVDS 1 对时钟 LVDS而 CameraLink 在此基础上分成了 Base、Medium、Full 三种配置。Base 配置使用一个 Channel Link 连接也就是 4 对数据加 1 对时钟此时数据位宽是 28bit其中 24bit 用于图像数据4bit 用于相机控制信号CC1-CC4。在 85MHz 像素时钟下Base 模式有效带宽 2.04Gbps传 8bit 灰度图可以跑到 85MHz×24bit/8bit255MB/s够用但不算宽裕。Medium 配置在 Base 基础上增加了第二个 Channel Link只用来传输图像数据这样数据位宽变成 56bit带宽翻倍。Full 配置则是在 Base 基础上增加两组通道数据位宽达到 84bit带宽是 Base 的三倍。做工程选型时首先要确认你的相机是哪种配置。工业相机厂商如 Basler、DALSA、Vieworks 的 CameraLink 相机通常在规格书上明确标注支持 Base、Medium 还是 Full。比如 DALSA 的 Genie Nano 系列很多支持 Base 配置而 Vieworks 的高分辨率面阵相机通常需要 Full 配置才能满足满帧率输出。还有一个小细节容易踩坑就是像素时钟。CameraLink 标准支持 20MHz~85MHz 的像素时钟范围但实际很多工业相机的像素时钟是可以软件配置的。比如同样的相机在低分辨率模式可能用 40MHz在高分辨率全幅面输出时跑到 75MHz。FPGA 端要做的是无论像素时钟怎么变都能正确接收并转发因此采集模块需要具备一定的自适应能力。2.2 FPGA 端 CameraLink 数据接收实战CameraLink 的物理层是 LVDS 差分信号但 FPGA 一般不会直接接收这种信号而是通过解串器芯片先把串行 LVDS 数据转成并行 CMOS/TTL 信号。主流方案是 DS90CR288ATI 公司Base 配置或 DS90CR288A DS90CR286A 组合Medium/Full 配置。我用的是 DS90CR288A 这块经典芯片它把 4 对 LVDS 数据线和 1 对 LVDS 时钟线转换成 28bit 并行数据 1 个像素时钟。需要注意DS90CR288A 输出的是 28bit 数据这 28bit 里前 24bit 是图像数据后 4bit 是相机控制信号。具体排列规则是D0~D7图像数据通道 1对应 Channel Link 的 Tx0 输出 D8~D15图像数据通道 2 D16~D23图像数据通道 3 D24~D27相机控制信号 CC1~CC4在 FPGA 里写采集模块时要把这 28bit 信号和像素时钟同步采样。这里有一个常见的坑DS90CR288A 输出的数据是在时钟上升沿变化还是下降沿变化不同批次的芯片可能有细微差异。稳妥的做法是写一个 IO 延迟自动校准逻辑通过抓取 FVAL帧有效、LVAL行有效信号的变化沿自动调整数据采样时钟相位。2.3 图像数据预处理与时序同步策略CameraLink 接收进来的图像数据格式FVALFrame Valid、LVALLine Valid、DVALData Valid这三个信号是关键。当 FVAL 拉高期间表示当前处于有效帧LVAL 拉高期间表示当前处于有效行DVAL 配合像素数据同步输出。这些信号在转换成 Aurora 用户数据流时最简单的做法是直接透传打包把 FVAL、LVAL、DVAL 当作数据的伴随通道一起打包发送。接收端解包后直接还原成这三个有效信号配合像素数据和行场同步信息就能完整恢复出图像时序。但这里有个问题需要权衡如果把 FVAL/LVAL/DVAL 信号和像素数据完全一一对应打包数据链路利用率不高。例如 Base 配置 24bit 像素数据至少需要封装成 32bit4 字节才能对齐到 Aurora 用户接口的常用位宽这会导致 25% 的带宽浪费。我的做法是在发送端做一个小模块把 24bit 像素数据和 FVAL/LVAL/DVAL 状态位封装成 32bit 数据帧。低 24bit 放像素数据第 24~26bit 放 FVAL、LVAL、DVAL第 27~31bit 预留。这样刚好凑满 32bit 对齐一个时钟周期传一个像素带宽利用率最大化。接收端解包时从 32bit 中高位提取出 FVAL/LVAL/DVAL 状态低 24bit 提取像素数据再按 CameraLink 时序输出。这个方案在工程上很成熟我测试过在 85MHz 像素时钟下没有任何带宽瓶颈。3. GT Transceivers Wizard 与 Aurora 8B10B 核心配置实操3.1 GT 收发器的线速率计算与选择Aurora 8B10B 核底层依赖 Xilinx GT 收发器在 7 系列 FPGA 上就是 GTXKintex-7、Artix-7 高速版本或 GTHVirtex-7 高端型号在 UltraScale 系列上是 GTH/GTY。GT 收发器的物理层实现已经比较成熟我们需要关心的是线速率Line Rate怎么定。线速率计算是第一步也是最容易出错的地方。公式是Line Rate 有效数据带宽 × 编码开销系数 / 通道数。以 Base 配置 CameraLink像素时钟 85MHz24bit 像素数据为例有效数据率 85MHz × 24bit 2.04GbpsAurora 8B10B 编码是每 8bit 数据编码成 10bit 在链路上传输所以物理层开销是数据量的 1.25 倍物理层数据率 2.04Gbps × 1.25 2.55Gbps如果使用 1 条 GT 通道线速率需要 ≥ 2.55Gbps。但 GT 收发器的线速率档位不是任意选的GTX 在 7 系列上典型范围是 480Mbps~12.5Gbps不同速度等级略有差异而且需要满足 QPLL/CPLL 的可配置性。经查 Vivado 的 GT Wizard2.55Gbps 这个速率在很多器件上是可以精确生成的但我更倾向于选一个留有裕量的档位比如 3.125Gbps。为什么选 3.125Gbps 而不是刚好卡在 2.55Gbps因为 Aurora 协议本身还有链路开销初始化序列、用户 K 码等而且线速率接近临界值会让时钟恢复压力增大。3.125Gbps 是 GTX 收发器非常成熟的档位大量 1G/10G 以太网设计都在用这个速率附近参考设计和调试经验都丰富。带宽利用率 2.55/3.125 81.6%符合 Aurora 轻量协议的开销比例完全够用。如果是 Full 配置的 CameraLink像素时钟还是 85MHz但数据位宽变成 84bit有效数据率 85MHz × 84bit 7.14Gbps物理层数据率 7.14 × 1.25 8.925Gbps这时单条 GT 通道就比较吃力了工程上通常用 2 条 GT 通道绑定每条通道线速率 8.925 / 2 4.4625Gbps取 5Gbps 档位就有余量了。Aurora 核会做多通道绑定把两条通道的字节交错分发实现逻辑上的双倍带宽。3.2 GT Transceivers Wizard 配置要点详解在 Vivado 里创建 GT Transceivers Wizard IP 核Xilinx 官方 IPPG182需要关注的配置项有好几处任何一个设错都可能导致链路起不来。第一步是选参考时钟REFCLK。在 7 系列 FPGA 上GTX 的参考时钟一般从专用参考时钟引脚如 MGTREFCLK输入频率通常选择 125MHz 或 100MHz。GT Wizard 会根据你设定的线速率和参考时钟频率自动算出分频比。我习惯用 125MHz 参考时钟因为 3.125Gbps 线速率下刚好可以整数分频3.125Gbps / 125MHz 25 倍频正好在 GTX 的 PLL 锁定范围内。这是纯经验值你换成 100MHz 参考时钟也能算只是分频系数不是整数测试下来也能锁但稳定性略差。第二步是设置 TX/RX 数据位宽。Aurora 8B10B 核建议 GT 的内部数据位宽设为 2 字节16bit或 4 字节32bit这和 Aurora 用户接口的位宽配置有关。我通常把 GT Wizard 的 Internal Data Width 设为 4 字节32bit这样在 3.125Gbps 线速率下内部用户时钟 3.125Gbps / 32bit 97.65625MHz。这个频率高于 CameraLink 的 85MHz 像素时钟满足数据流从慢速时钟域到快速时钟域的跨时钟处理要求。第三步是开启 RX CDR时钟数据恢复相关选项。GT Wizard 里有一个 RX Equalization 选项默认是 LPM低功耗模式但遇到长走线和光模块信号质量下降时改成 DFE决策反馈均衡模式会更稳妥。代价是功耗略高但对光链路这种长距离传输场景DFE 的抗码间干扰能力更可靠。如果你的光模块质量一般或者光纤链路长建议改成 DFE。第四步是注意 CPLL 和 QPLL 的选择。单通道低速率用 CPLL 够用多通道绑定比如 4 通道 Aurora就必须用 QPLL因为 QPLL 可以同时给多个 GT 通道提供时钟保证通道间的相位一致性。3.3 Aurora 8B10B IP 核搭建方法与参数关联GT Wizard 配置好之后再创建 Aurora 8B10B IP 核Xilinx 官方 IPPG046。这个 IP 核会把链路初始化、通道绑定、错误检测这些逻辑封装好用户只需要处理 User Interface。Aurora 核的配置界面里有几个关键参数必须和 GT Wizard 保持一致Line Rate必须等于 GT Wizard 里的线速率例如 3.125Gbps 参考时钟频率必须等于 GT Wizard 的参考时钟频率例如 125MHz 通道数Lanes必须小于等于 GT Wizard 创建的 GT 通道数 用户接口数据位宽Aurora 8B10B 核的 Streaming 接口每通道推荐设为 32bit对应 4 字节这些参数不匹配时Aurora 核在生成 Bitstream 时会报错误。但更隐蔽的问题是即使能生成 Bitstream链路初始化也可能异常。我在调试一款 Artix-7 板卡时GT 通道数建了 2 个Aurora 核却只配了 1 个通道结果第二条 GT 通道完全没有输出数据一直发送失败。排查了整整半天最后查原理图发现 GT 通道引脚的物理连接有问题。Aurora 核还提供两种数据接口模式Framing 和 Streaming。做视频流传输Streaming 模式更合适因为它不需要定义帧边界直接传送连续数据流。Framing 模式需要用户自己定义帧头和帧尾适合数据包格式的应用场景。我做 CameraLink 转光口时Streaming 模式开箱即用省去不少工作量。3.4 时钟架构与跨时钟域处理的关键方案时钟设计是这套系统的生命线我把时钟树梳理清楚你心里就有底了。CameraLink 像素时钟PIXCLK是来自 DS90CR288A 的输出时钟频率等于相机的像素时钟。这个时钟进入 FPGA 的普通 IO 引脚后进入采集模块完成 CameraLink 数据的同步采集。Aurora 用户时钟USER_CLK来自 GT Wizard 的输出时钟频率 线速率 /用户接口位宽 / 8 / 通道数。配置为 32bit 单通道、3.125Gbps 时USER_CLK 3.125×10^9 / 4 781.25MHz不对这里需要注意GT Wizard 内部数据位宽可能是 16bit 或 32bit而 Aurora 核的用户接口位宽再经过一个转换层。实际工程中Aurora 核输出的 USER_CLK 频率一般是你配置的 GT 内部时钟的一半或四分之一。举个具体例子GT Wizard 内部数据位宽设 32bit线速率 3.125Gbps则 GT 内部并行时钟 3.125Gbps / 32bit 97.65625MHz。Aurora 核如果配成双通道用户接口变成 64bit那么 USER_CLK 97.65625MHz 不变如果配单通道 32bitUSER_CLK 也是 97.65625MHz。这个时钟给到应用层就是跨时钟域处理的终点。跨时钟域方面CameraLink 像素时钟域85MHz到 Aurora USER_CLK 域97.6MHz之间必须加异步 FIFO。在 Vivado 里直接用 Xilinx FIFO Generator IP 核配置成异步时钟、标准读取模式数据宽度 32bit深度建议 2048。为什么需要这么深因为缓存太浅的话遇到像素时钟抖动或 Aurora 链路暂时性反压FIFO 会溢出丢数帧就花了。3.5 光模块选型与 SFP 接口电路注意事项SFP 光模块这边我踩过不少坑。最重要的一点是Aurora 8B10B 编码后输出的是标准的串行数据流光模块本质上只负责电光转换和光电转换不解析协议。所以任何支持对应速率的 SFP 模块都能用于 Aurora 链路只要你选的模块速率范围覆盖你的线速率。具体选型上3.125Gbps 线速率优先选 2.5G/3.125G 速率的 SFP 模块这类模块常见的是 850nm 多模配 OM3 光纤能传 300m配单模光纤能传更远。如果你的链路距离在 2km 以上就得选 1310nm 单模模块这类模块配单模光纤也能用到 10km只是成本更高。SFP 接口的电路设计方面FPGA 的 GT 引脚直接连接到 SFP 连接器的差分信号引脚。需要注意信号完整性SFP 座的焊盘和 GT 引脚之间的走线必须做阻抗控制100Ω 差分阻抗是标准走线长度尽量短避免接插件和过孔导致的信号反射。如果 PCB 布局紧张建议在 GT TX 端串联 0.1uF 电容做交流耦合Xilinx 器件内部已集成 DC 耦合选项但外部串联电容更保险RX 端也串联同样的电容。我遇到过一块板子 SFP 插上后链路一直不稳定时好时坏。用示波器量 GT 引脚信号发现眼图明显有塌陷展开度不够。排查到最后发现是 SFP 连接器的地引脚没有充分接地回流路径太长导致的。后来换了 SFP 座在 PCB 上增加过孔阵列问题就解决了。这类信号完整性问题在高速设计里非常容易遇到尤其在 DIY 或小批量板卡上。4. 四套工程源码的功能划分与核心模块实现4.1 四套工程源码分别解决什么场景这套项目一共提供 4 套工程源码目的很明确不同工业相机接口配置、不同传输距离和带宽需求下能各取所需。我按场景把它们分成四档。第一套CameraLink Base 配置单通道 Aurora 方案。适用于绝大多数标准工业相机工程例如 Basler acA2500-14um 这类 Base 接口的 500 万像素相机帧率 14fps 到 30fps像素时钟 85MHz 以内。这套方案是 4 套中最简单也最容易跑起来的适合初学者做基础验证和二次开发。第二套CameraLink Medium 配置单通道/双通道 Aurora 方案。Medium 的 CameraLink 相机通常应用于分辨率更高、帧率要求更严的场景比如线阵相机或高分辨率面阵相机。我有的 Medium 相机像素时钟到 60MHz但有效带宽翻倍到 3.4Gbps单纯单通道 Aurora 3.125Gbps 不够需要跑在 5Gbps 线速率或者双通道绑定。第三套CameraLink Full 配置多通道 Aurora 方案。Full 配置相机常见于高端面阵相机例如大靶面 sCMOS帧率不是很快但每帧数据量巨大。这种场景必须是双通道甚至四通道绑定才能跑满带宽。这第三套工程是双通道 Aurora 绑定方案线速率 5Gbps 两条通道用户接口 64bitUSER_CLK 依然跑在 100MHz 上下数据带宽达 10Gbps余量充足。第四套CameraLink Base 配置双通道低延迟增强方案。这套工程解决的场景比较特殊需要在传输视频流的同时把相机控制信号CC1-CC4和串口数据也透传到远端。比如远程控制相机触发拍照、查询相机状态、修改相机参数这些功能如果没有独立通道就得在视频流里插入控制包增加复杂度。这套工程里我单独划分出一条逻辑通道用 Aurora 协议中的消息通道Message Channel或自定义 K 码实现控制信号的透明传输。四套工程的 FPGA 逻辑框架是相通的核心差异在 GT 通道数和 Aurora 核参数配置以及 CameraLink 解串器芯片的数量。这套框架的复用性很强你一次学会后续改参数就能适配不同相机。4.2 核心模块代码结构解析拿第一套 Base 配置方案来拆解FPGA 顶层模块的层次结构和关键代码模块如下。camlink_rx_topCameraLink 接收顶层模块。负责把 DS90CR288A 输出的 28bit 数据 像素时钟同步进 FPGA提取 FVAL/LVAL/DVAL 和像素数据输出标准视频流接口。cl_fifo_wrapper异步 FIFO 包装模块。封装 Xilinx FIFO IP 核完成 CameraLink 像素时钟域到 Aurora USER_CLK 域的跨时钟域处理同时处理写满、读空等状态计数的输出。aurora_pkg_topAurora 发送/接收顶层模块。实例化 Aurora 8B10B IP 核把 FIFO 数据映射到 Aurora 的用户接口。发送方向把 32bit 数据写入 s_axi_tx_tdata接收方向从 m_axi_rx_tdata 读取数据。camlink_tx_topCameraLink 发送顶层模块。接收端从 Aurora 恢复出数据后重新生成 28bit CameraLink 并行格式和像素时钟驱动 DS90CR287 芯片输出。看一下关键接口代码的实现片段Aurora IP 核例化部分需要注意脱离 IP 核独立仿真的细节aurora_8b10b_0 aurora_core ( .s_axi_tx_tdata({data_hdr, pixel_data}), // 32bit 用户数据 .s_axi_tx_tvalid(fifo_dout_valid), .s_axi_tx_tready(fifo_rd_en), .m_axi_rx_tdata(recovered_data), .m_axi_rx_tvalid(rx_valid), .m_axi_rx_tlast(rx_last), .link_up(link_up), .user_clk(user_clk), .reset(reset_n), .gt_qpllclk_quad1(qpll_clk), .gt_qpllrefclk_quad1(qpll_refclk), .gt_rxp_in({1b0, gt_rxp}), .gt_rxn_in({1b0, gt_rxn}), .gt_txp_out(gt_txp), .gt_txn_out(gt_txn), .init_clk(init_clk) );这里有几个细节和初学者常掉的坑s_axi_tx_tdata 接口的位宽要严格和 IP 核配置一致32bit 就是 32bit不能 16bit 混用。gt_rxp_in 和 gt_rxn_in 是一组差分信号如果只用单个通道高位通道必须接 1b0单通道场景否则会出现链路检测异常。init_clk 一般接 50MHz 或 100MHz 的独立时钟不能和 GT 参考时钟共用ICAPE2 等比特流加载和复位逻辑依赖这个时钟。4.3 发送链路数据封包与接收链路解包的实现逻辑发送方向的数据封包逻辑核心工作是把 CameraLink 采集模块输出的 FVAL/LVAL/DVAL 和像素数据封装成 32bit 的 Aurora 用户数据帧。FVAL、LVAL、DVAL 这三个信号是伴随像素数据同步变化的在像素时钟域采样。但把它们放进 Aurora 用户数据流时存在一个时序对齐问题像素数据和这三个有效信号之间可能有 1~2 个时钟周期的错位。你直接无缝拼接的话接收端恢复图像时会出现行同步不齐的情况画面出现撕裂或偏移。我的处理方式是在采集模块里就把 FVAL/LVAL/DVAL 和像素数据流水线对齐确保三者严格同步输出。具体做法是把像素数据打两拍缓存把 FVAL/LVAL/DVAL 同步打拍直到三者对齐为止。接收方向的解包逻辑刚好反过来。Aurora 恢复出的 32bit 用户数据高位提取 FVAL/LVAL/DVAL 状态低位提取像素数据。注意接收方向也存在一个问题Aurora 链路刚建立时接收到的数据流起点是任意的可能从奇数地址开始。Aurora 核本身会处理字节对齐和通道绑定但对用户数据的帧起点我得自己通过检测 FVAL/LVAL 的跳变沿来定位。实现方式是写一个状态机等 FVAL 从低到高跳变时认为这是新一帧图像的起点从这个位置开始拼接下来的像素数据同时输出恢复的时序信号。这个方法的好处是即使链路中断后重新恢复也能迅速重新定位图像帧起点不会出现画面一直错位的情况。4.4 双通道绑定与负载均衡的设计要点第三套和第四套工程涉及双通道 Aurora双通道绑定看起来只是把 GT 通道数从 1 改成 2实际上里面有几个坑。第一个坑是数据分配的粒度。Aurora 8B10B 核的通道绑定机制处理的是字节级别的交错分发用户不需要关心具体哪个字节走到哪条通道。但用户接口的位宽必须相应扩大一倍。单通道 32bit双通道就是 64bit。也就是说用户接口一个时钟周期要提供 64bit 数据否则 Aurora 核会反压backpressure链路吞吐下来。在数据源侧64bit 数据的来源其实就是两个 32bit 的 FIFO 输出或者一个 64bit 宽度的 FIFO。我用的是一个 64bit 深度 1024 的 FIFO输入端从 CameraLink 采集模块以 32bit 写入输出端以 64bit 读出。写满标志拉高时采集模块暂停写入防止溢出。Aurora 核的 tready 信号作为读使能配合实现数据流的供需匹配。第二个坑是两通道的时延差。每条 GT 通道在接收端的字节对齐延迟可能不同导致两通道恢复出的数据在时间轴上存在偏差。Aurora 核内部有通道绑定逻辑channel bonding来自动补偿这种偏差但前提是输入到核的 GT 通道配置必须一致包括参考时钟、线速率、极性设置。第三个坑是极性设置。如果你的 PCB 布线时 GT 差分对的 P/N 反了需要在 GT Wizard 或 Aurora 核里配置 TX/RX 极性反转。每个通道可以独立配置极性这是一个很容易被忽略的细节。双通道的一根线极性接反最典型的故障现象就是只有一半数据恢复出来图像只有奇偶行或左右半幅。5. 系统调试、常见故障排查与工程化经验5.1 上电初始化顺序与硬件检查清单上电调试是所有环节里最考验耐心的。我总结了一套硬件检查清单照着走能少走很多弯路。先查电源。GT 收发器需要独立的模拟电源MGTAVCC 和 MGTAVTT这两个电压的值要严格按照 FPGA 器件手册设置。7 系列 GTX 是 1.0VMGTAVCC和 1.2VMGTAVTTUltraScale 的 GTH 是 0.9V 和 1.2V。电压差了 10% 以上链路就可能不稳定。再查时钟。用示波器量参考时钟引脚确认频率、幅度、上升沿是否符合要求。参考时钟的焊接不良、串阻过大会导致 GT PLL 锁不上。接下来检查 CameraLink 解串器芯片。上电后先看 PIXCLK 有没有输出如果 PIXCLK 有输出但数据线上全高或全低大概率是芯片未正确配置或 LVDS 输入线序有问题。检查 DS90CR288A 的 PDBPower Down引脚是否拉高如果悬空芯片默认进入低功耗模式数据输出全为高阻态。SFP 模块方面插上后看模块的 LOSLoss of Signal引脚电平。LOS 拉低表示检测到光信号拉高表示没信号。如果 LOS 一直是高先查光纤是否插好、对端是否在发送光信号如果 LOS 正常但链路还是起不来就得怀疑 GT 配置有问题了。5.2 常见疑难问题与排查速查表调试这套系统时常见故障大概分成四类我列了一个速查表方便你在实验室里按图索骥。表格如下故障现象可能原因排查方法与解决方案Aurora 链路 LINK_UP 一直拉低GT 线速率与对端不匹配核对两端的线速率和 GT Wizard 配置务必一致LINK_UP 偶尔拉高但数据错误光模块型号不匹配或信号劣化换一个 3.125G/5G 速率 SFP 模块检查眼图链路正常但接收图像花屏数据字节顺序错乱或 FVAL/LVAL 对齐异常检查 28bit 拼接顺序调整数据通道映射关系图像只有左半幅或右半幅双通道绑定异常或极性接反检查 GT 通道 polarity 设置核对 PCB 差分走线丢数但无明显规律FIFO 深度不够引起溢出加大异步 FIFO 深度到 2048 或 4096检查反压逻辑高低温测试时链路不稳定光模块电源噪声大增加 SFP 供电滤波电容电源用 LDO 隔离模块第一类故障 LINK_UP 拉不起来除了参数匹配问题还有一个隐蔽原因GT 的参考时钟没锁住。在 Vivado 里调试时加上 GT 的 drp 端口或者直接用 Xilinx 的 debug 工具观测 QPLL/CPLL lock 状态比盲猜配置高效得多。我习惯在工程里加一个简单的状态指示模块把 QPLL lock、GT TX/RX reset done、Aurora link_up 这些信号引到 LED 上一眼就能看出问题出在 PLL 还是链路层。第二类故障中光模块信号劣化是最难查的因为示波器不一定能直接测量光信号质量。我的办法是用 Xilinx 内部集成的 IBERT 测试Integrated Bit Error Ratio Tester在 Vivado 里生成 IBERT 工程把 GT 通道配成环回测试模式看误码率和眼图打开程度。如果误码率高于 10^-12说明链路质量不达标优先排查光模块和 PCB 的走线。第三类故障花屏问题本质上是因为接收端的 28bit 数据和发送端没有对应上。CameraLink 的通道映射顺序在 DS90CR288A 和 DS90CR287 之间是有规范的但如果相机厂家走的是非标线序或者通过转接头连接就可能导致数据位乱序。排查方法是发一个已知图像比如彩色竖条纹测试图通过对比发送端和接收端像素值的二进制关系手工推算出映射关系然后修改代码里的位映射表即可。第四类故障双通道绑定问题最直接的手段是把两个通道分别设置为独立单通道模式先单独验证每条链路都能正常传输。再设置成绑定模式如果绑定后数据错位就检查接收端的通道绑定延迟补偿参数。Aurora 核里面有几个和绑定相关的寄存器在 Xilinx 文档 PG046 里能找到详细说明按推荐值配置一般都能解决。5.3 板级调试经验与信号完整性心得做这套系统的时间里我最大的一条体会是高速链路的问题百分之八十出在硬件而非逻辑。比如 GT 通道的 PCB 走线正因如此我把能想到的都提前优化了差分 100Ω 阻抗、走线等长控制在 ±5mil 以内、过孔数量尽量少、信号回路面积不要留太大。这些做不好再好的 FPGA 代码也白搭。具体到板卡布局上SFP 座子尽量靠近 FPGA 的 GT 引脚减少走线长度和过孔数量。FPGA 到 DS90CR288A 的 LVDS 走线同样要控制阻抗CameraLink 时钟信号和数据信号之间等长性也要保证。另外一个细节是地平面的完整性。CameraLink 解串器、GT 收发器、SFP 模块这三个区域的参考地必须完整且连续。如果地平面被电源分割成孤岛高速信号回流路径断裂会产生严重的 EMI 和信号串扰。我见过一个案例SFP 和 FPGA 中间隔了一排磁珠地平面被切断结果 3.125Gbps 信号眼图闭到打不开去掉磁珠后一切正常。散热也是被忽视的点。高速 GT 收发器发热量不小SFP 光模块也是发热源如果板卡放在密闭机箱里温度一上来误码率显著上升。我推荐在 PCB 上预留散热焊盘贴上导热垫连接到外壳散热。5.4 二次开发建议与扩展方向整套系统跑通之后扩展空间其实很大。如果你想接入更多相机只需要按这套框架再加一路 CameraLink 采集模块和对应的 Aurora 通道在发送端做个多路数据复用接收端做解复用。需要注意 GT 通道总数要够用Kintex-7 325T 这种中等规模芯片有 16 个 GTX 通道做 4 路 Base 相机转光口也够了。如果你跑的是 CameraLink 相机但想支持 PoCLPower over Camera Link则需要额外处理供电问题。PoCL 是 CameraLink 标准里扩展的供电方式利用同一根线缆给相机供电。如果相机是 PoCL 供电那么系统的 CameraLink 连接器和板卡电源部分必须符合 PoCL 规范否则插上相机后供电异常。如果你想把这套系统升级成支持图像处理功能的方案比如在 FPGA 里加白平衡、坏点校正、ROI 裁剪再走 Aurora 发送这个框架也完全兼容。像素数据经过预处理再拼接时序信号即可地址映射和带宽规划在 CameraLink 像素时钟域内完成即可。还有一点是专家系统里经常被问到的一个问题Aurora 8B10B 能不能对接非 Xilinx 器件答案是可以但前提是对端也实现了 Aurora 8B10B 协议的物理层和链路层。有些国产 FPGA 厂商提供了 Aurora 兼容 IP我在调试中验证过在速率和参数一致的前提下跨厂商的 Aurora 链路可以正常建立。但需要注意链路初始化时间可能比同厂商长一些接收端的 byte alignment 逻辑需要仔细配置。6. 写在后面的几点实操体会在这套系统的调试过程里我个人经验最深刻的几点分享给你做参考。第一拿到这类项目第一版不建议追求功能完整。先把单通道 Base 配置跑通确认 CameraLink 采集和 Aurora 链路都没有问题再加带宽、加功能。一上来就搞 Full 配置双通道绑定万一故障出现排查范围大容易让人焦头烂额。第二仿真很重要但仿真替代不了上板调试。Aurora 链路初始化时间、GT PLL 锁定时间、SFP 模块的上电时序这些在行为级仿真里都非常理想化但实际板上会有各种不确定因素。我的习惯是用逻辑分析仪ILA抓关键信号比如 link_up、fifo_almost_full、gt_txresetdone结合硬件现象逐步缩小范围。一开始抓一堆信号没有头绪后来学会分优先级——先确认时钟锁住、链路建立再看数据流是否正常。第三所有复位逻辑必须考虑 GT 收发器的特殊要求。GT 的复位时序在 Xilinx 手册里写得很清楚复位释放后必须等待 TX Reset Done 和 RX Reset Done 拉高之后才能开始链路初始化。如果复位逻辑写得太随意比如在主复位还在拉低时就启动 Aurora 核链路会一直处于初始化失败状态。第四如果你想把这套设计产品化好版本管理和工程文档要跟上。FPGA 工程的工程文件、约束文件、 IP 核配置导出文件还有各版本改动记录全得留好。尤其 IP 核的升级不是简单替换有时 GT Wizard 版本升级后默认参数变了链路密钥就对不上了这在团队协作开发时是很容易踩坑的。最后再说一个比较冷门的小技巧Aurora 核的初始化时序中有一个需要注意的地方是若干个 cycle 的 INIT 时钟。如果 init_clk 频率太低比如用的低速调试时钟链路初始化时间会变长甚至出现超时。建议 init_clk 用 50MHz 或更高不要和低功耗模式同时使用。这套系统从原理图设计到最终调到稳定整体投入的时间比我预想的多一倍。但跑通那一刻看着光纤链路上流畅输出的图像前面踩过的坑都值了。希望这篇梳理对你的 CameraLink 转光口项目有实际帮助有问题随时交流。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门