ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于FPGA与Aurora协议的CameraLink图像光纤传输方案

基于FPGA与Aurora协议的CameraLink图像光纤传输方案 1. 项目思路与方案选型做图像传输项目的朋友应该都有体会CameraLink接口在工业相机领域扎根很深但它的传输距离和布线方式在现代系统中越来越吃紧。CameraLink线缆一般也就三五米超过这个距离要么信号衰减严重要么干扰大得没法看而且在户外或者车载这类场景下想把相机信号传到几十米外的主控端靠CameraLink几乎是做不到的。这次的项目就是把CameraLink接口采集的图像数据转成光信号走SFP光口传输。方案核心是Xilinx 7系列FPGA配合GT Transceivers Wizard生成高速收发通道再用Aurora 8B10B协议做链路编解码实现相机数据和主控端的光纤直连。做下来这套系统能稳定跑在10Gbps级别的链路速率上传输距离直接拉到几百米甚至上千米而且抗电磁干扰能力比铜缆强得多。为什么选Aurora 8B10B而不是其他高速串行方案这是有讲究的。Aurora协议是Xilinx自家的轻量级链路层协议它的设计定位就是“高效率、低开销、点对点”。相比PCIe要处理TLP包、完成复杂的事务层协商相比以太网要带上完整的MAC和PHY栈Aurora的核心思路非常直接——建立两个FPGA之间或者一个FPGA和一个支持Aurora的芯片之间的纯数据管道它只关心“怎么把数据从A端搬到B端”不关心上层跑的是什么。这正好契合图像传输的场景图像数据量大、实时性要求高、格式相对固定不需要复杂的协议栈开销。另外还有个很现实的原因——GT Transceivers Wizard生成的Aurora IP核使用起来非常“傻瓜化”。只要正确配置线速率、参考时钟、数据位宽把用户接口的收发时钟和数据信号接好链路就能自动完成通道绑定、字节对齐、时钟补偿这些底层工作。对做图像处理而不是做通信协议栈的团队来说省下的开发时间是以“人周”为单位计算的。我自己踩过不少高速串行传输的坑我的建议是如果你的项目需求就是“可靠的、可定制的、低延迟的点对点大数据流传输”Aurora 8B10B是目前生态最成熟的选择之一。如果需求是“和外部标准设备互联、要跑TCP/IP协议栈、要组网”那就别碰Aurora老实上以太网或者PCIe方案。选型这件事方向对了后面才顺。2. CameraLink图像接入与预处理2.1 CameraLink接口特性简述CameraLink协议本质上是建立在Channel Link技术之上的它的物理层用5对LVDS差分信号传递数据4对数据1对时钟每一对差分线上最多能传7位数据所以一路Channel Link理论上能传28位。CameraLink标准在此基础上定义了三种配置模式Base模式使用一个Channel Link通道传24位数据RGB88828位里剩下4位用于相机控制信号CC1-CC4和串行通信信号SerTFG、SerTC。Medium模式使用两个Channel Link通道能传48位数据适合更高位深的相机。Full模式使用三个Channel Link通道能传64位数据主要用在非常高分辨率和高帧率的场合。这次这个项目用的是Base模式接口的相机输出RGB888格式像素时钟在75MHz左右。75MHz是CameraLink标准里一个比较典型的工作频率数据率算下来就是75M × 24bit ≈ 1.8Gbps这个速率对GT来说很轻松也为后续扩展留了余量。FPGA这边接收CameraLink信号需要一颗接口芯片MDR-26接口进来的是LVDS差分信号不能直接接FPGA的普通IO。我用的接口芯片是DS90CR288ATi的经典型号它负责把4对LVDS数据差分对解码成28位并行数据同时恢复出像素时钟。需要注意的是DS90CR288A输出的是28位数据和一路时钟24位是有效图像数据4位是控制信号这4位控信里包含了行同步LVD、帧同步FVAL和数据有效DVAL三个关键信号图像采集逻辑全靠它们来定边界。2.2 图像时序抓取与数据打包拿到并行数据和像素时钟之后常规做法是用一个FIFO做跨时钟域缓冲。CameraLink的像素时钟域和FPGA内部处理时钟域是异步的直接把数据丢给后续逻辑处理时序约束和亚稳态问题会让人头疼到怀疑人生。我这里的处理链是这样的DS90CR288A输出的像素时钟作为写时钟把R、G、B三通道数据写入FIFO同时用LVD、FVAL这两个信号组合判断行有效和帧有效区间。在Vivado里直接调用FIFO IP核设置成Standard FIFO模式写端使用像素时钟读端使用用户逻辑时钟。读端出数据之后在用户逻辑里做一次帧同步判断当FVAL拉高时表示进入一帧图像DVAL拉高时表示像素有效把有效像素按行组织组织完一行就往下游的Aurora发送接口写。有一个细节值得注意CameraLink的控制信号和像素数据是同一时刻同步输出的在写入FIFO之前最好先用像素时钟打两拍再做组合逻辑判断防止因为接口芯片输出和FPGA内部走线延迟导致建立时间不够。这个我在早期的调试里吃过亏图像偶尔出现整行错位查了半天最后发现就是时序没打拍、采样位置不对导致的。打包格式上我设计的是每行图像数据前加一个32位的行头包含帧号、行号、数据长度每帧图像结束后加一个32位的帧尾包含帧号、总行数、CRC校验。这个开销很小但到了接收端有了行头和帧尾图像重建和丢帧检测就非常方便了。2.3 图像数据位宽与Aurora接口适配CameraLink过来的数据位宽是24位RGB888而Aurora IP核的用户接口位宽是由线速率和数据位宽共同决定的。这里要先讲清楚一个基本换算关系。GT Transceivers的线速率由参考时钟和PLL配置决定而Aurora IP核的用户接口位宽是按“每个用户时钟周期能传输多少个字节”来算的。公式很简单用户接口位宽字节 线速率Gbps / 用户时钟频率MHz / 8举个例子线速率配4.0Gbps用户时钟工作在125MHz那么数据位宽就是4000 / 125 / 8 4字节也就是32位。这个32位是指Aurora IP核在用户时钟每个周期能吞吐4字节数据。回到我们的项目。之前提到像素数据率大约是1.8Gbps打包后加上各种开销大概2Gbps出头。如果用全双工模式跑Aurora每一条GT通道的线速率我配的是3.125Gbps用户时钟62.5MHz时数据位宽是6字节48位这明显大于我们需要的带宽但有富余是好事后面做图像处理算法扩容时不用重新碰硬件。那为什么要用这么“浪费”的配置因为GT有一个最低线速率的限制7系列GTX的最低参考线速率大概在1Gbps左右但实际稳定工作通常建议在2.5Gbps以上。采用3.125Gbps的线速率不仅避开了低速档的抖动问题也为后续如果需要传输更高位深或者多路CameraLink信号留了余地。硬件设计上的余量关键时候能救命这个道理我反复强调过很多次。3. Aurora 8B10B IP核配置与链路搭建3.1 GT Transceivers Wizard与Aurora IP的关系很多人一开始分不清GT Transceivers Wizard和Aurora 8B10B这两个IP的关系其实它们的分工非常明确。GT Transceivers Wizard是底层配置工具负责配置Xilinx 7系列FPGA内嵌的高速收发器GTX/GTH的物理层参数包括线速率、参考时钟频率、TX/RX极性、预加重和均衡参数等。打一个比方GT Wizard是“修路的”负责把物理道路修通。Aurora 8B10B IP则是在这条“路”上跑的“交规”和“运输协议”它负责完成链路的初始化、通道对齐、8B/10B编解码、时钟补偿、用户数据流封装。你用Aurora IP的时候它内部会自动例化GT Transceivers Wizard的配置不需要你自己再把GT单独配一遍。在Xilinx FPGA里GTX是7系列里最常见的收发器支持线速率从几百Mbps到12.5Gbps覆盖了我们这种3.125Gbps的应用绰绰有余。K7-325T这种级别的芯片GTX数量足够而且逻辑资源也能轻松容纳图像采集、缓存和传输逻辑。3.2 Aurora 8B10B IP核关键参数配置Aurora 8B10B IP核的配置界面里有几个参数项非常关键我挨个说一下我的配置思路和原因。第一个是Line Rate线速率。我配的是3.125Gbps对应GT参考时钟125MHzPLL倍频倍数选择让GT输出3.125Gbps的串行速率。板卡上如果有125MHz的SMA输入优先使用独立时钟源给GT做参考时钟不要用FPGA内部PLL分频出来的信号参考时钟的抖动会直接影响链路的误码率。第二个是GT Refclk参考时钟。这个必须从FPGA的专用时钟引脚比如GTREFCLK引脚对输入不能随随便便接到普通IO上。参考时钟的频率必须和线速率匹配3.125Gbps对应的参考时钟通常是125MHz。如果你板子上只有100MHz晶振需要通过GT的PLL配置去做倍频但是抖动性能会差一些调试时会更容易出现偶发误码。第三个是User Interface Data Width用户接口数据位宽。Aurora IP核支持2字节、4字节、8字节等几种位宽我选的是4字节32位对应62.5MHz的用户时钟。这里要说明一下Aurora的用户接口有独立的发送通道s_axi_tx_tdata和接收通道m_axi_rx_tdata都是AXI4-Stream接口握手信号简单明了比传统FIFO接口好用得多。第四个是Flow Control流控模式。Aurora IP核有UFC用户流控、Native Flow ControlNFC等选项。如果链路对端的接收端是固定速率的图像消费逻辑不担心背压问题可以直接关闭流控节省逻辑资源。如果接收端可能因为存储带宽不够而产生阻塞开启NFC会更安全。我们这个项目里对端是PCIe采集卡速度足够所以关闭了流控让图像数据以最大吞吐率转发。第五个是Little Endian / Big Endian。这个字节序选项一定要保证发送端和接收端一致否则图像颜色通道会错乱出现红蓝互换这类诡异问题。实际调试时我遇到过这个坑最后在两端统一设置成Little Endian才恢复正常。3.3 时钟方案与复位设计Aurora链路对时钟极其敏感我专门说一下时钟方案这是高速串行项目里最容易被忽视又最容易出问题的点。GT参考时钟使用板载125MHz专用差分晶振通过GTREFCLK引脚输入到FPGA的GTX Quad。这里有个设计规范同一个Quad的GT通道共享同一路参考时钟如果你把多个GT通道分到不同Quad需要为每个Quad分别提供参考时钟。Aurora用户时钟用户接口时钟由Aurora IP内部生成通常是线速率除以数据位宽字节数。3.125Gbps线速率、4字节位宽用户时钟就是3.125G / 4 / 8 ≈ 97.6MHz。不对这里我重新算一下——之前说62.5MHz是我想岔了Aurora的用户时钟计算公式是LineRate / (DataWidthBytes × 8)所以3.125Gbps / (4 × 8) 97.6MHz左右。因为8B10B编码本身的特性GT有效数据率要打一个8/10的折扣所以用户时钟频率实际是线速率 × 0.8 / 数据位宽bit即3125 × 0.8 / 32 78.125MHz。这里容易算错调试时看到IP核生成的时钟频率对不上就要回头仔细核对原始配置。复位设计方面Aurora IP核的复位信号必须在其参考时钟稳定之后释放。我做法是设计了一个电源监控模块用寄存器控制复位时序上电后先等PLL_LOCK信号拉高表示GT时钟稳定再延迟100个用户时钟周期释放复位信号。直接上电立刻释放复位链路初始化大概率失败这个我实测过很多次。4. 四套工程源码架构说明这个项目一共整理交付了4套工程源码它们面向不同的硬件平台和接口组合核心逻辑一致但板级适配和外设驱动有所差异。我把这四套工程按核心芯片型号和接口做了一个对照表工程编号核心FPGA芯片CameraLink接口SFP光口数量应用场景工程AXC7K325T-2FFG6761路Base1路单路相机长距离传输工程BXC7K325T-2FFG9002路Base2路双路相机拼接传输工程CXC7A200T-2FBG4841路Base1路低成本单路方案工程DXC7Z045-2FFG9001路Full2路绑定高带宽相机采集传输工程A是最基础的版本适合第一次接触这个方案、想快速跑通的团队。它的逻辑结构最清晰CameraLink接收 → 图像FIFO → Aurora发送链路通道绑定为1条GT通道线速率3.125Gbps逻辑代码在K7-325T上占用不到15%的寄存器资源非常适合作为学习或二次开发的起点。工程B在工程A的基础上扩展了第二路CameraLink和第二路光纤涉及两路图像数据的时间同步问题。如果你的双目相机需要保证左右两帧图像严格同步两个通道的FIFO写状态需要共享同一个帧同步信号这里用一个小技巧在两路FIFO的写使能上增加同一个标志信号作为门控确保左右两路的帧起始点对齐。工程C面向成本敏感的工业场景用的是Artix-7系列逻辑资源较少JTAG调试时要注意位流大小和芯片容量的匹配。A7-200T的GTX数量和速率足够应付单路3.125Gbps的链路但如果你后续想扩展到4路光纤同时跑A7就不太够了直接上K7会更稳妥。工程D是完整的高带宽方案对应Full模式CameraLink相机64位数据两条GT通道绑定成一组Aurora链路线速率5.0Gbps用户数据位宽更大数据吞吐率翻了接近一倍。这个工程在Zynq UltraScale上跑过PS端还能同时跑Linux用软件做图像参数配置。如果只做纯FPGA传输Zynq-7045也是个不错的选择。5. 调试经验与踩坑记录5.1 链路无法初始化或频繁断链这是最让人崩溃的问题但90%的情况出在参考时钟和复位上。排查思路很固定第一步检查GT参考时钟是否稳定。用Vivado Hardware Manager里的IBERT工具Integrated Bit Error Ratio Tester集成误码率测试工具对GT通道做回环测试如果参考时钟正确IBERT应该能显示出误码率为零的高速链路。IBERT是Xilinx提供的调试利器时钟、眼图、误码率一目了然强烈建议遇到问题先跑一遍它不要上来就查逻辑。第二步检查复位时序。Aurora IP核的复位信号释放太早会导致初始化失败至少等待PLL_LOCK稳定后再释放。这里可以做一个简易状态机监控Gt_pll_lock信号拉高后延时若干周期再释放复位。多试几次延时值找到最适合你板子的值。第三步检查参考时钟频率和线速率配置是否匹配。很多板卡的GT参考时钟并不一定是标准频率值有可能是100MHz或者156.25MHz需要根据实际频率修改GT的配置参数不能用默认值硬跑。5.2 链路通了但图像花屏、错位链路状态指示灯已经显示UP但接收端恢复的图像画面乱七八糟这个问题通常出在图像数据边界或字节序上。先说字节序问题。TX端发送一个32位的RGB888像素数据8位R 8位G 8位B 8位填充如果对端按大端方式解析R和B就会互换画面看起来会变成诡异的蓝红色调。解决方式是在两端固定使用同一个Endian配置。再说行同步丢失。图像数据打包时我加了行头和帧头但如果在接收端没有正确解析这些头部直接把有效数据按固定宽度切割就会产生行错位表现为图像整体偏移或者出现斜纹。建议在接收端增加一个同步状态机遇到行头先核对帧号和行号确认连续无误后再输出数据。一旦发现数据断裂立刻丢弃当前行重新等待下一个有效行头避免错误蔓延。5.3 光纤传输的实际衰减与误码很多人以为光纤传输是“无损”的实际上光模块的发射功率、接收灵敏度和光纤跳线质量都会影响误码率。我用的SFP光模块是10G速率等级在3.125Gbps下工作非常轻松但如果你买到的是劣质模块或者光纤弯曲角度太大仍然会出现偶发误码。调试时可以加一个统计模块对Aurora链路的mmcm_lock、channel_up、lane_up信号以及接收到的数据做CRC校验统计误码率。如果误码率在10的负12次方级别说明链路健康如果经常能数到个位数级别的错误优先排查光模块和跳线其次再怀疑FPGA侧配置。我经验里还有一个容易被忽略的点SFP光模块的电源质量。多个SFP同时工作时如果板卡供电不足光模块的激光器发射功率会下降误码率立刻飙升。给每个SFP配置独立的电源滤波电容和磁珠不要共用一条粗电源线能省掉很多玄学问题。6. 工程源码交付清单与扩展方向这4套工程源码交付时包含了完整的Vivado工程文件xpr格式、全部HDL源码、约束文件xdc、IP核配置备份以及一份设计文档。拿到工程之后最快跑通的方式是用Vivado打开xpr工程文件版本选Vivado 2018.3及以上我用2018.3验证过后续版本基本都能直接打开。根据你的具体板卡型号修改xdc文件里的引脚约束主要是CameraLink接口的差分引脚和SFP的GT引脚位置。注意GT引脚必须绑定在FPGA支持高速收发器的专用引脚上不是随便一个普通IO都行。综合、实现、生成bitstream烧录到FPGA。上电后观察Aurora链路的channel_up信号是否拉高如果没拉高参考第5节的排查步骤。接入相机先用测试图案模式如果相机支持验证传输通路再切换到真实图像。如果想把方案用在更复杂的场景基于这套代码可以做的扩展方向很多——加图像缩放、加ROI裁剪、加色彩空间转换、加H.264压缩后再传。尤其是压缩后再传带宽利用率能提升好几倍但代价是延迟从微秒级变成毫秒级是否接受取决于你的具体项目需求。我个人建议如果做工业检测类应用传输层稳定第一尽量减少协议层次和缓冲次数。这套Aurora方案的端到端延迟可以控制在几十微秒级别远优于网络传输方案这也是这个架构在工业图像传输里最有竞争力的优势。最后分享一个维护上的小技巧Aurora IP核的版本升级要谨慎不同IP版本之间的接口信号可能会有细微变化。如果你用旧工程做了大量定制开发升级IP版本之后一定要重新核对所有接口信号的定义别让“顺手升级”变成“全面翻车”。
返回列表