首页 > 其他分享 >Zynq7020 使用 Video Processing Subsystem 实现图像缩放

Zynq7020 使用 Video Processing Subsystem 实现图像缩放

时间:2024-01-15 21:32:38浏览次数:34  
标签:Subsystem HDMI FPGA 缩放 IP 分辨率 Processing 图像

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版本的工程源码和技术支持;工程源码设计框图如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide

框图解释:箭头表示数据流向,箭头内文字表示数据格式,箭头外数字表示数据柳巷的步骤;

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资源情况;

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_图像缩放_02

Video Processing Subsystem IP配置如下:这里配置为双线性插值图像缩放算法;

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_03

4、工程代码详解

PL 端 FPGA 逻辑设计

开发板FPGA型号:Xilinx--Zynq7020--xc7z020clg400-2;开发环境:Vivado2019.1;输入:OV5640摄像头,分辨率1280x720p;输出:HDMI,1080P分辨率下的有效区域显示;工程作用:Zynq-7000系列FPGA使用Video Processing Subsystem实现图像缩放, HDMI 输出;工程BD如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_04

工程代码架构如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_05

工程的资源消耗和功耗如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_06

PS 端 SDK 软件设计

PS 端 SDK 软件工程代码架构如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_07

主函数通过如下的五个宏定义设计了五种不同的图像缩放方案:ov5640输入分辨率1280x720,HDMI输出分辨率1280x720;ov5640输入分辨率1280x720,HDMI输出分辨率640x480;ov5640输入分辨率1280x720,HDMI输出分辨率300x300;ov5640输入分辨率1280x720,HDMI输出分辨率1600x800;ov5640输入分辨率1280x720,HDMI输出分辨率1920x1080;

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_08

主函数进行相应的图像缩放操作,并打印相关信息,代码如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_09

5、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;

2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件-->另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_10

3:如果你的vivado版本高于本工程vivado版本,解决如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_11

打开工程后会发现IP都被锁住了,如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_12

此时需要升级IP,操作如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_13

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_14

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_15

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_16

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_图像缩放_17

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

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_18

ov5640输入分辨率1280x720,HDMI输出分辨率640x480;HDMI显示输出和串口打印分别如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_19

ov5640输入分辨率1280x720,HDMI输出分辨率300x300;HDMI显示输出和串口打印分别如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_ide_20

ov5640输入分辨率1280x720,HDMI输出分辨率1600x800;HDMI显示输出和串口打印分别如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_21

ov5640输入分辨率1280x720,HDMI输出分辨率1920x1080;HDMI显示输出和串口打印分别如下:

Zynq7020 使用 Video Processing Subsystem 实现图像缩放_IP_22

标签:Subsystem,HDMI,FPGA,缩放,IP,分辨率,Processing,图像
From: https://blog.51cto.com/u_15641375/9258503

相关文章

  • sklearn.preprocessing + keras
    sklearn.preprocessing+kerassklearn的数据预处理可以对业务数据进行规范化,和规范化后的数据还原,经常跟其他的模型配合使用。例如如下情况:https://github.com/influxdata/influxdb-client-python/blob/master/notebooks/stock-predictions.ipynb ExampleInfluxD......
  • Three.js——十五、Box3、相机动画、lookAt()视线方向、管道漫游案例、OrbitControls
    正投影相机正投影相机和透视相机的区别如果都以高处俯视去看整个场景,正投影相机就类似于2d的可视化的效果,透视相机就类似于人眼观察效果调整left,right,top,bottom范围大小如果你想整体预览全部立方体,就需要调整相机的渲染范围,比如设置上下左右的范围。使用场景:正投影可以......
  • 【MLOps】使用Ray缩放AI
    Ray正在人工智能工程领域崭露头角,对扩展LLM和RL至关重要Spark在数据工程中几乎是必不可少的。Ray正在人工智能工程领域崭露头角。雷是伦敦大学学院Spark的继任者。Spark和Ray有很多相似之处,例如用于计算的统一引擎。但Spark主要专注于大规模数据分析,而Ray则是为机器学习应用程序设......
  • Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用
    作者主页:www.sysin.org在Beta频道中为Windows预览体验成员宣布Windows11Preview上的Android™应用程序今天我们宣布的Android™应用程序适用于Windows11的第一个预览版现已在Beta频道在美国的WindowsInsiders可用,如果您还没有读过thisblogpostfromGiorgio......
  • Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (July
    WindowsSubsystemforAndroid(WSA)下载:在Windows11上运行Android应用(July2023)适用于Android™️的Windows子系统,2023年7月更新:2306.40000.4.0作者主页:sysin.org适用于Android™️的Windows子系统使你的Windows11设备能够运行AmazonAppstore中提供的Andr......
  • 【AI 实战】Text Processing and Word Embedding 文本处理以及词嵌入原理和代码实例讲
    文章目录【AI实战】TextProcessingandWordEmbedding文本处理以及词嵌入原理和代码实例讲解TexttoSequenceStep1:TokenizationStep2:BuildDictionaryStep3:One-HotEncodingStep4:AlignSequencesTextProcessinginKerasWordEmbedding:WordtoVectorHowtom......
  • JavaScript元素根据父级元素宽高缩放
    /***等比缩放*@paramwrap外部容器*@paramcontainer待缩放的容器*@returns{{width:number,height:number}}*返回值:width:宽度,height:高度*/aspectRatio(wrap:any,container:any){//w=h/ratio,h=w*rat......
  • vuejs+echarts实现x轴为时间轴且数据区域可缩放
    1、效果图2、具体功能描述①选择的时间为时间轴的开始和结束时间;②鼠标可以左右拖动x轴时间轴;③鼠标放入图表中可以缩放数据,x轴会相应的更改当前坐标轴间隔值,最小间隔值为1分钟,最大间隔值为1年,且在缩放时可以获取到数据窗口范围的起始数值;④点击y轴名称会对相应数据显示隐......
  • multiprocessing.Event()
    `multiprocessing.Event()`是Python中的一个类,用于在多进程之间共享布尔变量。这个类提供了一种简单的并发原语,允许进程之间进行通信。`multiprocessing.Event()`包装了一个布尔变量,可以设置为“已设置”(True)或“未设置”(False)。进程共享`Event`实例后,可以检查事件是否已设......
  • PyTorch for Natural Language Processing: A Complete Overview
    1.背景介绍自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学与人工智能的一个分支,旨在让计算机理解、解析和生成人类语言。自然语言处理的主要任务包括文本分类、情感分析、命名实体识别、语义角色标注、语义解析、机器翻译、语音识别、语音合成、问答系统、对话系统等。......