图片展示

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

作者:huyuhan02 浏览: 发表时间:2023-06-25 21:42:03 来源: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  

在线客服
联系方式
热线电话
0755-27809180
E-mail地址
tech@hizyuan.com
二维码
二维码
微信在线客服-(添加请备注:海振远产品咨询)
在线客服
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功
添加微信好友,详细了解产品
我知道了
粤ICP备19051499号-1