任 强,姚远程,秦明伟
(1.西南科技大学 信息工程学院,绵阳 621010;2.特殊环境机器人技术四川省重点实验室,绵阳 621010)
目前,随着视觉测量系统越来越多地应用到工业检测以及军事领域,相机的分辨率以及帧率不断提高,因此产生了巨大的数据量[1]。因此相机接口逐渐成为了高速图像采集传输的瓶颈。面对越来越大的数据量,目前主流的相机接口包括USB、IEEE 1394、RS.644 LVDS、Camera Link等逐渐无法满足高精度视觉测量需求[2~7]。论文[8]中所实现的Camera Link接口协议,实测吞吐率仅为0.3GB/S。新一代的CoaXPress接口标准采用同轴电缆作为传输介质,具有传输距离长、传输速度快、使用灵活等特点逐渐成为高速相机接口的首选标准。目前CoaXPress接口在视觉测量领域正在日益普及。
CoaXPress是一种非对称的高速点对点串行通信数字接口标准。该标准允许设备(如:数字相机)通过单根同轴电缆连接到主机(如:个人电脑中的数据采集设备)。CoaXPress将传统的同轴电缆技术与最先进的高速串行数据技术相结合,使得每个CoaXPress链路最高支持6.25Gbps的数据速率以及高达13W的设备供电功率和20Mbps的控制数据传输。对于传输速率非常高的设备,可以通过链路聚合的方式以提供数倍于单根同轴电缆的传输带宽。
CoaXPress是点对点的可扩展接口,设备和主机之间的传输介质是75欧的同轴电缆。一个接口包括一个主连接和可选的多个扩展连接,这些共同构成了一个链路,每一个连接对应一根同轴电缆。如图1所示,设备端对每个连接都进行了编号,编号0为主连接,编号1到n-1是n-1条扩展连接。
图1 CoaXPress典型连接
上行连接和下行连接传输的数据均采用8B/10B编码,8B/10B是一种行业编码方式,它将8bit数据编码为10bit数据以使连接上的信号达到直流平衡,也可以通过周期性的变换来恢复时钟。
CoaXPress协议规定使用同轴电缆作为物理介质进行数据传输,所以接收端必须使用专用的硬件设备完成物理接口以及电气特性的转换,它将连接到同轴电缆的DIN 1.0/2.3接口转换为连接FPGA的FMC接口,该接口卡可支持最多4路的CoaXPress连接,每路链接支持最高数据率为6.25Gbps,可通过外部的直流电源输入为相机提供高达13W的电源。
CoaXPress接口卡将接收到的数据通过FMC传输到FPGA,为满足CoaXPress协议指定的最高传输速度单条链路6.25Gbps的传输速率,FPGA中使用吉比特收发器(MGT)接收数据[9]。吉比特收发器是XILINX公司的FPGA芯片提供的一种高速的物理收发器,包括GTP、GTX,GTH,GTZ,这些收发器根据不同的用户需求在分布在不同的FPGA产品系列,各收发器的传输速率如表1所示。
表1 各吉比特收发器速度比较
测试硬件平台采用XILINX公司的Virtex-7 690T系列FPGA,该系列FPGA具有丰富的GTH收发器资源并且GTH传输速率满足协议要求,故采用GTH收发器在物理层提供数据收发。
如图2 所示为采集系统结构,该系统主要包含N个链路逻辑模块(每条链路对应一个模块)、相机控制模块、控制总线仲裁模块以及流复用与解码模块。
链路逻辑N模块:对每个连接进行实例化,每个CoaXPress连接的逻辑是相同的,主连接被标记为0,扩展连接标记为1~N-1,详细设计见4.2节。
流复用和解码模块:该模块对来自多个CoaXPress链接的输入流进行多路复用,并通过视频接口将它们转发给用户逻辑,详细设计见4.3节。
控制总线仲裁模块:按照传输优先级对来自相机控制模块以及链路逻辑的控制数据包进行仲裁。
相机控制模块:负责对设备和主机寄存器读写、串口收发以及上位机指令解析功能,详细设计见第5节。
单链路逻辑模块主要负责对物理层数据进行串并转换、8B/10B编解码、数据校验以及链路测试。链路测试工作独立使能,用以测试链路质量,结果反映到主机寄存器,包括链路测试包生成器与链路测试包接收器。该模块还包括下行链路传输层、上行链路传输层、链路层、控制通道模块、仲裁器模块、流缓冲器和流解包器,单链路逻辑模块结构如图3所示。
下行链路传输层:该模块接收来自设备端的数据(包括图像数据和控制数据),实现底层串行数据的解串和8B/10B解码。
上行链路传输层:该模块负责发送控制数据到设备端,实现并行数据的串化和8B/10B编码以满足底层物理链路传输要求。
链路层:该模块完成所有数据包的组包和解包以及处理它们的优先级,同时负责处理下行链路的空闲字插入和上行链路的错误校验。
控制通道模块:该子模块实现了CoaXPress连接的控制通道。包括用于命令发送FIFO、确认接收FIFO、发送和接收状态机、CRC校验器以及CRC发生器。公式1为CRC校验多项式。
图2 采集系统结构
链路测试发送器:生成链路测试数据包并对发送数据包计数器进行计数,该计数器可以被主机寄存器访问。
链路测试接收器:解析链路测试包并对接收数据包和错误的数据包进行计数,接收计数器和错误计数器都可以通过内部计数器访问。
仲裁器:通过读取主机寄存器判断系统处于工作模式还是测试模式,根据模式对发送到物理层的数据进行仲裁。
流缓冲器:通过FIFO缓存图像流数据并完成数据位宽转换。
流解包器:接收高优先级的流数据包,检查它们的完整性并剥离包头。在CRC校验错误的情况下,该模块将会在该数据包的描述符中设置特定的比特指示该错误。
图3 链路逻辑模块结构
图4 流复用与解码模块结构
如图4所示,流复用和解码模块包含多相机拓扑连接设计、仲裁器、缓冲区以及流解码器模块设计。目前采集系统支持最多4个相机的同时接入,因此系统可支持4个单抽头相机与1~2个多抽头相机同时接入。为满足这样的设计,流复用与解码模块通过访问相机控制模块中的主机寄存器改变交叉开关复用逻辑以形成正确的拓扑结构,实现来自同一相机的所有链路将被连接到同一仲裁器,仲裁器负责仲裁没有优先级的数据。数据流进入缓冲区,数据的每个流被划分到相应的流解码器(一个流对应一个流解码器),缓冲区与解码器的对应关系都通过寄存器配置实现。解码器根据CoaXPress协议包格式对视频流数据包进行解包,解码器的输出为简单图像视频流接口。
4.3.1 链路与相机拓扑设计
采集系统为每个可能接入的相机都实例化了相应的处理逻辑,因此需要将来自同一相机的一个或多个数据流分配到同一逻辑进行仲裁、缓冲。交叉开关复用逻辑模块1根据SDK程序中相机选择寄存器CAM_SELECT与仲裁器选择寄存器ARB_SEL可灵活配置链路与仲裁器的连接拓扑。如图5所示,链路0、链路1连接到相机0,链路2连接到相机1,链路3不处理。这时先写入值0x00到CAM_SELECT寄存器选择第一个仲裁器,再写入0x03到ARB_SEL寄存器连接链路0和链路1到该仲裁器。写入0x01到CAM_SELECT寄存器选择第二个仲裁器,再写入0x04到ARB_SEL寄存器将链路2连接到该仲裁器。
4.3.2 相机与解码器拓扑设计
图5 链路与相机拓扑示例
为支持多相机与多个数据流的设计,一个相机可能会产生多个数据流,不同的数据流必须对应到不同的解码器,因此交叉开关复用逻辑模块2实现缓冲区与流解码器的正确拓扑连接。交叉开关复用逻辑模块2根据主机寄存器中的解码器选择寄存器DEC_SEL完成拓扑控制。每个解码器都有对应的地址段,每个地址段内包含了许多用于指示解码器工作的寄存器,先访问解码器,再对该解码器地址内DEC_SEL寄存器进行写访问。
如图6所示为相机与解码器连接拓扑示例,第一个相机连接到第一个和第二个解码器,第二个相机连接到第三个解码器,第三个相机没有连接。先访问解码器0,写入值0x00到解码器0的DEC_SEL寄存器,将解码器0与相机0连接。访问解码器1,写入值0x00到解码器1的DEC_SEL寄存器,将解码器1与相机0连接。访问解码器2,写入值0x01到解码器2的DEC_SEL寄存器,将解码器2与相机1连接。
图6 相机与解码器拓扑示例
CoaXPress协议规定通过读写相机寄存器的方式实现参数配置。CoaXPress协议兼容相机通用接口标准(GenICam)与厂商自定义寄存器地址。CoaXPress协议开放了特定地址段由厂商自定义寄存器地址,厂商自定义寄存器地址段由相机说明文件给出。每个CoaXPress相机都会提供一份基于可扩展标识语言(XML)的标准相机描述文档,文档说明了支持的CoaXPress版本、设备各个寄存器的简单介绍,包括寄存器地址值、读写权限以及访问说明等等,通过查阅该文档即可实现对不同相机的控制。
系统控制部分基于Microblaze MCS(Micro Controller System)IP实现,XILINX提供了SDK(Software Development Kit)工具实现软件程序设计,程序设计部分采用C/C++语言开发,为设计提供了极大的灵活性[10]。如图7所示为下位机程序流程图,首先程序检测连接到主机的连接数量,并设置其中一条连接为主连接,设备与主机统一通过发现速率(目前有两种发现速率1Gbps和3Gbps)通信,该过程完成匹配收发器传输比特率、确定相机拓扑(多个相机或单个相机以及各自连接数)、协商最大数据包大小等工作。参数初始化部分包括设置缓冲器FIFO大小、设置初始采集分辨率并开始采集。串口指令格式由上下位机自由约定,下位机程序实时接收、解析串口指令并将参数配置到设备寄存器。下位机不断循环串口指令接收、解析、配置过程以实现动态配置相机参数。
图7 相机控制程序流程图
系统测试基于硬件平台Virtex7-485T-FFG1761,设计工具VIVADO 2016.4。表2所示为FPGA资源占用情况,采集系统使用了较多时钟资源,所以消耗了较多的BUFG。目前采集系统最多支持4条链路,每条链路对应一个吉比特收发器(GT),消耗4个GT资源,其余资源都控制在较低水平,还剩余丰富的逻辑资源用于下一步用户逻辑开发[11,12]。
6.2.1 数据正确性与吞吐率测试方案
为进行数据正确性测试,必须采用已知的数据源,由于真实相机存在抖动以及外界环境复杂性,真实相机无法应用于数据正确性测试。如图8所示为数据正确性与吞吐率测试系统结构,图像数据源采用KAYA仪器公司的CoaXPress相机模拟源产生已知的图像数据。相机模拟源测试图片为分辨率为5120×5120的灰度图像,测试图像每行像素值从0开始累加到255(灰度数据最大值)又重新循环。FPGA内的数据校验模块内的本地数据产生单元可产生与数据源相同的图像数据与采集到的图像数据进行比对并对错误数据进行计数以验证数据传输的正确性。吞吐率测试单元根据相机采集模块输出图像的大小以及帧率计算图像采集传输吞吐率大小。
6.2.2 数据正确性与测试结果及分析
如图8所示相机采集模块解码后的简单视频流信号分别传输到时序同步单元和本地数据产生模块。本地数据产生单元检测到输入数据有效时产生与测试图片源相同的测试数据,本地数据相比于输入图像数据有一个时钟的延迟,所以第一路数据通过时序同步单元与第二路本地数据的时序匹配。
数据错误计数器error_cnt由数据校验单元输出,指示错误比特个数。采集模块图像数据输出端口位宽为128bit,图像数据计数器Total_cnt负责对接收到的有效128bit数据的计数。Total_cnt寄存器位宽为24bit,最大计数范围为0~16777215。如图9所示,已经接收到2147483520(Total_cnt*128)个比特,误比特数为0,可得误码率小于10-10。帧率计数器Frame_rate指示一秒内采集到的图像数量,图像大小计数器Image_width和Image_height分别指示采集图像的宽度以及高度。由图9测试结果可得当前传输帧率为80帧每秒,图像宽度和高度均为5120,通过式(2)可得吞吐率Throughput达到2.09GB/S.
图8 数据传输正确性测试方案
图9 数据校验结果
测试结果表明采集系统能够完成吞吐率高达2GB/s可靠稳定的高速图像采集,实现了满足CoaXPress协议的高速图像数据包解码与传输。
6.3.1 相机控制测试方案
如图8所示,相机控制软件发送指令到FPGA中的相机控制模块,该模块完成对串口指令的解析,解析成功后对相应相机寄存器读写以完成配置。相机模拟源上位机软件界面可实时显示当前配置参数,因此通过模拟源的上位机软件显示结果即可判断参数配置与相机控制是否成功。
6.3.2 相机控制结果与分析
相机参数通过串口发送,下位机的软核模块对指令进行解析并读写相应的相机寄存器完成参数配置。图10为上位机相机参数设置软件参数配置示例,图10右侧的每个参数设置都对应了相应的控制指令。例如将采集图像高度设置为5120,串口指令为“sch 5120;”,下位机将返回参数是否配置成功以及实际参数配置结果等信息。
图10 串口指令发送示例
如图11所示为CoaXPress相机模拟源上位机参数显示界面,该软件实时显示当前相机配置参数,由图11显示结果可知,图像采集分辨率已成功设置5120×5120,右侧为实时发送的测试图像,帧率为80帧每秒。
图11 相机模拟源上位机软件界面
测试结果表明,该采集系统实现了低速控制数据的传输和编码以及串口指令对相机采集动作以及参数的灵活控制,极大地简化了相机控制工作的复杂度。
实验表明,本文所设计的高速CoaXPress图像采集系统提供一种高速、灵活、可靠的CoaXPress协议图像采集方案。设计实现了单链路逻辑模块、流复用和解码模块、系统控制等模块,实现了符合CoaXPress协议的高速图像采集电路设计,实测吞吐率可达2.09GB/S。物理层采用GTH收发器,可将误码率控制在10-11以下,同时结合CRC校验保证了的采集系统的可靠性。该系统可广泛应用于高精度视觉测量系统,具有很高的实用价值。