FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

目录

  • 1、前言
    • 免责声明
  • 2、相关方案推荐
    • 我这里已有的 MIPI 编解码方案
  • 3、本 MIPI CSI-RX IP 介绍
  • 4、个人 FPGA高端图像处理开发板简介
  • 5、详细设计方案
    • 设计原理框图
    • IMX327 及其配置
    • MIPI CSI RX
    • 图像 ISP 处理
    • 图像缓存
    • UVC 时序
    • USB3.0输出架构
    • FPGA逻辑设计工程源码架构
    • SDK软件工程源码架构
  • 6、工程源码1-->P4口相机
  • 7、工程源码2-->P3口相机
  • 8、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 9、上板调试验证
    • 准备工作
    • 图像输出演示
  • 10、福利:工程代码的获取

FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

1、前言

FPGA图像采集领域目前协议最复杂、技术难度最高之一的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。本设计基于Xilinx的Kintex7-325T中端FPGA开发板,采集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、YCrCb444转YCrCb422等一系列操作;经过ISP处理后的图像颜色饱满、画质清晰,输出YCrCb422格式的视频;然后再使用本博提供的图像缓存架构将视频缓存到板载的DDR3中;再使用本博提供的UVC视频时序将视频从DDR3中读出;再将UVC视频送入板载的CYUSB3014-BZXI芯片,通过板载的USB3.0接口发送出去;CYUSB3014-BZXI芯片在Win10下可以免驱使用,用USB3.0数据线连接FPGA开发板和笔记本电脑,打开电脑自带的摄像头软件,选择本开发板的摄像头,即可显示IMX327 MIPI摄像头解码采集的视频了;针对目前市面上主流的索尼IMX系列相机,本方案一共移植了2套工程源码,本博文介绍其中基于索尼IMX327相机的2套工程,详情如下:
在这里插入图片描述
这里说明一下提供的2套工程源码的作用和价值,如下:
工程源码1:Xilinx Kintex7-325T FPGA 解码索尼的 IMX327 MIPI相机,IMX327 被配置为 4 Lane RAW12 1080P分辨率;经FPGA解码、ISP图像处理、图像缓存、UVC时序同步等操作后,通过板载的USB3.0接口输出;本工程的相机接在配套FPGA开发板的P4接口,该接口的相机通过螺丝固定,相机不可独立移动;

工程源码2:Xilinx Kintex7-325T FPGA 解码索尼的 IMX327 MIPI相机,IMX327 被配置为 4 Lane RAW12 1080P分辨率;经FPGA解码、ISP图像处理、图像缓存、UVC时序同步等操作后,通过板载的USB3.0接口输出;本工程的相机接在配套FPGA开发板的P3接口,该接口的相机通过FPC软排线连接,相机可独立移动;

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

免责声明

本工程源码只是本博提供的FPGA高端图像处理开发板的测试例程使用,本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括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 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、YCrCb444转YCrCb422等一系列操作;经过ISP处理后的图像颜色饱满、画质清晰,输出YCrCb422格式的视频;图像 ISP 处理在工程 Block Design中如图:
在这里插入图片描述
这些IP均为Xilinx的免费IP,有的需要配置才能使用,在MicroBlaze软核运行的C语言代码已经提供了配置程序;

图像缓存

本设计使用本博提供的图像缓存读写IP实现视频缓存,该IP由纯verilog代码实现,用户接口为AXI4-Stream,可替换Xilinx官方的VDMA,本博已将他封装为自定义IP;图像缓存模块IP在工程 Block Design中如图:
在这里插入图片描述
需要注意的是,图像缓存架构需调用Xilinx的 MIG IP才能实现与DDR3的物理层交互;

UVC 时序

UVC 时序用于控制视频读出DDR3的时序,然后将读出的视频送入 USB3.0输出架构,UVC 时序很简单,与常用的VGA时序差不多,由纯verilog代码实现,将模块顶层代码拖入 Block Design中,如图:
在这里插入图片描述

USB3.0输出架构

UVC视频送入板载的CYUSB3014-BZXI芯片,通过板载的USB3.0接口发送出去;CYUSB3014-BZXI芯片在Win10下可以免驱使用,用USB3.0数据线连接FPGA开发板和笔记本电脑,打开电脑自带的摄像头软件,选择本开发板的摄像头,即可显示IMX327 MIPI摄像头解码采集的视频了;打开笔记本电脑的设备管理器,即可看到本开发板的USB3.0设备,如下:
在这里插入图片描述
打开电脑自带的摄像头软件后输出如下:
在这里插入图片描述

FPGA逻辑设计工程源码架构

提供的两套工程源码代码架构都一样,只是引脚约束不同;
工程Block Design如下:
在这里插入图片描述
由于调用IP较多,分散开来很不好看,也不利于阅读,本博将一些IP进行了再封装,如下图中红框标记部分,该封装只是形式上的好看而已,没有特殊功能,可以通过如下方法将其展开,查看里面的详细组成和结构,如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述

SDK软件工程源码架构

提供的两套工程源码代码架构都一样,只是引脚约束不同;
SDK软件工程源码架构如下:
在这里插入图片描述

6、工程源码1–>P4口相机

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
相机接口:开发板P4口,固定螺丝连接,相机不可自由移动;
输入:IMX327摄像头–MIPI–4 Lane–RAW12-1920x1080;
输出:USB3.0,分辨率1920x1080;
应用:FPGA高端项目:IMX327 MIPI 视频解码 USB3.0 UVC 输出;
工程源码架构请参考第五章节的“FPGA逻辑设计工程源码架构”和“SDK软件工程源码架构”
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码2–>P3口相机

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
相机接口:开发板P3口,FPC软排线连接,相机可自由移动;
输入:IMX327摄像头–MIPI–4 Lane–RAW12-1920x1080;
输出:USB3.0,分辨率1920x1080;
应用:FPGA高端项目:IMX327 MIPI 视频解码 USB3.0 UVC 输出;
工程源码架构请参考第五章节的“FPGA逻辑设计工程源码架构”和“SDK软件工程源码架构”
工程的资源消耗和功耗同工程源码1一致;

8、工程移植说明

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

9、上板调试验证

准备工作

需要准备的器材如下:
本博提供的专用FPGA开发板;
本博提供的专用IMX327摄像头;
USB3.0连接线;
笔记本电脑;

图像输出演示

仅演示连接在P4口相机的图像输出,如下:

图像输出演示


注意!
注意!
注意!
1、USB线一定要是3.0的,区别方法是USB口内部的塑料件是蓝色的,对应的,电脑的USB口也必须是3.0的;
2、USB线与电脑连接,一定要是直连,不能有转接的HUB,也就是开发板与电脑USB口直连;
3、电脑操作系统一定要是Windows10;
4、打开电脑自带的摄像头软件后,一定要选择“EZ-Camera!”;

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

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

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

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

相关文章

从Unity到Three.js(安装启动)

发现在3D数字孪生或模拟仿真方向,越来越多的公司倾向使用Web端程序,目前一直都是使用的Unity进行的Web程序开发,但是存在不少问题,比如内存释放、shader差异化、UI控件不支持复制或输入中文等。虽然大多数问题都可以找到解决方案&…

ubuntu22.04@laptop OpenCV Get Started: 004_cropping_image

ubuntu22.04laptop OpenCV Get Started: 004_cropping_image 1. 源由2. Cropping应用Demo3 image_crop3.1 C应用Demo3.2 Python应用Demo3.3 重点过程分析3.3.1 裁剪图像3.3.2 描绘矩形 4. 总结5. 参考资料 1. 源由 使用OpenCV进行裁剪相当于对NumPy数组做类似切片的动作。 每…

通过nginx学习linux进程名的修改

目录 1. 缘起2. 背景知识3. 源码分析3.1 准备工作3.2 设置进程名字 1. 缘起 在运行nginx的时候,用ps查看nginx的进程信息,可能的输出如下: root 42169 3105 0 16:51 ? 00:00:00 nginx: master process ./objs/nginx root …

PyTorch中模块、类和函数的命名和调用

1. Python的命名规则和调用 在 Python 中,模块、类和函数的命名遵循一定的规则,并且有特定的调用方法。下面分别介绍: 命名规则: 模块(Module): 模块命名应遵循 Python 的标识符命名规范&…

STM32/C51开发环境搭建(KeilV5安装)

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等…

【SpringBoot】策略和模板模式的思考与实践

一、应用场景 之所以会将策略和模板模式放在一起,是因为这两种模式用的最多最广泛,而且基本都是联合使用的。在开始之前,先复习一下模式的定义: 模板模式(Template Pattern) 模板模式是在一个抽象类中定…

python+flask人口普查数据的应用研究及实现django

作为一款人口普查数据的应用研究及实现,面向的是大多数学者,软件的界面设计简洁清晰,用户可轻松掌握使用技巧。在调查之后,获得用户以下需求: (1)用户注册登录后,可进入系统解锁更多…

C#,栅栏油漆算法(Painting Fence Algorithm)的源代码

1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏,找出油漆围栏的方法,使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的,所以返回10^97的模。 计算结果: 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…

Jetpack Compose之进度条介绍(ProgressIndicator)

JetPack Compose系列(12)—进度条介绍 Compose自带进度条控件有两个,分别是:CircularProgressIndicator(圆形进度条)和LinearProgressIndicator(线性进度条)。 CircularProgressIn…

Codeforces Round 923 (Div. 3)D. Find the Different Ones! 双指针

Problem - D - Codeforces 双指针O(2n),其实本场B题我写的是O(26n),结果这道题不敢想哈哈。 题意就是给你一串数字,然后问区间(l , r)内是否有不同的数字,输出任意一组下标即可,没有就输出 -1 -1 所以我们看l 在 l1~…

<网络安全>《20 工业防火墙》

1 概念 工业防火墙是一个有软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的边界上构造的保护屏障。工业防火墙是面向工业控制网络的逻辑隔离类安全防护产品,运用“白名单智能学习”技术建立工控网络安全通信模型,阻断一切非法访问…

初识C++(3)

目录 一、初始化列表: 1、概念: 2、特性: 二、static成员: 1、概念: 2、特性: 三、友元 1、概念: 友元函数: 友元类: 四、内部类: 1、概念&#…

【51单片机】实现一个动静态数码管显示项目(超全详解&代码&图示)(5)

前言 大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…

贪心算法之田忌赛马,多种语言实现

目录 题目描述: 输入: 样例输入: 样例输出: c代码实现: c++代码实现: python代码实现: Java代码实现: 题目描述: 这是中国历史上一个著名的故事。 “那是大约2300年前的事了。田骥将军是齐国的高级官员。他喜欢和国王和其他人一起赛马。 “田和王都有三匹不同等级…

Redis篇之集群

一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…

vue3——登录校验

页面 首先需要在表单配置model、ref、rules&#xff0c;el-form-item中放prop <el-form :model"form" label-width"0" ref"formRef" :rules"rules"><el-form-item label"" prop"username"><el-in…

HTML元素的操作

获取HTML的值 获取文本内容 1.先获取元素的内容 2.使用innerText方法 let btn document.getElementById("btn");//获取文本内容console.log(btn.innerText);设置文本内容 btn.innerText "测试数据"; let box document.getElementById("box"…

Web后端开发:登录认证案例

登录功能 需求分析 在登录界面中&#xff0c;输入用户的用户名以及密码&#xff0c;然后点击 “登录” &#xff0c;服务端判断用户输入的用户名和密码是否都正确。如果正确&#xff0c;则返回成功结果&#xff0c;前端跳转至系统首页面&#xff1b;否则报错&#xff0c;停留在…

从零开始手写mmo游戏从框架到爆炸(十)— 集成springboot-jpa与用户表

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 集成springboot-jpa&#xff0c;不用mybatis框架一个是方便对接不同的数据源。第二个目前规划的游戏内容可能对数据库的依赖不是很大&#xff0c;jpa应该肯定能满足要求了…

c++学习:iostream输入输出+错误流+标准日志流

C 中的输入和输出&#xff08;I/O&#xff09;主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库&#xff0c;它 提供了用于输入和输出的基本流类&#xff0c;包括 cin 、 cout 、 cerr 和 clog 头文件 #include <iostream> 标准输出流 ( cout ) cout…