Xilinx Zynq-7000系列FPGA实现视频拼接显示,提供两套工程源码和技术支持

目录

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

Xilinx Zynq-7000系列FPGA实现视频拼接显示,提供两套工程源码和技术支持

1、前言

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

本文使用Xilinx Zynq7000系列FPGA Zynq7020实现HLS图像缩放,输入视频源采用OV5640摄像头模组;FPGA采集OV5640摄像头视频DVP转RGB888,调用Zynq软核的片内i2c控制器将OV5640配置为960x540@30Hz分辨率;工程用一路摄像头数据复制一份来模拟两路摄像头输入;然后调用2个Xilinx官方的Video In to AXI4-Stream IP核将RGB视频流转换为AXI4-Stream视频流;然后调用2个Xilinx官方的VDMA IP将视频做PS侧DDR3的视频缓存操作,VDMA需要Zynq软件配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Mixer IP核做两路视频拼接操作,Video Mixer需要Zynq软件配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Timing Controller IP和AXI4-Stream to Video Out IP将AXI4-Stream视频流转换为RGB视频流;然后添加自定义的HDMI发送IP将RGB视频转换为TMDS的差分视频送显示器显示;

提供两套vivado2019.1版本的工程源码和技术支持,两套工程的区别在于拼接的视频路数不同方式不同,详情如下:
第一套vivado工程源码:输入,OV5640摄像头;2路拼接输出,HDMI显示器;
第二套vivado工程源码:输入,OV5640摄像头;4路拼接输出,HDMI显示器;

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

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

免责声明

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

2、相关方案推荐

FPGA图像处理方案

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

FPGA视频拼接叠加融合方案推荐

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

3、设计思路详解

本文使用Xilinx Zynq7000系列FPGA Zynq7020实现HLS图像缩放,输入视频源采用OV5640摄像头模组;FPGA采集OV5640摄像头视频DVP转RGB888,调用Zynq软核的片内i2c控制器将OV5640配置为960x540@30Hz分辨率;工程用一路摄像头数据复制一份来模拟两路摄像头输入;然后调用2个Xilinx官方的Video In to AXI4-Stream IP核将RGB视频流转换为AXI4-Stream视频流;然后调用2个Xilinx官方的VDMA IP将视频做PS侧DDR3的视频缓存操作,VDMA需要Zynq软件配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Mixer IP核做两路视频拼接操作,Video Mixer需要Zynq软件配置为三帧缓存,其本质为通过AXI_Lite 做寄存器配置;然后调用Xilinx官方的Video Timing Controller IP和AXI4-Stream to Video Out IP将AXI4-Stream视频流转换为RGB视频流;然后添加自定义的HDMI发送IP将RGB视频转换为TMDS的差分视频送显示器显示;

提供两套vivado2019.1版本的工程源码和技术支持,两套工程的区别在于拼接的视频路数不同方式不同,详情如下:
第一套vivado工程源码:输入,OV5640摄像头;2路拼接输出,HDMI显示器;
第二套vivado工程源码:输入,OV5640摄像头;4路拼接输出,HDMI显示器;

第一套vivado工程源码设计框图如下:
在这里插入图片描述
第二套vivado工程源码设计框图如下:
在这里插入图片描述
框图解释:箭头表示数据流向,箭头内文字表示数据格式,箭头外数字表示数据流向的步骤;

Video Mixer介绍

由于工程所用到的IP都是常用IP,所以这里重点介绍一下Video Mixer IP;
支持最大分辨率:8K,即可以处理高达8K的视频;
支持最多16层视频拼接叠加,即最多可拼接16路视频;
输入视频格式:AXI4-Stream;
输出视频格式:AXI4-Stream;
需要SDK软件配置,其本质为通过AXI_Lite 做寄存器配置;
提供自定义的配置API,通过调用该库函数即可轻松使用,具体参考SDK代码;
模块占用的FPGA逻辑资源更小,相比于自己写的HLS视频拼接而言,官方的Video Mixer资源占用大约减小30%左右,且更高效:
Video Mixer逻辑资源如下,请谨慎评估你的FPGA资源情况;
在这里插入图片描述

4、工程代码1:2路视频拼接 HDMI 输出

PL 端 FPGA 逻辑设计

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率960x540;
输出:HDMI,1920x1080黑色背景下拼接2路视频输出;
工程作用:Xilinx Zynq-7000系列FPGA实现视频拼接显示, HDMI 输出;
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

PS 端 SDK 软件设计

PS 端 SDK 软件工程代码架构如下:
)
PS工程主函数如下:

#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "helai_mixer.h"
#include "uart.h"XIicPs	Iic;
XScuGic Intc;              //中断控制器驱动程序实例
XUartPs Uart_Ps;           //串口驱动程序实例
void main()
{uart_init(&Uart_Ps);    //串口初始化uart_intr_init(&Intc, &Uart_Ps); //串口中断初始化I2C_config_init();	//ov5640 配置完成helai_vdma();	// VDMA 配置完成helai_mixer();	// video mixer 配置完成print("zynq7020 两路视频拼接:\n\r");print("输入视频分辨率:960x540\n\r");print("1920x1080黑色背景下拼接两路视频输出\n\r");while (1) ;
}

5、工程代码2:4路视频拼接 HDMI 输出

PL 端 FPGA 逻辑设计

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率960x540;
输出:HDMI,1920x1080黑色背景下拼接4路视频输出;
工程作用:Xilinx Zynq-7000系列FPGA实现视频拼接显示, HDMI 输出;
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

PS 端 SDK 软件设计

PS 端 SDK 软件工程代码架构如下:
在这里插入图片描述

#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "helai_mixer.h"
#include "uart.h"XIicPs	Iic;
XScuGic Intc;              //中断控制器驱动程序实例
XUartPs Uart_Ps;           //串口驱动程序实例
void main()
{uart_init(&Uart_Ps);    //串口初始化uart_intr_init(&Intc, &Uart_Ps); //串口中断初始化I2C_config_init();	//ov5640 配置完成helai_vdma();	// VDMA 配置完成helai_mixer();	// video mixer 配置完成print("zynq7020 四路视频拼接:\n\r");print("输入视频分辨率:960x540\n\r");print("1920x1080黑色背景下拼接四路视频输出\n\r");while (1) ;
}

6、工程移植说明

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软核;

7、上板调试验证并演示

准备工作

Zynq7000系列开发板;
OV5640摄像头;
HDMI显示器,支持1080P;

输出静态演示

工程1:ov5640输入分辨率960x540,2路视频拼接输出如下:
在这里插入图片描述
工程2:ov5640输入分辨率960x540,4路视频拼接输出如下:
在这里插入图片描述

输出动态演示

录制了一个小视频,输出动态演示如下:

video-mixer-hdmi

8、福利:工程源码获取

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

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

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

相关文章

8.HTML中表单标签

8. 表单标签 8.1 为什么需要表单 使用表单的目的是为了收集用户信息, 在我们网页中,我们也需要跟用户进行交互,收集用户资料,此时就需要表单 8.2 表单的组成 在HTML中,一个完整的表单通常由表单域,表单控件…

Linux下安装python3步骤:

1.下载Python3源码 你需要从Python官网下载Python3的源码包。本文以Python 3.9.9为例。你可以使用wget命令来下载源码包到你的Linux主目录中: wget https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tgz2.编译和安装Python3 下载好源码包后,你需要解压它&…

分布式锁之基于redis实现分布式锁(二)

2. 基于redis实现分布式锁 2.1. 基本实现 借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(true);其他…

PS 计数工具 基础使用方式讲解

上文PS 注释工具 基础使用方法讲解 中 我们讲了注释工具 解析来 我们来看这个计数工具 这里 我们换一张图像 如果 我要你数清楚 这个图上有几个咖啡豆 你能数清楚吗? 哈哈 其实也不难 不是特别大 但是 例如很多 且无规则物品时 我们可能就会数乱 左上角属性的话 我…

【【Linux系统下常用指令学习 之 二 】】

Linux系统下常用指令学习 之 二 文件查询和搜索 文件的查询和搜索也是最常用的操作,在嵌入式 Linux 开发中常常需要在 Linux 源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等。 1、命令 find find 命令用于在目录结构中查找文件…

IDM(Internet Download Manager)PC版提升下载速度与效率的利器

你是否曾经因为下载速度慢而感到烦恼?或者在下载大型文件时,经历了长时间的等待?如果你有这样的困扰,那么IDM(Internet Download Manager)就是你的救星! IDM是一款高效、实用的下载管理器&…

uni-app 跨端开发注意事项

文章目录 前言H5正常但App异常的可能性标题二H5正常但小程序异常的可能性小程序正常但App异常的可能性小程序或App正常,但H5异常的可能性App正常,小程序、H5异常的可能性使用 Vue.js 的注意区别于传统 web 开发的注意H5 开发注意微信小程序开发注意支付宝…

python 爬百度热搜并生成词云

1、爬取百度body存入txt def get_baidu_hot():url "https://top.baidu.com/board?tabrealtime"headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3&…

python tkinter使用(五)

python tkinter使用(五) 本篇文章讲述tkinter 中treeview的使用 Treeview是一个多列列表框,可以显示层次数据。 #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/11/23 下午8:28 .Email:Describe: treeview 使用 "&quo…

计算机毕业设计项目选题推荐(免费领源码)java+springboot+mysql 城市房屋租赁管理系统01855

摘 要 本论文主要论述了如何使用springboot 城市房屋租赁管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构JAVA技术,面向对象编程思想进行项目开发。在引言中,作者将论述城市房屋租赁管理系统的当前背景以及…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(从零开始简单易懂)

一、准备工作 ①&#xff1a;创建一个新项目 1.事先创建好一些包 ②&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…