FPGA千兆网 UDP 网络视频传输,基于88E1518 PHY实现,提供工程和QT上位机源码加技术支持

news/2024/5/18 16:08:41 标签: 网络, fpga开发, udp, 88E1518, QT, 视频传输

目录

  • 1、前言
    • 版本更新说明
    • 免责声明
  • 2、我这里已有的以太网方案
  • 3、设计思路框架
    • 视频源选择
    • OV5640摄像头配置及采集
    • 动态彩条
    • UDP协议栈
    • UDP视频数据组包
    • UDP协议栈数据发送
    • UDP协议栈数据缓冲
    • IP地址、端口号的修改
    • Tri Mode Ethernet MAC介绍以及移植注意事项
    • 88E1518 PHY
    • QT上位机和源码
  • 4、vivado工程详解
  • 5、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 6、上板调试验证并演示
    • 准备工作
    • ping一下
    • 静态演示
    • 动态演示
  • 7、福利:工程源码获取

1、前言

没玩过UDP协议栈都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。
UDP协议栈在实际项目中应用广泛,特别是在医疗和军工行业,目前市面上的图像拼接方案主要有Xilinx官方推出的Video Mixer方案和自己手撕代码的自定义方案;Xilinx官方推出的Video Mixer方案直接调用IP,通过SDK配置即可实现,但他的使能难度较高,且对FPGA资源要求也很高,不太适合小规模FPGA,在zynq和K7以上平台倒是很使用,如果对Video Mixer方案感兴趣,可以参考我之前的博客,博客地址:
点击直接前往

本文使用Xilinx的Kintex7 FPGA基于88E1518 网络PHY芯片实现千兆网UDP视频传输,视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用廉价的OV5640摄像头模组;另一种是如果你的手里没有摄像头,或者你的开发板没摄像头输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频,视频源的选择通过代码顶层的`define宏定义进行,上电默认选择OV5640摄像头模组作为视频输入源;FPGA采集视频后,使用FDMA将视频缓存到DDR3中,然后将视频读出,根据与QT上位机的通信协议将视频进行UDP数据组包,然后使用我们的UDP协议栈对视频进行UDP数据封装,再将数据送入Tri Mode Ethernet MAC IP,输出给开发板板载的88E1518 网络PHY,然后UDP视频通过开发板板载的RJ45网口经网线传输给电脑主机,电脑端用我们提供的QT上位机采集图像并显示;提供vivado2019.1版本的FPGA工程源码和QT上位机及其源码;

本博客详细描述了FPGA基于88E1518 网络PHY芯片实现千兆网UDP视频传输的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

版本更新说明

此版本为第2版,根据读者的建议,对第1版工程做了如下改进和更新:
1:增加了输入视频动态彩条的选择,有的读者说他手里没有OV5640摄像头,或者摄像头原理图和我的不一致,导致在移植过程中困难很大,基于此,增加了动态彩条,它由FPGA内部产生,不需要外接摄像头就可以使用,使用方法在后文有说明;
2:优化了FDMA,之前的FDMA内AXI4的数据读写突发长度为256,导致在低端FPGA上带宽不够,从而图像质量不佳,基于此,将FDMA内AXI4的数据读写突发长度改为128;
3:优化了UDP协议栈及其数据缓冲FIFO组的代码,并在博文里增加了这一部分的代码说明;
4:增加了Tri Mode Ethernet MAC IP核的使用、更新、修改等说明,以单独文档形式放在了资料包中;
5:优化了整体代码架构,使得之前看起来杂乱无章的代码变得清爽简洁;

免责声明

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

2、我这里已有的以太网方案

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

3、设计思路框架

FPGA工程设计框图如下:
在这里插入图片描述

视频源选择

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

OV5640摄像头配置及采集

OV5640摄像头需要i2c配置才能使用,需要将DVP接口的视频数据采集为RGB565或者RGB888格式的视频数据,这两部分均用verilog代码模块实现,代码位置如下:
在这里插入图片描述
其中摄像头配置为分辨率1280x720,如下:
在这里插入图片描述
摄像头采集模块支持RGB565和RGB888格式的视频输出,可由参数配置,如下:
在这里插入图片描述
RGB_TYPE=0输出本RGB565格式;
RGB_TYPE=1输出本RGB888格式;
设计选择RGB565格式;

动态彩条

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

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数据发送必须与QT上位机的接受程序一致,上位机定义的UDP帧格式包括帧头个UDP数据,帧头定义如下:
在这里插入图片描述
FPGA端的UDP数据组包代码必须与上图的数据帧格式对应,否则QT无法解析,代码中定义了数据组包状态机以及数据帧,如下:
在这里插入图片描述
另外,由于UDP发送是64位数据位宽,而图像像素数据是24bit位宽,所以必须将UDP数据重新组合,以保证像素数据的对齐,这部分是整个工程的难点,也是所有FPGA做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,其在代码中的位置如下:
在这里插入图片描述
可以看到其中Tri Mode Ethernet MAC IP核处于被锁定状态,这是我们故意为之,目的是根据不同的PHY延时参数而修改其内部代码和内部时序约束代码,由于本设计使用的网络PHY为88E1518 ,所以这里重点介绍使用88E1518 时Tri Mode Ethernet MAC的修改和移植事项,当你需要工程移植,或者你的vivado版本与我的不一致时,Tri Mode Ethernet MAC都需要在vivado中进行升级,但由于该IP已被我们人为锁定,所以升级和修改需要一些高端操作,关于操作方法,我专门写了一篇文档,已附在资料包里,如下:
在这里插入图片描述

88E1518_PHY_94">88E1518 PHY

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

QT_97">QT上位机和源码

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

4、vivado工程详解

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720;
输出:千兆UDP协议栈,88E1518 PHY,RJ45网口;
工程作用:千兆UDP网络视频传输
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程移植说明

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

6、上板调试验证并演示

准备工作

首先连接开发板和电脑,开发板端连接后如下图:
在这里插入图片描述
然后将你的电脑IP地址改为和代码里规定的IP一致,当然,代码里的IP是可以任意设置的,但代码里的IP修改后,电脑端的IP也要跟着改,我的设置如下:
在这里插入图片描述

ping一下

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

静态演示

ov5640摄像头1280x720输入UDP网络传输QT上位机显示如下:
在这里插入图片描述
动态彩条1280x720输入UDP网络传输QT上位机显示如下:
在这里插入图片描述

动态演示

动态视频演示如下:

FPGA-UDP-视频传输-K7

7、福利:工程源码获取

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


http://www.niftyadmin.cn/n/5041240.html

相关文章

医药行业安全生产信息化建设分享

随着科技的快速发展和全球化进程的推进,医药行业作为人类健康和安全的重要组成部分,面临着日益严峻的安全生产挑战。近年来,医药企业对于安全生产的需求越来越强烈,安全生产信息化建设成为了医药行业发展的重要趋势。本文将探讨医…

【翻译】Kingfisher 官方指南 Cheet Sheet

原文地址:https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet This documentation will describe some most common usage of Kingfisher. The code snippet is based on iOS. However, the similar code should also work for other platforms like macOS or…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求,需要在前端小程序中嵌入展示Office文件的功能。然而,前端使用开源组件进行在线预览会导致性能消耗较…

【Java 基础篇】Java网络编程:实现远程文件访问与管理

Java是一门强大的编程语言,具有广泛的网络编程功能。在本篇博客中,我们将深入探讨如何使用Java编写应用程序,实现远程文件访问和管理。这是一个有趣且实用的主题,特别适合那些希望构建网络文件系统、实现文件共享或进行远程文件操…

JNA封装C/C++动态库在flink内使用记录

概述 因为公司业务需求,需要将一部分原本已经用C/C写好的程序封装到flink内部使用。 操作系统 CentOS 7使用的技术和工具 flink 1.17.1 JDK 19.0.2 JNA 5.12.1 maven 3.9.4技术实现 利用JNA将C/C的程序封装到JAR包里面,然后结合flink依赖&#xff0…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录: App 文件夹:用于存放外设驱动文件,如 LED、数码管、定时器等。 Obj 文件夹:用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

gin 基本使用

gin 初体验 import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() }gin 路由接受一个 type …

python+opencv寻找图片或视频中颜色进行追踪之HSV颜色处理

pythonopencv寻找图片或视频中颜色进行追踪之HSV颜色处理 1.颜色空间转换 import cv2img cv2.imread(1.jpg) # 转换为灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(img, img) cv2.imshow(gray, img_gray) cv2.waitKey(0)cv2.cvtColor()用来进行颜色模…