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

摄像头的接口资料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接口。

开发环境

  1. Xilinx从2019.2开始将SDK集成到了Vitis中,Vitis不能自动导入Hardware,因此用起来比较麻烦。但是2020.1之前的版本中没有集成MIPI CSI-2 Tx Subsystem核的许可,使用时还要在Xilinx许可证网站上专门勾选这个ip核的许可证。2020.1以及之后的版本就在Xilinx许可证网站上下载免费的evaluation许可证就可以了。总之要先解决许可证的问题,否则示例工程会生成失败。
  2. 首先要参考vivado多线程编译设置(一劳永逸方法)_yundanfengqing_nuc的专栏-CSDN博客设置vivado多线程,否则后面综合的过程会非常慢。
  3. 下面使用的电脑CPU是i5-7500(辣鸡),内存16G。

下面是Vivado 2018.3环境下的操作

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

  2. 创建好之后Create Block Design,添加一个MIPI CSI-2 Rx Subsystem ip核,在左侧的design中右键,点击Open IP Example Design。此时vivado会自动创建一个示例工程,等待创建完成,大概需要10几分钟的时间。新的工程建好后就可把旧的关掉了。
  3. 创建好之后长这个样子,此时不要点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 '<hls IP submodule>' not found (xilinx.com)

  4. 重开之后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都是多余的,最好在这里取消勾选这些接口,否则可能带来不必要的麻烦。

  5. 配置好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窗口关掉了。

  6. 现在配置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的这些官方文档。由于这个显示屏不太容易买到,因此这里我就没用它。
  7. 保存好Block Design后点击左侧的Run Synthesis,开始进行综合,如果设置了多线程的话大概需要1个小时的时间,cpu占用很高,此时基本上干不了别的,只能等它完成。综合的过程中最好把vivado的窗口最小化,否则可能会卡死。
    综合完成后先不要Run Implementation。

  8. 综合完成后点击左侧的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表,就是这个管脚分配。


  9. 保存管脚分配,弹出Save Constraint窗口,选Save或者Create应该都可以,我选的Create,新建了一个约束文件,和之前的zcu102形成区别。
  10. 此时显示Synthesis Out-of-date,那就再综合一下,这次用不了多久。
    综合完成后还是先不要Run Implementation

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

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

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

  14. 打开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。

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

  16. 回到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这个文档。参数做如下调整,可以实现比较好的效果。

 

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值