目录
- 1、前言
- 工程概述
- 免责声明
- 2、相关方案推荐
- 我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
- 我这里已有的 MIPI 编解码方案
- 我这里已有的视频图像编解码方案
- 3、详细设计方案
- 设计框图
- FPGA开发板
- IMX317摄像头
- MIPI D-PHY
- MIPI CSI-2 RX Subsystem
- 图像预处理
- Sensor Demosaic 图像格式转换
- Gammer LUT 伽马校正
- Video Processing Subsystem 图像缩放
- Video Frame Buffer Write 图像缓存
- Zynq UltraScale+ VCU H265 视频压缩
- 工程源码架构
- PetaLinux 工程编译
- VLC播放器
- 4、Vivado工程源码详解
- 5、工程移植说明
- vivado版本不一致处理
- FPGA型号不一致处理
- 其他注意事项
- 6、上板调试验证并演示
- 准备工作
- 配置Xshell
- 配置开发板IP
- 配置MIPI CSI-2 RX Subsystem
- 配置Sensor Demosaic
- 配置Gamma LTU
- 配置Video Processing Subsystem
- 配置H265视频压缩
- 配置VLC播放器
- VLC播放H265码流视频演示
- 7、福利:工程源码获取
FPGA实现4K MIPI视频解码H265压缩网络推流输出,基于IMX317+VCU架构,支持4K60帧,提供工程源码和技术支持
1、前言
Xilinx系列FPGA实现MIPI视频解码现状:
MIPI视频解码分为D-PHY和CSI-2两大部分,其中D-PHY属于物理层,依托硬件,灵活性不高,方案不多;CSI-2属于协议层,依托代码,灵活性很高,方案很多;所以只要实现了D-PHY,MIPI-CSI解码其实就很灵活了;
目前Xilinx系列FPGA实现提供了多种MIPI D-PHY方案;第一种是使用专用的D-PHY芯片实现D-PHY功能,比如MC20901,该方案优点是设计简单,缺点是硬件成本较高;第二种是使用权电阻网络实现D-PHY功能,该方案是Xilinx官方推荐的一种简单、低速的D-PHY方案,通常用于测试,该方案优点是电路简单,硬件成本低,缺点是性能适中,无法用于高端场景;第三种是使用软核IP实现D-PHY功能,但该方案仅限于UltraScale+和Zynq UltraScale+高端系列FPGA,该方案优点是设计简单,缺点是硬件成本极高;然后D-PHY信号进入Xilinx官方的MIPI CSI-2 RX Subsystem IP实现CSI功能,即实现MIPI视频解码,另外,也可以使用自己写的CSI模块实现CSI功能;本设计使用UltraScale+和Zynq UltraScale+高端系列FPGA,所以无需考虑D-PHY部分;
Xilinx系列FPGA实现H265视频压缩现状:
目前Xilinx系列FPGA实现H265视频压缩目前有2种方案,第一种方案是使用自己写的H265视频压缩模块实现,该方案对开发人员的技术要求及其高,目前99.999%的人都不具备此等水平,H265视频压缩模块配合Xilinx系列FPGA的PetaLinux可实现完美的视频压缩,该方案优点是设计灵活,对FPGA型号要求不高,可选择性更多,硬件成本较低,缺点是实现难度堪称宇宙级;第二种方案是使用Xilinx官方的VCU IP核,该方案优点是设计简单,对开发者的技术要求较低,上手快,项目部署快,缺点是对FPGA型号要求很高,目前仅有Zynq UltraScale+MPSoCs的EV系列FPGA支持,可选择性更少,硬件成本很高;本设计采用Xilinx官方的VCU IP核实现H265视频压缩;
工程概述
本设计采用Zynq UltraScale+MPSoCs–XCZU4EV的高端型号FPGA实现4K MIPI视频解码H265压缩网络推流输出;视频输入源为IMX317 MIPI摄像头,FPGA首先对摄像头进行i2c初始化配置,将IMX317 输出分辨率配置为3840x2160@30Hz,MIPI-4 Lane输出模式;然后MIPI视频送入Xilinx官方的MIPI CSI-2 RX Subsystem IP核实现D-PHY+CSI功能;然后调用图像预处理模块实现视频剪裁和RAW12转RAW8功能;然后视频送入Xilinx官方的Sensor Demosaic IP核实现RAW8转RGB888功能;然后视频送入Xilinx官方的Gamma LTU实现伽马校正功能;然后送入Xilinx官方的Video Processing Subsystem IP核实现视频实时缩放;然后调用Xilinx官方的Video Frame Buffer Write IP核将图像写入PS侧的DDR4中缓存;然后然后调用Xilinx官方的Zynq UltraScale+ VCU IP核读出图像并作H265压缩;至此,整个FPGA工程已经完成;然后编译工程,导出.xsa文件,并在PetaLinux中做嵌入式Linux启动文件,在Linux软件设计中,将压缩的H265视频码流通过TCP协议从网口发送出去,在PC端可通过LVC播放器播放压缩的H265码流;然后将做好的Linux启动文件复制到TF卡中,插上TF卡即可启动Linux系统,在Xshell中即可操作终端进行配置;
本设计提供资源如下:
• 提供一套XCZU4EV开发板
• 提供一套Vivado2020.2版本的工程源码
• 提供一套编译好的固件,可启动Linux系统
本博客详细描述了Xilinx系列Zynq UltraScale+MPSoCs–XCZU4EV的高端型号FPGA实现4K MIPI视频解码H265压缩网络推流输出的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括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有项目需求或学习兴趣的兄弟可以去我的专栏看看,专栏地址如下:
点击直接前往专栏
我这里已有的视频图像编解码方案
我这里有图像的JPEG解压缩、JPEG-LS压缩、H264编解码、H265编解码以及其他方案,后续还会出更多方案,我把他们整合在一个专栏里面,会持续更新,专栏地址:
直接点击前往
3、详细设计方案
设计框图
本设计使用的工程详细设计方案框图如下:
FPGA开发板
本UP主有下列FPGA开发板均可实现4K@60Hz视频 HDMI2.0的收发,本博客仅仅是介绍了其中Zynq UltraScale+系列的开发板实现方案,关于本博客使用的这款开发板详细信息,请参考我之前的博客,对这块开发板感兴趣的朋友可以咨询本UP获得;博客链接如下:
点击直接前往
IMX317摄像头
视频输入源为IMX317 MIPI摄像头,FPGA首先对摄像头进行i2c初始化配置,将IMX317 输出分辨率配置为3840x2160@30Hz,MIPI-4 Lane输出模式;IMX317 i2c配置在vitis软件代码中;IMX317摄像头如下:
MIPI D-PHY
由于本设计使用UltraScale+系列FPGA,软核方案自带D-PHY,所以不再需要配套的D-PHY芯片或者权电阻D-PHY电路,也就是MIPI输入电路不再需要分理处LP低功耗电路,直接将HS差分时钟对和数据对直接连到FPGA的HP-BANK即可;
!!!注意
!!!注意
如果你的开发板FPGA型号不是UltraScale+系列,则需要D-PHY电路,否则无法解码MIPI视频;
MIPI CSI-2 RX Subsystem
然后MIPI视频送入Xilinx官方的MIPI CSI-2 RX Subsystem IP核实现D-PHY+CSI功能,当然,这里主要是CSI功能,即MIPI协议层解码,IMX317摄像头配置后,MIPI-CLK是600MHz,又由于是双沿传输,那么线速率就是1200MHz,IMX317配置为4 Lane通道传输,双像素输出模式;MIPI CSI-2 RX Subsystem配置如下:
MIPI CSI-2 RX Subsystem在Block Design中如下:
图像预处理
MIPI视频解码后,调用图像预处理模块实现视频剪裁和RAW12转RAW8功能;将图像预处理模块顶层直接拖入Block Design中如下:
Sensor Demosaic 图像格式转换
调用Xilinx的Sensor Demosaic IP实现RAM转RGB功能,该IP通过Vitis的C代码软件配置,Sensor Demosaic配置如下:
Sensor Demosaic在Block Design中如下:
Gammer LUT 伽马校正
调用Xilinx的Gammer LUT IP实现伽马校正功能,该IP通过Vitis的C代码软件配置,Gammer LUT配置如下:
Gammer LUT在Block Design中如下:
Video Processing Subsystem 图像缩放
由于工程所用到的IP都是常用IP,所以这里重点介绍一下Video Processing Subsystem;
Video Processing Subsystem有缩放、去隔行、颜色空间转换等功能,这里仅使用图像缩放功能;其特点如下:
优点1:适用于Xilinx所有系列的FPGA器件和所有的Vivado版本;
优点2:支持8K最大分辨率:即可以处理高达8K的视频;
优点3:输入视频格式:AXI4-Stream,方便对接Xilinx图像处理套路的相关IP;
优点4:输出视频格式:AXI4-Stream,方便对接Xilinx图像处理套路的相关IP;
优点5:模块占用的FPGA逻辑资源更小,相比于自己写的HLS图像缩放而言,官方的Video Processing Subsystem资源占用大约减小30%左右,且更高效:
注意!!!!
注意!!!!
缺点1:需要SDK软件配置,其本质为通过AXI_Lite 做寄存器配置,设计难度现对复杂,对新手小白不太友好;
缺点2:Xilinx官方提供的Video Processing Subsystem IAP并不能实现任意尺寸的图像缩放,只能在IAP中视频分辨率查找表范围内进行缩放操作,如果想要实现自定义任意尺寸缩放,需要修改Xilinx官方提供的API源代码,对新手小白极其友好,有此类需求的朋友可以联系博主,提供私人定制服务,也就是我帮你修改Xilinx官方提供的API源代码,以实现自定义任意尺寸缩放操作;
Video Processing Subsystem逻辑资源如下,请谨慎评估你的FPGA资源情况;
Video Processing Subsystem 在Block Design设计中如下:
Video Frame Buffer Write 图像缓存
Video Frame Buffer Write相当于精简版的VDMA,只具有视频写入DDR的功能,与VDMA相比具有YUV视频写入的功能,配置如下:
Video Frame Buffer Write 在Block Design设计中如下:
在Linux设计中可以对视频写入的基地址进行配置,通过终端指令配置;
Zynq UltraScale+ VCU H265 视频压缩
Zynq UltraScale+ VCU是Xilinx Zynq UltraScale+ ZUEV系列FPGA才有的IP,可以实现最高4K60帧的视频压缩和解压,IP的官方文档是《PG252》,读者可以自行前往阅读,Zynq UltraScale+ VCU配置如下:
输入视频格式为YUV420,最高分辨率配置为4K60帧;Zynq UltraScale+ VCU 在Block Design设计中如下:
工程源码架构
工程源码架构包括vivado Block Design逻辑设计和PetaLiux软件设计;
Block Design逻辑设计架构截图如下:
综合后的源码架构如下:
需要注意的是,在对Block Design进行Generate Output Products时需要选择Global模式,如下:
PetaLinux 工程编译
注意!!!
注意!!!
注意!!!
本博主已经提供好已制作完成的启动文件,理论上PetaLinux 工程编译不不要您重复再做,如果您感兴趣,则可以做这一步。。。
PetaLinux版本:PetaLinux版本为2020.2,因为vivado用的vivado202.2,为了兼容性,建议使用与之配套的PetaLinux2020.2;
运行环境:Ubuntu操作系统,我用的Win10上虚拟机搭建的Ubuntu,当然也可以使用直接装Ubuntu操作系统的电脑;
第1步:导出vivado工程的.xsa文件,并放到Ubuntu下你新建的文件夹中;同时下载我们提供的BSP包,也放到Ubuntu下你新建的文件夹中;然后改变其用户权限,如下图:
• 终端指令:sudo chmod -R 777 文件名,比如:
• 终端指令:sudo chmod -R 777 zu402_mipi_rx_wrapper.xsa
• 终端指令:sudo chmod -R 777 zu402_sd.bsp
第2步:配置PetaLinux2020.2环境变量,如下图:
• 终端指令:source /opt/pkg/petalinux/2020.2/settings.sh
第3步:建立基于BSP包的PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-create -t project -s zu402_sd.bsp -n zu402_sd
第4步:将.xsa硬件信息导入PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-config --get-hw-description=/home/文件路径/zu402_sd
在编译环境设置时,建议使用离线编译,当然,选择在线编译也是可以的,离线编译配置如下:
Yocto Settings → Add pre-mirror url如下,路径要改为你自己 download 及 ssate 的解压路径;
Yocto Settings → Local sstate feeds settings如下,路径要改为你自己 download 及 ssate 的解压路径;
其他配置保持默认即可,然后保存退出,如下:
第5步:修改设备树文件,如下图:
将我们提供的设备树文件替换掉PetaLinux工具自动生成的用户设备树文件;
• 终端指令:ln -sf zu402_sensor_imx317.dtsi system-user.dtsi
• 终端指令:ls -l
第6步:编译PetaLinux2020.2工程,如下图:
• 终端指令:petalinux-build
如果编译中途有报错信息,请复制报错信息并百度寻找解决办法,因为每个人的电脑配置不一样,环境配置不一样,遇到的问题也不一样,无法给出统一的答案;
第7步:生成镜像,如下图:
• 终端指令:cd images/linux
• 终端指令:petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga
system.bit
然后把PetaLinux2020.2工程生成的如下几个文件连同我们提供好的脚本文件一起放入SD卡中,如下:
到此们就可以插入SD卡上电跑系统了;
VLC播放器
压缩后的H265码流可通过VLC播放器播放,关于VLC播放器的安装与使用,请参考下面的博客链接:
点击直接前往
4、Vivado工程源码详解
开发板FPGA型号:Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
FPGA开发环境:Vivado2020.2;
Linux开发环境:PetaLinux2020.2;
输入:IMX317摄像头,分辨率3840x2160@30Hz;
输出:RJ45网口,H265压缩码流,分辨率3840x2160@30Hz;;
视频压缩方案:Zynq UltraScale+ VCU–H265压缩;
视频压缩输出方案:UDP网络推流;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握FPGA基于VCU的H265视频压缩的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
5、工程移植说明
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软核;
6、上板调试验证并演示
准备工作
FPGA开发板,推荐使用本博的开发板;
IMX317摄像头;
带显卡的电脑主机,显卡越贵越好;
网线;
开发板具体连接见资料包里的连接图:
开发板有启动模式选择拨码开关,SD卡启动方式如下,请将开发板拨到如图的配置:
然后将资料中的如下图所示压缩包解压,并将解压后的全部文件复制到TF卡中:
然后插上TF卡,然后将串口线和网线连接到电脑,安装串口驱动,资料包中已经提供,上电;
配置Xshell
我们使用Xshell连接开发板模拟Linux终端的操作,Xshell配置如下:
配置开发板IP
首先需要配置开发板IP,配置为和你的电脑在同一网段即可,因为开发板压缩的码流视频需要发送给电脑;首先查看你的电脑IP,以我的为例如下:
然后在Xshell依次输入如下指令配置配置开发板IP,具体配置要根据你的电脑IP而定,这里只是以我的为例,如果这一步都看不懂建议不要往下看了。。。
• 终端指令:
ifconfig
• 终端指令:
ifconfig ethe 169.254.142.240
如下:
然后ping电脑IP,一定要能ping通,不然后面的操作就没意义了,如下:
• 终端指令:
ping 169.254.142.239
配置MIPI CSI-2 RX Subsystem
MIPI CSI-2 RX Subsystem IP核的作用是实现MIPI CSI2-RX解码,配置MIPI CSI-2 RX Subsystem分辨率为3840x2160,如下:
• 终端指令1:
media-ctl -d /dev/media1 -V "\"a0000000.mipi_csi2_rx_subsystem\":0 [fmt:SBGGR12_1X12/3840x2160 field:none]"
• 终端指令2:
media-ctl -d /dev/media1 -V "\"a0000000.mipi_csi2_rx_subsystem\":1 [fmt:SBGGR12_1X12/3840x2160 field:none]"
配置Sensor Demosaic
Sensor Demosaic IP核的作用是实现Bayer转GRB888,配置Sensor Demosaic分辨率为3840x2160,如下:
• 终端指令1:
media-ctl -d /dev/media1 -V "\"a0020000.v_demosaic\":0 [fmt:SBGGR12_1X12/3840x2160 field:none]"
• 终端指令2:
media-ctl -d /dev/media1 -V "\"a0020000.v_demosaic\":1 [fmt:SBGGR12_1X12/3840x2160 field:none]"
配置Gamma LTU
Gamma LTU IP核的作用是实现伽马校正,配置Gamma LTU分辨率为3840x2160,如下:
• 终端指令1:
media-ctl -d /dev/media1 -V "\"a0040000.v_gamma_lut\":0 [fmt:RBG888_1X24/3840x2160 field:none]"
• 终端指令2:
media-ctl -d /dev/media1 -V "\"a0040000.v_gamma_lut\":1 [fmt:RBG888_1X24/3840x2160 field:none]"
配置Video Processing Subsystem
Video Processing Subsystem IP核的作用是实现图像缩放,配置Video Processing Subsystem分辨率为3840x2160,即不做缩放操作,如下:
• 终端指令1:
media-ctl -d /dev/media1 -V "\"a0010000.v_proc_ss\":0 [fmt:RBG888_1X24/3840x2160 field:none]"
• 终端指令2:
media-ctl -d /dev/media1 -V "\"a0010000.v_proc_ss\":1 [fmt:RBG888_1X24/3840x2160 field:none]"
配置H265视频压缩
输入如下指令:
• 终端指令:
gst-launch-1.0 v4l2src device=/dev/video0 io-mode=4 ! video/x-raw, format=NV16, width=3840, height=2160, framerate=30/1 ! omxh265enc qp-mode=auto gop-mode=basic gop-length=60 b-frames=0 target-bitrate=60000 num-slices=8 control-rate=constant prefetch-buffer=true low-bandwidth=false filler-data=true cpb-size=1000 initial-delay=500 periodicity-idr=60 ! video/x-h265,profile=main-422, alignment=au ! queue ! mpegtsmux alignment=7 name=mux ! rtpmp2tpay ! udpsink host=169.254.142.239 port=5005
注意!!!
注意!!!
上述指令中的《udpsink host=169.254.142.239 port=5005》
这里的IP是根据我自己的电脑配置的,你的电脑请根据实际情况修改;端口号5005为固定值;
配置VLC播放器
开发板网线连接电脑,打开VLC播放器,配置如下:
这里一定要注意:这里的IP是根据我自己的电脑配置的,你的电脑请根据实际情况修改;
注意!!!
注意!!!
电脑端一定要用有显卡的电脑,不要用笔记本电脑,不然延时很大,根本无法播放。。。
VLC播放H265码流视频演示
VLC播放H265码流视频演示如下:
IMX317-H265压缩
7、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下: