FPGA实现GTX Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持

目录

FPGA实现GTX Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持

视频-图传

1、前言

创作背景

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

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

从Xilinx官方IP核的选择来看,有Transceivers Wizard物理层IP核、Aurora8b10b协议层IP核可选,Transceivers Wizard更为底层,从PMA、PCS到用户接口,将更多底层接口开放给用户使用,便于灵活设计和自定义修改,但设计难度更大,需要用户自行设计接收端数据对齐逻辑,Transceivers Wizard本身不做对齐处理;而Aurora8b10b IP核是封装了完整协议层,并将接口转换为了AXI4-Stream流接口,用户无需关心数据对齐逻辑,而只需将自己的设计与AXI4-Stream流接口对接即可,使用和设计难度大为降低,但设计的灵活性也随之降低,由于Aurora8b10b IP核不开放底层接口,更难以做到自定义协议和设计;Transceivers Wizard IP核与Aurora8b10b IP核各有千秋,革命分工,没有优劣之分。

本设计采用Xilinx 7系列的GTX作为高速收发器,使用Transceivers Wizard物理层IP核,aurora 8b10b编解码的方式实现高速收发器2路视频传输;

工程概述

本设计使用Xilinx 7系列FPGA为平台,实现基于GTX Transceivers Wizard aurora 8b10b编解码2路视频传输;视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统摄像头,包括OV7725、OV5640和AR0135;如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先使用纯veriolog代码实现的i2c配置模块的对摄像头进行初始化配置,并采集摄像头视频;然后将采集输入视频复制1份,以模拟2路视频源;然后2路视频送入纯veriolog代码实现的2路视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX Transceivers Wizard IP核实现视频aurora 8b10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX Transceivers Wizard IP核实现视频aurora 8b10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入纯veriolog代码实现的数据对齐模块,实现错位数据对齐;然后数据送入2路纯veriolog代码实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用纯veriolog代码实现的图像缓存架构对采集视频做图像3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制FDMA从DDR3中读取视频并同步输出RGB888视频流;然后使用RGB转HDMI模块或者专用芯片实现RGB视频流转HDMI差分视频信号;最后用显示器显示视频即可;针对市场主流需求,本博客设计并提供4套工程源码,具体如下:

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

工程源码1

开发板FPGA型号为Xilinx--Kintex7--xc7k325tffg676-2;

输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯veriolog代码实现的i2c配置模块的对摄像头进行初始化配置,并采集摄像头视频;分辨率配置为1280x720@30Hz,颜色空间配置为RGB565;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB565像素的视频;然后将采集输入视频复制1份,以模拟2路视频源;然后2路视频送入纯veriolog代码实现的2路视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;GTP Transceivers Wizard的低16bit数据位宽传输第1路视频,高16bit数据位宽传输第2路视频,2路视频平均占用GTP Transceivers Wizard的全部带宽,且各自独立传输,这就保证了2路视频无论是否同源,均不影响同时传输;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入纯veriolog代码实现的数据对齐模块,实现错位数据对齐;然后数据送入2路纯veriolog代码实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用纯veriolog代码实现的图像缓存架构对采集视频做图像3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制FDMA从DDR3中读取视频并同步输出RGB888视频流;然后使用RGB转HDMI模块实现RGB视频流转HDMI差分视频信号,输出分辨率为1280x720@60Hz;最后用显示器显示视频即可;

由此形成多路Sensor+高速收发器+光编码+HDMI的高端架构;该工程适用于SFP光口的视频采集卡(光端机)应用;

工程源码2

开发板FPGA型号为Xilinx--Kintex7--xc7k325tffg676-2;

输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的IT6802芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对IT6802进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后将采集输入视频复制1份,以模拟2路视频源;然后2路视频送入纯veriolog代码实现的2路视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;GTP Transceivers Wizard的低16bit数据位宽传输第1路视频,高16bit数据位宽传输第2路视频,2路视频平均占用GTP Transceivers Wizard的全部带宽,且各自独立传输,这就保证了2路视频无论是否同源,均不影响同时传输;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入纯veriolog代码实现的数据对齐模块,实现错位数据对齐;然后数据送入2路纯veriolog代码实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用纯veriolog代码实现的图像缓存架构对采集视频做图像3帧缓存,缓存介质为板载DDR3;然后Native视频时序控制FDMA从DDR3中读取视频并同步输出RGB888视频流;然后使用RGB转HDMI模块实现RGB视频流转HDMI差分视频信号,输出分辨率为1920x1080@60Hz;最后用显示器显示视频即可;

由此形成多路Sensor+高速收发器+光编码+HDMI的高端架构;该工程适用于SFP光口的视频采集卡(光端机)应用;

工程源码3

开发板FPGA型号为Xilinx--Zynq7100--xc7z100ffg900-2;

输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯veriolog代码实现的i2c配置模块的对摄像头进行初始化配置,并采集摄像头视频;分辨率配置为1280x720@30Hz,颜色空间配置为RGB565;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB565像素的视频;然后将采集输入视频复制1份,以模拟2路视频源;然后2路视频送入纯veriolog代码实现的2路视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;GTP Transceivers Wizard的低16bit数据位宽传输第1路视频,高16bit数据位宽传输第2路视频,2路视频平均占用GTP Transceivers Wizard的全部带宽,且各自独立传输,这就保证了2路视频无论是否同源,均不影响同时传输;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入纯veriolog代码实现的数据对齐模块,实现错位数据对齐;然后数据送入2路纯veriolog代码实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用纯veriolog代码实现的图像缓存架构对采集视频做图像3帧缓存,缓存介质为板载PS端DDR3;然后Native视频时序控制FDMA从DDR3中读取视频并同步输出RGB888视频流;然后使用RGB转HDMI模块实现RGB视频流转HDMI差分视频信号,输出分辨率为1280x720@60Hz;最后用显示器显示视频即可;

由此形成多路Sensor+高速收发器+光编码+HDMI的高端架构;该工程适用于SFP光口的视频采集卡(光端机)应用;

工程源码4

开发板FPGA型号为Xilinx--Zynq7100--xc7z100ffg900-2;

输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为纯VHDL代码方案;首先FPGA纯verilog实现的i2c配置模块完成HDMI RX的DDC接口配置,EDID配置为1920x1080@60Hz,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流;为了支持1920x1080@60Hz,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号;然后将采集输入视频复制1份,以模拟2路视频源;然后2路视频送入纯veriolog代码实现的2路视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b编码和数据串化,将并行数据串化为高速串行差分信号,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;GTP Transceivers Wizard的低16bit数据位宽传输第1路视频,高16bit数据位宽传输第2路视频,2路视频平均占用GTP Transceivers Wizard的全部带宽,且各自独立传输,这就保证了2路视频无论是否同源,均不影响同时传输;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTP Transceivers Wizard IP核实现视频aurora 8b10b解码和数据解串,将差分高速串行信号解为并行数据;然后数据送入纯veriolog代码实现的数据对齐模块,实现错位数据对齐;然后数据送入2路纯veriolog代码实现的视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用纯veriolog代码实现的图像缓存架构对采集视频做图像3帧缓存,缓存介质为板载PS端DDR3;然后Native视频时序控制FDMA从DDR3中读取视频并同步输出RGB888视频流;然后使用RGB转HDMI模块实现RGB视频流转HDMI差分视频信号,输出分辨率为1920x1080@60Hz;最后用显示器显示视频即可;

由此形成多路Sensor+高速收发器+光编码+HDMI的高端架构;该工程适用于SFP光口的视频采集卡(光端机)应用;

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

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

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

免责声明

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

2、相关方案推荐

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

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

点击直接前往

我这里已有的 GT 高速接口解决方案

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

点击直接前往

GTX Transceivers Wizard 的单路视频传输示例

本设计是使用GTX Transceivers Wizard的单Lane 32bit数据位宽传输2路非同源视频案例,之前博主写过一篇基于GTX Transceivers Wizard的单Lane 32bit数据位宽传输1路视频的案例,感兴趣的可以去之前的博客看看,以下是博客链接:

点击直接前往

Aurora8B10B IP核的单路视频传输示例

本设计是使用GTX Transceivers Wizard的单Lane 32bit数据位宽传输2路非同源视频案例,之前博主写过一篇基于Aurora8B10B IP核的单Lane 16bit数据位宽传输1路视频的案例,感兴趣的可以去之前的博客看看,以下是博客链接:

点击直接前往

3、工程详细设计方案

工程设计原理框图

工程设计原理框图如下:

输入Sensor之-->OV5640摄像头

本设计输入2路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之-->芯片解码的HDMI

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

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

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

整个模块代码架构如下:

输入Sensor之-->RTL解码的HDMI

本设计输入2路HDMI视频;输入源为板载的HDMI输入接口或动态彩条,分辨率为1920x1080@60Hz,使用笔记本电脑接入HDMI输入接口,以模拟输入Sensor;HDMI解码方案为纯VHDL解码;HDMI输入接口逻辑设计,必须要考虑DDC通信,即通过i2c总线与输入设备协商分辨率,即EDID配置;本设计提供纯VHDL代码实现的i2c模块实现EDID配置;此外,TMDS差分视频进入FPGA IO后,需要将其解码为RGB视频,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流,本博主已将该代码封装为了自定义IP,可在vivado中直接调用,如下:

HDMI转RGB模块代码架构如下:

为了支持1080P@60Hz的输入视频,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号,参考原理图如下:

可以通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:

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

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

整个模块代码架构如下:

视频数据组包发送模块

视频数据组包发送模块由纯verilog代码实现;由于视频需要在GTX Transceivers Wizard IP核中通过aurora 8b10b协议收发,所以数据必须进行组包,以适应aurora 8b10b协议标准;视频数据组包模块代码位置如下:

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

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

基于GTX Transceivers Wizard 高速收发

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

基于GTX Transceivers Wizard 高速接口的视频传输架构顶层接口核参数配置如下:

GTX Transceivers Wizard IP 简介

关于GTX介绍最详细的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我们以此来解读:《ug476_7Series_Transceivers》的PDF文档我已放在了资料包里,文章末尾有获取方式;我用到的开发板FPGA型号为Xilinx Zynq7100;带有8路GTX资源,其中2路连接到了2个SFP光口,每通道的收发速度为 500 Mb/s 到 10.3125 Gb/s 之间。GTX收发器支持不同的串行传输接口或协议,比如 PCIE 1.1/2.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;

GTX Transceivers Wizard 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTX 收发器在Kintex7 FPGA 芯片中的示意图:《ug476_7Series_Transceivers》第24页;GTX 的具体内部逻辑框图如下所示,它由四个收发器通道 GTXE2_CHANNEL原语 和一个GTXE2_COMMON 原语组成。每路GTXE2_CHANNEL包含发送电路 TX 和接收电路 RX,GTXE2_CHANNEL的时钟可以来自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25页;每个 GTXE2_CHANNEL 的逻辑电路如下图所示:《ug476_7Series_Transceivers》第26页;

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

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

GTX Transceivers Wizard 发送和接收处理流程

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

GTX Transceivers Wizard 参考时钟

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

GTX Transceivers Wizard 发送接口

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

GTX Transceivers Wizard 接收接口

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

GTX Transceivers Wizard IP核 调用和使用

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

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

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

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

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

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

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

我的板子原理图如下:

选择外部数据位宽32bit的8b/10b编解码,如下:

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

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

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

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

GTP Transceivers Wizard 接收数据对齐模块

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

我定义的 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的基础操作,这里不再赘述;数据对齐模块顶层接口如下:

视频数据接收解包模块

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

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

图像缓存架构

图像缓存方案采用纯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更详细的介绍,请参考我之前的博客,博文链接如下:

点击直接前往

HDMI视频输出架构

缓存图像从DDR3读出后经过Native时序生成模块输出标准的VGA时序视频,然后经过纯verilog显示的RGB转HDMI模块输出HDMI差分视频;最后送显示器显示即可;代码例化如下:

工程源码架构

提供4套工程源码,以工程源码1为例,工程Block Design设计如下:

提供4套工程源码,以工程源码1为例,综合后的工程源码架构如下:

工程编译后资源消耗低、功耗低、时序收敛,符合工程项目应用要求,如下:

上图只是举例,资源消耗并非本工程的实际消耗,实际消耗请看下文的《工程代码详解》;

4、vivado工程源码1详解-->Kintex7--325T,2路OV5640视频-SFP光口回环版本

开发板FPGA型号:Xilinx-Kintex7--325T--xc7k325tffg676-2;

FPGA开发环境:Vivado2019.1;

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

输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;

回环光口类型:SFP光口;

高速收发器类型:Xilinx-GTX-Transceivers Wizard,单 Lane-线速率5Gbps;

高速收发器编解码协议:aurora 8b10b编解码;

图像缓存方案:纯verilog图像缓存+DDR3颗粒+3帧缓存;

工程作用:让读者掌握FPGA实现多路视频高速收发器传输的设计能力,以便能够移植和设计自己的项目;

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

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

5、vivado工程源码2详解-->Kintex7--325T,2路HDMI视频-SFP光口回环版本

开发板FPGA型号:Xilinx-Kintex7--325T--xc7k325tffg676-2;

FPGA开发环境:Vivado2019.1;

输入:HDMI或者FPGA内部动态彩条,IT6802芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;

输出:HDMI,RTL纯逻辑编码方案,输出分辨率1920x1080@60Hz;

回环光口类型:SFP光口;

高速收发器类型:Xilinx-GTX-Transceivers Wizard,单 Lane-线速率5Gbps;

高速收发器编解码协议:aurora 8b10b编解码;

图像缓存方案:纯verilog图像缓存+DDR3颗粒+3帧缓存;

工程作用:让读者掌握FPGA实现多路视频高速收发器传输的设计能力,以便能够移植和设计自己的项目;

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

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

6、vivado工程源码3详解-->Zynq7100,2路OV5640视频-SFP光口回环版本

开发板FPGA型号:Xilinx--Zynq7100--xc7z100ffg900-2;

FPGA开发环境:Vivado2019.1;

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

输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;

回环光口类型:SFP光口;

高速收发器类型:Xilinx-GTX-Transceivers Wizard,单 Lane-线速率5Gbps;

高速收发器编解码协议:aurora 8b10b编解码;

图像缓存方案:纯verilog图像缓存+PS端DDR3颗粒+3帧缓存;

工程作用:让读者掌握FPGA实现多路视频高速收发器传输的设计能力,以便能够移植和设计自己的项目;

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

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

7、vivado工程源码4详解-->Zynq7100,2路HDMI视频-SFP光口回环版本

开发板FPGA型号:Xilinx--Zynq7100--xc7z100ffg900-2;

FPGA开发环境:Vivado2019.1;

输入:HDMI或者FPGA内部动态彩条,纯VHDL解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;

输出:HDMI,RTL纯逻辑编码方案,输出分辨率1920x1080@60Hz;

回环光口类型:SFP光口;

高速收发器类型:Xilinx-GTX-Transceivers Wizard,单 Lane-线速率5Gbps;

高速收发器编解码协议:aurora 8b10b编解码;

图像缓存方案:纯verilog图像缓存+DDR3颗粒+3帧缓存;

工程作用:让读者掌握FPGA实现多路视频高速收发器传输的设计能力,以便能够移植和设计自己的项目;

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

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

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、上板调试验证

准备工作

需要准备的器材如下:

OV5640摄像头或者笔记本电脑,没有则请使用FPGA内部生成的彩条;

FPGA开发板,没有开发板可以找本博提供;

SFP光模块和光纤;

我的开发板了连接如下:

GTX Transceivers Wizard 光口视频传输效果演示

GTX Transceivers Wizard 光口视频传输效果演示如下:

视频-图传

10、工程代码的获取

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

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

网盘资料如下:

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

相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner2 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20202 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子3 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议