作者:Adam Taylor,贸泽电子专稿
现场可编程门阵列(FPGA)是实现图像处理系统的绝佳选择。它具有高度并行的逻辑架构,可实现高分辨率、高帧率的图像处理算法,因而非常适合用于从自动驾驶到机器人等诸多应用。通常,图像处理解决方案是在异构片上系统(SoC)中实现的,这样的系统能够结合可编程逻辑与Arm®硬处理器内核。然而,在某些应用中,这些处理器并不能得到充分利用,上电后也只能进行进行初步的IP核配置。在这种情况下,使用传统FPGA搭配IP核配置状态机或使用软处理器内核会是更好的选择。
本项目中,我们将使用AMD AC701评估板,在AMD Artix™ 7 FPGA上创建图像处理管道。该电路板将使用FMC互连来连接MIPI摄像头,并通过HDMI显示输出视频。
本项目的材料清单包括以下内容:
我们将使用以下软件开发此应用程序:
基本硬件设计
首先,我们要建立一个能够实现标准图像透传的系统,其间需要在FPGA中正确配置摄像头和IP模块,以便接收图像并通过HDMI传输到处理链。这些设备的用途非常广泛,因而可以配置为所需的输出格式。Pcam 5C摄像头模块和HDMI芯片均通过相同的I²C链路进行配置。
为了配置摄像头、HDMI芯片和内部IP核,我们需要实现AMD MicroBlaze™软处理器内核。
以下是透传功能所需的IP块:
这些模块通过AXI Stream和AXI4接口连接。通过AMD Vivado™ ML版Tcl窗口(图1)中的框图脚本,可以重建最终的模块设计。
图1:Tcl命令窗口(图源:作者)
通过该窗口,可开始在Vivado中重建项目,如图2所示。此过程可能需要几分钟才能完成。
图2:重建项目(图源:作者)
重建完成后,就可以探索项目设计了(图3)。
图3:完整的设计(图源:作者)
新建一个顶层HDL包装器,如图4所示。
图4:新建HDL包装器(图源:作者)
添加定义引脚的XDC约束。选择“添加源”并选择约束(图5)。
图5:添加约束条件(图源:作者)
选择IO.xdc文件(图6)。
图6:选择IO.xdc文件作为约束条件(图源:作者)
现在,我们就可以构建项目并生成位流。获取到位流后,就可以将其导出为Xilinx支持存档(XSA)文件,以便在Vitis中开发软件(图7)。
图7:将硬件导出到Vitis(图源:作者)
打开Vitis,并为工作区选择工作目录(图8)。所有文件和应用程序都将存储在这个位置。
图8:选择工作区(图源:作者)
在Vitis中新建应用程序项目,将刚才导出的XSA作为目标,然后选择“Hello World”应用程序(图9 – 13)。
图9:选择应用程序项目(图源:作者)
图10:选择刚才导出的XSA文件(图源:作者)
图11:选择目标处理器(图源:作者)
图12:选择域(图源:作者)
图13:选择“Hello World”应用程序(图源:作者)
打开图8中新建的工作区src文件夹,将其中的文件替换为图14所示的文件。
图14:将文件复制到工作区(图源:作者)
这些文件将出现在项目源文件下(图15)。
图15:确保文件已导入(图源:作者)
构建应用程序(图16)。
图16:构建应用程序(图源:作者)
新建调试应用程序,并通过JTAG下载到AC701评估板。将FMC Pcam适配器和Pcam模块组装到电路板上(图17 – 19)。
图17:设置硬件(图源:作者)
图18:配置调试应用程序(图源:作者)
图19:查看调试应用程序设置(图源:作者)
连接到HDMI目标机后,该目标机将下载调试应用程序并运行,实现图像显示和透传。如果您想了解软件设计,请查看AMD Vitis™统一软件平台中的软件应用程序。请注意,必须配置多个I²C开关,才能同时与摄像头和HDMI芯片通信(图20)。
图20:简单的RGB图像透传(图源:作者)
为了创建执行边缘检测的IP核,我们将使用Matlab和Simulink建立能够放入图像处理链中的IP块。
边缘检测算法
在Matlab中新建一个Simulink图表,并添加以下元素:
新建一个子模块,并添加以下内容:
图像合并子模块
最终的图表应与图21 – 23一致。
图21:上层设计(图源:作者)
图22:HDL过滤器模块(图源:作者)
图23:图像叠加(图源:作者)
有了这些模块,我们就可以运行仿真,并将输入图像的结果与输出图像进行比较。
在输出视频中,请注意Sobel的结果叠加到输入视频上时边缘是如何增强的(图24)。
图24:Simulink仿真(图源:作者)
要生成HDL,我们可以使用HDL工作流程助手和SoC Blockset来生成具有AXI Stream接口和AXI4 Lite配置寄存器的IP模块。
IP创建的关键要素是将像素流和控制端口映射到生成的IP块上的AXI Stream接口,这样就可以轻松地将IP块集成到我们的Vivado设计中(图25和26)。
图25:选择AXI接口(图源:作者)
图26:生成HDL(图源:作者)
生成后,我们可以将此IP核添加回Vivado项目。在Vivado中新建一个IP资源库,并添加我们刚刚创建的IP(图27)。
图27:更新后的Vivado图表(图源:作者)
将IP块添加到Vivado设计中。我们可以将其添加到VPSS和AXIS-to-Video Out块之间。该IP块处理的是灰度图像,而在VPSS的YUV444输出中,Y通道是亮度通道,因而我们在两个块之间添加一个AXI子集转换器,并且只提取TData数据流的低8位,因为这就是我们需要的信息。在IP块的输出端,添加另一个AXIS子集转换器(将8位TData转换为24位),将UV元素设置为0x80,将Y元素设置为IP块的输出。
然后,我们就可以重建该设计并生成位流。获取到位流后,就可以导出XSA文件并在Vitis中更新XSA文件,从而为FPGA设计提供新的位文件,其中就包括IP块。默认情况下,您无需自行更改或启用软件中的任何功能,因此应用程序应该能够立即开始运行。请注意,HDMI显示屏上的输出显示的是灰度图像(图28)。
图28:生成的输出图像(图源:作者)
总结
该项目表明,创建运行在AMD FPGA上的图像处理系统并不是一件难事。
AMD、AMD箭头标识、Artix、MicroBlaze、LogiCORE、Vivado和Vitis以及上述标识的组合均为Advanced Micro Devices, Inc.的商标。本文中使用的其他产品名称仅用于识别目的,它们可能是其各自所有者的商标。
作者简介:
Adam Taylor是嵌入式系统教授、工程负责人,也是FPGA/片上系统和电子设计领域的知名专家。
本文转载自:与非网