FPGA高端项目:解码索尼IMX327 MIPI相机+2路视频融合叠加,提供开发板+工程源码+技术支持

目录

  • 1、前言
  • 2、相关方案推荐
    • 本博主所有FPGA工程项目-->汇总目录
    • 我这里已有的 MIPI 编解码方案
  • 3、本 MIPI CSI-RX IP 介绍
  • 4、个人 FPGA高端图像处理开发板简介
  • 5、详细设计方案
    • 设计原理框图
    • IMX327 及其配置
    • MIPI CSI RX
    • 图像 ISP 处理
    • HLS多路视频融合叠加
    • 图像缓存
    • HDMI输出
    • 工程源码架构
    • 时序约束
  • 6、工程源码1详解-->IMX327解码+2路视频融合叠加+HDMI输出
  • 7、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 8、上板调试验证
    • 准备工作
    • 视频输出演示
  • 9、福利:工程代码的获取

FPGA高端项目:解码索尼IMX327 MIPI相机+2路视频融合叠加,提供开发板+工程源码+技术支持

1、前言

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

本设计基于Xilinx的Kintex7-325T中端FPGA开发板,采集2路IMX327 MIPI摄像头的4 Lane MIPI视频,IMX327 摄像头配置为 MIPI4 Lane RAW12模式,输出有效分辨率为1920x1080@60Hz;IMX327 MIPI摄像头引脚经过权电阻方案分出LP电路后接入FPGA的HS BANK的LVDS差分IO;采用自定义的MIPI CSI RX解码IP实现MIPI的D_PHY+CSI_RX功能,输出AXI4-Stream格式的RAW12格式视频,该IP由本博免费提供;至此,MIPI视频解码工作完成,但此时的视频还是原始的RAW12格式,远远达不到输出显示要求,所以还需进行图像处理操作,也就是图像ISP操作;本博提供及其完整的图像ISP,具体流程包括Bayer转RGB888、自动白平衡、色彩校正、伽马校正、RGB888转YCrCb444、图像增强、YCrCb444转RGB888、AE自动曝光等一系列操作;经过ISP处理后的图像颜色饱满、画质清晰,输出RGB888格式的视频;然后再使用Xilinx官方的VDMA图像缓存架构将视频缓存到板载的DDR3中,为了降低延时,仅缓存了1帧,其中一路VDMA配置为读写模式,另一路VDMA配置为只写模式,两路VDMA缓存图像的地址不一样;多路视频融合叠加采用HLS方案,底层视频为输入的第1路视频,叠加层视频为第2路视频经过缩放后得到,2路视频融合在一起输出,可通过SDK软件动态配置2路视频融合的透明度、叠加层视频的缩放大小、叠加层视频的显示位置等信息;;然后在VGA时序的控制下将缓存视频从DDR3中读出,再使用本博常用的HDMI输出模块将图像输出到显示器显示即可;针对目前市面上主流的索尼IMX系列相机,本方案一共移植了1套工程源码,详情如下:

工程源码1:Xilinx Kintex7-325T FPGA 解码索尼的 IMX327 MIPI相机,IMX327 被配置为 4 Lane RAW12 1080P分辨率;经FPGA解码、ISP图像处理、图像缓存、视频融合叠加、VGA时序同步、HDMI视频输出等操作后,通过板载的HDMI接口输出显示器;本工程的相机接在配套FPGA开发板的P4接口;

IMX327-MIPI相机在FPGA开发板P3口和P4口的连接方式如下图:
在这里插入图片描述

2、相关方案推荐

本博主所有FPGA工程项目–>汇总目录

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以写了一篇汇总目录的博文并置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。博客链接如下:
点击直接前往

我这里已有的 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 CSI-RX IP 介绍

本设计采用本博自研的MIPI CSI RX解码IP实现MIPI的D_PHY+CSI_RX功能,输出AXI4-Stream格式的RAW12颜色视频,该IP由本博免费提供;该IP目前只适用于Xilinx A7及其以上系列器件,支持的 4 lane RAW12图像,输入分辨率最高支持4K @30帧;IP UI配置界面如下:
在这里插入图片描述
该自定义IP只提供网表不提供源码,但用户依然可以自由使用,和使用Xilixn官方的 MIPI CSI-2 RX Subsystem一样,没有本质区别,因为MIPI CSI-2 RX Subsystem也是看不到源码的;MIPI CSI-RX IP资源消耗如下:
在这里插入图片描述

4、个人 FPGA高端图像处理开发板简介

本博客提供的工程源码需配合本博提供的FPGA高端图像处理开发板才能使用,亦或者读者自己拿去移植,但本博推荐使用本博客提供的工程源码需配合本博提供的FPGA高端图像处理开发板,该开发板截图如下:
在这里插入图片描述
此开发板专为高端FPGA图像处理设计,适合公司项目研发、研究所项目预研、高校项目开发、个人学习进步等场景需求,本博之前专门写过一篇博文详细介绍了该开发板的情况,感兴趣的请移步那篇博文,博客地址如下:
点击直接前往

5、详细设计方案

设计原理框图

工程源码的设计原理框图如下:
在这里插入图片描述

IMX327 及其配置

本设计使用本博提供的专用SONY公司的 IMX327 MIPI相机,该相机输出分辨率达到了1920x1080,采用焦距可调的镜头,清晰度极高,适用于高端项目开发,相机截图如下:
在这里插入图片描述
IMX327 MIPI相机需要 i2c配置才能正确使用,本设计调用本博自定义的i2c主机IP实现对IMX327的配置,该IP挂载与AXI-Lite总线上,通过MicroBlaze软核运行的C语言代码实现配置,此外,本博还设计了自动曝光程序,实时读取IMX327 RAW12像素,通过写IMX327对应寄存器的方式实现实时的自动曝光算法,使得IMX327在暗黑的环境下也能输出明亮的图像;

本博提供的FPGA开发板有两个MIPI CSI-RX接口,分别位于P3、P4接口,因此可以接两个MIPI相机,其中,P4接口的相机采用螺丝固定方式连接,适用于FPGA开发板需要移动的项目,如小车等;P3接口的相机采用FPC软排线方式连接,适用于FPGA开发板不需要移动的项目,如固定检测等,具体连接方式如下图:
在这里插入图片描述

MIPI CSI RX

本设计采用自定义的MIPI CSI RX解码IP实现MIPI的D_PHY+CSI_RX功能,输出AXI4-Stream格式的RAW12颜色视频,该IP由本博免费提供;该IP目前只适用于Xilinx A7及其以上系列器件,支持的 4 lane RAW12图像,输入分辨率最高支持4K @30帧;IP UI配置界面如下:
在这里插入图片描述
该自定义IP只提供网表不提供源码,但用户依然可以自由使用,和使用Xilixn官方的 MIPI CSI-2 RX Subsystem一样,没有本质区别,因为MIPI CSI-2 RX Subsystem也是看不到源码的;

图像 ISP 处理

本博提供及其完整的图像ISP,具体流程包括Bayer转RGB888、自动白平衡、色彩校正、伽马校正、RGB888转YCrCb444、图像增强、YCrCb444转RGB888、AE自动曝光等一系列操作;经过ISP处理后的图像颜色饱满、画质清晰,输出YCrCb422格式的视频;图像 ISP 处理在工程 Block Design中如图:
在这里插入图片描述
这些IP均为Xilinx的免费IP,有的需要配置才能使用,在MicroBlaze软核运行的C语言代码已经提供了配置程序;其中AE自动曝光采用SDK C语言AE算法实现,FPGA实时读取IMX327的亮度值,然后与AE模型进行比较,亮度不足则补光,亮度太高则降光,通过控制IMX327内部寄存器实现,C代码需要在MicroBlaze软核运行;

HLS多路视频融合叠加

多路视频融合叠加设计框图如下如所示:
在这里插入图片描述
多路视频融合叠加由底层视频和叠加层视频融合叠加而成,底层视频为输入的第1路视频,叠加层视频为第2路视频经过缩放后得到,两路视频融合在一起输出,可通过SDK软件动态配置2路视频融合的透明度、叠加层视频的缩放大小、叠加层视频的显示位置等信息;;设计加采用HLS方案C++代码实现,并综合成RTL后封装为IP,可在vivado中调用该IP,关于这个方案详情,请参考我之前的博客,博客链接如下:
点击直接前往
该IP在vivado中的综合资源占用情况如下:
在这里插入图片描述
HLS多路视频融合叠加需要在SDK中运行驱动和用户程序才能正常工作,我在工程中给出了C语言程序,具体参考工程源码;

图像缓存

工程使用VDMA图像缓存方案,VDMA架构使用Xilinx官方力推的VDMA图像缓存架构实现图像1帧缓存,VDMA图像缓存架构由Video In to AXI4-Stream、VDMA、Video Timing Controller、AXI4-Stream To Video Out构成;其在Block Design中如下:
在这里插入图片描述
VDMA需要驱动才能正常工作,本工程提供C语言驱动;

HDMI输出

HDMI输出架构由VGA时序和HDMI输出模块构成,VGA时序负责产生输出的1920x1080@60Hz的时序,并控制FDMA数据读出,HDMI输出模块负责将VGA的RGB视频转换为差分的TMDS视频,代码架构如下:
在这里插入图片描述
HDMI输出模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,关于这个模块,请参考我之前的博客,博客地址:点击直接前往

工程源码架构

工程源码的vivado Block Design设计截图如下:
在这里插入图片描述
工程源码截图如下:
在这里插入图片描述
工程源码需要运行MicroBlaze软核,用于配置ISP、VDMA等;SDK工程架构如下:
在这里插入图片描述
SDK代码中配置如下,用户可根据自己的需求任意修改;
第1路视频为底层视频,分辨率为1920x1080;
第2路视频为叠加层视频,分辨率为1920x1080,从叠加层视频坐标(760,340)处为原点取一块600x600的区域作为叠加融合视频;
将上一步取到的600x600的叠加融合视频进行图像缩放,缩放为960x540;
将上一步960x540的叠加融合视频从底层视频的(0,0)坐标开始叠加,底层与叠加层的透明度设置为40;

时序约束

由于本工程使用的时钟较多,有MIPI输入的差分时钟,有MIG使用的差分时钟,有MIPI相机使用的像素时钟,有HDMI模块使用的差分时钟,所以必须做时序分组约束,在代码的XDC文件里已经做好;此外,由于MIG输出的用户时钟达到了200M,所以整个系统的时钟太高,又加之整个工程使用的AXI总线较多,就导致时序很不收敛,所以我们将MIPI解码输出的时钟控制在100M,这样一来,图像从MIPI解码到VDMA之间时钟保持在100M的较低频率下,而软核控制的AXI总线系统依然跑200M,所以时序就收敛很多;如果不做上述时序约束,会导致MicroBlaze软核程序直接跑飞,整个系统无法运行吗,甚至在SDK里都无法进入DEBUG;

6、工程源码1详解–>IMX327解码+2路视频融合叠加+HDMI输出

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入1:IMX327 MIPI相机,4 Lane,分辨率1920x1080@60Hz;
输入2:IMX327 MIPI相机,4 Lane,分辨率1920x1080@60Hz;
输出:HDMI,分辨率1920x1080@60Hz下叠加缩放后的图像输出;
多路视频融合叠加:自研HLS方案;
图像缓存方案:VDMA方案;
图像缓存路径:DDR3;
工程作用:此工程目的是让读者掌握FPGA实现IMX327相机MIPI解码+图像缩放+转HDMI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第5章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程移植说明

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

8、上板调试验证

准备工作

需要准备的器材如下:
本博提供的FPGA开发板;
本博提供的IMX327 MIPI相机;
HDMI显示器;
我的开发板了连接如下:
在这里插入图片描述

视频输出演示

IMX327-2视频融合叠加

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

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

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

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

相关文章

【51单片机入门记录】RTC(实时时钟)-DS1302应用

目录 一、DS1302相关写函数 (1)Write_Ds1302 (2)Write_Ds1302_Byte 二、DS130相关数据操作流程及相关代码 (1)DS1302初始化数据操作流程及相关代码 (shijian[i]/10&…

20240406在Ubuntu20.04下让移远的4G模块EC200A-CN通过USB底板直接上网

20240406在Ubuntu20.04下让移远的4G模块EC200A-CN通过USB底板直接上网 2024/4/6 15:42 缘起:最近在调试全志H3平台在linux(Ubuntu Core/openWRT)下适配EC200A-CN。 以前调试移远的EC20的时候是先在Ubuntu下确认模块时好的,然后再开…

最新在线工具箱网站系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上…

蓝凌OA单点登录实现方案:以统一身份管理提升效率与安全新举措

蓝凌OA的优势与挑战 在数字化浪潮的推动下,企业对于高效、安全的身份管理需求愈发迫切。蓝凌OA系统,以其出色的流程管理和协同办公能力,已经成为众多企业实现数字化转型的重要工具。然而,随着企业信息化建设的不断深入&#xff0…

配置vscode链接linux

1.安装 remote SSH 2.按F1 ssh ljh服务器公网ip 3. 选择保存远端host到本地 某位置 等待片刻后 4. 切换到远程资源管理器中 应该可以看到一台电脑,右键在当前窗口链接,输入你的服务器用户密码后电脑变绿说明远程连接成功 5.一定要登陆上云服务器后再…

错误:找不到或无法加载主类(vscode的解决方法)

项目场景: 某天,喵某人在敲代码的过程中,点击运行代码,突然显示找不到或无法加载主类。之前创建的java文件都可以正常运行。但新建的java文件无论是什么,点击运行都会显示“错误:找不到或无法加载主类”。 …

深入剖析:HTML页面从用户请求到完整呈现的多阶段加载与渲染全流程详解

HTML页面的加载全过程是一个涉及网络通信、文件解析、资源加载、渲染树构建、布局计算以及最终绘制等多个环节的复杂过程。以下是详细的步骤说明: 1. 用户输入URL并发送请求 用户在浏览器地址栏输入一个URL(统一资源定位符),或者…

【内存泄漏】数据库连接connectionPhantomRefs内存过大

1. 问题背景 线上出现内存报警,内存增长曲线如下 dump内存文件,临时重新发布服务。后经排查发现是数据库连接池设置不合理以及mysql-connector-java 5.1.49有内存泄漏bug。以下为对此问题的分析及问题总结。 1.1 应用背景 数据库连接池: …

[StartingPoint][Tier1]Ignition

Task 1 Which service version is found to be running on port 80? (发现哪个服务版本在端口 80 上运行?) $ nmap -sV -Pn 10.129.1.27 -p 80 nginx 1.14.2 Task 2 What is the 3-digit HTTP status code returned when you visit http://{machine IP}/? (访…

Centos7下docker安装jenkins

个人记录 安装Docker与Docker-compose Centos7安装Docker与Docker-compose【图文教程】 配置docker-compose.yml vim docker-compose.yml按i进行编辑模式,粘贴如下内容 version: 3 services:jenkins:image: jenkinsci/blueoceancontainer_name: jenkinsrestart…

剑指Offer题目笔记26(动态规划的基础知识)

面试题88: 问题: ​ 一个数组cost的所有数字都是正数,它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本,在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。请计算爬上该楼梯的最少成本。 解决方案一:&…

Java | Leetcode Java题解之第9题回文数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPalindrome(int x) {// 特殊情况&#xff1a;// 如上所述&#xff0c;当 x < 0 时&#xff0c;x 不是回文数。// 同样地&#xff0c;如果数字的最后一位是 0&#xff0c;为了使该数字为回文&#xff0…

Linux:数据链路层

文章目录 路由表数据链路层分片mac帧报头ARP协议ARP的周边话题 路由表 当主机a想要发送消息到主机b&#xff0c;这一整个过程中&#xff0c;数据报文在进行传输的过程实际上是一跳一跳的过去的&#xff0c;而报文可能会经过公网进行传递&#xff0c;本质上这些网络都是靠对应的…

【python毕业设计】基于Python的医院信息管理系统的设计与实现(源码+数据库+毕业论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入&#xff0c;发现Google的工作很值得深挖&#xff0c;比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用&#xff0c;​Google真是科技进步的核心推动力&#xff0c;做了大量大模型的基础设施&#xff0c;服 故有了本文&#xf…

【前端Vue】Vue0基础完整教程第5篇:vue指令(下),成绩案例【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程&#xff08;Metaprogramming&#xff09;指在程序运行时操作或者创建程序的一种编程技术&#xff0c;简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成&#xff0c;使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…

【Python系列】将生成的 JSON 数据写入 JSON 文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

面试经典-Spring篇

1、解释Spring框架中bean的生命周期 实例化 通过反射去推断构造函数进行实例化 实例工厂、静态工厂 属性赋值 解析自动装配&#xff08;byname、bytype、 constractor、 Autowired&#xff09; 循环依赖 初始化 调用XXXAware回调方法&#xff08;BeanNameAware、BeanFactoryAw…

移动Web学习05-移动端适配Less预处理器

7、移动端适配 7.1、什么是适配&#xff1f; 简单理解就是、同一个网页&#xff0c;在不同屏幕分辨率的设备下、显示还是一样的&#xff0c;你可以理解为、网页当中的图片&#xff0c;盒子之间的距离、文字的大小、随着屏幕分辨率的变化而变化 前面我们学习了flex布局的方式…