FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录

  • 1、前言
    • 免责声明
    • 本项目特点
  • 2、相关方案推荐
    • 我这里已有的 GT 高速接口解决方案
    • 我这里已有的以太网方案
    • 我这里已有的图像处理方案
  • 3、设计思路框架
    • 设计框图
    • 视频源选择
    • ADV7611 解码芯片配置及采集
    • 动态彩条
    • 跨时钟FIFO
    • 图像缩放模块详解
      • 设计框图
      • 代码框图
      • 2种插值算法的整合与选择
    • GTP 全网最细解读
      • GTP 基本结构
      • GTP 发送和接收处理流程
      • GTP 的参考时钟
      • GTP 发送接口
      • GTP 接收接口
      • GTP IP核调用和使用
    • 数据对齐
    • 视频数据解包
    • 图像缓存
    • UDP数据组包
    • UDP协议栈
    • UDP协议栈数据发送
    • IP地址、端口号的修改
    • Tri Mode Ethernet MAC介绍以及移植注意事项
    • RTL8211
    • QT上位机和源码
  • 4、vivado工程1-->1路SFP传输
  • 5、vivado工程2-->2路SFP传输
  • 6、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 7、上板调试验证并演示
    • 准备工作
    • ping一下
    • 静态演示
    • 动态演示
  • 8、福利:工程源码获取

FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

1、前言

没玩过图像处理、GT高速接口、UDP网络通信,都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理,Xilinx不同的FPGA系列拥有不同的GT资源类型,低端的A7由GTP,K7有GTX,V7有GTH,更高端的U+系列还有GTY等,他们的速度越来越高,应用场景也越来越高端。。。

本文使用Xilinx的Artix7 FPGA的GTP资源和板载的RTL8211网络PHY做GTP aurora 8b/10b编解码 UDP网络视频传输实验;视频源有两种,分别对应开发板有没有HDMI输入接口的情况;一种是使用开发板自带的HDMI输入接口,我的板子HDMI输入采用ADV7611芯片解码方案;如果你的开发板没有HDMI输入接口,或者你的开发板HDMI输入接口不是ADV7611芯片解码,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,上电默认使用HDMI输入作为视频源;FPGA采集到视频数据后,首先进行图像缩放,将输入分辨率为19201080的视频缩小为1280720,然后将视频数据进行数据组包,然后调用GTP IP核,配置为8b/10b编解码模式,将组包的视频数据送入GTP编码发送出去,然后再GTP解码接收,用verilog编写视频数据对齐和视频数据解包模块解析出有效的视频数据,并恢复行场等时序,然后将视频送到DDR3进行缓存,再读出视频送UDP协议栈进行UDP协议编码,再调用Xilinx官方的Tri Mode Ethernet MAC作为MAC层,最后通过板载的RTL8211将视频通过网络数据形式发送PC,PC端用QT上位机接收图像并显示出来;

提供2套vivado2019.1版本的工程源码;2套工程的区别在于使用1个SFP光口还是使用2个SFP光口,详情请看第3章节的设计思路框架;工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

本项目特点

本项目是一个综合性的高端项目,从宏观上可以分为硬件和软件的结合,硬件指的是FPGA逻辑的实现,软件指的是PC端QT上位机的实现;从FPGA应用领域上可以分为图像处理、高速接口、网络传输三大领域,这三大领域是目前FPGA的主流应用,图像处理属于基础应用,网络传输属于中等应用,高速接口属于高端应用;这个工程直接将三者结合,在实际应用中很有需求,但市面上会的人很少。。。

2、相关方案推荐

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

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

我这里已有的以太网方案

目前我这里有大量UDP协议的工程源码,包括UDP数据回环,视频传输,AD采集传输等,也有TCP协议的工程,还有RDMA的NIC 10G 25G 100G网卡工程源码,对网络通信有需求的兄弟可以去看看:直接点击前往
其中10G万兆TCP协议的工程博客如下:
直接点击前往

我这里已有的图像处理方案

目前我这里已有的图像处理方案有很多,包括图像缩放、图像拼接、图像旋转、图像识别跟踪、图像去雾等等,所有工程均在自己的板子上跑通验证过,保证代码的可靠性,对图像处理感兴趣或有项目需求的兄弟可以参考我的图像处理专栏,里面包含了上述工程源码的详细设计方案和验证视频演示:直接点击前往

3、设计思路框架

本文使用Xilinx的Artix7 FPGA的GTP资源和板载的RTL8211网络PHY做GTP aurora 8b/10b编解码 UDP网络视频传输实验;视频源有两种,分别对应开发板有没有HDMI输入接口的情况;一种是使用开发板自带的HDMI输入接口,我的板子HDMI输入采用ADV7611芯片解码方案;如果你的开发板没有HDMI输入接口,或者你的开发板HDMI输入接口不是ADV7611芯片解码,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,上电默认使用HDMI输入作为视频源;FPGA采集到视频数据后,首先进行图像缩放,将输入分辨率为19201080的视频缩小为1280720,然后将视频数据进行数据组包,然后调用GTP IP核,配置为8b/10b编解码模式,将组包的视频数据送入GTP编码发送出去,然后再GTP解码接收,用verilog编写视频数据对齐和视频数据解包模块解析出有效的视频数据,并恢复行场等时序,然后将视频送到DDR3进行缓存,再读出视频送UDP协议栈进行UDP协议编码,再调用Xilinx官方的Tri Mode Ethernet MAC作为MAC层,最后通过板载的RTL8211将视频通过网络数据形式发送PC,PC端用QT上位机接收图像并显示出来;

设计框图

使用1个SFP光口框图如下:
在这里插入图片描述
注意:框图中的数字表示数据流向的顺序;
使用2个SFP光口框图如下:
在这里插入图片描述
注意:框图中的数字表示数据流向的顺序;

视频源选择

视频源有两种,分别对应开发板有没有HDMI输入接口的情况;一种是使用开发板自带的HDMI输入接口,我的板子HDMI输入采用IT6802芯片解码方案;如果你的开发板没有HDMI输入接口,或者你的开发板HDMI输入接口不是IT6802芯片解码,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,上电默认使用HDMI输入作为视频源;视频源的选择通过代码顶层的`define宏定义进行;如下:
在这里插入图片描述
选择逻辑代码部分如下:
在这里插入图片描述
选择逻辑如下:
当(注释) define COLOR_IN时,输入源视频是HDMI输入;
当(不注释) define COLOR_IN时,输入源视频是动态彩条;

ADV7611 解码芯片配置及采集

ADV7611 解码芯片需要i2c配置才能使用,ADV7611 解码芯片配置及采集这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述
代码中配置为1920x1080分辨率;

动态彩条

动态彩条可配置为不同分辨率的视频,视频的边框宽度,动态移动方块的大小,移动速度等都可以参数化配置,我这里配置为辨率1920x1080,动态彩条模块代码位置和顶层接口和例化如下:
在这里插入图片描述
在这里插入图片描述

跨时钟FIFO

跨时钟FIFO的作用是为了解决跨时钟域的问题,当视频不进行缩放时不存在视频跨时钟域问题,但当视频缩小或放大时就存在此问题,用FIFO缓冲可以使图像缩放模块每次读到的都是有效的输入数据,注意,原视频的输入时序在这里就已经被打乱了;

图像缩放模块详解

因为我们的QT上位机目前只支持1280x720,所以才需要缩放,即从输入的1920x1080分辨率缩小为1280x720;用笔记本电脑模拟HDMI视频输入源;

设计框图

本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;代码以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
在这里插入图片描述
视频输入时序要求如下:
在这里插入图片描述
输入像素数据在dInValid和nextDin同时为高时方可改变;
视频输出时序要求如下:
在这里插入图片描述
输出像素数据在dOutValid 和nextdOut同时为高时才能输出;

代码框图

代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;
图像缩放的实现方式很多,最简单的莫过于Xilinx的HLS方式实现,用opencv的库,以c++语言几行代码即可完成,关于HLS实现图像缩放请参考我之前写的文章HLS实现图像缩放
网上也有其他图像缩放例程代码,但大多使用了IP,导致在其他FPGA器件上移植变得困难,通用性不好;相比之下,本设计代码就具有通用性;代码架构如图;
在这里插入图片描述
其中顶层接口部分如下:
在这里插入图片描述

2种插值算法的整合与选择

本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:

input  wire i_scaler_type //0-->bilinear;1-->neighbor

通过输入i_scaler_type 的值即可选择;

输入0选择双线性插值算法;
输入1选择邻域插值算法;

关于这两种算法的数学差异,请参考我之前写的文章HLS实现图像缩放

GTP 全网最细解读

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

调用GTP做aurora 8b/10b协议的数据编解码,前面已经对GTP做了详细概述,这里不讲;代码位置如下:
在这里插入图片描述
需要注意的是,我一共调用了5个GTP,速率分别为1G、2G、4G、5G;代码中用一个参数选择速率,如下:
在这里插入图片描述
GTP_RATE=8’d1,GTP以1G线速率运行;
GTP_RATE=8’d2,GTP以2G线速率运行;
GTP_RATE=8’d4,GTP以4G线速率运行;
GTP_RATE=8’d5,GTP以5G线速率运行;
以我的测试来看,GTP以4G线速率运行时视频传输效果最佳;

GTP 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTP 收发器在Artix-7 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 子层包含8B/10B 编解码、缓冲区、通道绑定和时钟修正等电路。
这里说多了意义不大,因为没有做过几个大的项目是不会理解这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,后面我也会重点将到IP核的调用和使用;

GTP 发送和接收处理流程

首先用户逻辑数据经过 8B/10B 编码后,进入一个发送缓存区(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例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心发送接口的时钟和数据即可,GTP例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTP 接收接口

《ug482_7Series_GTP_Transceivers》的第125到213页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTP例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心接收接口的时钟和数据即可,GTP例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTP IP核调用和使用

在这里插入图片描述
有别于网上其他博主的教程,我个人喜欢用如下图的共享逻辑:
在这里插入图片描述
这样选择的好处有两个,一是方便DRP变速,二是便于IP核的修改,修改完IP核后直接编译即可,不再需要打开example工程,再复制下面的一堆文件放到自己的工程什么的,玩儿个GTP需要那么复杂么?
在这里插入图片描述
这里对上图的标号做解释:
1:线速率,根据自己的项目需求来,GTP的范围是0.5到6.25G,由于我的项目是视频传输,所以在GTP的速率范围内均可,为了通用性,我在vivado工程中例化了5个GTP,速率分别为1G、2G、4G、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的8b/10b编解码,如下:
在这里插入图片描述
下面这里讲的是K码检测:
在这里插入图片描述
这里选择K28.5,也就是所谓的COM码,十六进制为bc,他的作用很多,可以表示空闲乱序符号,也可以表示数据错位标志,这里用来标志数据错位,8b/10b协议对K码的定义如下:
在这里插入图片描述
下面讲的是时钟矫正,也就是对应GTP内部接收部分的弹性buffer;
在这里插入图片描述
这里有一个时钟频偏的概念,特别是收发双方时钟不同源时,这里设置的频偏为100ppm,规定每隔5000个数据包发送方发送一个4字节的序列,接收方的弹性buffer会根据这4字节的序列,以及数据在buffer中的位置来决定删除或者插入一个4字节的序列中的一个字节,目的是确保数据从发送端到接收端的稳定性,消除时钟频偏的影响;

数据对齐

由于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的基础操作,这里不再赘述;

视频数据解包

数据解包是数据组包的逆过程,代码位置如下:
在这里插入图片描述
GTP解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;
至此,数据进出GTP部分就已经讲完了,整个过程的框图我在代码中描述了,如下:
在这里插入图片描述

图像缓存

经常看我博客的老粉应该都知道,我做图像缓存的套路是FDMA,他的作用是将图像送入DDR中做3帧缓存再读出显示,目的是匹配输入输出的时钟差和提高输出视频质量,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
需要注意的是,为了适应UDP视频传输,这里的FDMA已被我修改,和以往版本不同,具体参考代码;

UDP数据组包

实现UDP数据的组包,UDP数据发送必须与QT上位机的接受程序一致,上位机定义的UDP帧格式包括帧头个UDP数据,帧头定义如下:
在这里插入图片描述
FPGA端的UDP数据组包代码必须与上图的数据帧格式对应,否则QT无法解析,代码中定义了数据组包状态机以及数据帧,如下:
在这里插入图片描述
另外,由于UDP发送是64位数据位宽,而图像像素数据是24bit位宽,所以必须将UDP数据重新组合,以保证像素数据的对齐,这部分是整个工程的难点,也是所有FPGA做UDP数据传输的难点;

UDP协议栈

本UDP协议栈方案需配合Xilinx的Tri Mode Ethernet MAC三速网IP一起使用,使用UDP协议栈网表文件,虽看不见源码但可正常实现UDP通信,该协议栈目前并不开源,只提供网表文件,但不影响使用,该协议栈带有用户接口,使得用户无需关心复杂的UDP协议而只需关心简单的用户接口时序即可操作UDP收发,非常简单;
协议栈架构如下:
在这里插入图片描述
协议栈性能表现如下:
1:支持 UDP 接收校验和检验功能,暂不支持 UDP 发送校验和生成;
2:支持 IP 首部校验和的生成和校验,同时支持 ICMP 协议中的 PING 功能,可接收并响应同一个子网内部设备的 PING 请求;
3:可自动发起或响应同一个子网内设备的 ARP 请求,ARP 收发完全自适应。ARP 表可保存同一个子网内部256 个 IP 和 MAC 地址对;
4:支持 ARP 超时机制,可检测所需发送数据包的目的 IP 地址是否可达;
5:协议栈发送带宽利用率可达 93%,高发送带宽下,内部仲裁机制保证 PING 和 ARP 功能不受任何影响;
6:发送过程不会造成丢包;
7:提供64bit位宽AXI4-Stream形式的MAC接口,可与Xilinx官方的千兆以太网IP核Tri Mode Ethernet MAC,以及万兆以太网 IP 核 10 Gigabit Ethernet Subsystem、10 Gigabit Ethernet MAC 配合使用;
有了此协议栈,我们无需关心复杂的UDP协议的实现了,直接调用接口即可使用。。。
本UDP协议栈用户接口发送时序如下:
在这里插入图片描述
本UDP协议栈用户接口接收时序如下:
在这里插入图片描述

UDP协议栈数据发送

UDP协议栈具有发送和接收功能,但这里仅用到了发送,此部分代码架构如下:
在这里插入图片描述
UDP协议栈代码组我已经做好,用户可直接拿去使用;
这里对代码中用到的数据缓冲FIFO组做如下解释:
由于 UDP IP 协议栈的 AXI-Stream 数据接口位宽为 64bit,而 Tri Mode Ethernet MAC 的 AXI-Stream数据接口位宽为 8bit。因此,要将 UDP IP 协议栈与 Tri Mode Ethernet MAC 之间通过 AXI-Stream 接口互联,需要进行时钟域和数据位宽的转换。实现方案如下图所示:
在这里插入图片描述
收发路径(本设计只用到了发送)都使用了2个AXI-Stream DATA FIFO,通过其中1个FIFO实现异步时钟域的转换,1个FIFO实
现数据缓冲和同步Packet mode功能;由于千兆速率下Tri Mode Ethernet MAC的AXI-Stream数据接口同步时钟信号为125MHz,此时,UDP协议栈64bit的AXI-Stream数据接口同步时钟信号应该为125MHz/(64/8)=15.625MHz,因此,异步
AXI-Stream DATA FIFO两端的时钟分别为125MHz(8bit),15.625MHz(64bit);UDP IP协议栈的AXI-Stream接口经过FIFO时钟域转换后,还需要进行数据数据位宽转换,数据位宽的转换通过AXI4-Stream Data Width Converter完成,在接收路径中,进行 8bit 到 64bit 的转换;在发送路径中,进行 64bit 到 8bit 的转换;

IP地址、端口号的修改

UDP协议栈留出了IP地址、端口号的修改端口供用户自由修改,位置如下:
在这里插入图片描述

Tri Mode Ethernet MAC介绍以及移植注意事项

本设计调用了Xilinx官方IP:Tri Mode Ethernet MAC,其在代码中的位置如下:
在这里插入图片描述
可以看到其中泰处于被锁定状态,这是我们故意为之,目的是根据不同的PHY延时参数而修改其内部代码和内部时序约束代码,由于本设计使用的网络PHY为RTL8211,所以这里重点介绍使用RTL8211时,Tri Mode Ethernet MAC的修改和移植事项,当你需要工程移植,或者你的vivado版本与我的不一致时,Tri Mode Ethernet MAC都需要在vivado中进行升级,但由于该IP已被我们人为锁定,所以升级和修改需要一些高端操作,关于操作方法,我专门写了一篇文档,已附在资料包里,如下:
在这里插入图片描述

RTL8211

本设计开发板使用的网络PHY为RTL8211,工作在延时模式下,原理图引出了MDIO,但代码中不需要MDIO配置,通过上下拉电阻即可使RTL8211工作于延时模式,该PHY最高支持千兆,且能在10M/100M/1000M之间自动协商,但本设计在Tri Mode Ethernet MAC端固定为1000M;在资料包中,我们提供RTL8211的原理图;
在这里插入图片描述

QT上位机和源码

我们提供和UDP通信协议相匹配的QT抓图显示上位机及其源代码,目录如下:
在这里插入图片描述
我们的QT目前仅支持1280x720分辨率的视频抓图显示,但同时预留了1080P接口,对QT开发感兴趣的朋友可以尝试修改代码以适应1080P,因为QT在这里只是验证工具,不是本工程的重点,所以不再过多赘述,详情请参考资料包的QT源码,位置如下:
在这里插入图片描述

4、vivado工程1–>1路SFP传输

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
开发环境:Vivado2019.1;
输入:HDMI或者动态彩条,分辨率1920x1080@60Hz;
输出:SFP光口/RJ45网口;
网络PHY:RTL8211,延时模式;
应用:FPGA GTP+UDP架构,高速接口以太网视频传输,1路SFP光口;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

5、vivado工程2–>2路SFP传输

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
开发环境:Vivado2019.1;
输入:HDMI或者动态彩条,分辨率1920x1080@60Hz;
输出:SFP光口/RJ45网口;
网络PHY:RTL8211,延时模式;
应用:FPGA GTP+UDP架构,高速接口以太网视频传输,2路SFP光口;
工程Block Design、工程代码架构、工程的资源消耗和第4章节的“vivado工程1–>1路SFP传输”一致;

6、工程移植说明

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软核;

7、上板调试验证并演示

准备工作

需要准备以下物品:
1:FPGA开发板;
2:板载HDMI输入接口,没有则选择代码里的动态彩条;
3:光模块和光纤;
4:网线;
5:上位机电脑,台式或笔记本;
工程1:1路SFP传输的光纤接法如下:在这里插入图片描述
工程2:2路SFP传输的光纤接法如下:
在这里插入图片描述
网口连接如下:
在这里插入图片描述
然后将你的电脑IP地址改为和代码里规定的IP一致,当然,代码里的IP是可以任意设置的,但代码里的IP修改后,电脑端的IP也要跟着改,我的设置如下:
在这里插入图片描述

ping一下

在开始测试前,我们先ping一下,测试UDP是否连通,如下:
在这里插入图片描述

静态演示

HDMI输入1920x1080缩小到1280x720后UDP网络传输QT上位机显示如下:
在这里插入图片描述
动态彩条1920x1080缩小到1280x720后UDP网络传输QT上位机显示如下:
在这里插入图片描述

动态演示

动态视频演示如下:

FPGA-GTP-UDP-HDMI

8、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/164583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法C语言版学习笔记(2)-线性表、顺序存储结构的线性表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 数据结构部分的知识框架一、线性表的定义和特点1.定义2.特点 二、线性表的实际案例引入1.案例一:多项式的加减乘除2.案例二:当多项式是稀疏多…

Spring Boot整合Redis实现订单超时处理

文章目录 为什么使用Redis?准备工作创建订单实体类存储订单到Redis设置订单超时监控订单超时订阅订单超时消息总结 🎉欢迎来到架构设计专栏~Spring Boot整合Redis实现订单超时处理 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:I…

使用Postman工具做接口测试 —— 环境变量与请求参数格式!

引言 在上一篇笔记我们主要介绍了接口测试的基础知识与基本功能,本章主要介绍如何使用postman做接口测试。 配置环境变量和全局变量 环境变量和全局变量 环境管理中还可以点击“Global”添加全局变量,环境变量只有当选择了该环境时才生效,…

Git设置显示中文

git config --global i18n.comitencoding utf-8 git config --global i18n.logoutputencoding utf-8 export LESSCHARSETutf-8

mysql之高阶语句

1、使用select语句,用order by对表进行排序【尽量用数字列进行排序】 select id,name,score from info order by score desc; ASC升序排列(默认) DESC降序排列(需要添加) (1)order by结合whe…

Halcon WPF 开发学习笔记(0):开篇介绍

文章目录 文章专栏Halcon是什么?安装教学视频链接简单来说 Halcon快速开发环境确认新建项目 文章专栏 Halcon开发 Halcon是什么? 史上最全VisionPro和Halcon 的详细对比 Halcon简述 Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测…

[LeetCode]-138. 随机链表的复制

目录 题目 解题步骤 1.拷贝节点插入原节点的后面 2.置每个拷贝节点random 3.拷贝节点解下来,尾插到一起,恢复原链表 完整代码 题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表…

Redis中的渐进式遍历-Scan命令

之前我们学习过遍历命令keys,而keys *是一次性的把整个redis中所有的key都获取到.在不知道当前redis中有多少key的情况下,这个操作是非常危险的,可能会一下子得到太多的key而阻塞redis服务器.从而使其他redis客户端卡顿. 通过渐进式遍历,就可以做到,既可以获取到所有的key,同时…

linux安装kafka教程

kafka需要安装jdk,我的是jdk17 一、安装kafka 1、下载kafka 1.到kafka的官网,去下载想用的kafka包:http://kafka.apache.org/downloads 2.我这里下载的是:kafka_2.12-3.4.1.tgz 3.将安装包传送到服务器并解压(默认…

房产网小程序源码 房产中介小程序源码 房产网源码

房产网小程序源码 房产中介小程序源码 房产网源码 功能介绍: 一、付费发布信息 支持付费发布、刷新、置顶房源信息;二、个人发布信息 支持个人和房产经纪人发布房源信息;三、新房楼盘模块 支持新房楼盘功能,后台添加…

0X03

红包题第二弹 看到源码里面的提示 ?cmdphpinfo(); 看到源码 kk 关键点就是有两个正则表达式 第一个 preg_match("/[A-Za-oq-z0-9$]/",$cmd) 第二个 preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\|\&q…

java--封装

面向对象的三大特征:封装、继承、多态 1.什么是封装 就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。(每一个类都可以看成封装) 2.封装的设计规范 合理隐藏、合理暴…