公司动态
Zynq MPSoC实现MIPI采集+H.265压缩
本文用于学习记录记性不好防止遗忘。。。在学习过程中感谢一些老大哥的帮助(包括CSDN、Xilinx官网、Altera官网等等)一、开发环境及实现功能主控芯片UltraScale XCZU4EV编译环境Vivado2020.2、Petalinux国内有很多H.265压缩SoC如海思、全志等等使用起来也很方便出于某些原因考虑比如接口的局限性以及一些IP总线算法的添加如果单纯使用这些SoC很难完成这些功能的添加需要再联合使用一块FPGA进行配合使用在不考虑成本的前提下也面临SoC和FPGA的交互问题使故使用Zynq进行H.265压缩学习在PL侧可轻松移植各个总线IP同时也可作为多接口输出的媒介。本记录主要基于Xilinx的MPSoC芯片实现MIPI4K图像采集、ISP算法融合、VCU实现H.265压缩最终实现PL、PS多接口压缩码流输出。CMOS传感器型号为IMX317输出分辨率可达3840x216030Hz配置为4 lane输出模式1个时钟2个像素。ISP算法融合使用硬件ISP对图像进行处理。VCU则在PS端实现H.265压缩。功能框图如下二、Vivado工程工作1、MIPI图像采集在UltraScale ZU4EV芯片中自带物理层D-PHY支持在非UltraScale系列上首先需要解决D-PHY物理层问题然后才能进行CSI-2协议层的处理。CSI协议解码由MIPI CSI-2 RX Subsystem 软核IP完成该IP可支持MIPI D-PHY物理层接收以及CSI-2协议解析。下图所示为当前IP核配置主要记录一些主要参数配置其他具体的配置查阅PG232。Pixel Format选择像素格式使用的是RAW12格式用于高质量图像采集。Serial Data LanesMIPI的数据通道数量使用4个通道适合处理高分辨率或高帧率视频数据。Line Rate (Mb/s)MIPI 数据通道的速率选择选择1440Mb/sPixels Per Clock选择输出接口上每个时钟输出的像素数。值为2像素。外围接口主要关注时钟配置dphy_clk_200MD-PHY 的工作时钟必须接 200Mhzvideo_aclk所有子系统核的工作时钟这个时钟需要大于lite_aclkvideo_aclk计算方式参考PG232手册介绍重要。2、关键图像处理IP ISP算法融合MIPI解码后如果不进行图像处理及ISP处理输出的图像会显得很暗或者发绿的情况当然Xilinx提供了一些现有的图像处理IP如Sensor Demosaic IP、Gamma IP等等这些都是最基础的IP算法但是灵活性较差因此选择调用已有的IP及自建IP算法进行融合得到最终质量较好的图像。1Sensor Demosaic IP主要是用来解 Bayer 数据的即可重构被称为 Bayer 的子样本色彩数据也可重构图像传感器捕获的 RAW 图像。传感器生成的图像需要完成从 RAW 数据到 RGB 数据的转换由 Demosaic 和 Debayer 进行处理。AMD Sensor Demosiac LogiCORE 能生成与数字摄像 机系统常用的 Bayer 模式相关的、缺失的颜色分量。主要关注以下参数:Samples per Clock指定每个时钟周期处理的像素数与MIPI CSI-2 RX Subsystem配置相对应为1个时钟2像素。Maximum Data Width指定输入样本的位宽度。取值范围为 8、10、12、16位。该参数应与连接到从 AXI4-Stream视频接口的视频IP核的视频组件宽度相匹配。下图为1个时钟2个像素的条件下输出的图像数据格式即输入数据为RAW10的图像格式输出为RBG101010两个像素共计60位有效数值同时高4位进行补0。为方便后期进行ISP算法处理在此设置为8位位宽因此需要添加一个RAW12_RAW8的转化这个比较简单。Interpolation Method插值方法High Resolution Interpolation该方法适用于高质量光学器件和高分辨率应用。选择这种方法会使 用更多的块ram和片(slice)并且大约会使dsp48的使用数量增加一倍。Horizontal Zipper Artifact Removal这个选项添加了一个后期处理平滑过滤器来去除水平拉链伪影。后处理过滤器软化输出图像会额外占用一部分片资源。为了更好的图像质量因此先不计资源占用均使用高性能处理2ISP算法后续ISP算法主要是针对RGB888格式及1个时钟2个像素的图像格式进行编写。常见的ISP算法有黑电平校正、自动白平衡、自动曝光、GAMMA校正、图像锐化、图像去噪、亮度调节等等可以根据图像传感器的具体性能进行添加适合自己的算法。根据一些开源算法及想要的图像效果进行设计调整可达到自己想要的效果。具体参数需要具体调整。也可使用Xilinx已有ISP算法如gamma_LUT IP核实际测试并不理想可能是传感器的原因输出图像过暗。3Video Processing Subsystem 图像缩放该IP功能较多如去隔行、色彩空间转换、图像缩放、帧率转化等等根据不同设计需求来进行选择帧率转化功能别的设计中已验证还是挺不错的对于小白比较友好手册中有详细描述。此处Video Processing Functionality模式仅配置为图像缩放及色彩空间转换主要目的是Xilinx的VCU IP核输入图像格式为YUV格式而在图像处理链路中为RGB888图像格式因此需要转化为YUV格式的图像。4Video Frame Buffer WriteXiinx提供了两种将数据存储到DDR中的IP核分别是AXI VDMA和Frame Buffer Write。由于AXI VDMA IP核从AXI4-Stream接口提取字节在不考虑视频数据格式的情况下直接将其存入缓存区中这样无法读取和写入VCU所需的半平面格式会导致编码器无法获取正确的视频图像格式进行编码。而Frame Buffer Write IP核支持写入各种视频格式可以读取和写入VCU编码器所需的半平面格式。3、VCU 压缩编码IPVCU IP主要是用来试下H.265压缩最高支持带宽为4K60hz还是比较方便的缺点是需要在Petalinux进行相关设计。具体介绍参考PG252有中文版本难得。可以通过简单的example工程来进行学习。4、axi-dma的添加主要用于PS端将压缩后的数据传输至PL端PL端可以实现接口多样化额外设计。比较简单。至此Vivado中一些重要的IP及算法搭建完成编译xsa后通过Petalinux进行相关设计。资源使用如下。三、Petalinux工作简要记录1、进行petalinux工程的搭建。此内容太过繁琐但简单不过于记录。学习之初强烈推荐正点原子大善人提供的手把手教程2、设备树的编写/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi中添加相关节点如PL端各个IP的节点配置最重要的是需要关注图像传输链路的流通性需要手动将数据流向的输入输出端口进行绑定。还有就是需要添加axi-dma的节点配置。3、驱动添加驱动的话主要是axi-dma驱动的添加xilinx提供了一种在工程内创建并添加驱动的操作流程也可以按照传统linux驱动编译方法在外部进行驱动编译及添加因为学习时参考的是大善人的教程一直沿用的外部添加驱动方法。axi-dma驱动的编译及测试方法后续会整理使用。4、跑起来想要运行VCU压缩xilinx提供了很多方法简单的话就是使用media ctrl的命令行的方式进行运行VCU这也是常用的方法但是想要实现灵活性配置以及将压缩输出通过AXI-DMA传输至PL端仍然离不开应用程序的编写索性直接全部使用应用程序来实现控制、采集、压缩、传输一体化。VCU应用程序压缩流程如下AXI-DMA压缩流程如下整体应用程序四、结果展示