硬件 Applet:从构思到应用

在本应用笔记中,您将学习如何在 VisualApplets 中设计和创建图像处理应用程序(即 applet),以及如何在图像采集卡上使用它。您还将学习如何在运行时通过 microDisplay 和 Framegrabber API 使用此 applet,以及如何在这些软件中配置 applet 的参数。有关如何在运行时在 microDisplay 中设计、构建和使用 applet 的简介,请参见 Getting Started。在本应用笔记中,您将以 Sobel 边缘滤波应用程序为例,了解上述 applet 开发和使用的各个阶段。另一个更简便的引导路径是 From Empty Design to Running Applet 教程主题。

工作流说明

工作流程如下:

  1. 在 VisualApplets 中设计 applet。

  2. 在 VisualApplets 中模拟 applet 并执行设计规则检查 (DRC)。

  3. 构建 applet。

  4. 对于 mE5 平台:烧录 applet。

  5. 通过 microDisplay 或 Framegrabber API 在硬件上使用 applet。

在 VisualApplets 中设计 Applet

启动新项目

applet 的设计阶段在 VisualApplets 中进行。要打开 VisualApplets,请单击文件 VisualApplets.exe 或 bin VisualApplets 安装目录中的文件夹,或者 Windows 开始菜单中的 VisualApplets 程序图标,或是桌面上的图标。

  1. 首先,打开 VisualApplets 主窗口,此时未加载任何项目。

    VisualApplets 主窗口

    图 186. VisualApplets 主窗口


  2. 单击 文件+新建 ( Ctrl+N ),或使用 文件 图标栏中的 新建 图标。随后将打开一个 新建项目 窗口,您可以在其中指定项目名称、目标硬件平台和目标运行时。您以后随时可以更改这些设置。

  3. 要依照本示例进行操作,请使用以下设置:

    项目名称:Sobel_Filter

    硬件平台:microEnable 5 marathon VCL

    目标运行时:Win 64 (Windows/AMD64)

  4. 单击 确定 确认您的设置。

    新建项目窗口

    图 187. 新建项目窗口


VisualApplets 现在会启动一个新项目,您会在程序窗口的中央看到一个空白的设计窗口。在右侧的 项目信息 标签页中,将显示有关当前项目的信息,例如项目名称、目标硬件、目标平台等。

Operators 与 Links

在 VisualApplets 中,图像处理操作由算子表示。您可以在 VisualApplets 设计窗口右侧的 算子库 中找到所有这些算子。您可以通过拖放操作非常轻松地将算子放置到设计窗口中。

设计中算子的实例称为 模块。算子可以具有输入端口和输出端口。设计中的算子(即模块)可以通过这些端口进行连接。模块之间的连接称为链接,在设计窗口中由箭头表示。这些模块和链接共同构成了图像(或信号)处理流水线。因此,操作的顺序由模块的顺序决定。

算子和链接具有 Property,它们描述了当前图像处理流水线相关的设置,例如图像尺寸。要查看和编辑这些 Property,请双击算子。算子的 Property 在 帮助 下的算子文档中有详细解释。

VisualApplets 中的算子文档

图 188. VisualApplets 中的算子文档


设计实现

本示例实现了一个 Sobel 边缘滤波算法。

在 VisualApplets 设计示例库中,包含用于边缘滤波以及进一步图像处理应用的“开箱即用”示例。您可以在 Examples\Processing 下的 VisualApplets 安装目录中找到这些设计示例及其对应的文档,请参见 处理示例。您可以将这些示例设计用作您自己的应用程序的基础。

为了实现此示例 Sobel 滤波器设计,请在 Operator Library 中找到相应算子,将它们拖入设计中,并按照 Getting Started 部分所述使用链接将它们连接起来。

随后您可以重命名这些模块,以便更好地概览设计并在运行时更佳地使用。

在有需要时,可使用 HierarchicalBoxes 对设计进行结构化,以获得更好的设计概览。

并且不要忘记不时保存设计。

设计组件

本应用笔记中的示例设计由下图所示的以下组件构成:

示例设计实现 Sobel_Filter.va

图 189. 示例设计实现 Sobel_Filter.va


  • 一个 Camera Link 灰度相机接口

  • 一个图像缓冲区

  • 具有 x 和 y 方向边缘滤波功能的 Sobel 边缘滤波模块(基于 SobelMultiGradient.vad 下的 Examples\Processing\Filter\EdgeDetection\Sobel_Multi_Gradient 中的示例,位于 VisualApplets 安装目录中)

  • 一个可调节的二值化阈值和一个用于在运行时更好地在显示器上显示二值化图像的缩放算子

  • DMA 到 PC。

您可以在设计中使用 CoefficientBuffer 作为图像的仿真源,而不是使用相机采集的图像。通过算子 SourceSelector,您可以在 VisualApplets 中以及在运行时为处理管道选择图像输入源。

参数设置

要对算子和链接进行参数化,您可以通过双击每个元素来编辑其参数。

Link Parameters

链接具有属性,这些属性定义了处理后图像的特性,例如最大图像尺寸、图像协议、位宽以及与最大可用带宽相关的参数:并行度(即在一个设计时钟周期内传输的像素数)。如果这些链接连接到特定的运算符(请参阅相应的运算符文档),例如相机接口运算符,您可以根据需要编辑和调整这些属性。

您选择的最大图像尺寸和 Parallelism 越高,FPGA 资源消耗就越大。因此,Basler 建议仅将这些值设置为实现目标所需的最低高度,以节省 FPGA 资源。链接的 Property 只能在 VisualApplets 的设计阶段进行更改。

Link Properties

图 190. 链接 Property


Operator Properties

算子 Property 有两种类型:static 和 dynamic。您只能在 VisualApplets 的设计阶段更改静态参数,而动态参数则既可以在设计阶段更改,也可以在运行时更改。有关算子 IS_GreaterThan 的静态和动态参数示例,请参见下方的屏幕截图。

静态和动态算子参数

图 191. 静态和动态算子参数


在本示例设计中,设置以下参数:

运算符IS_GreaterThan :

将参数Number设置为600 。

这用于识别边缘的灰度值。如果您想了解边缘的灰度值,请在IS_GreaterThan运算符之前设置一个模拟探针,运行模拟,然后放大包含边缘的像素,查看它们的灰度值。这是一个动态参数,您可以在运行时对其进行更改。

操作员SCALE :

将参数ScaleFactor设置为255 。

这可以增强边缘的可见性。这是一个动态参数。但是,为了节省 FPGA 资源,您可以将此参数设置为静态。

运行期间的参数访问准备

在运行时,您可以更改动态参数。一个常见的用例是,您的设计中包含多个运算符,并且您需要更改相同的参数,例如,为设计中的多个不同运算符更改图像尺寸。

图书馆 参数 这些运算符允许仅通过控制一个参数来访问设计中的不同模块参数。此外,这些运算符还允许将访问参数显示在特定的层次结构级别上。这些选项简化了运行时参数配置。示例设计 Sobel_Filter.va (看 图 189,“示例设计实现” Sobel_Filter.va'它使用转换和引用参数,可以轻松地在层次结构级别访问图像的宽度和高度、图像源选择器、阈值和缩放因子。 参数为此,创建一个空的 HierarchicalBox,并将其命名为 参数 并设置 显示层级 相应的平移参数和参考参数 参数您可以找到详细的文档。 参数 请参阅相应文档中的库文件。 Library Parameters.

完成设计

仿真源与探测器

在设计阶段,仿真源和探针非常有用。使用仿真源,您可以加载测试图像,并在短时间内检查处理流水线中每个环节的处理后图像。例外情况:信号无法仿真。此外,仿真还会执行一级设计规则检查,以验证实现的正式正确性。仿真结果与运行时结果一致。您可以在图标菜单或文本菜单的“分析”下找到仿真源和探针。 VisualApplets有关仿真源和探针的详细说明,请参阅“仿真”下的详细文档。

在 图 189,“示例设计实现” Sobel_Filter.va' 您可以在示例设计中看到加载到仿真源中的测试图像。 Sobel_Filter.va在阈值之后、DMA 之前,您可以看到当前处理步骤的结果。

设计规则检查 (DRC)

完成实施后,建议执行设计规则检查级别 1 和 2。要执行设计规则检查级别 1 和 2,请选择“分析” + “设计规则检查级别 1 和 2 ”,或使用图标栏中的“设计规则检查级别 1 和 2”图标。

Design Rule Check Level 1 报告了实现中的形式错误及其在设计中的确切位置。在将设计转换为硬件 applet 之前,您必须纠正这些错误。

Design Rule Check Level 2 还提供有关设计中估计使用的 FPGA 资源的信息。借助此信息,您可以检查是否有足够的 FPGA 资源用于您的图像处理实现。如果资源超过任何一种 FPGA 资源的 100%,则需要重新设计实现以节省资源。

在 图 192,“示例设计的 Design Rule Check 1 和 2 Sobel_Filter.va' 显示了 Design Rule Check 1 和 2 的结果:设计完全正确,大约使用了可用查找表 (Lookup Table) 的 36%、触发器 (FlipFlop) 的 22%、块 RAM (Block RAM) 的 15% 以及可用嵌入式 ALU 的 2%。您可以查看详细概述,了解设计中每个元素消耗了多少 FPGA 资源(参见 图 193,“FPGA 资源估算”下的 分析+FPGA 资源估计

示例设计 Sobel_Filter.va 的 Design Rule Check 1 和 2

图 192. 示例设计的 Design Rule Check 1 和 2 Sobel_Filter.va


FPGA 资源估计

图 193. FPGA 资源估算


在 VisualApplets 中生成 Applet

前提条件

仅当正确安装了 Xilinx 工具时,才能执行硬件 applet 构建过程。在 https://docs.baslerweb.com/visualapplets/installing-visualapplets#which-xilinx-toolchain-and-version-for-which-frame-grabber-platform 中,您可以找到详细的概述,了解哪些 Xilinx 版本适合您的采集卡平台。在此示例设计中 Sobel_Filter.va 选择了 microEnable 5 marathon VCL 平台。因此,Xilinx ISE 14.7 版或 2016.1 至 2020.1 之间的 Vivado 版本均适用。

编辑生成设置

现在,您已完成示例设计 Sobel_Filter.va 并希望将设计转换为硬件 applet。对于此转换过程(称为 build ),您需要选择正确的 Xilinx 构建设置。打开 设置+Build 设置,从文件系统中选择相应 Xilinx 版本的批处理文件 settings64.bat (推荐:Xilinx Vivado 2018.2),然后点击“确定”确认。有关编辑构建设置的详细说明,请参见 “Build Settings”.

构建硬件 Applet 对话框

图 194. 构建硬件 Applet 对话框


VisualApplets 现在使用 Xilinx 工具将应用程序转换为 FPGA 比特流,即 程序 或 小程序。 此过程的持续时间取决于设计的复杂程度。构建 高度复杂的的设计可能需要几个小时。对于此示例实现 Sobel_Filter.va,构建时间约为 15 分钟。构建 成功后,applet 将完全生成。applet 的名称 (*.hap 文件)与设计文件的名称相同 (*.va): Sobel_Filter.hap

在硬件上运行 Applet

前提条件

若要在采集卡上的硬件中运行 applet,系统需要安装可编程 (V Series) 采集卡(硬件)。此外,PC 上需要安装 Framegrabber SDK 软件。对于适用于 microEnable 5 marathon VCL 的此示例 applet,最新支持的 Framegrabber SDK 版本为 5.7。

烧录

如果像本例一样使用 microEnable 5 marathon 采集卡,则需要使用 microDiagnostics 将新 applet 烧录到采集卡中。

如果您准备在 microEnable IV 采集卡或最新 CXP 12 系列采集卡上使用新 applet,请直接跳过本节。

若要烧录采集卡,请执行以下步骤:

  1. 在 bin 的 Framegrabber SDK 安装目录下启动 microDiagnostics 工具。

  2. 选择您的采集卡。

  3. 在对话框左侧选择 Firmware。

  4. 将硬件 applet 分配给显示的其中一个分区(0 到 7): 转到所创建硬件 applet 所在的目录并选择该文件。

    microDiagnostics 中显示的固件分区

    图 195. microDiagnostics 中显示的固件分区


  5. 单击 Flash Now

  6. 等待新固件完全安装。烧录 完成后,microDiagnostics 中将显示一条消息。

  7. 按照消息中的说明操作。

在 microDisplay 中测试并加载 Applet

若要测试您的 applet Sobel_Filter.hap 并设置一些初始 参数,请使用 microDisplay 程序。加载 applet 需要执行以下步骤:

  1. 保存 applet(此处: Sobel_Filter.hap下的 Hardware Applets\<your frame grabber> (此处: mE5-MA-VCL)保存到 Framegrabber SDK 安装目录中。

  2. 从 Framegrabber SDK 安装目录的 bin 文件夹中启动 microDisplay。

  3. 在 microDisplay 中,在 Acquisition Devices 下选择您要使用的采集卡。随后将立即显示为所选采集卡提供的所有 applet。

  4. 双击选择要使用的 *.hap 文件(在此处为: Sobel_Filter.hap)。

参数设置与采集

加载 applet 后,您可以在 microDisplay 中看到参数树和图像采集窗口。下方显示了在 microDisplay 中加载的 Sobel_Filter.hap applet 的屏幕截图。

microDisplay 中的参数树和图像采集窗口

图 196. microDisplay 中的参数树和图像采集窗口


左侧显示的是参数树。这些参数在 VisualApplets 的设计阶段等同于算子名称。为算子起一个好的名称非常重要,这样才能找到要在采集时调整的正确参数。动态参数在运行时可调整。动态参数有两种:一种是仅在采集开始前可调整的参数(例如 DMA dimensions),另一种是甚至在图像采集过程中也可以调整的参数(例如算子 IS_GreaterThan 的阈值)。

在此示例中,您可以使用来自模拟器源的图像执行图像采集,并将二值化阈值设置为 150。如果在 VisualApplets 的设计阶段集成了 Parameters 库的参数,则可以在参数树中的 Parameters 层级下设置所有相关的动态参数。否则,您需要逐个浏览不同的层级来找到我们要设置的正确参数。

在本示例中,转到层级 Parameters 并将其展开:

  1. 右键单击 Parameter Simulation Image。随后,您可以选择用于图像采集的示例图像。

  2. 通过点击 Load Simulation Image 来加载该图像。

  3. 将参数 ImageSource selector 设置为 Simulator,并将 Binarization Threshold 设置为 150。

  4. 将图像尺寸设置为 1024x1024 像素。

设置好这些参数(或针对您的 applet 所有相关的参数)后,即可开始采集。在这里,您可以选择连续抓取、序列抓取或单帧抓取。若要停止连续抓取,请点击“停止”按钮。对于多进程设计,您可以分别启动和停止单个进程的采集。

有关使用 microDisplay 进行 applet 配置和采集的详细说明,请参阅 https://docs.baslerweb.com/frame-grabbers/what-is-micro-display-x。

在您自己的 SDK 中启动 Applet

您也可以不使用 mircoDisplay X 进行 applet 配置和采集,而是将其集成到您自己的 SDK 环境中。本节将介绍用于图像采集和配置的相关 SDK 组件的基本功能。

作为 C++ SDK 的基础,您可以使用 VisualApplets 内部的 SDK 代码生成器,您可以在图标菜单中找到它,或者在 VisualApplets 中通过 Build+Generate SDK Example 找到它。此功能会自动生成相应的 CMake 文件和 Visual Studio 项目文件,您可以将其用作 SDK 代码的基础。

生成的 SDK 项目文件

图 197. 生成的 SDK 项目文件


项目文件中生成的 C++ 代码 vasFgProject.cpp 包含以下代码组件:

  1. 采集卡:初始化

    定义采集周期数,定义板卡索引,调用函数 Fg_Init("Sobel_Filter.hap", boardIndex) 来启动 applet。

  2. 为采集缓冲区分配 Memory。

    函数: Fg_AllocMemEx(fg, ..., ...)

  3. Frame Grabber:获取*并为 Process0 设置* Property

    函数: Fg_setParameterWithType(fg, ..., ..., ...) 和 Fg_getParameterWithType(fg, ..., ..., ...)

    此处列出了设计中包含的所有 Property。为了获得更好的概览,Basler 建议删除所有在运行时调整时不需要的 Property。

  4. 创建显示窗口

    函数 CreateDisplay()

  5. 为每个存在的端口在 applet 和相机上启动采集:

    函数: Fg_AcquireEx(fg, 0, nrOfCycles, ...,...);

  6. 抓取图像:

    函数: Fg_getLastPicNumberBlockingEx(fg, ..., ..., ..., ...);

  7. 停止采集

    功能 Fg_stopAcquireEx(fg, .., .., ...)

  8. 关闭显示窗口

    函数 CloseDisplay(...);

  9. 释放缓冲区 Memory

    函数 Fg_FreeMemEx(fg, ..);

  10. Frame Grabber 反初始化

    函数 Fg_FreeGrabber(fg);

有关 SDK 函数的详细描述和解释,请访问 https://docs.baslerweb.com/frame-grabbers/sdk/basler__fg_8h.html

有关 Framegrabber API 的介绍,请访问 https://docs.baslerweb.com/frame-grabbers/framegrabber-api.html。

您可以将生成的示例 SDK 代码集成到更大的 SDK 环境中,以便对 frame grabber (预)处理后的图像进行进一步的软件处理。