FPGA实现GTP光口视频转USB3.0 UVC,基于Aurora8B10B+FT602芯片架构,提供4套工程源码和技术支持

目录

FPGA实现GTP光口视频转USB3.0 UVC,基于Aurora8B10B+FT602芯片架构,提供4套工程源码和技术支持

FPGA基于FT602实现USB3.0 UVC 视频传输

1、前言

创作背景

什么是UVC

UVC全称为USB Video Class,即USB 视频类,是一种为 USB 视频捕获设备定义的协议标准。

USB视频设备类(USB Video Class, UVC)是由USB Implementers Forum(USB-IF)制定并维护的通用协议规范,旨在为基于USB接口的视频采集设备确立统一的通信标准。该标准定义了视频数据流、控制命令及 payload 格式,使符合规范的摄像头、摄像机等设备能够实现真正的"即插即用"(Plug-and-Play)。

其主要技术特性与优势包括:

系统无关的兼容性:完全支持UVC 1.1或更高版本的设备,可在Windows、Linux、macOS等主流操作系统中直接识别并使用,无需安装厂商专属驱动,显著降低了部署与维护的复杂性。

标准化的数据与控制接口:规范明确定义了视频流传输格式(如未压缩的YUY2/MJPEG/H.264)及设备控制单元(如亮度、对比度、对焦),确保了跨厂商设备的功能一致性与可互换性。

优化的工业应用适配:凭借其即插即用、稳定可靠及易于集成的特点,UVC摄像头广泛应用于机器视觉、视频会议、自助服务终端、嵌入式系统、物流分拣及轻型自动化产线等场景,成为工业图像采集领域中高性价比的标准化解决方案。

FPGA实现UVC现状

FPGA实现UVC,一般方案为外挂PHY芯片实现UVC物理层,FPGA内部逻辑实现UVC协议层,由于UVC具有系统无关的兼容性,所以无需驱动和额外QT上位机。目前主流的PHY芯片有CYUSB3014和FT602,二者各有千秋,就价格、功耗、设计难以程度而言,FT602略胜于CYUSB3014。

本设计使用FT602芯片实现UVC物理层,FPGA内部逻辑实现UVC协议层。

FPGA实现SFP光口视频编解码现状

目前基于Xilinx系列FPGA的SFP光口视频编解码主要有以下几种,Artix7系列的GTP、Kintex7系列的GTX、更高端FPGA器件的GTH、GTY、GTV、GTM等,线速率越来越高,应用场景也越来越高端;编码方式也是多种多样,有8b/10b编解码、64b/66b编解码、HDMI编解码、SDI编解码等等;

本设计采用7系列的GTP高速收发器自带的Aurora8B10B编解码的方式实现SFP光口视频编解码;

工程概述

本设计使用FPGA基于Aurora8B10B+FT602芯片架构实现GTP光口视频转USB3.0 UVC。

视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统摄像头,包括OV7725、OV5640和AR0135;如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后采集视频送入verilog实现的视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP IP核实现视频Aurora8B10B编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP IP核实现视频Aurora8B10B解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入verilog实现的数据对齐模块,实现错位数据对齐;然后数据送入verilog实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入纯verilog实现的图像缓存架构对采集视频做3帧缓存,缓存介质为板载DDR3/4;然后Native视频时序控制图像缓存架构从DDR中读取视频并同步输出RGB888视频流;然后RGB视频送入纯verilog实现RGB888转YUV422实现视频格式转换;同时FPGA逻辑对FT602做接口匹配对接工作,以保证FT602正常工作;然后YUV422送入纯verilog实现UVC图像处理模块,实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出;然后UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。针对市场主流需求,本博客设计并提供4套工程源码,具体如下:

现对上述4套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx-->Artix7--xc7a35tfgg484-2;

视频输入源为OV5640摄像头,如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入verilog实现的视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP IP核实现视频Aurora8B10B编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP IP核实现视频Aurora8B10B解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入verilog实现的数据对齐模块,实现错位数据对齐;然后数据送入verilog实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入纯verilog实现的图像缓存架构对采集视频做3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制图像缓存架构从DDR3中读取视频并同步输出RGB888视频流;然后RGB视频送入纯verilog实现RGB888转YUV422实现视频格式转换;同时FPGA逻辑对FT602做接口匹配对接工作,以保证FT602正常工作;然后YUV422送入纯verilog实现UVC图像处理模块,实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出,输出分辨率为1280x720@60Hz;然后UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。

此工程适用于Xilinx-Artix7系列FPGA移植修改以及后续二次开发。

工程源码2

开发板FPGA型号为Xilinx-->Artix7--xc7a35tfgg484-2;

输入视频源为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的ADV7611芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对ADV7611进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后采集视频送入verilog实现的视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP IP核实现视频Aurora8B10B编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP IP核实现视频Aurora8B10B解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入verilog实现的数据对齐模块,实现错位数据对齐;然后数据送入verilog实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入纯verilog实现的图像缓存架构对采集视频做3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制图像缓存架构从DDR3中读取视频并同步输出RGB888视频流;然后RGB视频送入纯verilog实现RGB888转YUV422实现视频格式转换;同时FPGA逻辑对FT602做接口匹配对接工作,以保证FT602正常工作;然后YUV422送入纯verilog实现UVC图像处理模块,实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出,输出分辨率为1920x1080@60Hz;然后UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。

此工程适用于Xilinx-Artix7系列FPGA移植修改以及后续二次开发。

工程源码3

开发板FPGA型号为Xilinx-->Artix7--xc7a100tfgg484-2;

视频输入源为OV5640摄像头,如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入verilog实现的视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP IP核实现视频Aurora8B10B编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP IP核实现视频Aurora8B10B解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入verilog实现的数据对齐模块,实现错位数据对齐;然后数据送入verilog实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入纯verilog实现的图像缓存架构对采集视频做3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制图像缓存架构从DDR3中读取视频并同步输出RGB888视频流;然后RGB视频送入纯verilog实现RGB888转YUV422实现视频格式转换;同时FPGA逻辑对FT602做接口匹配对接工作,以保证FT602正常工作;然后YUV422送入纯verilog实现UVC图像处理模块,实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出,输出分辨率为1280x720@60Hz;然后UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。

此工程适用于Xilinx-Artix7系列FPGA移植修改以及后续二次开发。

工程源码4

开发板FPGA型号为Xilinx-->Artix7--xc7a100tfgg484-2;

输入视频源为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的ADV7611芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对ADV7611进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后采集视频送入verilog实现的视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP IP核实现视频Aurora8B10B编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP IP核实现视频Aurora8B10B解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入verilog实现的数据对齐模块,实现错位数据对齐;然后数据送入verilog实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后视频送入纯verilog实现的图像缓存架构对采集视频做3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制图像缓存架构从DDR3中读取视频并同步输出RGB888视频流;然后RGB视频送入纯verilog实现RGB888转YUV422实现视频格式转换;同时FPGA逻辑对FT602做接口匹配对接工作,以保证FT602正常工作;然后YUV422送入纯verilog实现UVC图像处理模块,实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出,输出分辨率为1920x1080@60Hz;然后UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。

此工程适用于Xilinx-Artix7系列FPGA移植修改以及后续二次开发。

本博客详细描述了FPGA基于Aurora8B10B+FT602芯片架构实现GTP光口视频转USB3.0 UVC的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

提供完整的、跑通的工程源码和技术支持;

工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往

本博已有的FPGA驱动USB通信方案

我的博客主页开设有FPGA驱动USB通信专栏,里面全是FPGA驱动USB通信的工程源码及博客介绍;既有基于USB2.0也有USB3.0方案;包括USB2.0/3.0测速试验、USB2.0/3.0视频采集传输试验、USB2.0/3.0视频采集+图像处理后传输试验等等;所有工方案均包括FPGA工程和QT上位机源码;专栏地址链接如下:
点击直接前往

本博已有的FPGA实现UVC图传方案

我的博客主页开设有FPGA实现UVC图传专栏,里面全是FFPGA实现UVC图传的工程源码及博客介绍;既有基于USB2.0 UVC,也有USB3.0 UVC方案;既有基于CYUSB3014的UVC物理层方案,也有基于FT602的UVC物理层方案;专栏地址链接如下:
点击直接前往

本博已有的 GT 高速接口解决方案

我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往

3、详细设计方案

设计原理框图

以2路视频缩放拼接工程为例,设计原理框图如下:

输入Sensor之-->OV5640摄像头

输入Sensor是本工程的输入设备,其一为OV5640摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:

SENSOR_TYPE=0;则输出OV5640摄像头采集的视频;

SENSOR_TYPE=1;则输出动态彩条的视频;

OV5640摄像头需要i2c初始化配置,本设计配置为1280x720@30Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV5640摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV5640摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:

输入Sensor之-->ADV7611芯片解码的HDMI

输入Sensor是本工程的输入设备,其二为板载的HDMI输入接口;输入源为板载的HDMI输入接口或动态彩条,分辨率为1920x1080@60Hz,使用笔记本电脑接入HDMI输入接口,以模拟输入Sensor;HDMI解码方案为芯片解码,使用ADV7611,可将输入的HDMI视频解码为RGB888视频;FPGA纯verilog实现的i2c配置模块完成对ADV7611芯片的配置,分辨率配置为1920x1080@60Hz;可以通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:

SENSOR_TYPE=0;则输出HDMI接口采集的视频;

SENSOR_TYPE=1;则输出动态彩条的视频;

整个模块代码架构如下:

视频数据组包

由于视频需要在GTP 中通过aurora 8b/10b协议收发,所以数据必须进行组包,以适应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:

首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入GTP发送;在此之前,需要对一帧视频进行编号,也叫作指令,GTP组包时根据固定的指令进行数据发送,GTP解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好理解,所以我在代码里进行了详细的中文注释,需要注意的是,为了防止中文注释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:

注意!!!指令可以任意更改,但最低字节必须为bc;

基于GTP高速收发器的视频传输架构

本设计使用GTP高速收发器传输视频,使用Aurora8B10B编解码协议,搭建基于GTP高速收发器的视频传输架构,包括视频数据组包模块、GTP IP核配置调用、接收数据对齐模块、视频数据解包模块等部分,总体代码架构如下:

基于GTP高速收发器的视频传输架构顶层接口核参数配置如下:

本设计共例化了2路GTP,所以2路GTP的收发回环方式也做了灵活的参数化配置,如果你只需要1路GT,则可删除另一路,如果你想例化更多路GT,则可根据上述设计方法扩展,十分方便;

GTP高速收发器--IP核简介

关于GTP介绍最详细的肯定是Xilinx官方的《ug482_7Series_GTP_Transceivers》,我们以此来解读:《ug482_7Series_GTP_Transceivers》的PDF文档我已放在了资料包里;我用到的开发板FPGA型号为Xilinx--Artix7系列FPGA;带有4路GTP资源,每通道的收发速度为500 Mb/s到6.6 Gb/s之间。GTP收发器支持不同的串行传输接口或协议,比如8b/10b编解码、PCIE /2.0接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;

GTP高速收发器--基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTP 收发器在Artix7系列FPGA 芯片中的示意图;《ug482_7Series_GTP_Transceivers》第13页;GTP 的具体内部逻辑框图如下所示,它由四个收发器通道 GTPE2_CHANNEL原语 和一个GTPE2_COMMON 原语 组成。每路 GTPE2_CHANNEL 包含发送电路 TX 和接收电路 RX;《ug482_7Series_GTP_Transceivers》第14页;每个 GTPE2_CHANNEL 的逻辑电路如下图所示:《ug482_7Series_GTP_Transceivers》第15页;

GTPE2_CHANNEL的发送端和接收端功能是独立的,均由 PMA(Physical Media Attachment,物理媒介适配层)和 PCS(Physical Coding Sublayer,物理编码子层)两个子层组成。其中 PMA 子层包含高速串并转换(Serdes)、预/后加重、接收均衡、时钟发生器及时钟恢复等电路。PCS 子层包含Aurora8B10B编解码、缓冲区、通道绑定和时钟修正等电路。

这里说多了意义不大,因为没有做过几个大的项目是不会理解这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,后面我也会重点将到IP核的调用和使用;

GTP高速收发器--数据收发处理流程

首先用户逻辑数据经过Aurora8B10B编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 设计时不慎将 TXP 和 TXN 差分引脚交叉连接,则可以通过极性控制(Polarity)来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。这里的每一个功能点都可以写一篇论文甚至是一本书,所以这里只需要知道个概念即可,在具体的项目中回具体用到,还是那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。

GTP高速收发器--参考时钟

GTP 模块有两个差分参考时钟输入管脚(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作为 GTP模块的参考时钟源,用户可以自行选择。一般的A7系列开发板上,都有一路 125Mhz 的 GTP 参考时钟连接到 MGTREFCLK0/1上,作为 GTP 的参考时钟。差分参考时钟通过IBUFDS 模块转换成单端时钟信号进入到 GTPE2_COMMOM 的 PLL0 和 PLL1 中,产生 TX 和 RX 电路中所需的时钟频率。TX 和 RX 收发器速度相同的话,TX 电路和 RX 电路可以使用同一个 PLL 产生的时钟,如果 TX 和 RX收发器速度不相同的话,需要使用不同的 PLL 时钟产生的时钟。参考时钟这里Xilinx给出的GT参考例程已经做得很好了,我们调用时其实不用修改;GTP 的参考时钟结构图如下:《ug482_7Series_GTP_Transceivers》第21页;

GTP高速收发器--发送接口

《ug482_7Series_GTP_Transceivers》的第75到123页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTP例化时留给用户的发送部分需要用到的接口;用户只需要关心发送接口的时钟和数据即可,以例化2路GTP为例,经本博主优化,用户只需要关心如下GTP发送接口即可快速使用GTP;

GTP高速收发器--接收接口

《ug482_7Series_GTP_Transceivers》的第125到213页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTP例化时留给用户的发送部分需要用到的接口;用户只需要关心接收接口的时钟和数据即可,以例化2路GTP为例,经本博主优化,用户只需要关心如下GTP接收接口即可快速使用GTP;

GTP高速收发器--IP核调用和使用

GTP IP核配置调用在工程种位置如下:

GTP IP核调用和使用很简单,通过vivado的UI界面即可完成,如下:

有别于网上其他博主的教程,我个人喜欢用如下图的共享逻辑:这样选择的好处有两个,一是方便DRP变速,二是便于IP核的修改,修改完IP核后直接编译即可,不再需要打开example工程,再复制下面的一堆文件放到自己的工程什么的,玩儿个GTP需要那么复杂么?

这里对上图的标号做解释:

1:线速率,根据自己的项目需求来,GTP的范围是0.5到6.25G,由于我的项目是视频传输,所以在GTP的速率范围内均可,为了通用性,我在vivado工程中配置为5G;

2:参考时钟,这个得根据你的原理图来,可以是80M、125M、148.5M、156.25M等等,我的开发板是125M;

4:GTP组的绑定,这个很重要,他的绑定参考依据有两个,已是你的开发板原理图,而是官方的参考资料《ug482_7Series_GTP_Transceivers》,官方将GTP资源分成了4组,名字分别为X0Y0、X0Y1、X0Y2、X0Y3,由于GT资源是Xilinx系列FPGA的专用资源,占用专用的Bnak,所以引脚也是专用的,那么这些GTP组和引脚是怎么对应的呢?《ug482_7Series_GTP_Transceivers》的说明如下:红框内为的我的开发板原理图对应的FPGA引脚;

我的板子原理图如下:

选择外部数据位宽32bit的Aurora8B10B编解码,如下:

下面这里讲的是K码检测:

这里选择K28.5,也就是所谓的COM码,十六进制为bc,他的作用很多,可以表示空闲乱序符号,也可以表示数据错位标志,这里用来标志数据错位,Aurora8B10B协议对K码的定义如下:

下面讲的是时钟矫正,也就是对应GTP内部接收部分的弹性buffer;

这里有一个时钟频偏的概念,特别是收发双方时钟不同源时,这里设置的频偏为100ppm,规定每隔5000个数据包发送方发送一个4字节的序列,接收方的弹性buffer会根据这4字节的序列,以及数据在buffer中的位置来决定删除或者插入一个4字节的序列中的一个字节,目的是确保数据从发送端到接收端的稳定性,消除时钟频偏的影响;

数据对齐

由于GT资源的Aurora8B10B数据收发天然有着数据错位的情况,所以需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:

我定义的 K 码控制字符格式为:XX_XX_XX_BC,所以用一个rx_ctrl 指示数据是否为 K 码 的 COM 符号;

rx_ctrl = 4'b0000 表示 4 字节的数据没有 COM 码;

rx_ctrl = 4'b0001 表示 4 字节的数据中 7: 0 为 COM 码;

rx_ctrl = 4'b0010 表示 4 字节的数据中15: 8 为 COM 码;

rx_ctrl = 4'b0100 表示 4 字节的数据中23:16 为 COM 码;

rx_ctrl = 4'b1000 表示 4 字节的数据中31:24 为 COM 码;

基于此,当接收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的基础操作,这里不再赘述;数据对齐模块顶层接口如下:

视频数据解包

数据解包是数据组包的逆过程,代码位置如下:

GTP解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;由于数据解包是数据组包的逆过程,所以这里不再过多赘述,视频数据解包模块顶层接口如下:

图像缓存

图像缓存方案采用纯verilog实现,缓存介质为DDR3/4;

图像缓存架构实现的功能是将输入视频缓存到板载DDR中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了Xilinx官方的MIG作为DDR控制器,所以FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:

图像缓存架构代码如下:

图像缓存架构由FDMA控制器+FDMA组成;FDMA实际上就是一个AXI4-FULL总线主设备,与MIG对接,MIG配置为AXI4-FULL接口;FDMA控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR中写入M个像素,写N次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以AXI4内部代码,以简单地像使用FIFO那样操作AXI总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为3帧缓存;

图像缓存使用Xilinx vivado的Block Design设计,如下图:

关于FDMA更详细的介绍,请参考我之前的博客,博文链接如下:
点击直接前往

视频读取控制

FDMA图像缓存架构使用VGA时序模块完成视频读取控制,VGA时序模块负责产生VGA时序,他有两个作用,一是控制FDMA控制器从DDR3中读出缓存的视频,二是将同步后的VGA视频送入下一级的UVC图像处理模块,VGA时序模块代码架构如下:

RGB888转YUV422

根据UVC协议,UVC传输视频格式为YUV422,所以需将RGB888转为YUV422。本设计提供纯verilog实现的RGB888转YUV422模块,如下:

UVC图像处理

UVC图像处理模块主要实现图像缓冲、数据接口转换和时序同步等处理,完成UVC协议层,并以标准的FT602用户IO读写时序输出;模块代码架构如下:

UVC图像处理模块顶层接口如下:

FT602芯片

FT602 是 USB-to-FIFO 接口 SuperSpeed USB(USB 3.1 Gen 1)USB 视频类(UVC)桥接芯片具有以下特点:

1:支持 USB 3.1 GEN 1 超高速:(5Gbps)/ USB 2.0 高速(480Mbps);

2:支持 USB 传输类型:控制/散装/中断;

3:支持 UVC 1.1 版:支持最多 4 个视频输入通道;

4:FIFO 总线:支持 2 个并行从 FIFO 总线协议,245 FIFO 和多通道 FIFO 模式,数据突发速率高达 400MB / s,32 位并行接口;

5:内置 16kB FIFO 数据缓冲 RAM;

6:用于视频设备的内置 I2C 主接口;

7:组态:

7.1:支持多电压 I / O:1.8V,2.5V 和 3.3V;

7.2:内部 LDO 1.0V 稳压器;

7.3:集成的上电复位电路;

7.4:用户可编程 USB 和 UVC 描述符;

7.5:工业工作温度范围:-40 至 85⁰C;

7.6:符合 RoHS 标准的紧凑型无铅 QFN-76 封装;

芯片框图如下:

参考电路如下:

UVC接收显示

UVC视频送入FT602芯片完成UVC物理层;用USB3.0线缆连接开发板至笔记本电脑USB3.0接口;无需安装驱动,直接打开Win10自带的相机软件,即可看到FPGA采集发来的图像。如下:

工程源码架构

本博客提供4套工程源码,以工程源码1为例,vivado Block Design设计如下,其他工程与之类似:

本博客提供4套工程源码,以工程源码1为例,使工程源码架构如下,其他工程与之类似:

4、vivado工程源码1详解-->Artix7-35T,OV5640光编码转UVC

开发板FPGA型号:Xilinx--Artix7--xc7a35tfgg484-2;

FPGA开发环境:Vivado2019.1;

输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;

输出:USB3.0 UVC,分辨率1280x720@60Hz;

高速收发器类型:Xilinx--GTP高速收发器,线速率5Gbps;

高速收发器编解码:Aurora8B10B编解码;

图像缓存方案:纯verilog方案,DDR3做介质,图像3帧缓存;

USB3.0 UVC协议层方案:纯逻辑实现;

USB3.0 UVC物理层方案:FT602芯片;

工程作用:让读者掌握FPGAFPGA实现GTP光口视频转USB3.0 UVC输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

5、vivado工程源码2详解-->Artix7-35T,HDMI光编码转UVC

开发板FPGA型号:Xilinx--Artix7--xc7a35tfgg484-2;

FPGA开发环境:Vivado2019.1;

输入:HDMI(笔记本输入模拟Sensor)或动态彩条,分辨率1920x1080@60Hz;

输出:USB3.0 UVC,分辨率1920x1080@60Hz;

高速收发器类型:Xilinx--GTP高速收发器,线速率5Gbps;

高速收发器编解码:Aurora8B10B编解码;

图像缓存方案:纯verilog方案,DDR3做介质,图像3帧缓存;

USB3.0 UVC协议层方案:纯逻辑实现;

USB3.0 UVC物理层方案:FT602芯片;

工程作用:让读者掌握FPGAFPGA实现GTP光口视频转USB3.0 UVC输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

6、vivado工程源码3详解-->Artix7-100T,OV5640光编码转UVC

开发板FPGA型号:Xilinx--Artix7--xc7a100tfgg484-2;

FPGA开发环境:Vivado2019.1;

输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;

输出:USB3.0 UVC,分辨率1280x720@60Hz;

高速收发器类型:Xilinx--GTP高速收发器,线速率5Gbps;

高速收发器编解码:Aurora8B10B编解码;

图像缓存方案:纯verilog方案,DDR3做介质,图像3帧缓存;

USB3.0 UVC协议层方案:纯逻辑实现;

USB3.0 UVC物理层方案:FT602芯片;

工程作用:让读者掌握FPGAFPGA实现GTP光口视频转USB3.0 UVC输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

7、vivado工程源码4详解-->Artix7-100T,HDMI光编码转UVC

开发板FPGA型号:Xilinx--Artix7--xc7a100tfgg484-2;

FPGA开发环境:Vivado2019.1;

输入:HDMI(笔记本输入模拟Sensor)或动态彩条,分辨率1920x1080@60Hz;

输出:USB3.0 UVC,分辨率1920x1080@60Hz;

高速收发器类型:Xilinx--GTP高速收发器,线速率5Gbps;

高速收发器编解码:Aurora8B10B编解码;

图像缓存方案:纯verilog方案,DDR3做介质,图像3帧缓存;

USB3.0 UVC协议层方案:纯逻辑实现;

USB3.0 UVC物理层方案:FT602芯片;

工程作用:让读者掌握FPGAFPGA实现GTP光口视频转USB3.0 UVC输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

8、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;

2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件-->另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;

3:如果你的vivado版本高于本工程vivado版本,解决如下:

打开工程后会发现IP都被锁住了,如下:

此时需要升级IP,操作如下:

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:


更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;

2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;

3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

9、上板调试验证

准备工作

需要准备的器材如下:

FPGA开发板;

OV5640摄像头或ADV7611转接板:

FT602转接板(FPGA开发板板载FT602芯片的除外);

笔记本电脑或者PC主机;

USB3.0数据线;

SFP光模块和光纤;

我的开发板连接如下:

UVC详细测试步骤

第1步:

用USB3.0线缆连接FPGA开发板至PC端电脑的USB3.0接口;

!!!注意!!!注意!!!注意

USB线一定要是3.0的,区别方法是USB口内部的塑料件是蓝色的,对应的,电脑的USB口也必须是3.0的;

USB线与电脑连接,一定要是直连,不能有转接的HUB,也就是开发板与电脑USB口直连;

第2步:

下载工程的bit文件至FPGA开发板,如下:

第3步:

打开我的电脑-->管理-->设备管理器-->. 照相机,可以看到FT602的UVC设备,如下:

第4步:

打开Win10自带的相机APP,如下:

此时,我们并不能看到图像,需要设置一下相机默认的分辨率,如下:

如果我们下载的是OV5640摄像头转UVC的工程bit,那么UVC分辨率就是1280x720@60Hz,此时UVC分辨率设置如下:

如果我们下载的是HDMI摄像头转UVC的工程bit,那么UVC分辨率就是1920x1080@60Hz,此时UVC分辨率设置如下:

以下载彩条视频工程为例,此时我们可以看到图像,如下:

以下载OV5640摄像头工程为例,此时我们可以看到图像,如下:

以下载HDMI输入工程为例,此时我们可以看到图像,如下:

UVC视频录制本地保存

基于Win10自带APP的强大功能,我们还可以用相机的录制功能,将采集到的视频保存到本地,点击录制,如下:

录制完成后,系统自动保存视频,点击如下位置查看:

并可点击播放录制的视频,如下:

Win10自带APP功能强大,除了录制外,还有拍照等其他功能,期待你的进一步应用开发。

USB3.0 UVC 视频传输效果演示

USB3.0 UVC 视频传输效果演示如下:

FPGA基于FT602实现USB3.0 UVC 视频传输

12、工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送。

资料获取方式:文章末尾的V名片。

网盘资料如下:

此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:

相关推荐
hahaha601614 小时前
3NRD降噪算法FPGA实现8并行度设计
fpga开发
松小白song15 小时前
一次“载电流显示为 0“的排查经历:负值钳位引发的踩坑
fpga开发
yingheceping18 小时前
复旦微FPGA开发板厂商TOP5甄选榜:2026选型参考
fpga开发·fpga
NamoAmitabha12820 小时前
PL 端的 GPIO IP(AXI GPIO)---PS控制----deepseek
fpga开发·zynq--ps
hahaha60161 天前
3D降噪算法YUV降噪FPGA实现
fpga开发
Hello-FPGA2 天前
基于RFSOC FPGA ZCU216 的CoaXPress 采集demo
fpga开发
9527华安2 天前
FPGA基于ADV7182解码PAL视频,Video Processing Subsystem去隔行,提供6套工程源码和技术支持
fpga开发·音视频·pal·adv7182
hahaha60162 天前
数字图像时域滤波或者3D降噪算法FPGA实现
算法·计算机视觉·fpga开发
GateWorld2 天前
Xilinx 7系列FPGA时钟网络详解
fpga开发·时钟网络·xilinx 7系列
szxinmai主板定制专家2 天前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x