电信宽带做网站,设计开发网站,深圳外贸建站搭建哪家好,网站建设歺金手指排名13目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包UDP… 目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC介绍以及移植注意事项B50610 PHYQT上位机和源码 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基于B50610网络PHY芯片实现千兆网UDP视频传输(视频缩放后再传输)视频源有两种分别对应开发者手里有没有摄像头的情况一种是使用板载的HDMI输入接口(笔记本电脑输入模拟HDMI输入源)另一种是如果你的手里没有摄像头或者你的开发板没HDMI输入接口则可使用代码内部生成的动态彩条模拟摄像头视频视频源的选择通过代码顶层的define宏定义进行上电默认选择HDMI输入接口作为视频输入源FPGA采集视频后首先使用纯verilog实现的图像缩放模块对视频进行缩小操作即从输入的1920x1080分辨率缩小为1280x720因为我们的QT上位机目前只支持1280x720所以才需要缩放使用FDMA将视频缓存到DDR3中然后将视频读出根据与QT上位机的通信协议将视频进行UDP数据组包然后使用我们的UDP协议栈对视频进行UDP数据封装再将数据送入Tri Mode Ethernet MAC IP输出给开发板板载的B50610网络PHY然后UDP视频通过开发板板载的RJ45网口经网线传输给电脑主机电脑端用我们提供的QT上位机采集图像并显示提供vivado2019.1版本的FPGA工程源码和QT上位机及其源码
本博客详细描述了FPGA基于B50610网络PHY芯片实现千兆网UDP视频传输的设计方案工程代码可综合编译上板调试可直接项目移植适用于在校学生、研究生项目开发也适用于在职工程师做学习提升可应用于医疗、军工等行业的高速接口或图像处理领域 提供完整的、跑通的工程源码和技术支持 工程源码和技术支持的获取方式放在了文章末尾请耐心看到最后
版本更新说明
此版本为第2版根据读者的建议对第1版工程做了如下改进和更新 1增加了输入视频动态彩条的选择有的读者说他手里没有OV5640摄像头或者摄像头原理图和我的不一致导致在移植过程中困难很大基于此增加了动态彩条它由FPGA内部产生不需要外接摄像头就可以使用使用方法在后文有说明本例程板载的是HDMI输入接口没有该接口的朋友可以选择使用动态彩条 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视频传输方案但他的输入视频没有进行缩放操作而是直接缓存后送UDP协议栈输出博客链接如下直接点击前往
FPGA图像缩放方案
本博客使用到的图像缩放方案是我之前发布过的一篇博文的内容对该图像缩放部分感兴趣的可以参考博客链接如下直接点击前往
我这里已有的以太网方案
目前我这里有大量UDP协议的工程源码包括UDP数据回环视频传输AD采集传输等也有TCP协议的工程还有RDMA的NIC 10G 25G 100G网卡工程源码对网络通信有需求的兄弟可以去看看直接点击前往 其中千兆TCP协议的工程博客如下 直接点击前往
3、设计思路框架
FPGA工程设计框图如下
视频源选择
视频源有两种分别对应开发者手里有没有摄像头的情况一种是使用板载的HDMI输入接口另一种是如果你的手里没有摄像头或者你的开发板没HDMI输入接口则可使用代码内部生成的动态彩条模拟摄像头视频视频源的选择通过代码顶层的宏定义进行上电默认选择HDMI输入接口作为视频输入源 视频源的选择通过代码顶层的define宏定义进行如下 选择逻辑代码部分如下 选择逻辑如下 当(注释) define COLOR_IN时输入源视频是动态彩条 当(不注释) define COLOR_IN时输入源视频是HDMI输入
IT6802解码芯片配置及采集
IT6802解码芯片需要i2c配置才能使用关于IT6802解码芯片的配置和使用请参考我往期的博客博客地址点击直接前往 IT6802解码芯片配置及采集这两部分均用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实现图像缩放
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官方IPTri Mode Ethernet MAC其在代码中的位置如下 可以看到其中泰处于被锁定状态这是我们故意为之目的是根据不同的PHY延时参数而修改其内部代码和内部时序约束代码由于本设计使用的网络PHY为B50610所以这里重点介绍使用B50610时Tri Mode Ethernet MAC的修改和移植事项当你需要工程移植或者你的vivado版本与我的不一致时Tri Mode Ethernet MAC都需要在vivado中进行升级但由于该IP已被我们人为锁定所以升级和修改需要一些高端操作关于操作方法我专门写了一篇文档已附在资料包里如下
B50610 PHY
本设计开发板使用的网络PHY为B50610工作在延时模式下原理图引出了MDIO但代码中不需要MDIO配置通过上下拉电阻即可使B50610工作于延时模式该PHY最高支持千兆且能在10M/100M/1000M之间自动协商但本设计在Tri Mode Ethernet MAC端固定为1000M在资料包中我们提供B50610的原理图
QT上位机和源码
我们提供和UDP通信协议相匹配的QT抓图显示上位机及其源代码目录如下 我们的QT目前仅支持1280x720分辨率的视频抓图显示但同时预留了1080P接口对QT开发感兴趣的朋友可以尝试修改代码以适应1080P因为QT在这里只是验证工具不是本工程的重点所以不再过多赘述详情请参考资料包的QT源码位置如下
4、vivado工程详解
开发板FPGA型号Xilinx–Kintex7–xc7k325tffg676-2 开发环境Vivado2019.1 输入HDMI或动态彩条分辨率1920x1080 输出千兆UDP协议栈B50610 PHYRJ45网口 工程作用千兆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是否连通如下
静态演示
HDMI输入1920x1080缩小到1280x720后UDP网络传输QT上位机显示如下 动态彩条1920x1080缩小到1280x720后UDP网络传输QT上位机显示如下
动态演示
动态视频演示如下 FPGA-UDP-视频缩放传输-K7-16比9 7、福利工程源码获取
福利工程代码的获取 代码太大无法邮箱发送以某度网盘链接方式发送 资料获取方式私或者文章末尾的V名片。 网盘资料如下