基于GigE Vision的高速图像采集传输系统设计*
2023-10-10赵冬青储成群单彦虎程洪涛
李 昂 赵冬青 储成群 单彦虎 程洪涛
(中北大学电子测试技术国家重点实验室 太原 030051)
1 引言
目前,实时图像采集处理系统在工业生产,军事,航海航空等领域有着广泛的应用。图像采集处理的精度和传输速度很大程度上影响着工业生产的效率[1]。高精度图像在图像采集和处理过程中都会伴随着巨大的数据吞吐量[2~4],因此需要使用传输效率更高且性能稳定的视频采集传输系统。
Xilinx 公司推出的ZYNQ-7000 系列芯片集成了Cortex-A9 双核处理器和Xilinx7 系列的FPGA(Field-Programmable Gate Array)。同时具备ARM的软件可编程性和FPGA 的硬件可编程性[5~9]。软件编程是根据顺序流程来运行,而FPGA 有并行处理的内在特点,所有硬件逻辑可以同时工作,所以对于大数据量、需要重复执行的逻辑功能,软件处理的效率远远不如硬件[10~11]。本文以ZYNQ芯片作为主控芯片,充分利用硬件可编程逻辑的优势设计了GigE Vision 协议用于上位机和FPGA 之间的通信,提高了图像采集传输速度。该系统结构具有高吞吐率、高灵活性及低延时的特点。
GigE Vision 是一种基于千兆以太网的图像传输标准。其具有传输效率高、传输距离长和可靠性高等优点[12~13]。GigE Vision 协议可分为GVCP(GigE Vision Control Protocol)和GVSP(GigE Vision Streaming Protocol)两大类。其中,GVCP 协议用于上位机对相机进行控制,GVSP 协议负责传输大量的图像数据。
2 系统整体框架设计
系统的硬件平台采用图像传感器,ZYNQ,以太网芯片共同组成的硬件平台。整体架构如图1所示,前端的图像采集部分中图像传感器将感光芯片接收到的照度信号转换成电信号,并用数字图像的方式记录和保存。ZYNQ 主控芯片负责从摄像头中获取数据,将图像数据输出到PL 端用于图像采集的IP 核,由VDMA0 负责将图像数据通过AXI 互联传至DDR3 动态存储器中进行缓存。利用VDMA1 读取DDR3 中的数据,最后通过用户自定义的IP 核根据GVSP 协议对图像数据格式进行封装,最终通过RGMII 接口传到上位机上进行显示。上位机也可以通过GVCP 协议发送控制指令到FPGA中,通过指令解析模块解析对GVCP 协议进行拆解,保留其中的关键信息并将控制指令发送至PS端,根据指令信息处理器通过SPI 接口对Sensor 进行寄存器配置,配置完成后上位机可以收到FPGA的回令。
图1 系统整体架构
2.1 图像采集模块
本文采用IMX183 CMOS 数字图像传感器。可以输出5496*3672 分辨率的黑白图像。摄像头的配置通过写寄存器实现,由PS 端通过应用程序对图像传感器寄存器进行配置。图像数据以LVDS(Low-Voltage Differential Signaling)的传输模式进行输出。读取模式设置为Readout mode No.1 像素数据深度为10bit。
图像数据以LVDS的接口形式传输到ZYNQ 的PL端,所以要先用IBUFDS(Differential Signaling Input Buffer with Selectable I/O Interface)对信号进行缓冲和转接,再通过自定义图像采集IP核将4组图像数据差分信号进行串行转并行的操作,10bit 像素图像数据取高8 位,舍弃低2 位,最终将4 组差分信号转换成32位并行数据流格式。
2.2 图像读写缓存和显示模块
VDMA(Video Direct Memory Access)是Xilinx官方推出的一款用于图像处理的IP 核,用于高带宽存储器(DDR3)和AXI-Stream 类型外设之间的通信,使视频流能够高带宽直接接入DDR3 中。VDMA 的结构框图如图2所示,该IP 有三种不同类型的接口。Memory Map 接口是一种存储映射,读写访问时会伴随一个地址,通常连接到DDR 动态存储器[14]。AXI4-Stream接口可以传输大量的数据流,与Memory Map 不同的是只给出数据并不给出相应的地址。AXI4-Lite接口相对与其他两个接口来说性能较低,使用PS 端通过此接口对VDMA 进行寄存器配置。
图2 AXI VDMA 结构框图
系统搭建示意图如图3所示,像素时钟为125M。一共用到两个VDMA IP 核,两个IP 核配置各不相同,用于图像采集的VDMA0 只需使能写通道,用于图像显示的VDMA1 只需使能读通道。将VDMA 写通道配置成Dynamic Genlock Master,读通道配置成Dynamic Genlock Slave。防止读写操作发生在同一帧,从而避免冲突。
图3 图像显示系统架构图
由于VDMA 只接收AXI-Stream 类型的视频流数据[15],要实现图像数据到DDR的传输,需要在PL端调用Video in to AXI-Stream IP 核将数据类型转换为AXI-Stream 类型。在通过VDMA0 进行写操作(S2MM)将图像数据写入DDR 中,图像数据通过AXI-Smartconnect 互联利用高速32 位AXI-HP 总线接口输出给PS 端,AXI-HP 总线接口为PL 端访问DDR 提供了高带宽的数据通路,每个HP 接口携带两个FIFO 用于数据缓存[16]。PL 端在读取DDR中存储的图像数据时,由VDMA1 进行读操作(MM2S),也是通过高速的HP 接口和AXI-Smartconnect 将DDR 中的数据传至PL 端,读出的数据流依然为AXI-Stream 类型,再通过自定义IP 核将其图像数据封装成GVSP 协议格式传输给上位机进行显示。
3 GigE Vision协议层实现方式
本文采用GigE Vision 协议作为千兆以太网的图像传输的标准。GigE Vision具有传输速度快、通讯控制便捷、传输距离长等优点[17~21]。GigE Vision是在UDP(User Datagram Protocol)协议的基础上数据传输的。因此,要实现ZYNQ 与上位机之间的通信,还需要设计实现UDP、IP 和MAC 三种协议。所设计GigE Vision 协议层主要包含GVCP 模块、GVSP模块和MAC模块。逻辑框图如图4所示。
图4 GigE Vision协议层逻辑框图
3.1 GVCP模块
GVCP 包含指令包和应答包两种数据包格式,GVCP 模块主要负责对GVCP 指令包进行解析和产生GVCP 应答包。指令包首部一共8 个字节,如图5所示。0x42 是命令指定代码,用于此模块识别GVCP 包,command 表示需要执行的指令。length和req_id 分别表示除首部外指令包的长度和ID号。应答包首部如图6所示,status 表示指令执行的状态,acknowledge 字段代表应答包类型,length和ack_id 分别代表除首部外应答包的长度和ID号。
图5 GVCP指令包首部
图6 GVCP应答包首部
GVCP 指令解析部分根据数据有效信号对MAC 模块发送的字节数据进行计数,对字节内容逐字进行解析。将command 字段指令和数据反馈给处理器,处理器接收到指令后执行相应的操作,之后返回应答信号。
GVCP 回令封装部分接受处理器返回的应答数据,其中包括指令执行状态,应答包类型和载荷数据等,根据GVCP 应答包首部进行封装。将封装后的数据输出给MAC模块。
3.2 GVSP模块
GVSP 模块根据GVSP 协议的数据格式对图像数据进行封装,图像数据以数据块为单位进行传输,每个数据块中都有头数据包、数据净荷包和尾数据包。一个数据块中仅有一个头数据包和尾数据包来表示数据块的开始和结束,头数据包和尾数据包都不包含图像数据,本文中一个数据块包含562 个数据净荷包作为图像数据传输的媒介。这三种类型的数据包拥有相同的GVSP 首部,格式如图7所示。status 用于判断数据包的传输状态,block_id 表示当前发送数据块的ID 号,每当一个尾数据包发送完成后此ID 号加1。packet_id 表示该数据块中数据包的ID 号,每发送一个GVSP类型的数据包此ID号加1,当发送一个尾数据包后将此ID号清零。packet_format用于区分GVSP 数据包的类型,当packet_id 为0 时,packet_format 为0x01 表示头数据包,头数据包的总长度为86 字节,当packet_id 为564 时,packet_format 为0x02 表示尾数据包,总长度为60 字节,packet_id 在1 到563 之间时packet_format为0x03表示数据净荷包,这里总长度为9014字节。
图7 GVSP首部
3.3 MAC模块
MAC 模块结构图如图8所示,包括MAC 接收帧解析模块、MAC 发送帧封装模块、CRC 校验模块和RGMII接口模块。
图8 MAC层结构图
MAC 层根据UDP、IP 和MAC 三种协议对数据帧进行封装和解析。以数据帧接收模块为例其状态跳转图如图9所示。首先针对RGMII 比特流进行解析得到MAC 帧数据,通过CRC 校验模块检测帧的准确性,再根据数据有效信号对MAC 帧字节进行计数,从前端码开始对MAC 帧逐字进行解析,检测目的MAC 地址、目的IP 地址和目标端口号是否与本地地址相匹配,若匹配则继续向后解析,最后将命令信息输出至GVCP 模块。若不匹配,则丢弃该帧。此处的目的MAC 地址、目的IP 地址及目标端口号都可以通过处理器利用AXI4-Lite接口进行配置。
图9 接收帧解析流程图
MAC 发送帧封装模块执行相反的过程,根据UDP、IP 和MAC 三种协议格式为GVSP 格式的图像数据包和GVCP格式的应答数据包添加UPD 首部、IP 首部和CRC 校验等信息,将封装后的数据帧通过RGMII 接口输出给上位机。采用RGMII 接口可以减少信号线数量,节约电路成本。
4 实验验证
在Vivado中搭建好硬件工程,检测无误后生成bit 流文件,将硬件信息导入SDK 开发工具中,在SDK 中通过C 语言程序对VDMA 进行配置,将编写好的控制代码放入SDK 目录下。通过上位机进行命令发送,同时下位机接收到命令后发送图像数据。最后结果使用Wireshark 软件进行验证,得到如图10所示的结果图,从图中可以看出,接受到的图像数据包符合系统设计的要求。
图10 Wireshark抓包结果图
上位机能够成功接收到图像数据并实时显示,运行显示结果如图11所示,图像分辨率为5496*3672。数据传输速度可以达到980Mbps,画面清晰稳定,上位机可以通过发送指令对系统进行复位,通过配置寄存器调节摄像头的增益、曝光时间等参数,还可以控制摄像头启动或停止传输图像数据,只传输一帧图像或者连续传输图像数据,整个系统满足设计要求。
图11 摄像头实验结果
5 结语
本文基于ZYNQ 全可编程片上系统成功搭建了图像采集显示系统,在PL 端通过设计自定义IP核实现了GigE Vision 协议传输指令信息和图像数据,充分利用可编程逻辑部分的优势,节省了ARM端的运行资源,降低了处理器的占用率,为后端分析及算法应用提供了良好的硬件平台。此系统可以应用于传输距离长、大数据量的高速图像数据传输的实际应用中。