Zynq UltraScale+ XCZU3EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

2023-09-15 08:34:41

1、前言

FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。

本设计基于Xilinx的Zynq UltraScale+ XCZU3EG开发板,采集2路IMX214 摄像头的4Line MIPI视频,IMX214 摄像头引脚接Zynq UltraScale+ XCZU3EG的LVDS BANK,经过MC20901芯片将IMX214 的MIPI信号转换为LVDS信号输出给FPGA,然后CSI2 RX模块输出Bayer视频,再经过Bayer转RGB模块输出RGB视频,再经伽马矫正模块增强图像质量,然后调用2个Xilinx官方的Video Scaler 做图像缩放,将输入的1920x1080视频缩小到960x1080;然后调用2个Xilinx官方的VDMA将图像送入PS端的DDR4中做三帧缓存后读出;最后通过板载的DP接口将视频输出显示器;

本文详细描述了FPGA 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出的设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于MIPI协议,请自行搜索,csdn就有很多大佬讲得很详细,我就不多写这块了;

免责声明

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

2、我这里已有的 MIPI 编解码方案

我这里目前已有丰富的基于FPGA的MIPI编解码方案,主要是MIPI解码的,既有纯vhdl实现的MIPI解码,也有调用Xilinx官方IP实现的MIPI解码,既有2line的MIPI解码,也有4line的MIPI解码,既有4K分辨率的MIPI解码,也有小到720P分辨率的MIPI解码,既有基于Xilinx平台FPGA的MIPI解码也有基于Altera平台FPGA的MIPI解码,还有基于Lattice平台FPGA的MIPI解码,后续还将继续推出更过国产FPGA的MIPI解码方案,毕竟目前国产化方案才是未来主流,后续也将推出更多MIPI编码的DSI方案,努力将FPGA的MIPI编解码方案做成白菜价。。。
基于此,我专门建了一个MIPI编解码的专栏,并将MIPI编解码的博客都放到了专栏里整理,对FPGA编解码MIPI有项目需求或学习兴趣的兄弟可以去我的专栏看看,专栏地址如下:
点击直接前往专栏

3、本 MIPI CSI2 模块性能及其优越性

一个字:牛逼,表现如下:
1:纯VHDL代码实现,学习性和阅读性达到天花板;
2:移植性还可以,只要兼容Xilinx解串源语的FPGA均可移植;
3:算法达到天花板,标准的CSI2接收协议实现解码;
4:实用性达到天花板,采用IMX214 摄像头作为输入(主要是便宜),不同于市面上验证性和实验性的工程,本设计直接面向实用工程,贴近真实项目,做类似项目的兄弟可直接拿去用,一个月工资直接拿到手。。。
5:支持高达1920X1080分辨率的MIPI视频解码;
6:时序收敛很到位,考虑到MIPI协议的复杂性和时序的高要求,所以没有采用时序收敛不强的verilog,而是VHDL,虽然阅读性可能会低一些,但用户只需要知道用户接口即可,并不需要去看内部的复杂代码;
7:使用方便,虽然是VHDL代码实现,但均已封装为自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
8:同时采集2路非同源时钟的MIPI相机,解码后做2路视频拼接显示,高度符合现实高端项目;
9:Zynq UltraScale+ XCZU3EG作为主控,很高端;

4、详细设计方案

设计原理框图

设计原理框图如下:
在这里插入图片描述

IMX214 摄像头及其配置

我使用到的IMX214 摄像头输出为4 Line MIPI格式,输出分辨率为1080p@60Hz;输出 RAW10数据;Zynq UltraScale+ XCZU3EG通过调用IIC配置IMX214 ,这个操作在SDK软件里完成;

D-PHY 模块

D-PHY采用硬件方案实现,用MC20901芯片(主要是便宜,性能一般)将IMX214 的MIPI信号转换为LVDS信号输出给FPGA,原理框图如下:
在这里插入图片描述

CSI-2-RX 模块

关于MIPI CSI-2-RX,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI CSI-2-RX功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;本MIPI CSI-2-RX只能支持4 line的MIPI视频,数据格式支持RAW10;
本工程中的CSI-2-RX自定义IP调用如下:
在这里插入图片描述
MIPI CSI-2-RX纯VHDL源码如下:
在这里插入图片描述

Bayer转RGB模块

关于MIPI Bayer转RGB,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI Bayer转RGB功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
本工程中的Bayer转RGB自定义IP调用如下:
在这里插入图片描述
MIPI Bayer转RGB纯VHDL源码如下:
在这里插入图片描述

伽马矫正模块

关于MIPI 伽马矫正,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI 伽马矫正功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
本工程中的伽马矫正自定义IP调用如下:
在这里插入图片描述
MIPI 伽马矫正纯VHDL源码如下:
在这里插入图片描述

VDMA图像缓存

调用2路VDMA,配置为写模式,只需要将视频写入DDR4,这样设计的目的是做2路视频拼接,2路VDMA写入图像的DDR地址不同,可以保证图像在内存中地址不冲突,读出图像时仅需在SDK里调用DP显示的API库函数即可,这既是常规的设计思路,也是减轻HP接口AXI4总线负载的要求;
配置为只写模式的VDMA如下:
在这里插入图片描述

Video Scaler 图像缓存

调用2个Xilinx官方的Video Scaler 做图像缩放,将输入的1920x1080视频缩小到960x1080;这样做的目的是将2路视频拼接到输出分辨率为1920x1080的显示器上去;Video Scaler的缩放操作在SDK中完成,IP如下:
在这里插入图片描述

DP 输出

Zynq UltraScale+ XCZU3EG开发板板载了一路DP输出接口,在SDK里直接DP显示的API库函数即可,不过需要注意的是,在建立SDK工程时,DP驱动名称主要手动更改,如图:
在这里插入图片描述
在这里插入图片描述

5、vivado工程详解

PL端FPGA硬件设计

开发板FPGA型号:Xilinx–Zynq UltraScale±-xczu3cg-sfvc784-1-e;
开发环境:Vivado2019.1;
输入:2路IMX214 MIPI 4 Line RAW10;
输出:HDMI 2分频拼接显示,1080P;
应用:FPGA 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出;
工程Block Design如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

PS端SDK软件设计

SDK C语言软件代码架构如下:
在这里插入图片描述

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

输出如下:
在这里插入图片描述

8、福利:工程代码的获取

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

更多推荐

云原生之使用Docker部署Teedy轻量级文档管理系统

云原生之使用Docker部署Teedy轻量级文档管理系统一、Teedy介绍1.1Teedy简介1.2Teedy特点二、本地环境介绍2.1本地环境规划2.2本次实践介绍三、本地环境检查3.1检查Docker服务状态3.2检查Docker版本3.3检查dockercompose版本四、下载Teedy镜像五、部署Teedy轻

如何通过SQL批量删除重复数据

文章目录前言一、GROUPBY、HAVING是什么二、编写SQL1.查询重复数据2.删除SQL总结前言浅浅记录一下,工作问题。今天在库中看到存在很多重复数据,本文将介绍怎么通过SQL语句批量删除重复数据的一种方式。一、GROUPBY、HAVING是什么我们先来了解一下GROUPBY,HAVING。GROUPBY是SQL

2023年 python结合excel实现快速画图(零基础快速入门)

目录1.适用人群2.环境配置3.基本用法3.1数据读取3.2数据分析3.3数据组装3.4制表:4.快速提升5.效果展示1.适用人群电脑有python环境,会python基本使用,需要短时间内完成大量画图任务的数据分析的人群。(有过matplab相关画图库及echart用户使用起来会很快)2.环境配置pipinstall

从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)

Stream流Stream流1.体验Stream流2.Stream流的常见生成方式3.Stream流中间操作方法4.Stream流终结操作方法5.Stream流的收集操作6.Stream流综合练习Stream流1.体验Stream流案例需求按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以

Gateway核心架构

1Gateway核心架构1.1基本概念路由(Route)是gateway中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:id,路由标识符,区别于其他Route。uri,路由指向的目的地uri,即客户端请求最终被转发到的微服务。order,用于多个Route之间的排序,数值越小排序越靠前,匹配优

Java常用类之 String、StringBuffer、StringBuilder

Java常用类文章目录一、字符串相关的类1.1、String的不可变性1.2、String不同实例化方式的对比1.3、String不同拼接操作的对比1.4、String的常用方法1.5、String类与其他结构之间的转换1.5.1、String与基本数据类型、包装类之间的转换1.5.2、String与char[]的转换

多线程知识点整理

一.线程的状态1.线程创建,2.线程运行,3线程阻塞,4.线程等待,5.timed_waiting6.线程执行完毕publicenumState{//线程刚创建NEW,//在JVM中正在运行的线程RUNNABLE,//线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行BLOCKED,//等待状态WAITING,

腾讯mini项目-【指标监控服务重构】2023-08-06

今日已办feature/client_traces_profile修改consumer4个阶段的spankind将profile的span作为rootspan,保持与venus的followsfrom的linkfeature/profile-otelclient-metric将metric部分使用新分支pushgo.o

芯片核数造假,华为不装了,网友直呼这一波赚翻了!

首先说一下之前以为华为是青岛新恩制作的芯片,但是在最新的一个消息中发现,麒麟芯片其实是华为子公司自主研发生产的。2个重量级消息,华为突破芯片封锁后,美国科技界惊出一身冷汗!华为麒麟9000s是中芯国际做的吗?台积电和三星有没有参与?最终是这家青岛公司扛下了所有。而华为芯片为什么可以确定,而不是之前囤积的呢?其实是因为在

Linux CentOS7 wc命令

wc命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。录入manwc可以查看相关信息基本语法:wc[选项]文件…说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。该命令常用选项:-l统计行数-

Vue的详细教程--入门

🥳🥳WelcomeHuihui'sCodeWorld!!🥳🥳接下来看看由辉辉所写的关于Vue的相关操作吧目录🥳🥳WelcomeHuihui'sCodeWorld!!🥳🥳一.Vue是什么二.Vue的特点及优势三.使用Vue的详细步骤1.导入2.定义边界3.创建vue实例四.Vue的基本语法①v-model

热文推荐