Zynq UltraScale系列使用MIPI CSI-2 RX Subsystem 解码MIPI视频PD输出 提供2套工程源码和技术支持

news/2024/7/21 7:28:41 标签: fpga开发, MIPI, MIPI CSI-2 RX, 图像处理

目录

  • 1、前言
  • 2、设计思路和架构
  • 3、vivado工程详解
  • 4、上板调试验证
  • 5、福利:工程代码的获取

1、前言

本设计采用OV5640摄像头MIPI模式作为输入,分辨率为1280x720@60Hz,MIPI解码方案采用Xilinx官方提供的MIPI CSI-2 RX Subsystem IP解码MIPI视频,通过DP接口输出视频。
FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。
本文详细描述了设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于MIPI协议,请自行搜索,csdn就有很多大佬讲得很详细,我就不多写这块了;
本设计只针对2line的MIPI相机;
如果要使用4line的MIPI相机,请参考我之前写的文章4line MIPI解码

2、设计思路和架构

工程采用两个 lane 的 MIPI 输入,MIPI 摄像头配置为 RAW10 输出。通过mipi_csi2_rx_subsystem 模块进行协议解析并转换成 AXIS 流数据,并通过Sensor Demosaic模块将RAW 转换成 RGB 数据,之后经过 Gammer 校正等模块,进入 VDMA,之后进入 HP 口。
设计架构如下:
在这里插入图片描述
先配置 ZYNQ 核,100MHz 用于数据传输,200MHz 用于 MIPI 模块参考时钟,如下图:
在这里插入图片描述
配置 i2c 为 EMIO,用于配置摄像头寄存器,GPIO EMIO 设置为 1,用于配置摄像头使能,如下图:
在这里插入图片描述
添加 mipi_csi2_rx_subsystem IP,用于 MIPI 数据的接收与解析,转成 axi-stream 接口。
配置如下,数据格式选择 RAW10,选择 2 lane,Line Rate 配置为 1000Mbps,指的是最大支持的速率,也可以根据自己的需求填写,范围为 80-2500;Pixels Per Clock 默认配置为1,表示 1 个周期为 1 个像素;如下图:
在这里插入图片描述
自此,输入MIPI视频就以完成了解码,输出为AXIS视频流;后面就是图像数据格式转换和VDMA缓存以及vitis软件配置了。

3、vivado工程详解

提供2套工程源码,对应2种fpga,其他型号的fpga只需在vivado里更改fpga型号,然后重新编译即可,很简单,不多说;
工程1:
输入:OV5640摄像头MIPI模式,1280x720@60Hz;
FPGA型号:Zynq UltraScale Xczu4ev;
开发环境:vivado2020.2;
输出:DP,1280x720@60Hz;

工程2:
输入:OV5640摄像头MIPI模式,1280x720@60Hz;
FPGA型号:Zynq UltraScale Xczu2cg;
开发环境:vivado2020.2;
输出:DP,1280x720@60Hz;

以工程1为例,vivado工程BD如下:
在这里插入图片描述
综合后的代码架构如下:
在这里插入图片描述
vitis软件配置部分c代码主函数源码如下:

int main(void)
{
	int Status;
	int i ;
	Xil_DCacheDisable();
	Xil_ICacheDisable();
	for (i = 0; i < DISPLAY_NUM_FRAMES; i++)
	{
		pFrames[i] = frameBuf[i];
		memset(pFrames[i], 0, DEMO_MAX_FRAME);
	}
	PsGpioSetup() ;
	XGpioPs_WritePin(&Gpio, CAM_EMIO, 0) ;
	usleep(1000000);
	XGpioPs_WritePin(&Gpio, CAM_EMIO, 1) ;
	usleep(1000000);
	i2c_init(&ps_i2c0, XPAR_XIICPS_0_DEVICE_ID,100000);
	xil_printf("DPDMA Generic Video Example Test \r\n");
	Status = DpdmaVideoExample(&RunCfg, pFrames[0]);
	if (Status != XST_SUCCESS) {
		xil_printf("DPDMA Video Example Test Failed\r\n");
		return XST_FAILURE;
	}
	gamma_lut_init();
	demosaic_init();
	vdma_write_init(XPAR_AXIVDMA_0_DEVICE_ID,HORSIZE,VERSIZE,DEMO_STRIDE,(unsigned int)pFrames[0]);
	sensor_init(&ps_i2c0);
	return 0;
}

4、上板调试验证

由于某些不可抗力和高层次复杂因素,不便展示调试结果,请见谅;
在这里插入图片描述

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

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


http://www.niftyadmin.cn/n/108402.html

相关文章

【RocketMQ】RocketMQ 5.0版本任意时刻延迟消息的实现原理浅析

文章目录意外发现设计方案时间轮定时消息存储具体实现流程图流程步骤意外发现 无意间从官方的最新的客户端代码中看到下面的Example&#xff1a; 感兴趣的可以看看这个介绍&#xff1a;https://rocketmq.apache.org/docs/featureBehavior/02delaymessage 生产者&#xff1a;…

创建自助服务知识库的指南

在SaaS领域&#xff0c;自助文档是你可以在客户登录你的网站时为他们提供的最灵活的帮助方式&#xff0c;简单来说&#xff0c;一个自助知识库是一个可以帮助许多客户的文档&#xff0c;拥有出色的自助服务知识库&#xff0c;放在官网或者醒目的地方&#xff0c;借助自助服务知…

C语言易错小贴士

1.数组建立以及strlen&#xff1a; char arr1[]"bit"; char arr2[]{b,i,t}; char arr3[]{b,i,t,\0}; 1&#xff09;其中arr1数组需要注意默认为4个字符&#xff0c;和arr3包含的内容是一致的&#xff1b; 2&#xff09;arr2末尾没有\0&#xff0c;后面是数组越界的…

【ROS学习笔记7】ROS中的常用命令行

【ROS学习笔记7】ROS中的常用命令行 文章目录【ROS学习笔记7】ROS中的常用命令行前言一、rosnode二、rostopic三、rosmsg四、rosservice五、rossrv六、rosparam七、Reference写在前面&#xff0c;本系列笔记参考的是AutoLabor的教程&#xff0c;具体项目地址在 这里 前言 机器…

《C++ Primer》第七章 类

《C Primer》第七章 类 7.1 定义抽象数据类型 类的基本思想是数据抽象与封装。数据抽象是一种以利于接口和实现分离的变成技术。要想实现数据抽象与封装&#xff0c;需要先定义一个抽象数据类型。 类内&#xff1a; this: 总是指向"这个"对象&#xff0c;是一个常…

JavaScript中单例模式这样用

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 单例模式…

203. 移除链表元素 L2-027 名人堂与代金券

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#…

下拉框推荐-Suggest-SUG

什么是下拉框推荐 在我们使用各种app&#xff08;飞猪&#xff09;想要搜索我们想要的东西&#xff0c;假设我想要上海迪士尼的门票&#xff0c;那么精确的query是“上海迪士尼门票”&#xff0c;要打7个字&#xff0c;如果在你输入“上海”的时候app就推荐了query“上海迪士尼…