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

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名片。
网盘资料如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41667729/article/details/129265707
今日推荐