国产高云FPGA实现MIPI视频解码+图像缩放,基于OV5647摄像头,提供Gowin工程源码和技术支持

目录

国产高云FPGA实现MIPI视频解码+图像缩放,基于OV5647摄像头,提供Gowin工程源码和技术支持

1、前言

国产FPGA现状:

"苟利国家生死以,岂因祸福避趋之!"大洋彼岸的我优秀地下档员,敏锐地洞察到祖国的短板在于先进制程半导体的制造领域,于是本着为中华民族伟大复兴的中国梦贡献绵薄之力的初心,懂先生站在高略高度和长远角度谋划,宁愿背当代一世之骂名也要为祖国千秋万世谋,2018年7月,懂先生正式打响毛衣战,随后又使出恰勃纸战术,旨在为祖国先进制程半导体领域做出自主可控的战略推动;2019年初我刚出道时,还是Xilinx遥遥领先的时代(现在貌似也是),那时的国产FPGA还处于黑铁段位;然而才短短7年,如今的国产FPGA属于百家争鸣、百花齐放、八仙过海、神仙打架、方兴未艾、得陇望蜀、友商都是XX的喜极而泣之局面,此情此景,不得不吟唱老人家的诗句:魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间。。。

目前对于国产FPGA优势有以下几点:

1:性价比高,与同级别国外大厂芯片相比,价格相差几倍甚至十几倍;

2:自主可控,国产FPGA拥有完整自主知识产权的产业链,从芯片到相关EDA工具;

3:响应迅速,FAE技术支持比较到位,及时解决开发过程中遇到的问题,毕竟中文数据手册;

4:采购方便,产业链自主可控,采购便捷;

FPGA实现MIPI视频解码现状:

MIPI视频解码分为D-PHY和CSI-2两大部分,其中D-PHY属于物理层,依托硬件,灵活性不高,方案不多;CSI-2属于协议层,依托代码,灵活性很高,方案很多;所以只要实现了D-PHY,MIPI-CSI解码其实就很灵活了;第一种D-PHY方案是使用FPGA内部资源,目前FPGA内部继承了硬核MIPI D-PHY的可选方案还是很丰富,国产的高云、安路、易灵思等都有,Xilinx则只有UltraScale+高端系列FPGA才有,该方案优点是设计简单,缺点是硬件成本较高;第二种是使用专用的D-PHY芯片,比如MC20901,该方案优点是设计简单,缺点是硬件成本较高;第三种是使用权电阻网络实现D-PHY功能,该方案是Xilinx官方推荐的一种简单、低速的D-PHY方案,通常用于测试,该方案优点是电路简单,硬件成本低,缺点是性能适中,无法用于高端场景;然后D-PHY信号进入FPGA内部的MIPI CSI-2 RX IP实现CSI功能,即实现MIPI视频解码,另外,也可以使用自己写的CSI模块实现CSI功能;本设计使用国产高云系列FPGA,所以无需考虑D-PHY部分;

工程概述

本设计使用国产高云GW5A-LV25UG324ES型号的FPGA做MIPI视频解码转HDMI输出系统;输入视频源为OV5647摄像头,FPGA首先使用纯verilog代码实现的OV5647配置模块对OV5647摄像头做i2c配置,将其配置为MIPI 2 Lane的、RAW8颜色格式的、分辨率为1920x1080@30Hz的状态输出;然后MIPI视频送入高云官方提供的MIPI-DPHY硬核IP实现DPHY功能,分离出LP和HS电路以及控制信号;然后DPHY视频送入高云官方提供的MIPI-CSI2-RX硬核IP实现MIPI视频协议层解码功能,解出有效视频数据和控制数据;然后解码视频送入高云官方提供的MIPI-Byte-To-Pixel-Converter硬核IP实现视频格式转换功能,将解码视频数据包转换成标准像素格式数据,并从同步短包中恢复视频同步信号;然后视频送入纯verilog实现的Bayer转RGB模块实现颜色空间转换,将RAW8图像转换为RGB888图像;然后视频送入纯verilog代码实现的图像缩放模块,将原视频从1920x1080缩放到1280x720,您可修改缩放参数轻松缩放到其他分辨率,工程只是举例,修改方法博客有说明;然后视频送入高云官方提供的Video-Frame-Buffer硬核IP实现视频缓存功能,本设计使用3帧缓存;然后使用纯verilog实现Native视频时序生成模块控制视频从DDR3中读出,并做输出视频同步;然后同步视频送入高云官方提供的DVI-TX硬核IP实现视频接口转换功能,将RGB888视频流编码为HDMI差分视频流输出;最后使用HDMI显示器显示即可;针对市场主流需求,本设计提供1套Gowin工程源码,具体如下:

现对上述1套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为高云GW5A-LV25UG324ES;输入视频源为OV5647摄像头,FPGA首先使用纯verilog代码是实现的OV5647配置模块对OV5647摄像头做i2c配置,将其配置为MIPI 2 Lane的、RAW8颜色格式的、分辨率为1920x1080@30Hz的状态输出;然后MIPI视频送入高云官方提供的MIPI-DPHY硬核IP实现DPHY功能,分离出LP和HS电路以及控制信号;然后DPHY视频送入高云官方提供的MIPI-CSI2-RX硬核IP实现MIPI视频协议层解码功能,解出有效视频数据和控制数据;然后解码视频送入高云官方提供的MIPI-Byte-To-Pixel-Converter硬核IP实现视频格式转换功能,将解码视频数据包转换成标准像素格式数据,并从同步短包中恢复视频同步信号;然后视频送入纯verilog实现的Bayer转RGB模块实现颜色空间转换,将RAW8图像转换为RGB888图像;然后视频送入纯verilog代码实现的图像缩放模块,将原视频从1920x1080缩放到1280x720,您可修改缩放参数轻松缩放到其他分辨率,工程只是举例,修改方法博客有说明;然后视频送入高云官方提供的Video-Frame-Buffer硬核IP实现视频缓存功能,本设计使用3帧缓存;然后使用纯verilog实现Native视频时序生成模块控制视频从DDR3中读出,并做输出视频同步;然后同步视频送入高云官方提供的DVI-TX硬核IP实现视频接口转换功能,将RGB888视频流编码为HDMI差分视频流输出,输出分辨率为1280x720@60Hz,为了兼容缩放后的其他分辨率,本设计将背景分辨率设计为1920x1080,缩放后的图像叠加在其上显示即可,这也是本博主的创新点;最后使用HDMI显示器显示即可;本工程适用于国产高云FPGA实现MIPI视频解码转HDMI应用;

本文详细描述了国产高云FPGA图像视频采集系统的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

提供完整的、跑通的工程源码和技术支持;

工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网以及其他开源免费获取渠道等等),若大佬们觉得有所冒犯,请私信批评教育;部分模块源码转载自上述网络,版权归原作者所有,如有侵权请联系我们删除;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往

国产高云FPGA基础教程

高云FPGA开发软件Gowin的下载、安装、Licence共享,工程搭建、代码添加、综合、编译、下载、各种IP的调用、配置、使用等基础操作,是做高云FPGA开发的基本功,当然,如果你已是有经验的工程师,则可以省略这一步,为此,我专门开设了专栏,详细讲述国产高云FPGA基础教程,甚至可以说是保姆级的教程,专栏地址如下:
点击直接前往

国产高云FPGA相关方案推荐

鉴于国产高云FPGA的优异表现和市场需求,我专门开设了一个人国产高云FPGA专栏,里面收录了基于国产高云FPGA的图像处理、UDP网络通信、GT高速接口、PCIE等博客,感兴趣的可以去看看,博客地址:点击直接前往

我这里已有的 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有项目需求或学习兴趣的兄弟可以去我的专栏看看,专栏地址如下:
点击直接前往专栏

我这里已有的FPGA图像缩放方案

我的主页目前有FPGA图像缩放专栏,改专栏收录了我目前手里已有的FPGA图像缩放方案,从实现方式分类有基于HSL实现的图像缩放、基于纯verilog代码实现的图像缩放;从应用上分为单路视频图像缩放、多路视频图像缩放、多路视频图像缩放拼接;从输入视频分类可分为OV5640摄像头视频缩放、SDI视频缩放、MIPI视频缩放等等;以下是专栏地址:
点击直接前往

3、设计思路框架

工程设计原理框图

工程设计原理框图如下:

OV5647摄像头及其配置

视频输入源为OV5647 MIPI摄像头,FPGA首先使用纯verilog代码是实现的OV5647配置模块对OV5647摄像头做i2c配置,将其配置为MIPI 2 Lane的、RAW8颜色格式的、分辨率为1920x1080@30Hz的状态输出;OV5647摄像头如下:

OV5647配置模块代码如下:

MIPI-DPHY

使用高云官方提供的MIPI-DPHY硬核IP实现DPHY功能,分离出LP和HS电路以及控制信号;MIPI-DPHY硬核IP配置如下:

工程中IP核例化如下:

MIPI-CSI2-RX

DPHY视频送入高云官方提供的MIPI-CSI2-RX硬核IP实现MIPI视频协议层解码功能,解出有效视频数据和控制数据;MIPI-CSI2-RX硬核IP配置如下:

工程中IP核例化如下:

视频格式转换

然后解码视频送入高云官方提供的MIPI-Byte-To-Pixel-Converter硬核IP实现视频格式转换功能,将解码视频数据包转换成标准像素格式数据,并从同步短包中恢复视频同步信号;MIPI-Byte-To-Pixel-Converter硬核IP配置如下:

工程中IP核例化如下:

Bayer转RGB

然后视频送入纯verilog实现的Bayer转RGB模块实现颜色空间转换,将RAW8图像转换为RGB888图像;代码如下:

图像缩放模块详解

图像缩放模块功能框图如下,由跨时钟FIFO、插值+RAM阵列构成,跨时钟FIFO的目的是解决跨时钟域的问题,比如从低分辨率视频放大到高分辨率视频时,像素时钟必然需要变大,这是就需要异步FIFO了,插值算法和RAM阵列具体负责图像缩放算法层面的实现;

插值算法和RAM阵列以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:

依据上图,图像缩放模块内部核心是例化了4个双口RAM,作用是缓存4行图像,以得到4个临近的像素,以此为基础做线性插值;如果是做图像放大操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中插入更多的像素点来扩大分辨率;如果是做图像缩小操作,就以这4个临近的像素为基准,以线性插值为算法,在原图像中删除更多的像素点来缩小分辨率;此外,前面描述的工作是实时的、整幅图像全部扫描式的进行,所以需要对RAM的读写操作进行精准控制;

图像缩放模块代码架构如下:模块的例化请参考工程源码的顶层代码;

图像缩放模块FIFO的选择可以调用工程对应的vivado工具自带的FIFO IP核,也可以使用纯verilog实现的FIFO,可通过接口参数选择,图像缩放模块顶层接口如下:

FIFO_TYPE选择原则如下:

1:总体原则,选择"gaoyun"好处大于选择"verilog";

2:当你的FPGA逻辑资源不足时,请选"gaoyun";

3:当你图像缩放的视频分辨率较大时,请选"gaoyun";

4:当你的FPGA没有FIFO IP或者FIFO IP快用完了,请选"verilog";

5:当你向自学一下异步FIFO时,,请选"verilog";

6:不同FPGA型号对应的工程FIFO_TYPE参数不一样,但选择原则一样,具体参考代码;

2种插值算法的整合与选择

本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;

具体选择参数如下:

c 复制代码
input  wire i_scaler_type //0-->bilinear;1-->neighbor

通过输入i_scaler_type 的值即可选择;

输入0选择双线性插值算法;

输入1选择邻域插值算法;

代码里的配置如下:

图像缩放模块使用(重点阅读)

图像缩放模块使用非常简单,顶层代码里设置了四个参数,如下:

上图是将输入视频分辨率从1280x720缩放为1920x1080;

如果你想将输入视频分辨率从1280x720缩放为640x480;

则只需修改为如下:

再比如你想将输入视频分辨率从1280x720缩放为960x540;

则只需修改为如下:

在本博主这里,想要实现图像缩放,操作就是这么无脑简单,就该两个参数就能搞定貌似高大上的双线性插值图像缩放,这种设计、这种操作、这种工程源码,你还喜欢吗?

图像缩放模块仿真

图像缩放模块需要vivado和matlab联合仿真;

需要注意的是,仿真的目的是为了验证,这一步我已经替你们做完了,所以读者不再需要单独仿真,如果读者是在需要自己仿真玩玩儿,需要自己写仿真代码;vivado和matlab联合仿真详细步骤如下:

第一步:网上下载一张1280X720的图片,并用matlab将图片转换为RGB格式的txt文档;

第二步:在vivado下设计tstbench,将RGB格式的txt文档作为视频输入源给到图像缩放模块,并将缩放后的图像数据写入输出txt文档;

第二步:用matlab将输出txt文档转换为图片,并于原图一并输出显示以做比较;

根据以上方法得到以下仿真结果:

双线性插值算法原图1280X720缩小到800x600如下:

邻域插值算法原图1280X720缩小到800x600如下:

双线性插值算法原图1280X720放大到1920x1080如下:

邻域插值算法原图1280X720放大到1920x1080如下:

Video Frame Buffer 图像缓存

调用高云官方的Video Frame Buffer IP核将视频送到外接DDR3中做三帧缓存;该部分是图像采集显示系统的重点,如果是其他FPGA,则需要写一大堆代码才能实现,花费时间和精力很多,但高云FPGA通过集成硬核IP轻松实现了该功能,即Video Frame Buffer IP核;IP使用非常简单,配置如下:

工程中IP核例化如下:

DDR3 控制器

调用高云官方的DDR3 Memory Interface IP核实现图像数据到DDR3颗粒的搬运工作,类似于Xilinx的MIG;DDR3 Memory Interface IP配置如下:

工程中IP核例化如下:

HDMI输出架构

然后使用纯verilog实现Native视频时序生成模块控制视频从DDR3中读出,并做输出视频同步;然后同步视频送入高云官方提供的DVI-TX硬核IP实现视频接口转换功能,将RGB888视频流编码为HDMI差分视频流输出;最后使用HDMI显示器显示即可;DVI-TX硬核IP配置如下:

HDMI输出架构代码如下:

工程源码架构

工程源码架构如下:

我发布的工程源码均已编译通过,如下:

4、Gowin工程源码1详解:OV5647 MIPI缩放转HDMI

开发板FPGA型号:国产高云--GW5A-LV25UG324ES;

开发环境:Gowin-V1.9;

输入:OV5647摄像头;MIPI-2 Lane;RAW8色域;分辨率1920x1080@30Hz;

输出:HDMI,逻辑编码;1920x1080黑色背景下叠加显示缩放后的图像;

MIPI-DPHY方案:高云官方硬核IP方案;

MIPI-CSI2-RX方案:高云官方硬核IP方案;

图像缩放方案:纯Verilog图像缩放;

图像缩放实例:1920x1080缩放到1280x720,其他分辨率缩放可自行修改;

图像缓存方案:高云官方硬核IP方案,3帧缓存;

工程源码架构请参考前面第3章节中的《工程源码架构》小节;

工程作用:此工程目的是让读者掌握紫光同创FPGA实现MIPI视频解码转HDMI输出的设计能力,以便能够移植和设计自己的项目;

工程的资源消耗和功耗如下:

5、上板调试验证并演示

准备工作

你需要有以下装备才能移植并测试该工程代码:

1:FPGA开发板;

2:OV5647摄像头;

3:HDMI传输线;

4:HDMI显示,要求分辨率支持1920x1080;

开发板连接如下:

国产高云FPGA实现MIPI视频缩放转HDMI输出演示

国产高云FPGA实现MIPI视频缩放转HDMI输出演示如下:

OV5647-缩放720P

6、工程源码

工程代码如下:

相关推荐
FPGA_ADDA6 小时前
KU115LPE-V10型FPGA加速卡
fpga开发·ku115·fpga加速卡
hahaha60167 小时前
温度对IO通信的影响
fpga开发
硬件学长森哥8 小时前
Android音视频流媒体基础总结
android·音视频
aqi008 小时前
FFmpeg开发笔记(六十六)Windows给FFmpeg集成LC3音频的编码器liblc3
ffmpeg·音视频·直播·流媒体
追随远方9 小时前
Android OpenSL ES 音频播放完整实现指南
android·elasticsearch·音视频
Digitally9 小时前
如何将视频从 iPhone 传输到 HP 笔记本电脑
电脑·音视频·iphone
键盘歌唱家12 小时前
AIGC方案-java实现视频伪动效果
java·aigc·音视频
hahaha601617 小时前
xilinx的gt的ALIGN_COMMA_WORD设置的作用
fpga开发
第二层皮-合肥1 天前
实战案例-FPGA如何实现JESD204B确定性延迟
fpga开发
CFAteam1 天前
DeepSeek AI功能演示:如何生成Verilog脚本
人工智能·ai·fpga开发·llama