FPGA实时视频采集转千兆UDP网络输出,基于Tri Mode Ethernet MAC+PHY芯片架构,提供12套工程源码和技术支持

1、前言

目前网上的fpga实现udp基本生态如下:
1:verilog编写的精简版udp收发器,不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的问题排查机制都不具备,这样的代码谁敢用?
2:带ping功能的完整版udp收发器,代码优秀也好用,但基本不开源,不会提供源码给你,这样的代码也有不足,那就是出了问题不知道怎么排查,毕竟你没有源码,无可奈何;

FPGA实现UDP网络通信现状;
Xilinx系列FPGA实现UDP网络通信主要有两种方案,其一是使用PHY芯片实现物理层功能,比如常见的RTL8211、B50610等芯片,UDP协议栈部分很简单,可使用verilog代码直接实现;其二是使用Xilinx官方的IP核实现物理层功能,比如常见的1G/2.5G Ethernet PCS/PMA or SGMII、AXI 1G/2.5G Ethernet Subsystem、10G/25G Ethernet Subsystem、10G Ethernet Subsystem等,UDP协议栈部分很简单,可使用verilog代码直接实现;本设计使用PHY芯片方案实现物理层功能;

工程概述

本设计的核心是使用FPGA实时视频采集转UDP网络视频流输出,采集视频经过了DDR缓存,所以可以做图像处理,转UDP网络视频流输出基于Tri Mode Ethernet MAC+PHY芯片架构;

视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统摄像头,包括OV7725、OV5640和AR0135;如果你的FPGA开发板没有视频输入接口,或者你的手里没有摄像头时,可以使用FPGA逻辑实现的动态彩条模拟输入视频,代码里通过parametr参数选择视频源,默认不使用动态彩条;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3或DDR4;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的PHY网络芯片实现物理层功能,将RGMII数据转换为差分数据;再经过板载的RJ45网口,用网线传输到电脑端;电脑端使用QT上位机接收UDP网络视频并显示出来;本博客提供11套工程源码,具体如下:
在这里插入图片描述
现对上述11套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx–>Artix7-35T–xc7a35tfgg484-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211E网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211E工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx 7系列FPGA做视频采集卡项目;

工程源码2

开发板FPGA型号为Xilinx–>Artix7-35T–xc7a35tfgg484-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的KSZ9031网络芯片实现物理层功能,将RGMII数据转换为差分数据;KSZ9031工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx 7系列FPGA做视频采集卡项目;

工程源码3

开发板FPGA型号为Xilinx–>Artix7-100T–xc7a100tfgg484-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的B50610网络芯片实现物理层功能,将RGMII数据转换为差分数据;B50610工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx 7系列FPGA做视频采集卡项目;

工程源码4

开发板FPGA型号为Xilinx–>Kintex7-325T–xc7k325tffg676-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的B50610网络芯片实现物理层功能,将RGMII数据转换为差分数据;B50610工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx 7系列FPGA做视频采集卡项目;

工程源码5

开发板FPGA型号为Xilinx–>Kintex7-325T–xc7k325tffg900-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211F网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211F工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx 7系列FPGA做视频采集卡项目;

工程源码6

开发板FPGA型号为Xilinx–>Zynq7020—xc7z020clg400-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载PS端DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的B50610网络芯片实现物理层功能,将RGMII数据转换为差分数据;B50610工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx Zynq7000系列FPGA做视频采集卡项目;

工程源码7

开发板FPGA型号为Xilinx–>Zynq7020—xc7z020clg400-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载PS端DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的KSZ9031网络芯片实现物理层功能,将RGMII数据转换为差分数据;KSZ9031工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx Zynq7000系列FPGA做视频采集卡项目;

工程源码8

开发板FPGA型号为Xilinx–>Zynq7100—xc7z100ffg900-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载PS端DDR3;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211E网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211E工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx Zynq7000系列FPGA做视频采集卡项目;

工程源码9

开发板FPGA型号为Xilinx–>Kintex UltraScale–xcku060-ffva1156-2-i;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR4;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211E网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211E工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx UltraScale系列FPGA做视频采集卡项目;

工程源码10

开发板FPGA型号为Xilinx–>Kintex UltraScale±-xcku3p-ffva676-2-i;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR4;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211E网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211E工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx UltraScale+系列FPGA做视频采集卡项目;

工程源码11

开发板FPGA型号为Xilinx- Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载PS端DDR4;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的RTL8211E网络芯片实现物理层功能,将RGMII数据转换为差分数据;RTL8211E工作于延时模式,输出RGMII接口数据;再经过板载的RJ45网口,用网线传输到电脑端,UDP网络视频流输出分辨率为1280x720@60Hz;电脑端使用QT上位机接收UDP网络视频并显示出来;该工程适用于Xilinx UltraScale+MPSoCs系列FPGA做视频采集卡项目;

本文详细描述了FPGA实时视频采集转UDP网络视频流输出的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

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

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

我这里已有的以太网方案

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

3、工程详细设计方案

工程设计原理框图

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

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的顶层模块,整个模块代码架构如下:
在这里插入图片描述

FDMA图像缓存

FDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR中,由于调用了Xilinx官方的MIG作为DDR控制器,所以FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:
在这里插入图片描述
FDMA图像缓存架构由FDMA控制器+FDMA组成;FDMA实际上就是一个AXI4-FULL总线主设备,与MIG对接,MIG配置为AXI4-FULL接口;FDMA控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR中写入M个像素,写N次即可完成1帧图像的缓存,本设计只用到了FDMA控制器的写功能,FDMA控制器IP配置如下:
在这里插入图片描述
FDMA图像缓存架构在Block Design中如下:
在这里插入图片描述

UDP视频组包发送

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

UDP协议栈

本UDP协议栈使用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协议栈用户接口接收时序如下:
在这里插入图片描述

MAC数据缓冲FIFO组

这里对代码中用到的数据缓冲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 的转换;MAC数据缓冲FIFO组代码架构如下:
在这里插入图片描述

Tri Mode Ethernet MAC 使用教程

本设计的核心是调用Xilinx的Tri Mode Ethernet MAC IP核实现以太网物理层的数据接口转换;所以重点讲讲Tri Mode Ethernet MAC这个IP,IP调用如下:
在这里插入图片描述
Tri Mode Ethernet MAC并不能直接使用,而是需要配合对应的PHY芯片的RGMII时序图做针对性修改,需要修改IP内部源码,这部分操作比较复杂,我专门写了《Tri Mode Ethernet MAC移植使用教程》文档,并放在了资料包中;

此外,Tri Mode Ethernet MAC还需要AXI4-Lite接口的配置才能工作,工程中如下:
在这里插入图片描述

PHY芯片

本例程提供11套vivado工程源码,分别用到了RTL8211、KSZ9031、B50610等市面上主流的PHY型号,通过这些型号PHY的使用,你将能学会其他型号PHY的使用,因为很多都是兼容的,比如RTL8211兼容YT8531,B50610兼容88E1518等;此外,还提供了PHY的参考原理图,一并放在了资料包中;

IP地址、端口号的修改

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

UDP视频接收显示QT上位机

仅提供Win10版本的QT上位机,位置如下:
在这里插入图片描述
以Win10版本为例,源码位置如下:
在这里插入图片描述
以Win10版本下,可以点击已经编译好的QT软件直接运行,位置如下:
在这里插入图片描述
QT上位机运行效果如下:
在这里插入图片描述
我们的QT目前仅支持1280x720分辨率的视频抓图显示,但同时预留了1080P接口,对QT开发感兴趣的朋友可以尝试修改代码以适应1080P,因为QT在这里只是验证工具,不是本工程的重点,所以不再过多赘述;

工程源码架构

提供11套工程源码,以工程源码1为例,工程Block Design设计如下:
在这里插入图片描述
提供11套工程源码,以工程源码1为例,综合后的工程源码架构如下:
在这里插入图片描述
FDMA图像缓存架构虽然不需要SDK配置,但PL端时钟由Zynq软核提供,所以需要运行运行SDK以启动Zynq;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个“Hello World”即可,如下:
在这里插入图片描述

04、vivado工程源码01详解–>Artix7-35T,RTL8211E做PHY

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:RTL8211E芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

05、vivado工程源码02详解–>Artix7-35T,YT8531C做PHY

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:YT8531C芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

06、vivado工程源码03详解–>Artix7-35T,KSZ9031做PHY

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:KSZ9031芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

07、vivado工程源码04详解–>Artix7-100T,B50610做PHY

开发板FPGA型号:Xilinx–Artix7–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:B50610芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

08、vivado工程源码05详解–>Kintex7-325T,B50610做PHY

开发板FPGA型号:Xilinx–>Kintex7-325T–xc7k325tffg676-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:B50610芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

09、vivado工程源码06详解–>Kintex7-325T,RTL8211F做PHY

开发板FPGA型号:Xilinx–>Kintex7-325T–xc7k325tffg900-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、vivado工程源码07详解–>Zynq7020,B50610做PHY

开发板FPGA型号:Xilinx–>Zynq7020—xc7z020clg400-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+PS端DDR3颗粒
以太网物理层方案:B50610芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

11、vivado工程源码08详解–>Zynq7020,KSZ9031做PHY

开发板FPGA型号:Xilinx–>Zynq7020—xc7z020clg400-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+PS端DDR3颗粒
以太网物理层方案:KSZ9031芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

12、vivado工程源码09详解–>Zynq7100,RTL8211E做PHY

开发板FPGA型号:Xilinx–>Zynq7100—xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+PS端DDR3颗粒
以太网物理层方案:RTL8211E芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

13、vivado工程源码10详解–>KU060,RTL8211F做PHY

开发板FPGA型号:Xilinx–>Kintex UltraScale–xcku060-ffva1156-2-i;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR4颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

14、vivado工程源码11详解–>KU3P,RTL8211F做PHY

开发板FPGA型号:Xilinx–>Kintex UltraScale±-xcku3p-ffva676-2-i;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR4颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

15、vivado工程源码12详解–>ZU4EV,RTL8211F做PHY

开发板FPGA型号:Xilinx- Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
FPGA开发环境:Vivado2019.1;
输入:OV5640摄像头或动态彩条,分辨率1280x720@30Hz;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+PS端DDR4颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

16、工程移植说明

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

17、上板调试验证并演示

准备工作

需要准备的器材如下:
摄像头,没有摄像头可用动态彩条;
FPGA开发板,没有开发板可以找本博提供;
网线;
电脑主机;
我的开发板了连接如下:
在这里插入图片描述
然后将电脑端IP地址设置为如下:
在这里插入图片描述
然后下载bit或者固化bin文件,即可开始测试;

ping测试

打开电脑CMD,输入ping指令;
单次ping测试如下:
在这里插入图片描述
连续ping测试如下:
在这里插入图片描述

ARP测试

打开电脑CMD,输入ARP指令;如下:
在这里插入图片描述

QT上位机配置

打开QT上位机配置如下,然后可以采集显示视频;
在这里插入图片描述

FPGA实时视频采集转UDP网络视频流输出演示

FPGA实时视频采集转UDP网络视频流输出演示如下:

UDP-图传

18、工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾名片。
网盘资料如下:
在这里插入图片描述
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐