Xilinx Kintex7中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录

  • 1、前言
    • 免责声明
  • 2、我这里已有的 MIPI 编解码方案
  • 3、本 MIPI CSI2 模块性能及其优缺点
  • 4、详细设计方案
    • 设计原理框图
    • OV5640及其配置
    • 权电阻硬件方案
    • MIPI CSI-2 RX Subsystem
    • Sensor Demosaic图像格式转换
    • Gammer LUT伽马校正
    • VDMA图像缓存
    • AXI4-Stream toVideo Out
    • HDMI输出
  • 5、vivado工程详解
    • FPGA逻辑设计
    • Vitis SDK软件设计
    • Vitis HLS补丁
  • 6、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 7、上板调试验证
  • 8、福利:工程代码的获取

Xilinx Kintex7中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

1、前言

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

本设计基于Xilinx的 Kintex7中端FPGA开发板,采集OV5640摄像头的2Line MIPI视频,OV5640摄像头配置为MIPI模式,引脚经过权电阻方案后接入FPGA的HS BANK的LVDS差分IO;调用Xilinx的MIPI CSI-2 RX Subsystem IP实现MIPI的D-PHY功能,该IP由Xilinx免费提供,将MIPI视频解码后以AXIS视频流格式输出;再调用Xilinx的Sensor Demosaic IP实现RAM转RGB功能; 再调用Xilinx的Gammer LUT IP实现伽马校正功能;再调用Xilinx的VDMA IP实现图像三帧缓存功能,VDMA调用两个,一个用于视频写入DDR3,另一个用于视频读出DDR3,这样分开读写的目的在于使用AXI的带宽;再调用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP实现视频流从AXI4-Stream到VGA时序的转换;最后用自定义的HDMI发送IP将视频输出显示器显示;整个工程调用MicroBlaze软核做IP的配置,相当于Zynq的作用,MicroBlaze的配置在Vitis SDK里以C语言软件代码的形式运行,所以整个工程包括FPGA逻辑设计和Vitis SDK软件设计两部分,需要具备FPGA和嵌入式C语言的综合能力,不适合初学者或者小白。。。

本文详细描述了Xilinx Kintex7中端FPGA解码MIPI视频的设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于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 模块性能及其优缺点

由于调用了Xilinx的MIPI CSI-2 RX Subsystem IP核,所以性能上就取决于你的FPGA型号,理论上FPGA越高端,支持的IO线速率或者GT高速接口线速率就越高,就能跑速率更高的MIPI视频;
该IP适应性极强,支持的MIPI相机性能参数如下:
在这里插入图片描述
在这里插入图片描述
并且,在越高端的FPGA型号上,该IP支持的高端性能也越多;
由于调用了Xilinx的MIPI CSI-2 RX Subsystem IP核,NIPI视频解码的稳定性很好,且使用及其简单,缺点是看不到源码,出了问题后不好排查,只能在输入输出接口添加ila进行逐级追踪;
本方案使用的FPGA型号为Xilinx Kintex7,属于中端FPGA的MIPI解码应用,再小型的Artix7-35T或者Spartan7、Spartan6等就已经不能使用MIPI CSI-2 RX Subsystem了;

4、详细设计方案

本设计基于Xilinx的 Kintex7中端FPGA开发板,采集OV5640摄像头的2Line MIPI视频,OV5640摄像头配置为MIPI模式,引脚经过权电阻方案后接入FPGA的HS BANK的LVDS差分IO;调用Xilinx的MIPI CSI-2 RX Subsystem IP实现MIPI的D-PHY功能,该IP由Xilinx免费提供,将MIPI视频解码后以AXIS视频流格式输出;再调用Xilinx的Sensor Demosaic IP实现RAM转RGB功能; 再调用Xilinx的Gammer LUT IP实现伽马校正功能;再调用Xilinx的VDMA IP实现图像三帧缓存功能,VDMA调用两个,一个用于视频写入DDR3,另一个用于视频读出DDR3,这样分开读写的目的在于使用AXI的带宽;再调用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP实现视频流从AXI4-Stream到VGA时序的转换;最后用自定义的HDMI发送IP将视频输出显示器显示;

设计原理框图

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

OV5640及其配置

输入视频采用廉价的OV5640摄像头模组,配置为MIPI模式,2 Line,数据格式为RAW10,线速率为1000Mbps,视频分辨率为1280*720,一个时钟一个像素,OV5640需要SCCB总线配置才能运行,该总线等价于I2C总线,调用一个AXI-GPIO模拟I2C,利用Vitis软件配置OV5640,配置部分代码有C语言实现,具体参考Vitis程序;AXI-GPIO调用和SCCB软件配置代码截图如下:
在这里插入图片描述
在这里插入图片描述

权电阻硬件方案

使用Xilinx官方推荐的权电阻硬件方案将输入的差分MIPI对恢复HS和PL,原理图部分截图如下:
在这里插入图片描述
注意:权电阻方案只在低速率的MIPI模式下可用,高速率的MIPI请用专用芯片实现,比如MC20001,MC系列这种方案可以支持到2Gbps/Lane速率以上,只要FPGA的IO速率够用;

MIPI CSI-2 RX Subsystem

调用Xilinx的MIPI CSI-2 RX Subsystem IP实现MIPI的D-PHY功能,该IP由Xilinx免费提供,将MIPI视频解码后以AXIS视频流格式输出;调用和配置如下:
在这里插入图片描述
在这里插入图片描述

Sensor Demosaic图像格式转换

调用Xilinx的Sensor Demosaic IP实现RAM转RGB功能,该IP通过Vitis的C代码软件配置,Sensor Demosaic调用和C代码软件配置代码截图如下:
在这里插入图片描述
在这里插入图片描述

Gammer LUT伽马校正

调用Xilinx的Gammer LUT IP实现伽马校正功能,该IP通过Vitis的C代码软件配置,Gammer LUT调用和C代码软件配置代码截图如下:
在这里插入图片描述
在这里插入图片描述

VDMA图像缓存

调用Xilinx的VDMA IP实现图像三帧缓存功能,VDMA调用两个,一个用于视频写入DDR3,另一个用于视频读出DDR3,这样分开读写的目的在于使用AXI的带宽;该IP通过Vitis的C代码软件配置;VDMA调用和C代码软件配置代码截图如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AXI4-Stream toVideo Out

再调用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP实现视频流从AXI4-Stream到VGA时序的转换;Video Timing Controller配置为1280*720@60Hz,这两个IP不需要软件配置;Video Timing Controller和AXI4-Stream toVideo Out调用截图如下:
在这里插入图片描述
在这里插入图片描述

HDMI输出

最后用自定义的HDMI发送IP将视频输出显示器显示,该IP最大输出分辨率只支持1920*1080@60Hz;IP调用截图如下:
在这里插入图片描述

5、vivado工程详解

FPGA逻辑设计

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg900-2;
开发环境:Vivado2021.1;
输入:OV5640摄像头–MIPI–2 Line–RAW10-1280*720;
输出:HDMI ,分辨率720P;
应用:Xilinx Kintex7中端FPGA解码MIPI视频;
工程Block Design如下:
在这里插入图片描述
由于调用IP较多,分散开来很不好看,也不利于阅读,我们将MIPI解码和缓存的核心IP进行了再封装,如上图中红框标记部分,该封装只是形式上的好看而已,没有特殊功能,可以通过如下方法将其展开,查看里面的详细组成和结构,如下:
在这里插入图片描述
展开后如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

Vitis SDK软件设计

Vitis SDK C语言软件是为了配置FPGA调用的IP,用VItis打开即可查看,代码内容如下:
在这里插入图片描述

Vitis HLS补丁

由于工程中用到了HLS生成的IP,Sensor Demosaic和Gammer LUT,可能会出现综合编译失败,或者警告后在Vitis SDK里找不到设备ID等情况,此时需要更改电脑系统时间或者打上官方补丁解决这件事情,具体方法参考这位大佬博文:直接点击前往

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

需要准备的器材如下:
FPHA开发板;
OV5640摄像头;
HDMI显示器;
输出如下:
在这里插入图片描述

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

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

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

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

相关文章

Java安全架构 JCA、JCE、JSSE、JAAS

Java语言拥有三大特征:平台无关性、网络移动性和安全性,而Java安全体系结构对这三大特征提供了强大的支持和保证, Java安全体系结构总共分为4个部分: (1)JCA( Java Cryptography Architecture…

工具及方法 - 手机扫条码工具: SCANDIT APP

一般扫个链接使用微信扫一扫即可。扫具体条码,可以在微信里搜索小程序,打开也能扫,得到条码内容。 还有其他方式,比如使用淘宝、百度等APP也可以直接扫码条码,还能得到更多的信息。 使用百度的话,不扫条码…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】🌏题目描述🌏输入格式&a…

诡异的bug之dlopen

序 本文给大家分享一个比较诡异的bug,是关于dlopen的,我大致罗列了我项目中使用代码方式及结构,更好的复现这个问题,也帮助大家进一步理解dlopen. 问题复现 以下是项目代码的文件结构: # tree . ├── file1 │ …

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次,最大化你的得分: 从 nums 中选择一个元素 m 。将选中…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

STM32中使用看门狗实现系统自动复位

STM32中的看门狗(Watchdog)是一种用于监控系统运行状态并在系统故障或死锁时执行自动复位的硬件功能。在本文中&#xff0c;我将介绍如何在STM32微控制器中使用看门狗来实现系统的自动复位。下面是详细的解释&#xff1a; 一、看门狗原理简介 看门狗是一种独立的硬件计时器&am…

DNA甲基化的相关知识

目录 1. DNA甲基化简介 2. 原理 3. 酶分类 4. DNA甲基化类型 5.机制 6. 十大DNA甲基化研究核心问题 6.1 植物中的甲基化 6.2 植物中DNA甲基化的主要功能 6.3 DNA甲基化作为生物标志物的潜力 6.4 DNA甲基化检测方法 1. DNA甲基化简介 DNA甲基化&#xff08;DNA methy…

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写&#xff0c;其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务&#xff0c; MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

【大语言模型】Docker部署清华大学ChatGLM3教程

官方地址&#xff1a;https://github.com/THUDM/ChatGLM3 1 将代码保存至本地 方法1&#xff1a; git clone https://github.com/THUDM/ChatGLM3 方法2&#xff1a; https://github.com/THUDM/ChatGLM3/archive/refs/heads/main.zip 2 创建Docker文件 注&#xff1a;请先…

人工智能与新能源电动车的融合——技术创新引领未来交通革命

人工智能与新能源电动车的融合——技术创新引领未来交通革命 摘要&#xff1a;本文探讨了人工智能与新能源电动车领域的技术融合&#xff0c;分析了其在智能驾驶、电池技术、充电设施等方面的应用与创新。文章指出&#xff0c;这两大技术的结合将重塑交通产业&#xff0c;为我…

Unity之NetCode多人网络游戏联机对战教程(8)--玩家位置同步

文章目录 前言添加相机玩家添加对应组件服务端权威&#xff08;server authoritative&#xff09;客户端权威&#xff08;client authoritative&#xff09;服务端同步位置阅读与理解PlayerTransformSync.csNetworkVariableUploadTransformSyncTransform 后话 前言 承接上篇&a…

【MybatisPlus】条件构造器、自定义SQL、Service接口

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MybatisPlus 一、条件构造器1.1 基于QueryW…

【设计原则篇】聊聊开闭原则

开闭原则 其实就是对修改关闭&#xff0c;对拓展开放。 是什么 OCP&#xff08;Open/Closed Principle&#xff09;- 开闭原则。关于开发封闭原则&#xff0c;其核心的思想是&#xff1a;模块是可扩展的&#xff0c;而不可修改的。也就是说&#xff0c;对扩展是开放的&#xf…

学开发语言 求职互联网行业的未来发展

我喜欢回答各种各样的问题&#xff0c;自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考&#xff0c;也欢迎交流探讨。 提问&#xff1a; 自考本科&#xff0c;学的开发语言&#xff0c;问互联网行业求职和发展&#xff01; 作为一个资深码农&#xff0c;对这样…

php 插入排序算法实现

插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将一个数据序列分为有序区和无序区&#xff0c;每次从无序区选择一个元素插入到有序区的合适位置&#xff0c;直到整个序列有序为止 5, 3, 8, 2, 0, 1 HP中可以使用以下代码实现插入排序算法&#xff1a; functi…

Word 插入的 Visio 图片显示为{EMBED Visio.Drawing.11} 解决方案

World中&#xff0c;如果我们插入了Visio图还用了Endnote&#xff0c; 就可能出现&#xff1a;{EMBED Visio.Drawing.11}问题 解决方案&#xff1a; 1.在相应的文字上右击&#xff0c;在出现的快捷菜单中单击“切换域代码”&#xff0c;一个一个的修复。 2.在菜单工具–>…

数据结构 | 图

最小生成树算法 Prime算法 算法思路&#xff1a;从已选顶点所关联的未选边中找出权重最小的边&#xff0c;并且生成树不存在环。 其中&#xff0c;已选顶点是构成最小生成树的结点&#xff0c;未选边是不属于生成树中的边。 例子&#xff1a; 第一步&#xff1a; 假设我们从顶…

从0到0.01入门 Webpack| 002.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

使用VSCode进行Python模块调试

使用VSCode进行Python模块调试 创建测试文件 创建文件test/a/b.py&#xff0c;且当前工作路径为test/ b.py文件内容&#xff1a; def cal(numa, numb):print(int(numa) int(numb))if __name__ "__main__":import sys# 判断系统参数长度是否为4且判断第2个参数是…