Zynq7020 使用 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语言的综合能力,不适合初学者或者小白;

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显示输出和串口打印分别如下:

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

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

相关文章

java+vue基于Spring Boot的渔船出海及海货统计系统

该渔船出海及海货统计系统采用B/S架构、前后端分离进行设计,并采用java语言以及springboot框架进行开发。该系统主要设计并完成了管理过程中的用户注册登录、个人信息修改、用户信息、渔船信息、渔船航班、海货价格、渔船海货、非法举报、渔船黑名单等功能。该系统操…

Elasticsearch安装Windows版

目录 1.:下载安装包,选择指定的版本,这里选择了7.8.0,官网下载地址: ​编辑 2:下载好之后解压,解压之后是这样的: 3:配置环境变量,跟JDK一样,…

rime中州韵小狼毫 联想词组 滤镜

教程目录:rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 在 rime中州韵小狼毫 自定义词典 一文中,我们分享了如何在rime中州韵小狼毫须鼠管输入法中定义用户自定义词典;通过自定义词典,我们可以很方便的在…

*(长期更新)软考网络工程师学习笔记——Section 22 无线局域网

目录 一、IEEE 802.11的定义二、IEEE 802.11系列标准三、IEEE 802.11的两种工作模式四、CDMA/CA协议(一)CDMA/CA协议的定义(二)CDMA/CA协议的过程 五、AC与AP(一)接入控制器AC(二)无…

MySQL解决海量数据和并发性的方案——分库分表

分库分表其实是两个事情,为了解决的东西实际上也是两个,但是一定要注意,不到最后万不得已,不要用分库分表,因为这会对数据查询有极大限制。 数据量太大查询慢的问题。 这里面我们讲的「查询」其实 主要是事务中的查询…

如何实现图片压缩

文章目录 1、canvas实现图片压缩2、其他 1、canvas实现图片压缩 canvas 实现图片压缩,主要是使用 canvas 的drawImage 方法 具体思路 拿到用户上传的文件转成base64创建一个 Image,主要是获取到这个图片的宽度和高度创建一个 2D 的画布,画布…

一文搞懂系列——Linux C线程池技术

背景 最近在走读诊断项目代码时,发现其用到了线程池技术,感觉耳目一新。以前基本只是听过线程池,但是并没有实际应用。对它有一丝的好奇,于是趁这个机会深入了解一下线程池的实现原理。 线程池的优点 线程池出现的背景&#xf…

RocketMQ源码阅读-Message拉取与消费-Broker篇

RocketMQ源码阅读-Message拉取与消费-Broker篇 1. ConsumeQueue是什么2. Message重放2.1 从MappedFile文件读取Message到ConsumeQueue2.2 ConsumeQueue持久化 3. Broker提供的拉取接口3.1 请求Header3.2 拉取消息接口3.3 拉取失败处理 4. Broker提供的更新消费进度接口5. Broke…

短视频IP运营流程架构SOP模板PPT

【干货资料持续更新,以防走丢】 短视频IP运营流程架构SOP模板PPT 部分资料预览 资料部分是网络整理,仅供学习参考。 抖音运营资料合集(完整资料包含以下内容) 目录 抖音15秒短视频剧本创作公式 在抖音这个短视频平台上&#…

SpringBoot集成RabbitMq,RabbitMq消费与生产,消费失败重发机制,发送签收确认机制

RabbitMq消费与生产,消费失败重发机制,发送确认机制,消息发送结果回执 1. RabbitMq集成spring bootRabbitMq集成依赖RabbitMq配置RabbitMq生产者,队列,交换通道配置,消费者示例 2. RabbitMq消息确认机制消息…

【例7.5】 取余运算(mod) 快速幂

1326:【例7.5】 取余运算(mod) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 输入b,p,k的值,求bpmodk 的值。其中b,p,kk为长整型数。 【输入】 输入b,p&#xf…

Scott用户数据表的分析

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果想要知道某个用户所有的数据表: select * from tab; 此时结果中一共返回了四张数据表,分别为部门表(dept) ,员工表(emp&a…

【LV12 DAY20 RTC实验】

编程实现通过LED状态显示当前电压范围,并打印产生低压警报时的时间 注: 电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时,LED2、LED3、LED4点亮 电压在501mv~1000mv时,LED2、LED3点亮 电压在…

HTML--CSS--浮动布局及定位布局

正常文档布局 块元素独占一行 行内元素在有多个的时候,就是从左到右排在一行 块元素包括:div,p,hr 行内元素:span,i,img 浮动布局 float 属性: left 向左 right 向右 作用我目前看起来就是浮动元素的宽度是由内容决定的&#x…

HDFS和MapReduce综合实训

文章目录 第1关:WordCount词频统计第2关:HDFS文件读写第3关:倒排索引第4关: 网页排序——PageRank算法 第1关:WordCount词频统计 测试说明 以下是测试样例: 测试输入样例数据集:文本文档test1…

Java实战之每日海报

前言 使用java生成每日海报。 项目起因是巧合下遇到了一篇很棒的文档,说的是用程序来实现每日生成一个海报。如果之后加上自动发布的功能,简直就是太棒了啊! 样例图如下: 每日海报 思路 访问某词站的API获取网络图片&#…

Java持久层框架之争:选择最佳方案来提升你的开发效率!

1、前言 在现代软件开发领域,选择适合的持久层框架是至关重要的一步。持久层框架可以帮助我们管理数据访问、数据库连接、事务处理等复杂的数据库操作,从而提升开发效率和代码质量。 然而,在众多的Java持久层框架中,选择最佳方案并…

算法通关村番外篇-LeetCode编程从0到1系列五

大家好我是苏麟 , 今天带来算法通关村番外篇-LeetCode编程从0到1系列五 . 数学 1523. 在区间范围内统计奇数数目 描述 : 给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。 题目 : LeetCode 1523. 在区间范围内统计奇…

Spring Data JPA 踩过的坑实录

前言 游戏中台一直在使用spring 全家桶, 本文会左右使用Spring Data JPA的坑点记录总结 主要给大家总结介绍了关于使用Spring JPA注意事项及踩过的坑。 案例1: 为什么只调用了 org.springframework.data.repository.CrudRepository#findById(ID id) 却…

孤儿进程与僵尸进程以及僵尸进程的解决

孤儿进程: 定义: 父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程( Orphan Process )。 过程: 每当出现一个孤儿进程的时候,内核就…