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名片。

网盘资料如下:

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

相关推荐
zy135380675733 小时前
12V输入5V/2A输出升降压芯片AH4002
科技·单片机·物联网·fpga开发·硬件工程·智能电视
dadaobusi3 小时前
verilog的generate
fpga开发
从此不归路4 小时前
FPGA 结构与 CAD 设计(第2章)
ide·fpga开发
FPGA_小田老师4 小时前
FPGA例程(5):时钟(clock)分频倍频(PLL/MMCM)实验--vivado行为级仿真、综合后仿真和实现后仿真说明
fpga开发·pll·mmcm·run simulation·前仿真·后仿真
3有青年5 小时前
HPS cold reset pin和AVST configuration的功能和作用
fpga开发
3有青年21 小时前
Altera FPGA操作系统支持的情况分析
fpga开发
国科安芯21 小时前
卫星通讯导航FPGA供电单元DCDC芯片ASP4644S2B可靠性分析
单片机·嵌入式硬件·fpga开发·架构·安全性测试
stars-he1 天前
FPGA学习笔记-图书馆存包柜,乒乓球游戏电路设计
笔记·学习·fpga开发
从此不归路1 天前
FPGA 结构与 CAD 设计(第3章)下
ide·fpga开发