Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

目录

  • 1、前言
    • 免责声明
  • 2、相关方案推荐
    • FPGA图像处理方案
    • FPGA图像缩放方案
    • 自己写的HLS图像缩放方案
  • 3、设计思路详解
    • Video Processing Subsystem 介绍
  • 4、工程代码详解
    • PL 端 FPGA 逻辑设计
    • PS 端 SDK 软件设计
  • 5、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 6、上板调试验证并演示
    • 准备工作
    • 输出静态演示
  • 7、福利:工程源码获取

Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

1、前言

没玩过图像缩放都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。
目前市面上主流的FPGA图像缩放方案如下:
1:Xilinx的HLS方案,该方案简单,易于实现,但只能用于Xilinx自家的FPGA;
2:非纯Verilog方案,大部分代码使用Verilog实现,但中间的fifo或ram等使用了IP,导致移植性变差,难以在Xilinx、Altera和国产FPGA之间自由移植;
3:纯Verilog方案;

本文使用Xilinx Zynq7000系列FPGA Zynq7020实现Video Processing Subsystem图像缩放,输入视频源采用OV5640摄像头模组;FPGA采集OV5640摄像头视频DVP转RGB888,调用Zynq软核的片内i2c控制器将OV5640配置为1280x720@30Hz分辨率;然后调用Xilinx官方的Video In to AXI4-Stream IP核将RGB视频流转换为AXI4-Stream视频流;然后调用Xilinx官方的Video Processing Subsystem IP核将输入视频进行任意尺寸图像缩放操作,该操作通过Zynq软核SDK软件配置,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的VDMA IP将视频做PS侧DDR3的视频缓存操作,调用Zynq将VDMA配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Timing Controller IP和AXI4-Stream to Video Out IP将AXI4-Stream视频流转换为RGB视频流;然后添加自定义的HDMI发送IP将RGB视频转换为TMDS的差分视频送显示器显示;提供一套vivado2019.1版本的工程源码和技术支持;

本博客详细描述了Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;整个工程调用Zynq软核做IP的配置,Zynq的配置在SDK里以C语言软件代码的形式运行,所以整个工程包括FPGA逻辑设计和SDK软件设计两部分,需要具备FPGA和嵌入式C语言的综合能力,不适合初学者或者小白;

提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

FPGA图像处理方案

我的主页目前有FPGA图像处理专栏,改专栏收录了我目前手里已有的FPGA图像处理方案,包括图像缩放、图像识别、图像拼接、图像融合、图像去雾、图像叠加、图像旋转、图像增强、图像字符叠加等等;以下是专栏地址:
点击直接前往

FPGA图像缩放方案

我的主页目前有FPGA图像缩放专栏,改专栏收录了我目前手里已有的FPGA图像缩放方案,从实现方式分类有基于HSL实现的图像缩放、基于纯verilog代码实现的图像缩放;从应用上分为单路视频图像缩放、多路视频图像缩放、多路视频图像缩放拼接;从输入视频分类可分为OV5640摄像头视频缩放、SDI视频缩放、MIPI视频缩放等等;以下是专栏地址:
点击直接前往

自己写的HLS图像缩放方案

之前写过一篇自己写的HLS图像缩放的博客,该方案与官方的Video Processing Subsystem区别在于手写的看得到;以下是博客地址:
点击直接前往

3、设计思路详解

本文使用Xilinx Zynq7000系列FPGA Zynq7020实现Video Processing Subsystem图像缩放,输入视频源采用OV5640摄像头模组;FPGA采集OV5640摄像头视频DVP转RGB888,调用Zynq软核的片内i2c控制器将OV5640配置为1280x720@30Hz分辨率;然后调用Xilinx官方的Video In to AXI4-Stream IP核将RGB视频流转换为AXI4-Stream视频流;然后调用Xilinx官方的Video Processing Subsystem IP核将输入视频进行任意尺寸图像缩放操作,该操作通过Zynq软核SDK软件配置,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的VDMA IP将视频做PS侧DDR3的视频缓存操作,调用Zynq将VDMA配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Timing Controller IP和AXI4-Stream to Video Out IP将AXI4-Stream视频流转换为RGB视频流;然后添加自定义的HDMI发送IP将RGB视频转换为TMDS的差分视频送显示器显示;提供一套vivado2019.1版本的工程源码和技术支持;
工程源码设计框图如下:
在这里插入图片描述
框图解释:箭头表示数据流向,箭头内文字表示数据格式,箭头外数字表示数据柳巷的步骤;

Video Processing Subsystem 介绍

由于工程所用到的IP都是常用IP,所以这里重点介绍一下Video Processing Subsystem;
Video Processing Subsystem有缩放、去隔行、颜色空间转换等功能,这里仅使用图像缩放功能;其特点如下:
适用于Xilinx所有系列的FPGA器件;
支持最大分辨率:8K,即可以处理高达8K的视频;
输入视频格式:AXI4-Stream;
输出视频格式:AXI4-Stream;
需要SDK软件配置,其本质为通过AXI_Lite 做寄存器配置;
提供自定义的配置API,通过调用该库函数即可轻松使用,具体参考SDK代码;
模块占用的FPGA逻辑资源更小,相比于自己写的HLS图像缩放而言,官方的Video Processing Subsystem资源占用大约减小30%左右,且更高效:
Video Processing Subsystem逻辑资源如下,请谨慎评估你的FPGA资源情况;
在这里插入图片描述
Video Processing Subsystem IP配置如下:这里配置为双线性插值图像缩放算法;
在这里插入图片描述
在这里插入图片描述

4、工程代码详解

PL 端 FPGA 逻辑设计

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的有效区域显示;
工程作用:Zynq-7000系列FPGA使用Video Processing Subsystem实现图像缩放, HDMI 输出;
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

PS 端 SDK 软件设计

PS 端 SDK 软件工程代码架构如下:
在这里插入图片描述
主函数通过如下的五个宏定义设计了五种不同的图像缩放方案:
ov5640输入分辨率1280x720,HDMI输出分辨率1280x720;
ov5640输入分辨率1280x720,HDMI输出分辨率640x480;
ov5640输入分辨率1280x720,HDMI输出分辨率300x300;
ov5640输入分辨率1280x720,HDMI输出分辨率1600x800;
ov5640输入分辨率1280x720,HDMI输出分辨率1920x1080;
在这里插入图片描述
主函数进行相应的图像缩放操作,并打印相关信息,代码如下:
在这里插入图片描述

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、上板调试验证并演示

准备工作

Zynq7000系列开发板;
OV5640摄像头;
HDMI显示器或者LCD显示屏,我用到的LCD显示屏为4.3寸分辨率800x480;

输出静态演示

ov5640输入分辨率1280x720,HDMI输出分辨率1280x720;
HDMI显示输出和串口打印分别如下:
在这里插入图片描述
在这里插入图片描述
ov5640输入分辨率1280x720,HDMI输出分辨率640x480;
HDMI显示输出和串口打印分别如下:
在这里插入图片描述
在这里插入图片描述
ov5640输入分辨率1280x720,HDMI输出分辨率300x300;
HDMI显示输出和串口打印分别如下:
在这里插入图片描述
在这里插入图片描述
ov5640输入分辨率1280x720,HDMI输出分辨率1600x800;
HDMI显示输出和串口打印分别如下:
在这里插入图片描述
在这里插入图片描述
ov5640输入分辨率1280x720,HDMI输出分辨率1920x1080;
HDMI显示输出和串口打印分别如下:
在这里插入图片描述
在这里插入图片描述

7、福利:工程源码获取

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

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

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

相关文章

给sprite上增加刷光动效

游戏引擎 —— cocos creator 3.52 此动效给动态修改尺寸的图片增加一层刷光的效果,直接贴代码 CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: tr…

Charles 网络抓包工具详解与实战指南

文章目录 导读软件版本Charles基本原理核心功能下载及安装界面介绍网络包展示 常用场景介绍PC 端网络抓包移动端网络抓包PC 端配置手机端配置 开启 SSL 代理PC 端和移动端 CA 证书安装Charles 直接安装Charles 下载 CA 文件手动安装 常用操作请求重发请求改写、动态改写断点&am…

计算机网络——物理层相关习题(计算机专业考研全国统考历年真题)

目录 2012-34 原题 答案 解析 2018-34 原题 答案 解析 2009/2011-34 原题 答案 解析 2016-34 原题 答案 解析 2014-35/2017-34 原题 答案 解析 2013-34 原题 答案 解析 2015-34 原题 答案 解析 物理层的协议众多,这是因为物理层…

【DevOps】Git 图文详解(九):工作中的 Git 实践

本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…

【SpringMVC】 三层架构

一.lombok工具包 中央仓库查找这个工具包:https://mvnrepository.com/ 给类添加Data注解就可以获取gettter和setter方法 , 这样我们就不必写getter 和 setter 方法. 也可以给成员属性添加单独的getter 和 setter , 针对某个成员属性单独添加setter或setter方法. 二.如果使用spr…

一起学docker系列之七docker容器卷技术

目录 1 为什么使用容器数据卷?2 数据卷的特点和优势3 使用数据卷的方法3.1 创建容器并挂载数据卷3.2 容器间数据卷的共享与继承 4 数据卷的权限设置5 注意事项5.1 解决权限问题5.2 路径自动创建 结语 对于容器化应用程序的数据管理和持久化,Docker 数据卷…

链表的回文结构

题目描述 题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是: 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下: ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中:l…

成为AI产品经理——模型构建流程(下)

目录 1.模型训练 2.模型验证 3.模型融合 4.模型部署 上节课我们讲了模型设计、特征工程,这节课我们来讲模型构建剩下的三个部分:模型训练、模型验证和模型融合。 1.模型训练 模型训练就是要不断地训练、验证、调优直至让模型达到最优。 那么怎么达…

Python“牵手”京东商品详情接口运营场景,京东商品详情接口调用指南

京东商品详情接口是一种程序化的接口,通过这个接口,商家或开发者可以使用自己的编程技能,获取京东平台上的商品详细信息。这个接口允许商家根据自身的需求,获取商品的标题、价格、促销价、优惠券、库存、销量、详情图片、SKU属性、…

YOLOv5分割训练,从数据集标注到训练一条龙解决

最近进行了分割标注,感觉非常好玩,也遇到了很多坑,来跟大家分享一下,老样子有问题评论区留言,我会的就会回答你。 第一步:准备数据集 1、安装标注软件labelme如果要在计算机视觉领域深入的同学&#xff0…

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC通信简单…

致远M3 反序列化RCE漏洞复现(XVE-2023-24878)

0x01 产品简介 M3移动办公是致远互联打造的一站式智能工作平台,提供全方位的企业移动业务管理,致力于构建以人为中心的智能化移动应用场景,促进人员工作积极性和创造力,提升企业效率和效能,是为企业量身定制的移动智慧…

15.Python 异常处理和程序调试

1. 异常处理 异常就是在程序执行过程中发生的超出预期的事件。一般情况下,当程序无法正常执行时,都会抛出异常。 在开发过程中,由于疏忽或考虑不周,出现的设计错误。因此,在后期程序调试中应该根据错误信息&#xff…

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

手写数字可视化_Python数据分析与可视化

手写数字可视化 手写数字流形学习 手写数字 手写数字无论是在数据可视化还是深度学习都是一个比较实用的案例。 数据在sklearn中,包含近2000份8 x 8的手写数字缩略图。 首先需要先下载数据,然后使用plt.imshow()对一些图形进行可视化: 打开c…

Mysql 锁机制分析

整体业务代码精简逻辑如下: Transaction public void service(Integer id) {delete(id);insert(id); }数据库实例监控: 当时通过分析上游问题流量限流解决后,后续找时间又重新分析了下问题发生的根本原因,现将其总结如下&#xf…

XDR 网络安全:技术和最佳实践

扩展检测和响应(XDR)是一种安全方法,它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性,从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…

Linux系统介绍及文件类型和权限

终端:CtrlAltT 或者桌面/文件夹右键,打开终端 切换为管理员:sudo su 退出:exit 查看内核版本号:uname -a 内核版本号含义:5 代表主版本号;13代表次版本号;0代表修订版本号;30代表修订版本的第几次微调;数字越大表示内核越新. 目录结构 /bin:存放常用命令(即二进制可执行程序…

C/C++内存管理(2):`new`和`delete`的实现原理

new和delete操作自定义类型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

pcie-2-rj45速度优化

背景: 目前用iperf3打流传输速率达不到要求,千兆实际要求跑到800M以上: 优化方案: 1.优化defconfig: 首先编译user版本验证看是否正常 debug版本关闭CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通过更换驱动,或者更新驱动来优化 3.绑定大核: 以8125网卡为例,udp…