
FPGA实时视频缩放转千兆UDP网络输出,基于Tri Mode Ethernet MAC+PHY芯片架构,提供6套工程源码和技术支持
FPGA实时视频缩放转千兆UDP网络输出,基于Tri Mode Ethernet MAC+PHY芯片架构,提供6套工程源码和技术支持
目录
- 1、前言
- 2、相关方案推荐
- 3、工程详细设计方案
- 4、vivado工程源码1详解-->Artix7-35T,RTL8211E做PHY
- 5、vivado工程源码2详解-->Artix7-35T,KSZ9031做PHY
- 6、vivado工程源码3详解-->Kintex7-325T,B50610做PHY
- 7、vivado工程源码4详解-->Kintex7-325T,RTL8211F做PHY
- 8、vivado工程源码5详解-->Zynq7100,RTL8211E做PHY
- 9、vivado工程源码6详解-->KU060,RTL8211F做PHY
- 10、工程移植说明
- 11、上板调试验证并演示
- 12、工程代码的获取
FPGA实时视频缩放转千兆UDP网络输出,基于Tri Mode Ethernet MAC+PHY芯片架构,提供6套工程源码和技术支持
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初始化配置,然后采集摄像头视频;然后使用自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块实现对输入视频的图像缩放操作;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存后读出,缓存介质为板载DDR3或DDR4;从DDR读出的视频然后送入UDP视频组包发送模块,将视频加上包头和其他控制信息;然后组包的视频送入UDP协议栈进行以太网帧组帧;UDP协议栈输出的MAC数据经过FIFO组进行数据缓冲;MAC数据再送入Xilinx官方的Tri Mode Ethernet MAC IP核实现AXIS数据到RGMII数据转换;再经过板载的PHY网络芯片实现物理层功能,将RGMII数据转换为差分数据;再经过板载的RJ45网口,用网线传输到电脑端;电脑端使用QT上位机接收UDP网络视频并显示出来;本博客提供6套工程源码,具体如下:
现对上述6套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为Xilinx–>Artix7-35T–xc7a35tfgg484-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为纯VHDL代码方案;首先FPGA纯verilog实现的i2c配置模块完成HDMI RX的DDC接口配置,EDID配置为1920x1080@60Hz,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流;为了支持1920x1080@60Hz,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的silicom9011芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对silicom9011进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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–>Kintex7-325T–xc7k325tffg676-2;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的IT6802芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对IT6802进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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–xc7k325tffg900-2;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的ADV7611芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对ADV7611进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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–>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,也可采用其他型号;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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做视频采集卡项目;
工程源码6
开发板FPGA型号为Xilinx–>Kintex UltraScale–xcku060-ffva1156-2-i;输入视频为HDMI视频,用笔记本电脑模拟,笔记本电脑通过HDMI线连接FPGA开发板的HDMI输入接口,板载的ADV7611芯片实现HDMI视频解码,FPGA使用纯Verilog实现的i2c总线对ADV7611进行初始化配置,分辨率配置为1920x1080@60Hz,输出RGB888视频给FPGA;然后使用自研、纯verilog实现的、支持任意比例缩放的图像缩放模块,将输入视频由1920x1080缩放为1280x720;然后使用本博主常用的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做视频采集卡项目;
本文详细描述了FPGA实时视频采集缩放转UDP网络视频流输出的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往
我这里已有的以太网方案
目前我这里有大量UDP协议的工程源码,包括UDP数据回环,视频传输,AD采集传输等,也有TCP协议的工程,还有RDMA的NIC 10G 25G 100G网卡工程源码,对网络通信有需求的兄弟可以去看看:
直接点击前往
其中千兆TCP协议的工程博客如下:
直接点击前往
我这里已有的FPGA图像缩放方案
我的主页目前有FPGA图像缩放专栏,改专栏收录了我目前手里已有的FPGA图像缩放方案,从实现方式分类有基于HSL实现的图像缩放、基于纯verilog代码实现的图像缩放;从应用上分为单路视频图像缩放、多路视频图像缩放、多路视频图像缩放拼接;从输入视频分类可分为OV5640摄像头视频缩放、SDI视频缩放、MIPI视频缩放等等;以下是专栏地址:
点击直接前往
3、工程详细设计方案
工程设计原理框图
工程设计原理框图如下:
输入Sensor之–>RTL解码的HDMI
输入Sensor是本工程的输入设备,其二为板载的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;则输出动态彩条的视频;
整个模块代码架构如下:
输入Sensor之–>芯片解码的HDMI
输入Sensor是本工程的输入设备,其二为板载的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;则输出动态彩条的视频;
整个模块代码架构如下:
纯Verilog图像缩放模块详解
本设计的图像缩放模块使用纯Verilog方案,功能框图如下,由跨时钟FIFO、插值+RAM阵列构成,跨时钟FIFO的目的是解决跨时钟域的问题,比如从低分辨率视频放大到高分辨率视频时,像素时钟必然需要变大,这是就需要异步FIFO了,插值算法和RAM阵列具体负责图像缩放算法层面的实现;
插值算法和RAM阵列以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
依据上图,图像缩放模块内部核心是例化了4个双口RAM,作用是缓存4行图像,以得到4个临近的像素,以此为基础做线性插值;如果是做图像放大操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中插入更多的像素点来扩大分辨率;如果是做图像缩小操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中删除更多的像素点来缩小分辨率;此外,前面描述的工作是实时的、整幅图像全部扫描式的进行,所以需要对RAM的读写操作进行精准控制;
图像缩放模块代码架构如下:模块的例化请参考工程源码的顶层代码;
图像缩放模块FIFO的选择可以调用工程对应的vivado工具自带的FIFO IP核,也可以使用纯verilog实现的FIFO,可通过接口参数选择,图像缩放模块顶层接口如下:FIFO_TYPE选择原则如下:
1:总体原则,选择"xilinx"好处大于选择"verilog";
2:当你的FPGA逻辑资源不足时,请选"xilinx";
3:当你图像缩放的视频分辨率较大时,请选"xilinx";
4:当你的FPGA没有FIFO IP或者FIFO IP快用完了,请选"verilog";
5:当你向自学一下异步FIFO时,,请选"verilog";
6:不同FPGA型号对应的工程FIFO_TYPE参数不一样,但选择原则一样,具体参考代码;
2种插值算法的整合与选择
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:
input wire i_scaler_type //0-->bilinear;1-->neighbor
通过输入i_scaler_type 的值即可选择;
输入0选择双线性插值算法;
输入1选择邻域插值算法;
代码里的配置如下:
纯Verilog图像缩放模块使用(重点阅读)
图像缩放模块使用非常简单,顶层代码里设置了四个参数,举例如下:
上图是将输入视频分辨率从1280x720缩放为1920x1080;
如果你想将输入视频分辨率从1280x720缩放为640x480;
则只需修改为如下:
再比如你想将输入视频分辨率从1280x720缩放为960x540;
则只需修改为如下:
当然,需要修改的不仅仅这一个地方,FDMA的配置也需要相应修改,详情请参考代码,但我想要证明的是,图像缩放模块使用非常简单,你都不需要知道它内部具体怎么实现的,上手就能用;
在本博主这里,想要实现图像缩放,操作就是这么无脑简单,就该两个参数就能搞定貌似高大上的双线性插值图像缩放,这种设计、这种操作、这种工程源码,你还喜欢吗?
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在这里只是验证工具,不是本工程的重点,所以不再过多赘述;
工程源码架构
提供6套工程源码,以工程源码1为例,工程Block Design设计如下:
提供6套工程源码,以工程源码1为例,综合后的工程源码架构如下:
FDMA图像缓存架构虽然不需要SDK配置,但PL端时钟由Zynq软核提供,所以需要运行运行SDK以启动Zynq;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个“Hello World”即可,如下:
4、vivado工程源码1详解–>Artix7-35T,RTL8211E做PHY
开发板FPGA型号:Xilinx–Artix7–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,纯VHDL解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:KSZ9031芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
5、vivado工程源码2详解–>Artix7-35T,KSZ9031做PHY
开发板FPGA型号:Xilinx–Artix7–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,ADV7611芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:KSZ9031芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
6、vivado工程源码3详解–>Kintex7-325T,B50610做PHY
开发板FPGA型号:Xilinx–>Kintex7-325T–xc7k325tffg676-2;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,IT6802芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:B50610芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
7、vivado工程源码4详解–>Kintex7-325T,RTL8211F做PHY
开发板FPGA型号:Xilinx–>Kintex7-325T–xc7k325tffg900-2;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,ADV7611芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+DDR3颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
8、vivado工程源码5详解–>Zynq7100,RTL8211E做PHY
开发板FPGA型号:Xilinx–>Zynq7100—xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,纯VHDL解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+PS端DDR3颗粒
以太网物理层方案:RTL8211E芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
9、vivado工程源码6详解–>KU060,RTL8211F做PHY
开发板FPGA型号:Xilinx–>Kintex UltraScale–xcku060-ffva1156-2-i;
FPGA开发环境:Vivado2019.1;
输入:HDMI或者FPGA内部动态彩条,ADV7611芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:千兆UDP网络视频,分辨率1280x720@60Hz;
图像缩放方案:纯verilog代码实现、任意比例缩放的图像缩放模块;
图像缩放用例:1920x1080缩放到1280x720;
图像缓存方案:FDMA图像缓存+DDR4颗粒
以太网物理层方案:RTL8211F芯片,延时模式,RGMII接口;
FPGA端MAC方案:Xilinx官方Tri Mode Ethernet MAC IP核,固定千兆模式;
以太网传输层协议:UDP协议,千兆速率;
实现功能:FPGA实时视频采集转UDP网络视频流输出;
工程作用:此工程目的是让读者掌握FPGA实时视频采集转UDP网络视频流输出的设计能力,以便能够移植和设计自己的项目;
工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
10、工程移植说明
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软核;
11、上板调试验证并演示
准备工作
需要准备的器材如下:
摄像头,没有摄像头可用动态彩条;
FPGA开发板,没有开发板可以找本博提供;
网线;
电脑主机;
我的开发板了连接如下:
然后将电脑端IP地址设置为如下:
然后下载bit或者固化bin文件,即可开始测试;
ping测试
打开电脑CMD,输入ping指令;
单次ping测试如下:
连续ping测试如下:
ARP测试
打开电脑CMD,输入ARP指令;如下:
QT上位机配置
打开QT上位机配置如下,然后可以采集显示视频;
FPGA实时视频采集转UDP网络视频流输出演示
FPGA实时视频采集转UDP网络视频流输出演示如下:
HDMI-UDP
12、工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾名片。
网盘资料如下:

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)