图片展示

XILINX ZCU106开发板MIPI摄像头开发的示例程序【详细讲解】

Author:huyuhan02 Click: Time:2023-06-25 21:42:03 From:CSDN

引言:        

      本文此示例程序是基于XILINX ZCU102开发板的,本文介绍如何将例程移植到ZCU106开发板上(ZCU104也同理)。示例程序的目的就是从摄像头采集图像,然后用显示器显示出来。


一、Zynq UltraScale+ MPSoC ZCU102 评估套件

ZCU102 评估套件可帮助设计人员快速启动面向汽车、工业、视频以及通信应用的设计。

产品描述

ZCU102 评估套件可帮助设计人员快速启动面向汽车、工业、视频以及通信应用的设计。该套件具有基于 AMD 16nm FinFET+ 可编程逻辑架构的 Zynq™ UltraScale+™ MPSoC 器件,提供一款四核 ARM® Cortex®-A53、双核 Cortex-R5F 实时处理器以及一款 Mali™-400 MP2 图像处理单元。ZCU102 支持所有可实现各种应用开发的主要外设及接口。

特色 AMD 器件

包含 Zynq UltraScale+ XCZU9EG-2FFVB1156 MPSoC

系统逻辑单元 (K)600
内存 (Mb)32.1
DSP Slice2,520
最大 I/0 引脚328
zynq-ultrascale-plus-bk-chip

主要性能和优势

  • 经过优化,可采用 Zynq Ultrascale+ MPSoC 快速进行应用原型设计
  • DDR4 SODIMM — 4GB 64 位、支持 ECC,与处理器子系统 (PS) 相连
  • DDR4 组件 – 512MB 16 位,与可编程逻辑 (PL) 相连
  • PCIe® 根端口 Gen2x4、USB3、显示端口与 SATA
  • 4 个以太网 SFP+ 接口
  • 两个用于 I/O 扩展的 FPGA 夹层卡 (FMC) 接口,包括 16 个 16.3Gb/s GTH 收发器和 64 个用户定义差分 I/O 信号





配置

  • 板上 JTAG 配置电路通过 USB 实现配置
  • 双路 Quad-SPI 闪存
  • 从 SD 卡启动

存储器

  • PS 4GB DDR4 64-bit SODIMM w/ ECC
  • 1200MHz / 2400Mbps DDR PL 512MB DDR4 组件内存 ([256 Mb x 16] 器件)
  • 8KB IIC EEPROM
  • 双 64MB Quad SPI 闪存
  • SD 卡槽

控制 & I/O

  • 6 个方向按钮 (5 个 PL、1 个 PS)
  • DIP 开关 (8x PL)
  • 面向电源、时钟、SD 卡和 I2C 总线切换的 PMBUS 及系统控制器 MSP430
  • USB2/3 (MIO ULPI 和 1 GTR)**

扩展连接器

  • 2 个 FMC-HPC 接插件 (16 个 GTH 收发器、 64 个差分用户定义信号)
  • 2x PMOD 数据头
  • IIC

通信与网络

  • RGMII 的 10、100 或 1000 Mb/s 通信串行 GMII 接口 - 支持 1 Gb / s SGMII 接口
  • 4x SFP+ cage
  • SMA GTH 支持 (4 个 SMA Tx/Rx 接插件)
  • UART 至 USB 的桥接器
  • RJ45 以太网接插件
  • SATA (1 x GTR)**
  • PCIe Gen2x4 Root Port**

显示

  • HDMI 视频输入输出 (3 GTH)
  • 驱动 HDMI 输出接插件的外部重定时器器件
  • 9 个 GPIO 用户 LED (8 个 PL、1 个 PS)
  • VESA DisplayPort 1.2 数据源专用控制器在 1.62 Gb/s、2.70 Gb/s 或 5.40 Gb/s 下支持达两个通道的主链路数据。

时钟技术

  • 可编程时钟
  • 系统时钟、用户时钟, 抖动减弱时钟
  • 2x SMA MGT 输入时钟

功耗

  • 12V 插墙式适配器或 ATX

** 开关支持 PCIe 根端口 ,或支持  SATA、USB2/3 和 DisplayPort




二、Zynq UltraScale+ MPSoC ZCU106 评估套件

ZCU106 评估套件可帮助设计人员为视频会议、监控、高级驾驶员辅助系统 (ADAS) 以及流媒体及编码应用快速启动设计。

产品描述

ZCU106 评估套件可帮助设计人员为视频会议、监控、高级驾驶员辅助系统 (ADAS) 以及流媒体及编码应用快速启动设计。此套件包含一个 Zynq™ UltraScale+™ MPSoC EV 器件,并支持所有可实现各种应用开发的主要外设及接口。 随附提供的 ZU7EV 器件配备四核 ARM® Cortex™-A53 应用处理器、双核 Cortex-R5 实时处理器、Mali™-400 MP2 图形处理单元、支持 4KP60 的 H.264/H.265 视频编解码器和 16nm FinFET+ 可编程逻辑。


主要性能和优势

  • 经过优化,可采用 Zynq Ultrascale+ MPSoC 快速进行应用原型设计
  • 集成型视频编解码器单元支持 H.264/H.265
  • HDMI 视频输入输出
  • PCIe® Endpoint Gen3x4, USB3, DisplayPort & SATA
  • DDR72 SODIMM — 72 位, 与处理器子系统相连
  • DDR4 组件 — 64 位,与可编程逻辑相连
  • 2 个 SFP+ 屏蔽罩
  • 2 个 FPGA Mezzanine Card (FMC) 接口,实现 I/O 扩展

特色 AMD 器件

包含 Zynq UltraScale+ XCZU7EV-2FFVC1156 MPSoC

系统逻辑单元 (K)504
存储器38Mb
DSP slice1,728
视频编解码器单元 (VCU)1
最大 I/O 引脚数464

开发板特性

包含 Zynq UltraScale+ XCZU7EV-2FFVC1156 MPSoC


配置

  • 板上 JTAG 电路,通过 USB 实现配置
  • 双路 Quad-SPI 闪存
  • 从 SD 卡启动

存储器

  • PS DDR4 72-bit SODIMM
  • PL DDR4 组件
  • Quad-SPI 闪存
  • SD 卡槽

控制 & I/O

  • 6x 方向按钮
  • DIP 开关
  • 面向电源、时钟、SD 卡和 I2C 总线切换的 PMBUS 及系统控制器 MSP430
  • USB2/3

扩展连接器

  • 2 个 FMC-HPC 连接器
  • 2 个 PMOD 插头

通信与网络

  • SDI (x1 GTH)
  • AES3 音频连接器
  • SFP+ cage (2x 2GTH)
  • SMA (x1 GTH)
  • UART 至 USB 的桥接器
  • RJ-45 以太网连接器
  • SATA (1 x GTR)
  • PCIe Gen3 Endpoint (x4 GTH)

显示

  • HDMI 视频输入输出 (x3 GTH)
  • DisplayPort (2x GTR)

时钟技术

  • 可编程时钟
  • 系统时钟、用户时钟, 抖动减弱时钟

功耗

  • 12V 插墙式适配器或 ATX




三、将ZCU102的MIPI摄像头图像采集例程移植到ZCU106 详解


这个示例程序是基于XILINX ZCU102开发板的,本文介绍如何将例程移植到ZCU106开发板上(ZCU104也同理)。示例程序的目的就是从摄像头采集图像,然后用显示器显示出来。


摄像头的接口资料:MIPI-DSI、MIPI-CSI、LVDS等接口解析_夜风的博客-CSDN博客

开发板上的FMC接口资料:FMC标准以及FMC连接器介绍_woshizzai的博客-CSDN博客_fmc接口

说明:这个示例程序是基于ZCU102开发板的,Xilinx并没有在ZCU106开发板上搞这个示例程序的计划,因此这篇文章要做的就是把ZCU102的示例程序移植到ZCU106上面去,因此有很多需要注意的地方。(ZCU104也同理)

示例程序的目的就是从摄像头采集图像,然后用显示器显示出来。


参考资料:pg232-mipi-csi2-rx.pdf(示例程序的介绍【必看】)、LI-IMX274MIPI-FMC_datasheet.pdf(摄像头的文档,可以在摄像头的官网上下载。用来查找摄像头数据线、时钟等端口)、ug1244-zcu106-eval-bd.pdf(查找zcu106开发板的管脚分配)、Solved: ZCU106: MIPI RX example - Community Forums (xilinx.com)(前人踩过的坑)、Solved: mipi CSI-2 RX ZCU106 - Community Forums (xilinx.com)(MIPI ip核的设置)、Solved: MIPI interface Technology Development issues (gree... - Community Forums (xilinx.com)(最终图像发绿的问题)

硬件:ZCU106开发板、LI-IMX274MIPI-FMC摄像头、HDMI的数据线及显示器以及用来跑程序的电脑和两根usb线(一根下载线、一根UART串口线)。HDMI线插在开发板的上面的HDMI接口,摄像头插在HPC0 FMC接口。


开发环境:


Xilinx从2019.2开始将SDK集成到了Vitis中,Vitis不能自动导入Hardware,因此用起来比较麻烦。但是2020.1之前的版本中没有集成MIPI CSI-2 Tx Subsystem核的许可,使用时还要在Xilinx许可证网站上专门勾选这个ip核的许可证。2020.1以及之后的版本就在Xilinx许可证网站上下载免费的evaluation许可证就可以了。总之要先解决许可证的问题,否则示例工程会生成失败。

首先要参考vivado多线程编译设置(一劳永逸方法)_yundanfengqing_nuc的专栏-CSDN博客,设置vivado多线程,否则后面综合的过程会非常慢。

下面使用的电脑CPU是i5-7500(辣鸡),内存16G。


下面是Vivado 2018.3环境下的操作:


新建一个空白project,开发板选择随意,但是要注意在windows系统下有路径长度的限制,在选择创建路径的时候路径名称不要太长,否则之后编译的过程中可能出错。


创建好之后Create Block Design,添加一个MIPI CSI-2 Rx Subsystem ip核,在左侧的design中右键,点击Open IP Example Design。此时vivado会自动创建一个示例工程,等待创建完成,大概需要10几分钟的时间。新的工程建好后就可把旧的关掉了。

创建好之后长这个样子,此时不要点Run Block Automation。为了防止后续的误操作,此时可以先把这个工程备份一份,选中整个工程的文件夹复制粘贴即可,后续如果要重来的话,把文件夹里的“- 副本”删掉,路径中不能有中文。

此时先不急操作,先把vivado关掉,重新打开vivado,open project,选择这个工程的xpr文件,相当于重开一次。因为刚创建好的时候vivado使用的是non-project模式,重开之后使用的是project模式。non-project模式可能会对后续操作造成一些问题,详见Solved: ERROR: [Common 17-69] Command failed: write_hw_pla... - Community Forums (xilinx.com)、AR# 70400: Vivado IP Flows - Synthesizing a Block design in non-project mode fails with ERROR: [Synth 8-439] module '' not found (xilinx.com)


重开之后Open Block Design,首先配置ZYNQ 那个IP核,双击ZYNQ UltraSCALE那个IP核,配置DDR4。注意蓝圈中的设置,如果是使用了某些芯片的ZCU106开发板,是需要这样设置的,另外一些则不需要。这个问题详见【分享】解决新的ZCU106单板运行helloworld异常的问题 - 云+社区 - 腾讯云 (tencent.com)、AR# 71961: Design Advisory for Zynq UltraScale+ MPSoC ZCU102 and ZCU106 Evaluation Kits - DDR4 SODIMM change (xilinx.com),不只是这个工程,其他工程中也都要这样设置。由于我用的是新版的,需要这样设置。如果是旧版ZCU106要按照旧版的设置。这里默认的设置是ZCU102的,如需更改则一定要更改。


然后PCIe、SATA、Display Port都是多余的,最好在这里取消勾选这些接口,否则可能带来不必要的麻烦。


配置好ZYNQ UltraSCALE后要换开发板设置,方法是点击左侧的PROJECT MANAGER 中的Settings,在Project Device中选择ZCU106开发板。点击OK,vivado会自动更改一些东西。设置好之后会提示有一些block需要升级,这里点击Report IP Status,需要等待几分钟。进度条结束后下面会出现IP Status的窗口,此时点击Upgrade Selected,升级ip核。升级结束后会出现Generate Output Product的窗口,这里要点击skip,先不要生成output,然后会有critical waring的窗口,点击OK,然后就可以把IP Status窗口关掉了。


现在配置MIPI CSI-2 Rx Subsystem 和MIPI CSI-2 Tx Subsystem这两个ip核。这步一定不能忽略。MIPI CSI-2 Rx Subsystem就在默认的Digram窗口中,MIPI CSI-2 Tx Subsystem在dsi_display_path中,需要双击打开dsi_display_path才能找到。按下图所示设置他们的Pin Assignment,这里参考了Solved: ZCU106: MIPI RX example - Community Forums (xilinx.com)。

(这一步其实就是把摄像头的接口和FPGA的管脚对应上,正常的流程应该是先在LI-IMX274MIPI-FMC_datasheet.pdf中找到摄像头CSI时钟线数据线对应的FMC pin,再在ug1244-zcu106-eval-bd.pdf中找到FMC pin对应的FPGA pin。由于这个实力中有现成的管脚分配结果,是别人之前找好的,可以直接用。如果没有的话,就得按照这个流程自己去找这些管脚。)


设置好之后再回到Digram窗口中,找到MIPI CSI-2 Rx Subsystem,现在它多出来了两个端口(bg1、bg3),右键选中这两个端口,点击Make External,接两条线出来。然后就可以按ctrl+s保存block design了。


这里需要说明的是MIPI CSI-2 Rx Subsystem完成的功能是从摄像头读取数据,因此它的管脚必须正确设置。而MIPI CSI-2 Tx Subsystem完成的功能是向DSI显示屏输出视频信号,在这个例子中我们没有用到DSI显示屏,因此这个管脚似乎也可以不用修改。但是必须要保证这两个IP核中的Pin Assignment设置要和后面要修改的xdc文件中的管脚分配保持一致,否则最后写比特流文件的时候会出现错误。


关于这个DSI显示屏,可以看到摄像头的电路板上有一个34pin的排线插口,这个就是DSI显示屏的插口。完整的示例程序是可以选择视频的输出路径的,可以以HDMI显示器为输出,也可以以这个DSI显示屏为输出。具体信息可以参考pg232-mipi-csi2-rx.pdf这个文档,在DocNav软件中可以找到Xilinx的这些官方文档。由于这个显示屏不太容易买到,因此这里我就没用它。

保存好Block Design后点击左侧的Run Synthesis,开始进行综合,如果设置了多线程的话大概需要1个小时的时间,cpu占用很高,此时基本上干不了别的,只能等它完成。综合的过程中最好把vivado的窗口最小化,否则可能会卡死。


综合完成后先不要Run Implementation。


综合完成后点击左侧的Open Elaborated Design中的Schematic,打开管脚分配的窗口。此时会弹出来一个Critical Messages,可以发现里面的警告都和mipi_example_zcu102.xdc有关。这是因为它默认的管脚分配是基于ZCU102的,在后面还要修改,因此它们是可以忽略的,点击OK即可。


按下图进行管脚分配。注意reset和LED0在更改Package Pin之后I/O Std并没有随之改变,还是红色,需要手动调整I/O Std。这个管脚分配过程就是把ZCU102的管脚改成ZCU106的,参考了Solved: ZCU106: MIPI RX example - Community Forums (xilinx.com)中用户“msh”回答,其中有个回答里附了一个excel表,就是这个管脚分配。


保存管脚分配,弹出Save Constraint窗口,选Save或者Create应该都可以,我选的Create,新建了一个约束文件,和之前的zcu102形成区别。


此时显示Synthesis Out-of-date,那就再综合一下,这次用不了多久。


综合完成后还是先不要Run Implementation

在Sources这里找到design_1_i,右键,选择Generate Output Products。


生成结束后,就可以进行硬件设计的最后一步,点左侧的Generate Bitstream。在写比特流之前,程序会自动Run Implementation。这个过程会持续半个小时左右。

比特流生成结束后,File-Export-Export Hardware,输出时要include bitstream。然后再launch SDK,打开SDK,此时vivado中的操作就结束了。


打开SDK后可以看到这些。其中design_1_hw_0是示例中自带的ZCU102的平台工程,xmipi_example是示例的应用工程,standalone_bsp_0是xmipi_example的板级支持包。在这里design_1_hw_0和standalone_bsp_0都是没用的,可以直接删掉,右键,delete,删除的时候可以选中delete project contents on disk。xmipi_example也需要右键,delete,但是删除的时候不能选delete project contents on disk,因为里面的代码还要用。删完后应该只剩一个design_1_wrapper_hw_platform_0。


在项目的目录里找到mipi_csi2_rx_subsystem_0_ex.sdk这个文件夹,下面有一个xmipi_example文件夹,这就是刚才从SDK工作空间中移除的那个。把它剪切到其他地方去,比如桌面上。

回到SDK,File-New-Application Project,新建一个应用工程,名称还叫xmipi_example,设置如下。点Next,下一步选择Hello World,点Finish。

17.把这个工程中的src中的helloworld.c删除。


18.这步比较关键。打开项目目录下mipi_csi2_rx_subsystem_0_ex.sdk文件夹中的xmipi_example中的src,再新建一个窗口打开刚才剪切出去的xmipi_example中的src。注意不要搞混,第一个是现在工作目录中的项目,第二个是已经移除出去的项目。把第二个中的除了lscript.ld和platform开头以外的所有文件复制到第一个当中去。

回到SDK,右键选择xmipi_example,Refresh,可以看到这些文件已经添加进来了。


19. 右键选择xmipi_example,Build Project。Build完成后,右键选择xmipi_example,Run As-Run Configuration,按下图设置,注意要勾选Program FPGA,等后续操作好就可以点Run来烧程序了。主要工作到此结束了。


20. 下面用USB线连接开发板和电脑,一根UART串口线,一根JTAG线。SW6开关拨至0000,打开开发板电源。设备管理器里读出来四个串口,两个PL的,两个PS的。我这里COM5对应了PS侧的UART0。默认的输入输出应该就是UART0,如果是UART1的话那就是COM6了,这个输入输出的设置可以在bsp的设置中选择。

用一个超级终端连接COM5,用115200的默认设置即可。


21. 点击刚才的Run来烧程序,烧好之后终端里就有提示了。摄像头已经连接,所以输入y,DSI显示器虽然没有连接,但是还是要输入y。原因是如果选择没有DSI显示器的话,默认的输出就是HDMI,但是初始的输出分辨率是4K,而我的显示器不支持4K,所以会报错,报错之后就要重新烧程序了,所以按照他的菜单提示操作,先让默认输出是DSI显示器,然后再更改到1920的分辨路,再把输出改成HDMI。

此时,就是摄像头的图像,输出到显示器上了。可以看到图像发绿,这个问题之前的人也遇到过,好像还没有硬件层面的解决方法,具体可以参考Solved: MIPI interface Technology Development issues (gree... - Community Forums (xilinx.com)

到这里示例程序就完成了。



更新:图像发绿的问题可以通过调整色彩校正矩阵的参数来实现。

Video Processing Subsystem这个ip核的作用是进行色彩校正。在SDK中找到void ConfigCSC(u32 width , u32 height)这个函数,下面列出的这些寄存器就是色彩校正矩阵的一些参数,具体每个寄存器的含义要参照pg231这个文档。参数做如下调整,可以实现比较好的效果。

 

————————————————

版权声明:本文为CSDN博主「huyuhan02」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/huyuhan02/article/details/120081037


原文来自于CSDN的 huyuhan02的示例讲解,感谢huyuhan02的分享,如有版权问题,请联系删除。






电话:0755-2780 9180   E-mail: tech@hizyuan.com
地址:深圳市宝安区西乡街道湾区人工智能产业园D栋4楼
Copyright 版权所有  海振远科技 All rights reserved  

Service Center
Contacts
热线电话
0755-27809180
E-mail地址
tech@hizyuan.com
Qrcode
Qrcode
微信在线客服-(添加请备注:海振远产品咨询)
Service Center
Add WeChat friend to learn more about the product
Use Enterprise WeChat
"Scan" to join the group chat
Copy success!
Add WeChat friend to learn more about the product
I see.