Zynq7020 纯VHDL解码 MIPI 视频,HDMI输出,支持 ISP 动态配置,提供vivado工程源码和技术支持
1、前言
FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。
本设计基于Xilinx的Zynq7020 开发板,采集OV5640摄像头的2Line MIPI视频,OV5640摄像头引脚接Zynq7020 的BANK35,经过纯VHDL实现的 D-PHY和CSI2 RX模块输出Bayer视频,再经过Bayer转RGB模块输出RGB视频,再经伽马矫正模块增强图像质量,然后调用Xilinx官方VDMA将图像送入PS端的DDR3中做三帧缓存后读出;调用Xilinx官方VTC模块产生输出视频时序,zynq通过SDK软件动态配置VTC的输出时序,支持1080P、720P和640P三种时序输出,调用Xilinx官方AXI4-Stream to Video Out做数据流转换,输出VGA时序的RGB数据,最后通过纯VHDL实现的RGB转HDMI模块将视频输出显示器;在SDK软件端,通过串口与PC交互,PC发送指令给SDK软件,可动态配置ISP,ISP功能包括控制OV5640输入分辨率、控制OV5640输入图像格式、任意修改OV5640内部寄存器值、任意读取OV5640内部寄存器值、任意修改伽马矫正系数(输出效果不同)、控制切换自动白平衡方式(有三种模式:高级、简单和禁用);
本文详细描述了Zynq7020 纯VHDL解码 MIPI 视频HDMI输出的设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于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 模块性能及其优越性
一个字:牛逼,表现如下:
1:纯VHDL代码实现,学习性和阅读性达到天花板;
2:移植性还可以,只要兼容Xilinx解串源语的FPGA均可移植;
3:算法达到天花板,标准的CSI2接收协议实现解码;
4:实用性达到天花板,采用OV5640摄像头作为输入(主要是便宜),不同于市面上验证性和实验性的工程,本设计直接面向实用工程,贴近真实项目,做类似项目的兄弟可直接拿去用,一个月工资直接拿到手。。。
5:支持高达1920X1080分辨率的MIPI视频解码;
6:时序收敛很到位,考虑到MIPI协议的复杂性和时序的高要求,所以没有采用时序收敛不强的verilog,而是VHDL,虽然阅读性可能会低一些,但用户只需要知道用户接口即可,并不需要去看内部的复杂代码;
7:使用方便,虽然是VHDL代码实现,但均已封装为自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
4、详细设计方案
设计原理框图
设计原理框图如下:
OV5640摄像头及其配置
我使用到的OV5640摄像头输出为2 Line MIPI格式,输出分辨率有720p@60Hz和1080p@30Hz两种,可通过SDK软件选择配置为哪一种;OV5640输出 RAW10数据;zynq通过i2c片内外设配置OV5640,这个操作在SDK软件里完成,PL端硬件无需参与;
D-PHY 模块
关于MIPI D-PHY,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI D-PHY功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;本MIPI D-PHY只能支持1 line或者2 line的MIPI视频;
本工程中的D-PHY自定义IP调用如下:
MIPI D-PHY纯VHDL源码如下:
CSI-2-RX 模块
关于MIPI CSI-2-RX,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI CSI-2-RX功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;本MIPI CSI-2-RX只能支持1 line或者2 line的MIPI视频,数据格式支持RAW10;
本工程中的CSI-2-RX自定义IP调用如下:
MIPI CSI-2-RX纯VHDL源码如下:
Bayer转RGB模块
关于MIPI Bayer转RGB,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI Bayer转RGB功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
本工程中的Bayer转RGB自定义IP调用如下:
MIPI Bayer转RGB纯VHDL源码如下:
伽马矫正模块
关于MIPI 伽马矫正,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现MIPI 伽马矫正功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
本工程中的伽马矫正自定义IP调用如下:
MIPI 伽马矫正纯VHDL源码如下:
RGB转HDMI模块
关于RGB转HDMI,网上介绍原理和概念的文章一大堆,在此不再重复,这里重点介绍用FPGA实现;
我们采用纯VHDL代码实现RGB转HDMI功能,为了照顾大家不习惯阅读VHDL代码的习惯,我们已经将改部分代码封装成为了自定义IP,用户无需关心代码实现的复杂逻辑,仅需调用IP,通过UI界面配置即可使用,当然,如果你想看里面的源码依然可以直接打开观看;
本工程中的RGB转HDMI纯VHDL源码如下:
ISP 动态配置
在SDK软件端,通过串口与PC交互,PC发送指令给SDK软件,可动态配置ISP,ISP功能包括控制OV5640输入分辨率、控制OV5640输入图像格式、任意修改OV5640内部寄存器值、任意读取OV5640内部寄存器值、任意修改伽马矫正系数(输出效果不同)、控制切换自动白平衡方式(有三种模式:高级、简单和禁用);具体如下:
当下载bit后,PC端的串口调试助手会收到打印的提示信息;
Please press the key corresponding to the desired option:
a. Change Resolution
b. Change Liquid Lens Focus
d. Change Image Format (Raw or RGB)
e. Write a Register Inside the Image Sensor
f. Read a Register Inside the Image Sensor
g. Change Gamma Correction Factor Value
h. Change AWB Settings
此时,你可以输入a、b、d、e、f、g、h案件来动态配置摄像头;这里说明如下:
OV5640输入分辨率控制
当你输入 a 后,会看到如下打印信息:
1. 1280 x 720, 60fps
2. 1920 x 1080, 15fps
3. 1920 x 1080, 30fps
输入 1 ,OV5640输入分辨率为1280 x 720, 60fps;
输入 2 ,OV5640输入分辨率为1920 x 1080, 15fps;
输入 3 ,OV5640输入分辨率为1920 x 1080, 30fps;
OV5640调焦控制
也就是上面的输入 b 时的功能,但此功能我调试一直失败中,暂不知道问题出在哪里,所以直接跳过,不再赘述;
OV5640输入数据格式控制
当你输入 d 后,会看到如下打印信息:
Please press the key corresponding to the desired setting:
1. Select image format to be RGB, output still Raw
2. Select image format & output to both be Raw
输入 1 ,OV5640输入数据格式为RGB;
输入 2 ,OV5640输入数据格式为RAW;
注意:RGB格式仅在调试中使用,因为本工程为MIPI,所以请务必配置为RAW;
OV5640写寄存器控制
当你输入 e 后,会看到如下打印信息:
Please enter address of image sensor register, in hex, with small letters:
此时你需要输入需要写的OV5640寄存器地址,注意是输入十六进制数;
地址输入完后,会看到如下打印信息:
Please enter value of image sensor register, in hex, with small letters:
此时你需要输入需要写的OV5640寄存器数据,注意是输入十六进制数;
自此,OV5640写寄存器操作完成;
OV5640读寄存器控制
当你输入 f 后,会看到如下打印信息:
Please enter address of image sensor register, in hex, with small letters:
此时你需要输入需要读的OV5640寄存器地址,注意是输入十六进制数;
地址输入完后,会看到读回的数据;
伽马矫正系数控制
当你输入 g 后,会看到如下打印信息:
Please press the key corresponding to the desired Gamma factor:
1. Gamma Factor = 1
2. Gamma Factor = 1/1.2
3. Gamma Factor = 1/1.5
4. Gamma Factor = 1/1.8
5. Gamma Factor = 1/2.2
输入 1 ,伽马矫正系数为1;
输入 2 ,伽马矫正系数为1/1.2;
输入 3 ,伽马矫正系数为1/1.5;
输入 4 ,伽马矫正系数为1/1.8;
输入 5 ,伽马矫正系数为1/2.2;
自动白平衡控制
当你输入 h 后,会看到如下打印信息:
Please press the key corresponding to the desired AWB change:
1. Enable Advanced AWB
2. Enable Simple AWB
3. Disable AWB
输入 1 ,自动白平衡为高级模式,此时效果最佳;
输入 2 ,自动白平衡为简单模式,此时效果一般;
输入 3 ,自动白平衡功能被禁用,此时输出可能为黑色;
MIPI D-PHY 硬件方案
本设计使用xilinx官方推荐的电阻网络方案,要求800M Hz以下,走线30mm以内;板载MIPI接口原理图部分如下:
然后差分信号组连到BANK35,如下:
5、vivado工程详解
PL端FPGA硬件设计
开发板FPGA型号:Xilinx--zynq7020--xc7z020clg400-1;
开发环境:Vivado2019.1;
输入:OV5640 MIPI 2 Line RAW10;
输出:HDMI显示器,720P;
应用:Zynq7020 纯VHDL解码 MIPI 视频HDMI输出;
工程Block Design如下:
工程代码架构如下:
综合编译完成后的FPGA资源消耗和功耗预估如下:
PS端SDK软件设计
SDK C++语言软件代码架构如下:
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、上板调试验证
输出如下:
8、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以百度网盘链接方式发送,
通过微信获取资料:
网盘资料如下: