通过 VisualApplets,您可以将在 VHDL 中设计的图像处理模块转换为 VisualApplets 算子。
您可以将模块作为 IP 核集成到 VisualApplets 中。每个 IP 核构建一个算子。实现后,这些算子的工作方式与内置的 VisualApplets 算子相同。以这种方式实现的算子被称为 自定义算子。

为了在 VisualApplets GUI 上使用您的自定义算子,您还需要定义一个或多个包含该自定义算子的自定义库。每个自定义算子都必须属于一个特定的自定义库。
只需几个步骤,即可将新的 自定义算子 添加到 VisualApplets 中。您可以完全自主完成整个工作流程:
-
直接在 VA GUI 上指定自定义算子的主要 Property 及其接口(算子名称、算子版本、所需图像输入、图像输出、Memory 端口的数量和 Property 等)。
-
根据您在第 1 步中的输入,让 VisualApplets 为算子接口(黑盒)生成 VHDL 代码以及用于测试您的实现的 VHDL 测试平台。
-
包装您的 HDL 代码,使其接口与生成的黑盒相匹配。自动生成的测试平台可能有助于测试您的实现。
-
为您的实现创建网表。如果需要,还需创建约束文件。
-
(可选)创建算子文档(用于算子帮助窗口)以及模拟模型(稍后可用于模拟包含自定义算子的 VA 设计)。
-
再次在 VA 中编辑自定义算子:添加生成的网表,并可选择添加帮助文件和模拟模型。
完成这些步骤后,您的图像处理模块即可作为自定义算子直接在 VisualApplets 中使用,并且可以像任何其他算子一样使用。自定义库保存为 *.val 或 *.vl 文件(类似于用户库)。它们可以以此格式进行部署和分发。

在整个工作流程中,会使用两次 VisualApplets(即 VisualApplets Custom Operator Functionality):
-
用于在 VisualApplets 中生成算子原型,从而能够导出 HDL 代码来定义相关的 IP 核接口(黑盒和测试平台)。
-
通过添加用于综合以及(可选)模拟和帮助内容所需的文件来完善算子。
生成算子原型: VA Custom Operator Functionality 允许您创建一个算子原型,该原型可立即用于在 VisualApplets 中实例化算子。对于此算子原型,可以导出黑盒接口和一个 RTL 级模拟实体,用于仿真生成的算子接口的通信端口。然后,您可以开始编码(即实现符合黑盒接口的 HDL 代码)并模拟您的自定义算子设计。随后,将生成的 FPGA 设计综合为 EDIF 或 NGC 网表。或者,您可以添加约束文件,为 VisualApplets 高级模拟创建动态链接库,并为 VisualApplets GUI 编写 HTML 文档。
完成算子定义: VA Custom Operator Functionality 允许您指定网表、模拟库和文档文件。补充这些文件后,算子便可立即使用。
算子端口可以是同步的,也可以是异步的。在 VisualApplets 中,同步基本上意味着多个端口的数据是同步传输的,而彼此异步的端口则支持非对齐通信模式。
端口只有在具有共同的 M 源,或者源自 SYNC 模块时才是同步的;该源与端口之间可以存在任何 O 算子的组合。
根据算子输入端口之间的关系,我们区分以下选项:
-
同步输入:所有输入端口彼此同步。有一个输出端口。
-
异步输入:部分输入端口彼此异步,所有输出彼此同步。
不允许使用带有异步输出的算子。带有同步输入的算子只能有一个输出。如果需要多个输出,则必须将输入声明为异步。
![]() |
定义多个输出 |
|---|---|
|
如果要创建一个具有多个输出的算子,则需要将其次输入声明为异步。多个输出始终是同步的。 |
两类算子的示例(内置的 VisualApplets 算子):
|
![]()
|
RemoveImage |
带有同步输入和一个输出的 M 算子。 |
|
![]()
|
SYNC |
带有异步输入以及多个同步输出的 M 算子。 |
VisualApplets 自定义算子接口旨在顺利集成您的新算子,使其在 VisualApplets 中的表现如同内置算子一样。您可以为自定义算子定义任意数量的输入和输出端口。
-
图像输入 / 图像输出: Image In 和 Image Out 端口可能支持多种图像格式。它们由易于使用的 FIFO 接口驱动。这些 FIFO 驻留在自定义算子的 VA 部分中,因此您只需实现流控制,而无需实现 FIFO。
-
Memory 端口:您还可以定义任意数量的 Memory 端口。它们同样使用驻留在自定义算子 VA 部分中的 FIFO。
-
GPIO 端口:除图像端口外,您还可以定义通用 I/O 端口,例如用于向算子传输异步信号。
-
寄存器:为了让算子的最终用户能够配置算子并访问状态信息,您可以定义任意数量的写寄存器和读寄存器。
-
时钟:用于接收时钟脉冲的端口是为每个自定义算子自动设置的。
-
复位/启用端口:用于接收复位或启用命令的端口是为每个自定义算子自动设置的。

以下各节详细介绍了上图所示的不同类型的接口。
VisualApplets 连接了两个时钟输入——设计时钟以及与设计时钟同步但频率加倍的第二个时钟。除 Memory 接口外,所有接口都必须与设计时钟同步。Memory 接口可以配置为使用设计时钟或倍频时钟来进行读和/或写接口操作。
复位(Reset)和启用(Enable)输入由实例化该算子的 VA 进程相应的“进程启用 (process enable)”和“进程复位 (process reset)”信号驱动。请确保在算子中实现以下行为作为对这些信号的响应:
-
断言 Reset 会将算子置于其初始状态。
-
断言 Enable 会开始处理。
-
停用 Enable 会停止处理。
-
(当 Enable=0 时,不读取算子的输出 FIFO。根据图像处理流水线的状态,某些数据可能仍会写入输入端口,但流控制可安全地防止任何 FIFO 内容损坏。)
-
仅当 Enable=0 时才断言 Reset
自定义算子的 VA 部分实现了对这些信号的以下行为:
-
Reset 将清空所有端口接口 FIFO。
-
Reset 和 Enable 对算子的参数没有影响。
-
Reset 和 Enable 对算子的 GPIO 接口没有影响。
为了传递算子参数和状态,自定义算子可以配备任意数量的 VisualApplets 参数。每个参数都会映射到自定义算子的一个独立寄存器端口。VisualApplets 负责调度对算子寄存器的访问。
您可以定义自定义算子的图像输入和输出端口将支持的图像协议。然后,您的算子未来的用户将能够从您提供的图像协议列表中进行选择。
VisualApplets 提供以下图像格式以供您算子的 ImgIn 和 ImgOut 端口支持:
-
grayXxP:每个像素包含 X 位且 Parallelism 为 P 的灰度图像
-
rgbYxP: 每个颜色分量(红、绿、蓝)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsiYxP: 每个颜色分量(HSI 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
hslYxP: 每个颜色分量(HSL 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsvYxP: 每个颜色分量(HSV 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
yuvYxP: 每个颜色分量(YUV 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
ycrcbYxP: 每个颜色分量(YCrCb 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
labYxP: 每个颜色分量(LAB 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
-
xyzYxP: 每个颜色分量(XYZ 色彩模型)包含 Y/3 位且 Parallelism 为 P 的彩色图像
此外,图像尺寸以及像素分量是有符号还是无符号的信息可以通过可选后缀进行编码。
The pixel data width X is limited to 64 bit. The width Y must be a multiple of 3 and is limited to 63 bit. The parallelism P defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}.
将图像数据打包到给定接口宽度 N 的字中时,必须遵循以下规则:
-
所有 P 个像素的数据必须能够放入长度为 N 的单个字中。数据采用 LSB 对齐存储,这意味着对于像素宽度 Z(对于灰度,Z=X;对于彩色,Z=Y),数据的分配方式如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。
-
对于 RGB 图像,三个颜色分量按 LSB 对齐打包到子字 [0..Y-1] 中,顺序如下:红色使用位 [0..Y/3-1 ],绿色使用位 [Y/3..2*Y/3-1],蓝色使用位 [2*Y/3..3*Y/3-1]。
-
对于 YUV 彩色图像,适用与 RGB 相同的规则,其中 Y 扮演红色的角色,U 扮演绿色的角色,V 扮演蓝色的角色。
-
对于 HSI 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,I 扮演蓝色的角色。
-
对于 LAB 彩色图像,适用与 RGB 相同的规则,其中 L 扮演红色的角色,A 扮演绿色的角色,B 扮演蓝色的角色。
-
对于 XYZ 彩色图像,适用与 RGB 相同的规则,其中 X 扮演红色的角色,Y 扮演绿色的角色,Z 扮演蓝色的角色。
在 VisualApplets 中,任何链路都带有最大图像宽度和最大图像高度 Property。VisualApplets 允许您为自定义算子所支持的任何图像协议分别定义最大宽度和高度的可选约束。
对于图像接口端口,您可以定义允许的图像协议列表。该列表构成了可能的 VisualApplets 图像格式(见上文)的子集。格式可以通过以下 Property 进行描述:
-
数据类型 uint 或 int
-
像素数据 Bit Width N = [1..64]
-
灰度或 Color Format(包含聚合宽度 N 的单分量或三分量)
-
Color Format 的类型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)
-
2D、1D 或 0D
-
Parallelism P = {1,2,4,8,16,32,64}
默认假设核大小为 1x1。所列出的格式从零开始编号 ,并由此定义一个 ID。
在 VisualApplets 中使用最终算子时,算子用户可以在此处为相关的图像通信端口 选择您列出的任何格式。 根据 VisualApplets 用户所做的选择,相应的 ID 将输出到 相关的自定义算子端口。
这使自定义算子能够根据所选格式调整其行为。
图像输入端口允许将图像数据从 VisualApplets 进程传送到 自定义算子。这些端口命名为 ImgIn。如果您将 自定义算子设计为支持配置其输入通道(请参阅“图像协议”一节),则可以通过 VisualApplets 中相应格式参数选择的单个 端口驱动几种不同的协议。该接口 基本上由一个 FIFO 和一个参数寄存器组成,该寄存器为实际 使用的数据格式提供 ID。自定义算子必须负责读取 FIFO 并根据 所选图像格式的协议解释图像数据。算子必须 根据提供 FIFO 填充状态信息的 状态引脚保证正确的流控,即当 FIFO 为空时不得读取数据。
对于图像接口端口,需要定义允许的图像格式列表。 此列表构成了可能的 VisualApplets 图像格式(请参阅“图像协议”一节)的子集,其中格式可以通过以下 属性进行描述:
-
数据类型 uint 或 int
-
像素数据 Bit Width N = [1..64]
-
灰度或 Color Format(包含聚合宽度 N 的单分量或三分量)
-
Color Format 的类型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)
-
2D、1D 或 0D
-
Parallelism P = {1,2,4,8,16,32,64}
默认假设核大小为 1x1。所列出的格式从零开始编号 ,并由此定义一个 ID。
在 VisualApplets 中使用最终算子时,用户可以针对相关的图像通信端口在此处选择您列出的任何 格式。根据 VisualApplets 用户所做的选择,相应的 ID 将输出到相关的自定义 算子端口。这使自定义算子能够根据所选 格式调整其行为。
图像输出端口允许将图像数据从自定义算子传送到 VisualApplets 进程。这些端口命名为 ImgOut。如果您将 自定义算子设计为支持对其输出通道进行适当配置(请参阅 “图像协议”一节),则可以通过 VisualApplets 中相应格式参数选择的 单个端口驱动几种不同的协议。 该接口基本上由一个 FIFO 和一个参数寄存器组成,该寄存器为 实际使用的数据格式提供 ID。自定义算子必须负责根据所选图像格式的协议用 图像数据填充 FIFO。算子必须 根据提供关于 FIFO 填充状态信息的 状态引脚保证正确的流控,即当 FIFO 满时不得写入数据。
对于图像接口端口,需要定义允许的图像格式列表。 此列表构成了可能的 VisualApplets 图像格式(请参阅“图像协议”一节)的子集,其中格式可以通过以下 属性进行描述:
-
数据类型 uint 或 int
-
像素数据 Bit Width N = [1..64]
-
灰度或 Color Format(包含聚合宽度 N 的单分量或三分量)
-
Color Format 的类型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)
-
2D、1D 或 0D
-
Parallelism P = {1,2,4,8,16,32,64}
默认假设核大小为 1x1。所列出的格式从零开始编号 ,并由此定义一个 ID。
在 VisualApplets 中使用最终算子时,用户可以针对相关的图像通信端口在此处选择您列出的任何 格式。根据 VisualApplets 用户所做的选择,相应的 ID 将输出到相关的自定义 算子端口。这使自定义算子能够根据所选 格式调整其行为。
通用 I/O 接口允许连接自定义 算子的专用信号引脚。每个 GPIO 端口都映射到自定义算子的一个引脚,该引脚既可以是输入, 也可以是输出。
不支持双向引脚。在 VisualApplets 中,相应的算子 端口类型为 SIGNAL。
![]() |
不支持双向引脚 |
|---|---|
|
GPIO 引脚必须是输入或输出。不支持 双向引脚。 |
首先,您需要输入一些用于描述您的新自定义算子的详细信息。
VisualApplets 使用这些详细信息为您的自定义算子生成 VHDL 黑盒 以及用于仿真相应的测试平台。
您可以通过 VisualApplets GUI 为您的各个自定义算子输入配置 。即使算子规范在网表、仿真模型和 文档方面不完整,VisualApplets 也会使指定的算子立即可用于设计中。
![]() |
自定义库文件 |
|---|---|
|
包含所有算子的自定义库存储为一个 该文件可以分发并直接应用在 VisualApplets 中。只需将其 复制到 VisualApplets 设置中指定的自定义库目录中即可。 |
![]() |
XML 格式的算子配置 |
|---|---|
|
VisualApplets 以 XML 格式存储自定义算子规范。您可以将 XML 内容从自定义库导出到文件,例如以便在版本 控制系统中进行处理。另一方面,您可以导入 XML 以添加自定义算子(请参阅 “导入和导出单个自定义算子”一节)。您无需 了解此 XML 文件的外观。但是,如果您想查看,请参阅 “自定义算子规范的 XML 格式”一节。 |
在开始定义新的自定义算子之前,您需要创建一个属于该新算子的自定义库。
如果您已经有一个可用的自定义库来存放新的自定义算子,请跳过本节并继续阅读“创建新自定义算子”一节。
要创建新的自定义库:
-
在菜单中,选择菜单项。

-
为您的新自定义库命名。
-
默认情况下,新的自定义算子库保存在
*.val文件格式中。如果您想在 VisualApplets 3.3.2 或更旧版本中打开此库,请选择 . -
点击

![]() |
遵循有效 C 标识符的约定 |
|---|---|
|
在定义库名称时,请确保遵守有效 C 标识符的命名约定。 |
现在,新的自定义库已创建。您可以在算子面板的标签页中看到它:
当您将鼠标移动到自定义库名称上时,工具提示会显示该库的保存格式 *.vl 旧版文件格式:

若要创建新的自定义库,您可能需要指定一个目录来存储所有与自定义库相关的的文件。您可以在 → → 下进行此操作。

要定义新的自定义算子:
-
在菜单中,选择菜单项。
-
在打开的子菜单中,选择。

-
在打开的窗口中,通过双击库名称来选择自定义库。

-
输入自定义算子的名称:

![[提示]](../common/images/admon/tip.png)
遵循 VHDL 命名约定 在 VA GUI 中定义算子名称时,请确保符合 VHDL 命名约定。
VHDL 有效名称的定义如下:
“端口、信号、变量、实体名称、体系结构主体或类似对象的有效名称由一个字母开头,后跟任意数量的字母或数字,且不含空格。有效名称也称为命名标识符。VHDL 不区分大小写。但是,名称中可以使用下划线,但不能以其开头或结尾。不允许使用两个连续的下划线。”
-
在保存之前,您必须定义新算子的 Property:

有关定义新自定义算子 Property 的详细信息,请参阅“定义自定义算子的基本信息”。
-
点击按钮。
对话框随即打开。在这里,您可以定义您的自定义算子。
-
点击 按钮。
现在,您的新自定义算子将显示在它所属的自定义库中:

在 VisualApplets 中创建并保存新的自定义算子后,您可以随时中断工作并在之后继续。要继续操作,请转到 Custom Library 选项卡,打开该库,右键单击算子名称,然后从子菜单中选择 Edit。

![]() |
改用算子模板 |
|---|---|
|
或者,您可以使用 VisualApplets 安装中提供的自定义算子模板来定义新的自定义算子。有关如何使用该模板的信息,请参阅 “Custom Operator Template” 一节。 |
首先,您需要定义自定义算子的接口。
-
提供您的供应商名称。您可以输入任意字符串。此信息旨在供用户识别算子。
-
Provide a version number for your operator, e.g., version 1.0. You can enter any number but you should comply with the version scheme <major>.<minor>. This information is intended for operator version identification by the user.

-
转到 选项卡。
在 选项卡下,您可以描述图像输入端口的属性。
-
首先,您需要定义自定义算子 ImgIn 端口的输入模式:

![]() |
同步和异步算子端口 | |||||
|---|---|---|---|---|---|---|
|
算子端口可以是同步的,也可以是异步的。在 VisualApplets 中,同步基本上意味着多个端口的数据是同步传输的,而彼此异步的端口则支持不对齐的通信模式。 端口仅在具有共同的 M 源或由 SYNC 模块提供源时才是同步的;该源与端口之间可以存在任何 O 算子组合。 根据算子输入端口之间的关系,我们区分以下选项:
不允许使用具有异步输出的算子。具有同步输入的算子只能有一个输出。如果需要多个输出,则必须将输入声明为异步。 如果您想创建一个具有多个输出的算子,则需要将其输入声明为异步。多个输出始终是同步的。 两类算子的示例(VisualApplets 内置算子):
|
您可以定义一个或多个图像输入端口(ImgIn)。每个 ImgIn 端口可以按您指定的次数使用。
-
点击 按钮
以创建第一个图像输入(ImgIn) 端口。
-
为 ImgIn 端口命名,并在 字段中定义输入端口的数量:>1 表示定义一个端口数组,其名称由基本名称和索引组成。

随后,程序窗口中的算子示意图将立即显示输入的 ImgIn 端口数组:

-
在 面板中,指定此 ImgIn 端口支持的协议属性。

-
在 下,指定 ImgIn 端口的宽度。
-
在 下,指定输入数据的 FIFO 缓冲区深度,该深度至少需由 VA core 提供。该值必须介于 15 到 1023 之间且为 2 的幂减 1。
对于图像接口端口,需定义一个允许的协议列表。协议可通过以下属性进行描述:
-
灰度或彩色格式(单或三个数据分量,总宽度为 N)
-
Color Format 的类型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)
-
像素数据 Bit Width N = [1..64]
-
Parallelism P = {1,2,4,8,16,32,64}
-
2D(阵列)、1D(线)或 0D(原始数据)
-
数据类型 uint 或 int
-
最大图像尺寸
默认内核大小隐式为 1x1。
列出的协议从零开始编号,从而定义一个 ID(在下图 面板表格的左侧列中可见)。
如果指定了多个协议,则表示您将自定义算子设计为支持配置其输入通道。在这种情况下,可以通过单个端口驱动多个不同的协议。
自定义算子的用户可以在特定的 ImgIn 端口上选择要使用的协议。根据 VA 用户所做的选择,相应的 ID 将输出至相关的自定义算子端口。这使得自定义算子能够根据所选协议调整其行为。
-
-
在 下,指定协议的 Color Format。

允许使用以下 Color Format:
-
grayXxP:每个像素 X 位且 Parallelism 为 P 的灰度图像
-
rgbYxP: 每个颜色分量(红、绿、蓝)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsiYxP: 每个颜色分量(HSI 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hslYxP: 每个颜色分量(HSL 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsvYxP: 每个颜色分量(HSV 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
yuvYxP: 每个颜色分量(YUV 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
ycrcbYxP: 每个颜色分量(YCrCb 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
labYxP: 每个颜色分量(LAB 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
xyzYxP: 每个颜色分量(XYZ 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
-
双击 列中的字段,并为特定格式指定像素数据宽度:

Pix.Width 的取值范围取决于您在 下的选择:
Gray:像素数据宽度(以下称为 X)限制为 64 位。
All color formats:像素数据宽度(以下称为 Y)必须是 3 的倍数且限制为 63 位。
-
双击 列中的字段,并为特定格式指定 Parallelism。
The parallelism defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}. Packing of image data into words of a given interface width N (specified under ) must follow certain rules:
-
所有 P 个像素的数据必须能够放入长度为 N 的单个字中。数据以 LSB 对齐方式存储,这意味着对于像素宽度 Z(对于灰度图像,Z=X;对于彩色图像,Z=Y),数据的分布如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。
-
对于 RGB 图像,三个颜色分量按 LSB 对齐方式打包到子字 [0..Y-1] 中,顺序如下:红色使用位 [0..Y/3-1],绿色使用位 [Y/3..2*Y/3-1],蓝色使用位 [2*Y/3..3*Y/3-1]。
-
对于 HSI 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,I 扮演蓝色的角色。
-
对于 HSL 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,L 扮演蓝色的角色。
-
对于 HSV 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,V 扮演蓝色的角色。
-
对于 YUV 彩色图像,适用与 RGB 相同的规则,其中 Y 扮演红色的角色,U 扮演绿色的角色,V 扮演蓝色的角色。
-
对于 YCrCb 彩色图像,适用与 RGB 相同的规则,其中 Y 扮演红色的角色,Cr 扮演绿色的角色,Cb 扮演蓝色的角色。
-
对于 LAB 彩色图像,适用与 RGB 相同的规则,其中 L 扮演红色的角色,A 扮演绿色的角色,B 扮演蓝色的角色。
-
对于 XYZ 彩色图像,适用与 RGB 相同的规则,其中 X 扮演红色的角色,Y 扮演绿色的角色,Z 扮演蓝色的角色。
-
-
在 下,指定协议支持 2D(区域)、1D(线扫描)还是 0D(原始)图像。

-
:通过这些可选字段,您可以为图像宽度和图像高度定义约束条件。
-
重复步骤 6 到 10,以定义您希望 ImgIn 端口支持的任意数量的协议。
-
重复步骤 1 到 11,以定义您希望自定义算子提供的任意数量的 ImgIn 端口。

在 选项卡下,描述图像输出端口的属性。
您可以定义一个或多个图像输出端口(ImgOut)。每个 ImgOut 端口都可以按照您指定的次数使用。
-
点击 按钮
以创建一个第一个图像输出 (ImgOut) 端口。
-
为 ImgOut 端口命名。
-
双击 列中的字段以创建端口数组。Multiplicity >1 定义了一个端口数组,其名称由基础名称和索引组成。

程序窗口中的算子示意图将立即显示输入的 ImgOut 端口数组:

-
在 面板中,您可以指定此 ImgOut 端口所支持协议的 Property。
在 下,指定 ImgOut 端口的宽度。
-
在 下,指定输出数据的缓冲 FIFO 的深度,该深度至少需要由 VA 核心提供。该值必须介于 15 到 1023 之间且为 2 的幂减 1。
对于图像接口端口,需定义一个允许的协议列表。协议可通过以下属性进行描述:
-
灰度或 Color Format(包含聚合宽度 N 的单分量或三分量)
-
Color Format 的类型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)
-
像素数据 Bit Width N = [1..64]
-
Parallelism P = {1,2,4,8,16,32,64}
-
2D(阵列)、1D(线)或 0D(原始数据)
-
数据类型 uint 或 int
-
最大图像尺寸
默认内核大小隐式为 1x1。
列出的协议从零开始编号,从而定义一个 ID(在下图 面板表格的左侧列中可见)。
如果指定了多个协议,则表示您将自定义算子设计为支持配置其输入通道。在这种情况下,可以通过单个端口驱动多个不同的协议。
自定义操作符的用户可以在特定的 ImgOut 端口上选择其要使用的协议。根据 VA 用户所做的选择,相应的 ID 将输出至相关的自定义操作符端口。这使得自定义操作符能够使其行为适应所选的协议。
-
-
在 下,指定协议的 Color Format。

允许使用以下 Color Format:
-
grayXxP:每个像素 X 位且 Parallelism 为 P 的灰度图像
-
rgbYxP: 每个颜色分量(红、绿、蓝)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsiYxP: 每个颜色分量(HSI 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hslYxP: 每个颜色分量(HSL 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
hsvYxP: 每个颜色分量(HSV 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
yuvYxP: 每个颜色分量(YUV 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
ycrcbYxP: 每个颜色分量(YCrCb 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
labYxP: 每个颜色分量(LAB 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
xyzYxP: 每个颜色分量(XYZ 色彩模型)占 Y/3 位且 Parallelism 为 P 的彩色图像
-
-
双击 Pix.Width 列中的字段,并为特定格式指定像素数据宽度:

Pix.Width 的取值范围取决于您在 下的选择:
Gray:像素数据宽度(以下称为 X)限制为 64 位。
All color formats:像素数据宽度(以下称为 Y)必须是 3 的倍数且限制为 63 位。
-
双击 列中的字段,并为特定格式指定 Parallelism。
The parallelism defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}. Packing of image data into words of a given interface width N (specified under ) must follow certain rules:
-
所有 P 个像素的数据必须能够放入长度为 N 的单个字中。数据以 LSB 对齐方式存储,这意味着对于像素宽度 Z(对于灰度图像,Z=X;对于彩色图像,Z=Y),数据的分布如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。
-
对于 RGB 图像,三个颜色分量按 LSB 对齐方式打包到子字 [0..Y-1] 中,顺序如下:红色使用位 [0..Y/3-1],绿色使用位 [Y/3..2*Y/3-1],蓝色使用位 [2*Y/3..3*Y/3-1]。
-
对于 HSI 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,I 扮演蓝色的角色。
-
对于 HSL 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,L 扮演蓝色的角色。
-
对于 HSV 彩色图像,适用与 RGB 相同的规则,其中 H 扮演红色的角色,S 扮演绿色的角色,V 扮演蓝色的角色。
-
对于 YUV 彩色图像,适用与 RGB 相同的规则,其中 Y 扮演红色的角色,U 扮演绿色的角色,V 扮演蓝色的角色。
-
对于 YCrCb 彩色图像,适用与 RGB 相同的规则,其中 Y 扮演红色的角色,Cr 扮演绿色的角色,Cb 扮演蓝色的角色。
-
对于 LAB 彩色图像,适用与 RGB 相同的规则,其中 L 扮演红色的角色,A 扮演绿色的角色,B 扮演蓝色的角色。
-
对于 XYZ 彩色图像,适用与 RGB 相同的规则,其中 X 扮演红色的角色,Y 扮演绿色的角色,Z 扮演蓝色的角色。
-
-
在 下,指定协议支持 2D(区域)、1D(线扫描)还是 0D(原始)图像。

-
:通过这些可选字段,您可以为图像宽度和图像高度定义约束条件。
-
重复步骤 6 至 10,以定义您希望 ImgOut 端口支持的任意数量协议。
-
重复步骤 1 至 11,以定义您希望自定义操作符支持的任意数量 ImgOut 端口。
通用 I/O 接口允许连接自定义 算子的专用信号引脚。每个 GPIO 端口都映射到自定义算子的一个引脚,该引脚既可以是输入, 也可以是输出。
不支持双向引脚。在 VisualApplets 中,相应的操作符端口属于 SIGNAL 类型。
-
转到 标签页。
-
使用以下工具添加任意数量的 GPI 和 GPO: 按钮
.
-
双击该字段可为特定的 GPI 或 GPO 命名。
定义的 GPI 和 GPO 会立即显示在程序窗口左上角面板中自定义操作符的示意图内:

![]() |
不支持双向引脚 |
|---|---|
|
引脚为输入或输出端。不支持双向引脚。 |
可以设置自定义操作符以访问一个或多个 Memory 组(DRAM、SRAM 等)。
所有 Memory 端口都具有类似 FIFO 的接口,用于执行写和读命令。这些 FIFO 驻留在自定义操作符的 VA 部分中,因此您只需实现流控制,而无需实现 FIFO。将 FIFO 内容转发到连接至自定义操作符的 Memory 控制器的时序完全由 VisualApplets 控制。
在 标签页下,您可以定义操作符对外部 Memory 的访问权限。您最多可以指定 4 个端口,并能够指定操作符所需的 Memory 接口 Property。
![]() |
符合目标平台的 Memory 布局 |
|---|---|
|
请牢记潜在目标平台(将运行包含自定义操作符的小程序所在的平台)的 Memory 布局。 |

|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
Integer |
数据宽度 |
|
|
Integer |
地址宽度 |
|
|
Integer |
用于标记写访问权限的标志宽度。此参数必须 >= 1。 |
|
|
Integer |
用于标记读访问权限的标志宽度。此参数必须 >= 8。 |
|
|
字符串 |
此参数用于指示 Memory 接口时钟与设计时钟之间的关系。支持以下可能的值:
|
在输入了 'Defining an Individual Custom Operator via GUI' 一节中所述的所有详细信息后,您就可以开始进行实际的 VHDL 编码了。首先,您需要让 VisualApplets 生成 VHDL 黑盒和测试平台(test bench)。
要触发 VHDL 黑盒和测试平台的生成:
-
在 VisualApplets 程序窗口的 面板中,转到 选项卡。
-
打开自定义库并选择您要实现的自定义 operator。
-
右键点击 operator 名称,然后在子菜单中选择 → 。

-
指定您希望存储所创建的 VHDL 文件的文件夹。
此时,生成过程开始。生成成功后,将打开一个确认对话框。点击 进行确认。
您可以在指定的文件夹中找到所有生成的文件。
生成的黑盒提供了您通过 GUI 指定的所有端口(请参见 'Defining an Individual Custom Operator via GUI')。
在本章中,您可以找到关于这些端口在生成的 VHDL 黑盒中外观的详细描述。
VisualApplets 支持两个时钟域。有一个基础设计时钟以及一个与该时钟同相且频率加倍的派生时钟。因此,自定义 operator 有两个时钟输入。此外,还有一个 Reset 和
Enable 如上所述的输入。
|
端口 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
在 |
1 |
基础设计时钟 |
|
|
在 |
1 |
时钟同步到 |
|
|
在 |
1 |
operator 复位 |
|
|
在 |
1 |
启用处理 |
正如章节中所描述的,写寄存器端口的定义 '通过 GUI 定义单独的自定义算子' 将产生如下接口,其中 PORTID 是寄存器名称,且
PORTIDWidth 是定义的寄存器宽度。
|
端口 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
在 |
PORTID |
寄存器数据 |
|
|
在 |
1 |
信号写访问 |
正如 '定义自定义算子的寄存器' 中所述,读寄存器端口的定义相应地会产生以下接口:
|
端口 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
输出 |
PORTID |
寄存器数据 |
|
|
在 |
1 |
信号读访问 |
为了在 VisualApplets 核心与自定义算子之间进行数据通信,可以配置如 '定义图像输入端口' 中所述的图像通信端口。通信通过一个简单的 FIFO 接口和一个额外的格式标识符端口来完成。
用于将数据从 VisualApplets 核心传输到自定义算子的 ImgIn 通道会产生如下接口,其中 PORTID 是相应端口类型的名称,X 是用于区分同类多个端口的端口号:
|
端口 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
在 |
PORTID |
进入自定义算éd的数据 |
|
|
输出 |
1 |
接受输入数据 |
|
|
在 |
1 |
信号行结束。如果激活此标志,则数据不包含像素值。 |
|
|
在 |
1 |
信号帧结束。如果激活此标志,则数据不包含像素值。此标志仅在同时发出行结束信号时才会断言。 |
|
|
在 |
1 |
缓冲区 FIFO 为空 |
|
|
在 |
|
缓冲区 FIFO 中的字数。此信号可用于生成 FIFO 标志,例如 |
|
|
在 |
|
通知当前图像数据格式的预定义参数。N 是为该端口指定的图像格式数量。 |
下图说明了 ImgIn 端口处的数据流。端口名称组件 PORTIDX 已被替换为 ImgIn。该波形显示了尺寸为 3x2 的二维帧的输入。
当 ImgIn 端口是多个 O 同步输入端口的一部分时,它们必须同时消耗 FIFO 数据。在这种情况下,所有端口的 FIFO 填充水平将完全匹配,因此算子只需要根据多个 O 同步输入之一的填充水平来实现流控制。

用于将自定义算子中的数据传输到 VisualApplets 核心的 ImgOut 通道将导向如下所示的接口,其中 PORTID 是对应的端口类型名称,而 X 是用于区分同类多个端口的端口号:
|
端口 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
输出 |
PORTID |
输出数据 |
|
|
输出 |
1 |
输出数据有效 |
|
|
输出 |
1 |
将当前写入访问信号作为行结束通知。此后的写入数据将不再被解释为像素数据。 |
|
|
输出 |
1 |
将当前写入访问信号作为帧结束通知。此后的写入数据将不再被解释为像素数据。该标志需要同时与行结束选通信号相关联。 |
|
|
在 |
1 |
缓冲 FIFO 已满,不再接受更多数据 |
|
|
在 |
|
缓冲区 FIFO 中的字数。此信号可用于生成 FIFO 标志,例如 |
|
|
在 |
|
通知当前图像数据格式的预定义参数。N 是为该端口指定的图像格式数量。 |
下图说明了 ImgOut 端口处的数据流。该波形显示了尺寸为 3x2 的二维帧的输出。当 ImgOut 端口是多个 O 同步输出端口的一部分时,所有这些端口必须同时发出数据。

可以设置自定义算子以拥有最多四个 memory 端口。生成的接口的 I/O 端口会带有后缀 X,其中 X 是 memory 端口的索引。
|
名称 |
方向 |
Width |
描述 |
|---|---|---|---|
|
|
输出 |
|
通过 VisualApplets 核心输出到 memory 的写入数据 |
|
|
输出 |
|
写标志输出 |
|
|
输出 |
|
写地址 |
|
|
输出 |
1 |
发出写命令 |
|
|
输出 |
1 |
为此写端口请求优先级 |
|
|
在 |
1 |
可能仅接受单个后续写命令 |
|
|
在 |
1 |
由于相关的 FIFO 已满,不接受任何写命令 |
|
|
在 |
1 |
用于写命令的 FIFO 为空 |
|
|
在 |
4 |
已缓冲的写命令数量 |
|
|
在 |
|
来自 VisualApplets 核心的写标志输出 |
|
|
在 |
1 |
写标志输入有效 – 信号指示 |
|
|
输出 |
|
读标志 |
|
|
输出 |
|
读地址 |
|
|
输出 |
1 |
发出读命令 |
|
|
输出 |
1 |
为此读端口请求优先级 |
|
|
在 |
1 |
可能仅接受单个后续读命令 |
|
|
在 |
1 |
由于 FIFO 已满,因此不接受任何读取命令 |
|
|
在 |
1 |
用于读取命令的 FIFO 为空 |
|
|
在 |
4 |
缓冲读取命令的数量 |
|
|
在 |
|
读标志输入 – 仅在以下情况下有效 |
|
|
在 |
|
读取数据输入 |
|
|
在 |
1 |
读取数据有效 |

上图展示了 Memory 接口协议的波形。
在自定义算子的接口描述中定义的任何 GPIO 输入或输出信号(章节 “通过 GUI 定义单独的自定义算子”)在生成的算子接口中都有一个相应的输入或输出端口。声明通用引脚时将创建以下端口:
-
iSig_名称 针对名为以下内容的 GPIO 输入信号 名称. -
oSig_名称 针对名为以下内容的 GPIO 输出信号 名称.
为了仿真包含自定义算子模块的 VisualApplets 设计,VisualApplets 会为连接到自定义算子的接口创建一个仿真测试平台。
每个接口端口都由 File I/O 独立驱动进行仿真。仿真实体应包含以下元素:
-
寄存器访问仿真。根据激励文件,可以写入和读取一组寄存器。
-
连接到 ImgIn 类型端口的帧源仿真器。在文件的激励下,这些类型的模块向 ImgIn 输出帧数据。
-
连接到 ImgOut 类型端口的帧宿仿真器。此类型的模块仿真连接到 ImgOut 的算子。该模块将接收到的数据写入文件。
-
Memory 端口仿真器。
-
GPIO 仿真器。每个用于输入的 GPIO 信号均由通过文件配置的信号发生器驱动。每个 GPIO 信号输出都会受到监控,信号的变化会写入报告文件。
对于 RTL 级仿真,VisualApplets 会创建一个包含包的 VHDL 文件,该包的名称为 CustomOperator_<OPERATORNAME> 其中
<OPERATORNAME> 是给定的算子名称。
此包包含组件 <OPERATORNAME> 和
<OPERATORNAME>_TB 其中后者是 VisualApplets 设计与自定义算子之间接口的测试平台。以下显示了名为的简单自定义算子的生成代码 RegExample
仅由一个读和写寄存器端口组成(Ctrl 和 Status),每个端口宽 4 位:
component RegExample port( iDesignClk: in std_logic := '0'; iDesignClk2x: in std_logic := '0'; iReset: in std_logic := '0'; iEnable: in std_logic := '0'; ivReg_Ctrl_D: in std_logic_vector(3 downto 0); iReg_Ctrl_Wr: in std_logic; ovReg_Status_D: out std_logic_vector(3 downto 0); iReg_Status_Rd: in std_logic ); end component; component RegExample_TB generic( DesignClkPeriod: time := 16 ns; Register_StimuliFileName: string := "" ); end component;
测试平台创建自定义算子的实例,并将协议仿真模块连接到每个接口端口。以下部分介绍了不同类型的仿真器、如何通过激励文件对其进行控制,以及如何生成输出文件。
生成的测试台为寄存器访问接口实现了一个仿真器。该仿真器的配置用于寻址带有单个进程的设计。写寄存器和读寄存器的地址从 0x4 开始,寄存器地址根据给定自定义算子组件中寄存器接口端口的顺序以 1 的增量递增(如上述示例组件 RegExample)。读写寄存器的地址是独立计数的。该仿真器由实体参数设置的文本文件驱动
Register_StimuliFileName 如上述 VHDL 代码中所提供。
激励文件中可能会出现以下命令:
|
命令 |
描述 |
|---|---|
|
|
行其余部分为注释 |
|
|
模拟全局复位 |
|
|
模拟进程复位。此命令具有以下语法: |
|
|
启用进程。语法如下: |
|
|
等待一定数量的时钟周期。语法如下, |
|
|
写入寄存器: |
|
|
从寄存器读取: |
在任何命令的最后一个参数之后,可以添加注释,其前缀为 “#”。
以下代码是一个示例激励文件,它根据上述测试台访问寄存器 RegExample_TB:
REM ************************************************************
REM Command formats:
REM GRS -> Global reset
REM GEN <value> -> Set global enable to <value>
REM PRS <procID> -> Reset process <procID> (0 .. F) REM PEN <procID> <value>
-> Set enable of process <procID> to
<value>
REM WCK <clk_ticks> -> Wait for <clk_ticks> clock cycles REM WRR <wrRegAddr> <value>
-> Write <value> to register <wrRegAddr> REM RDR <rdRegAddr> -> Read from register <rdRegAddr>
REM ************************************************************
WCK 0004 # wait for 4 clock cycles
GRS # global reset
GEN 1 # set global enable
WCK 0001 # wait for 1 clock tick
PRS 0 # reset process 0
PEN 0 1 # set enable of process 0
WCK 0002 # wait for 2 clock ticks
WRR 0004 0000000A # write 0xA to address 0x4
WCK 0002 # wait for 2 clock ticks
RDR 0004 # read from address 0x4
WCK FFFF
类型图像通信接口的模拟 ImgIn 由提供有关进入自定义算子的数据序列信息的激励文件驱动。对于任何存在的 ImgIn 端口,测试台具有通用 <PORTIDX>_StimuliFileName where <PORTIDX> 是对应图像输入端口类型的名称,后跟端口号。给定文件中的每一行都必须遵循以下语法:
<Command> <Data> <EndOfLine> <EndOfFrame> <DataValid>
其中 <Command> 是一个三个字母的命令, <Data> 提供一个十六进制数据字,其余三个参数对应图像协议标志。
下表描述了可用命令:
|
命令 |
描述 |
|---|---|
|
|
数据命令。此命令提供将作为端口输入的的数据
|
|
|
等待命令。参数 |
|
|
设置 FID 输入。参数 |
任何命令行都可以添加注释,前面加 “#”。
以下代码是一个示例激励文件,用于输入 3x2 图像:
FID 00000001 0 0 0 #Format: Cmd Data(hex) EndOfLine EndOfFrame DataValid
DAT 00000000 0 0 0
DAT 0000001a 0 0 1
DAT 0000001b 0 0 1
DAT 0000001c 0 0 1
DAT 00000000 1 0 1
WCK 00000004 0 0 0
DAT 0000002a 0 0 1
DAT 0000002b 0 0 1
DAT 0000002c 0 0 1
DAT 00000000 1 1 1
WCK 0000FFFF 0 0 0
类型图像通信接口的模拟 ImgOut 由激励文件驱动,该文件提供有关 FID 状态序列的信息。对于任何当前的 ImgOut 端口,VA_Design_Emulator 实体具有一个通用
<PORTIDX>_StimuliFileName 其中
<PORTIDX> 是对应图像输出端口类型的名称,后跟端口号。语法与 ImgIn 接口的激励完全相同,只是没有 DAT 命令可用。一个简单的激励文件可能如下所示:
WCK 00000010 0 0 0 #Format: Command Data(hex)
FID 00000001 0 0 0
WCK 0000FFFF 0 0 0
参数
<EndOfLine>,<EndOfFrame> 和
<DataValid> 实际上是没有意义的。
即: ImgOut 生成的测试平台中存在的接口模拟器将接收到的数据写入文件。为此,测试平台实体具有一个通用
<PORTIDX>_DumpFileName。在仿真期间,将创建一个具有给定名称的文件,并使用 DAT 和
WCK 命令以完全对应于 ImgIn 接口模拟器的激励文件格式写入数据。
当自定义算子实现对 Memory 的接口时,测试平台会将内存仿真模块连接到相应的接口端口。自定义算子不能依赖于 Memory 接口的特定时序(例如返回读数据的等待时间),因为这完全由 VisualApplets 控制,并且可能在不同平台甚至不同设计之间有所不同。
专用输入信号的模拟是针对每个信号独立进行的,由激励文件驱动。其中提供了有关信号状态序列的信息。激励文件可以由下面描述的多个命令组成。对于任何存在的输出信号端口,测试平台实体具有一个通用
iSig_<NAME>_StimuliFileName 其中
<NAME> 是相关的端口名称。
下表描述了可用命令:
|
命令 |
描述 |
|---|---|
|
|
设置信号。此命令提供端口处的输出将被设置为的信号状态 |
|
|
Wait 命令。其语法为: |
|
|
从头重新开始。命令解释器将从激励文件的第一行重新开始。此命令没有任何参数。该命令将在同一时钟周期执行文件的第一条命令,从而能够构建无缝循环。 |
|
|
停留在当前状态。命令解释器将停止,并且当前信号状态将保持不变,直至仿真结束。此命令没有任何参数。 |
任何命令行都可以添加注释,前面加 “#”。
以下代码是一个示例 stimuli 文件,它使自定义算子输入信号切换为低电平 5 个时钟周期,高电平 7 个时钟周期(与……同步
iDesignClk):
SET 0 # deassert output
WCK 0004 # wait for 4 clock cycles
SET 1 # assert output
WCK 0006 # wait for 6 clock cycles
RST # restart from begin
通过写入转储文件来监控专用的输出信号
oSig_<NAME>_DumpFileName 其中
<NAME> 是相关的端口名称。该文件由 SET
和 WCK 命令组成,这些命令与专用输入信号的 stimuli 文件的命令完全对应。
必须提供高级仿真组件,以便将自定义算子完全集成到 VisualApplets 中。高级仿真组件需要编译为带有预定义导出 C 函数集的动态链接库。您可以在算子规范的 → 选项卡中添加此文件:

为了在 VisualApplets 中进行高级仿真,必须导出以下函数:
int SimulateOPNAME (va_custom_op_sim_handle simHandle)
其中 OPNAME 是自定义算子的名称。
高级仿真必须满足以下要求:
-
Frame based simulation — 在每个图像输入端口上,都可以查询是否有一个或多个可用帧。如果启动仿真所需的所有端口都能够提供一帧,则需要计算相关的输出帧并通过调用适当的函数将其发出。对于一维图像数据,数据流会自动分割成帧,并像 2D 数据一样进行仿真。
-
Bit accurate simulation — 结果帧的计算必须是位准确的,即输出数据必须与硬件实现生成的数据完全相同。
-
Keeping consistency of flow — 当算子输入端口相互同步时,必须相应地获取输入图像。当定义了多个输出时,必须同时输出图像。对于仿真函数而言,这意味着当一帧输出到一个输出链路时,在仿真函数返回之前,也必须向所有其他输出链路输出一帧。
由于算子的行为通常取决于算子参数集,因此可以通过以下接口查询这些参数:
|
序号 |
功能 |
描述 |
|---|---|---|
|
1 |
|
获取算子参数的值。 |
VisualApplets 提供了几个用于为自定义算子获取、生成和存储图像数据的函数:
|
序号 |
功能 |
描述 |
|---|---|---|
|
1 |
|
获取在 ImgIn 端口上可用的图像。 |
|
2 |
|
将图像输出到 ImgOut 端口。 |
|
3 |
|
查询 ImgIn 端口是否可以提供图像。 |
|
4 |
|
查询 ImgOut 端口是否可以接收图像。 |
|
5 |
|
创建新图像。 |
|
6 |
|
删除图像。 |
|
7 |
|
将图像存储在算子实例的本地存储中,并提供一个名称,以便稍后引用该图像。 |
|
8 |
|
查询存储在算子实例中的图像数量。 |
|
9 |
|
通过索引获取存储的图像。 |
|
10 |
|
通过索引获取存储图像的名称。 |
|
11 |
|
通过名称获取存储的图像。 |
|
12 |
|
创建新的图像格式句柄,该句柄由与给定 port 关联的格式进行初始化。 |
|
13 |
|
创建作为给定格式副本的新图像格式。 |
|
14 |
|
删除先前创建的图像格式句柄。 |
通过图像句柄操作图像时,可使用以下函数:
|
序号 |
功能 |
描述 |
|---|---|---|
|
1 |
|
获取图像格式。 |
|
2 |
|
设置帧的 Property(例如高度)。 |
|
3 |
|
获取帧的 Property。 |
|
4 |
|
设置像素分量值 |
|
5 |
|
获取像素分量值 |
|
6 |
|
设置行的单独长度。 |
|
7 |
|
获取单独行的长度。 |
可以通过以下函数操作图像格式:
|
序号 |
功能 |
描述 |
|---|---|---|
|
1 |
|
设置图像格式 Property(例如最大宽度)。 |
|
2 |
|
获取图像格式 Property。 |
模拟函数可以使用以下函数将状态消息(即错误消息)注入 VisualApplets 模拟系统中:
|
序号 |
功能 |
描述 |
|---|---|---|
|
1 |
|
创建状态消息。 |
|
2 |
|
设置状态消息的 Property(如严重性)。 |
|
3 |
|
将状态消息提交至模拟引擎。 |
为了查询信息和配置参数,必须通过软件接口交换数据。为了保持接口函数简洁同时提供类型安全的接口,实现了一种数据抽象机制。每当需要传输不同类型的数据时,就会使用一种名为 va_data 的数据结构,其中包含对数据的引用以及有关底层数据类型的信息。该数据结构由用户创建,但通过下面列出的专用函数进行配置。下表显示了此方法处理的数据类型:
|
数据类型 |
描述 |
|---|---|
|
|
以 32 位整数形式给出的 enum 条目 |
|
|
32 位有符号整数 |
|
|
32位无符号整数 |
|
|
64位有符号整数 |
|
|
64位无符号整数 |
|
|
浮点数,双精度 |
|
|
32位有符号整数数组 |
|
|
32位无符号整数数组 |
|
|
64位有符号整数数组 |
|
|
64位无符号整数数组 |
|
|
双精度浮点数数组 |
|
|
给定的字符串为 |
配置先前创建的 va_data 结构体
(vaData),用于通过以下函数设置数据通信:
va_data* va_data_enum(va_data* vaData, int32_t *data)
va_data* va_data_int32(va_data* vaData, int32_t *data)
va_data* va_data_uint32(va_data* vaData, uint32_t *data)
va_data* va_data_int64(va_data* vaData, int64_t *data)
va_data* va_data_uint64(va_data* vaData, uint64_t *data)
va_data* va_data_double(va_data* vaData, double *data)
va_data* va_data_int32_array(va_data* vaData, int32_t *data, size_t elementCount)
va_data* va_data_uint32_array (va_data* vaData, uint32_t *data, size_t elementCount)
va_data* va_data_int64_array (va_data* vaData, int64_t *data, size_t elementCount)
va_data* va_data_uint64_array (va_data* vaData, uint64_t *data, size_t elementCount)
va_data* va_data_double_array (va_data* vaData, double *data, size_t elementCount)
va_data* va_data_string(va_data* vaData, char data*, size_t strSize)
va_data* va_data_const_string(va_data* vaData, const char **data)
对于字符串,有两种字符串通信方式:
-
通过以下方式提供 char 数组
va_data_string(。随后,查询到的字符串数据将被复制 到该数组中。 -
提供指向以下内容的指针
const char*。当查询类型为VA_STRING的信息时,将返回指向内部字符串 表示形式的指针。使用 此方法时,请检查返回字符串的生命周期。
示例代码:以下代码展示了如何查询图像宽度。
uint32_t imgWidth;
va_data
va_imgWidth;
va_data_double(&va_imgWidth,&imgWidth);
vaSi_Image_GetProperty(imageHandle, "Width", &va_imgWidth);
此后,变量 imgWidth 将包含请求的
信息。
以下是对指定仿真接口函数的参数及返回值进行的 详细说明。
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
参数名称。 |
|
参数 3 |
用于查询值的返回参数。 |
|
描述 |
返回具有指定名称的参数的值。 |
|
返回值 |
0:值为查询的数据 <0: Cannot query parameter |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
算子端口名称。 |
|
参数 3 |
图像句柄的返回参数。 |
|
描述 |
获取在指定端口进入算子的图像,并返回引用该图像的句柄。在从仿真函数返回之前,必须通过调用以下函数来存储此图像: |
|
返回值 |
0: OK <0 : Cannot get image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
算子端口名称。 |
|
参数 3 |
图像句柄。 |
|
描述 |
将图像输出到指定的端口。 |
|
返回值 |
0:操作已成功完成 <0: Cannot output image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
算子输入端口名称。 |
|
描述 |
返回指定名称的端口处是否有可用的输入图像。 |
|
返回值 |
true:图像可用 false:无可用图像 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
算子输出端口名称。 |
|
描述 |
返回指定名称的输出端口是否可以接收图像。 |
|
返回值 |
true:输出已准备好接收下一幅图像 false:输出尚未准备好接收图像 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
新图像的图像格式。 |
|
参数 3 |
图像句柄的返回参数。 |
|
描述 |
根据参数 2 给定的格式创建一张空白图像。在从仿真函数返回之前,必须通过调用以下函数来存储此图像:
|
|
返回值 |
0:确定 <0 : Could not create image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
要删除的图像的句柄。 |
|
描述 |
删除由给定图像句柄引用的图像。 |
|
返回值 |
0:操作已成功完成 <0: Error during deleting image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
图像句柄。 |
|
参数 3 |
存储图像所使用的名称。稍后可以通过此名称查询该图像。 |
|
描述 |
将图像存储在算子仿真实例的本地存储中。 |
|
返回值 |
0:操作已成功完成 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
图像计数的返回参数。 |
|
描述 |
返回存储在算子仿真实例中的图像数量。 |
|
返回值 |
0: OK <0: Can’t query information. |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
所存储图像数组中的索引。 |
|
参数 3 |
图像句柄的返回参数。 |
|
描述 |
获取之前存储的图像。该图像将从图像存储中移除。在从仿真函数返回之前,必须通过调用以下函数重新存储该图像 |
|
返回值 |
0:确定 <0 : Could not get image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
所存储图像数组中的索引。 |
|
描述 |
返回图像名称的字符串。 |
|
返回值 |
非 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
存储图像时使用的名称。 |
|
参数 3 |
图像句柄的返回参数。 |
|
描述 |
获取之前使用指定存储名称存储的图像。该图像将从图像存储中移除。在从仿真函数返回之前,必须通过调用以下函数重新存储该图像
|
|
返回值 |
0:确定 <0 : Could not get image |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
算子端口名称。 |
|
参数 3 |
格式句柄的返回指针。 |
|
描述 |
创建一个新的图像格式对象并返回相应的句柄。该格式由具有指定名称的端口的格式进行初始化。在从仿真函数返回之前,必须通过调用以下函数删除该格式
|
|
返回值 |
0:确定 <0 : Could not create format |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
正在复制的格式的句柄。 |
|
参数 3 |
格式句柄的返回参数。 |
|
描述 |
创建一个新的图像格式对象并返回相应的句柄。该格式由提供的格式进行初始化。在从仿真函数返回之前,必须通过调用以下函数删除该格式
|
|
返回值 |
非 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
提供给算子仿真函数的仿真句柄。 |
|
参数 2 |
正在删除的格式的句柄。 |
|
描述 |
删除由给定格式句柄引用的图像格式对象。 |
|
返回值 |
0: OK <0 : Could not delete format |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
先前创建的格式的句柄,该格式将被设置为图像的格式。 |
|
描述 |
查询由图像句柄引用的图像的格式。 |
|
返回值 |
0:操作已成功完成 <0: Cannot query format |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
用于标识要设置的 Property 的字符串。 |
|
参数 3 |
指向用于设置新 Property 的数据结构的指针。 |
|
描述 |
设置图像句柄引用的图像的 Property。可以通过此函数设置以下 Property:
|
|
返回值 |
0:Property 设置成功 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
用于标识要查询的 Property 的枚举值。 |
|
参数 3 |
指向用于数据通信的数据结构的指针。 |
|
描述 |
查询图像句柄引用的图像的 Property。可用 Property 如下:
|
|
返回值 |
0:Property 查询成功 |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
行号。 |
|
参数 3 |
行长度。 |
|
描述 |
将引用行的长度设置为一个自定义值,该值可以不同于整体图像宽度(但不得超过图像格式定义的最大图像宽度)。 |
|
返回值 |
0:操作已成功完成 <0: Cannot set line length to the given value |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
行号。 |
|
Parameter 3 |
行长度的返回参数。 |
|
描述 |
返回引用行的长度。 |
|
返回值 |
0: OK <0: Cannot query line length |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
帧内的位置。 |
|
参数 3 |
分量索引。 |
|
参数 4 |
像素分量值。 |
|
描述 |
将相应的像素分量设置为给定值。 |
|
返回值 |
0:操作已成功完成 <0: Error setting the pixel component value |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像句柄。 |
|
参数 2 |
帧内的位置。 |
|
参数 3 |
分量索引。 |
|
参数 4 |
像素分量值的返回参数 |
|
描述 |
返回相应的像素分量值。 |
|
返回值 |
0:操作已成功完成 <0: Error getting the pixel component value |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像格式句柄。 |
|
参数 2 |
用于标识要设置的 Property 的枚举值。 |
|
参数 3 |
指向包含新 Property 的数据结构的指针。 |
|
描述 |
设置由句柄引用的图像格式的 Property。可以通过此函数设置以下 Property:
|
|
返回值 |
0:Property 设置成功
|
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
图像格式句柄。 |
|
参数 2 |
用于标识要查询的 Property 的枚举值。 |
|
参数 3 |
指向将被查询的 Property 覆盖的数据结构的指针。 |
|
描述 |
查询由句柄引用的图像格式的 Property。可查询的
Property 与可通过该函数设置的
Property 相同。
|
|
返回值 |
0:Property 查询成功
|
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
仿真句柄。 |
|
参数 2 |
创建的错误消息的返回参数。 |
|
描述 |
创建一个可提交给仿真引擎的状态消息。 |
|
返回值 |
0:确定 <0: Can’t create message |
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
仿真句柄。 |
|
参数 2 |
状态消息句柄。 |
|
参数 3 |
要设置的 Property 的名称。 |
|
参数 4 |
新 Property 值 |
|
描述 |
更改状态消息 Property。可通过此函数设置以下 Property:
|
|
功能 |
|
|---|---|
|
语法 |
|
|
参数 1 |
仿真句柄。 |
|
参数 2 |
要提交的状态消息的句柄。 |
|
描述 |
已向仿真引擎提交状态消息。 |
|
返回值 |
0:确定 <0: Can’t submit message |
算子的文档应以 HTML 文件形式提供。如果可用,构成文档的所有文件都需要在选项卡 → 下指定:

指定的第一文件被解释为算子文档的起点。该文件的命名规则为:
<NameOfCustomOperator>.htm.
确保提供 CSS 文件。 同时请确保提供所有相关的图像文件。
您可以使用 VisualApplets 安装目录中子目录下的算子模板 Examples/CustomLibrary/OperatorTemplate.
当您包装好 HDL 代码使其接口与生成的黑盒相匹配后,您需要执行最后几个步骤来完成您的自定义算子:
-
从您的实现中创建一个网表。
![[提示]](../common/images/admon/tip.png)
设置 Add IO Buffer = NO在创建网表时,请确保您的综合工具不会自动添加 I/O 缓冲区。如果您使用 XST 进行网表综合,请设置
Add IO Buffer = NO否则,生成的 NGC 文件将在 VisualApplets 构建流程中引发错误。
![[提示]](../common/images/admon/tip.png)
网表生成过程中的警告 在生成网表时,可能会输出关于自定义算子接口未使用的 I/O 端口的警告。未使用的 I/O 端口是指根据您的算子定义生成但未与您的 IP 核连接的所有端口。您可以忽略这些警告。
这种行为的示例包括您在以下位置找到的所有自定义算子示例:
ExamplesVisualApplets 安装目录:\Examples\CustomLibrary -
如果需要,还可以定义约束文件(
*.ucf格式(如果您使用 Xilinx ISE),*.xdc如果您使用 Xilinx Vivado,则使用此格式)。 -
(可选)按照“定义自定义算子的软件接口”一节中的描述设置算子的软件接口。
-
(可选)按照“创建自定义算子文档”一节中的描述创建算子文档。
现在,您需要在 VisualApplets 中完成算子定义。为此,请按以下步骤操作。
必需步骤:
-
转到标签页。

-
指定您生成的网表文件。
-
如果您定义了约束,请指定约束文件。
-
指定支持的设备:设备名称即目标平台的 FPGA 类型名称。请使用与 VisualApplets 的项目信息框中完全相同的拼写。如果支持多个 FPGA 类型,请使用以空格分隔的名称列表。

如果设计使用了自定义算子,但目标平台上的 FPGA 不在此列表中,则 DRC 将报错,提示目标平台不支持该算子。
-
指定支持的 Xilinx Tool(s)。您可以同时勾选 ISE 和 Vivado。使用 ISE 生成的网表通常也与 Vivado 构建流程兼容,但您应该检查您的算子实现是否如此。您需要定义支持给定网表的工具的最低版本号。通常,这就是您用于创建网表的版本。
如果设计使用了自定义算子,但在构建设计时未指定所用的工具,则 DRC 将报错,提示目标平台不支持该算子。
![[提示]](../common/images/admon/tip.png)
定义多个核心 您可以为同一个自定义算子定义多个核心。这允许使用针对设备和工具的自定义算子实现,以便为不同的目标平台选择合适的实现来构建 applet。
可选步骤:
-
可选,输入算子的逻辑资源消耗。只需输入 Xilinx 工具在生成网表期间估计的值。
-
在标签页下,指定模拟库(自定义算子的软件接口)的路径。
-
在标签页下,指定图标文件的路径。此文件包含在 VisualApplets 中显示自定义算子时将使用的图标。
-
在标签页下,指定组成自定义算子文档的所有文件。确保同时提供 CSS 文件和所有相关的图像文件。
-
如果要保护您的算子设计:在左下角,激活选项。在打开的对话框中:
-
确保激活了保护模式 。
-
输入您的密码。
-
点击 。

您随时可以在之后的任何时间使用自定义库元素的上下文菜单来保护您的自定义算子设计。
![[提示]](../common/images/admon/tip.png)
保护选项 启用保护后,自定义算子将变为“黑盒”。保护自定义算子设计有两种方法:
-
通过密码保护:之后可以通过密码打开和编辑自定义算子设计。没有密码的用户将无法看到自定义算子的任何详细信息(黑盒)。
-
不可逆保护:如果您选择保护模式单向,则自定义算子将永久变成黑盒,并且无法重新打开,即使您自己也无法打开。
“单向”保护是不可逆的:如果您选择保护模式为单向(而不是密码),则自定义库元素将永远无法重新打开,即使您自己也无法打开。如果您计划在稍后增强该元素,请确保选择保护模式。或者,您可以在启用此保护模式之前保存该元素的副本(作为分层框或非受保护算子)。
-
-
点击 。
现在,您的新自定义算子已准备好在设计中使用。
包含所有算子的自定义库存储为一个
<LibaryName>.val 或
<LibaryName>.vl 文件。
<LibaryName> 是自定义库的名称。
该文件可分发并直接在 VisualApplets 中应用。只需将其复制到 VisualApplets 设置中指定的自定义库目录中即可( → → → )

-
复制新的
<LibaryName>.val或<LibaryName>.vl文件到 VisualApplets 安装目录的 Custom Library 文件夹中。 -
在 VisualApplets 图形用户界面中重新扫描自定义库:右键单击库名称,并从子菜单中选择 。

在 VisualApplets 示例目录中,您可以找到一个名为
CustomLibrary.vl
的现成库,其中包含所有示例算子。
对自定义算子进行更改时,这些更改不会反映在已使用该自定义算子的设计中。因此,您需要更新设计中的自定义算子实例。
-
右键单击该算子。
-
从子菜单中选择 或 。

Custom Libraries 的更新机制与 User Libraries 完全相同。
在安装目录中,您可以找到一个用于定义自定义算子的自定义算子模板。
\Examples\CustomLibrary 要使用自定义算子模板:
-
右键单击要在其中创建新自定义算子的自定义库。
-
从子菜单中选择 → 。

-
指定算子模板的路径。
-
点击 。
随后将立即打开 对话框:

-
为您的新自定义算子命名,然后按照 'Defining an Individual Custom Operator via GUI' 一节中的说明进行操作。
自定义算子的定义以 XML 格式存储。可以从算子库导出相关的 XML 文件,或者使用以前导出的 XML 文件导入算子。
在下文中,我们将介绍所需的参数,其中参数名称对应于具有相同名称的 XML 标签。像这样的参数 ImgInInfo 将会转换为类似以下的 XML 条目:
<ImgInInfo> ImgInPortNames </ImgInInfo> 其中
ImgInPortNames 是该值,在此情况下,它将是一个端口名称序列。这些参数采用分层排序。在下表中,带有灰色背景的行将指示期望参数所在的层级位置。
简单的参数值可以属于以下类型:
-
选择(Choice):允许的值为
YES或NO -
字符串(String):不含空格的 ASCII 字符串
-
Integer
-
浮点数
某些参数是由值的结构组成的,其中数组或记录可以作为构造元素。输入数组时,需使用由空格分隔的值列表,这些值本身也可以具有结构。输入记录时,请遵循以下格式,其中 RecordName 是记录标识符,
attrX 是记录条目的标识符,以及
attrXValue 是对应的值:
<RecordName attr1=”attr1Value” .. attrN=”attrNValue”/>
例如,提供一个名为 port 的记录,其中包含名称和宽度条目:
<port name=”flag” width=”4”/>
XML 格式的根标签是 算子 ,带有一个属性
name ,应在其中提供自定义算子名称:
<Operator name=”XYZ”> … </Operator>
![]() |
遵循 VHDL 命名约定 |
|---|---|
|
在 VA GUI 中定义算子名称时,请确保符合 VHDL 命名规范。 VHDL 有效名称的定义如下: “端口、信号, 变量, 实体名, 架构体主体或类似对象的有效名称由一个字母后跟任意数量的字母或数字组成,且不含空格。有效名称也称为命名标识符。VHDL 不区分大小写。但是,名称中可以使用下划线,但不能以划线开头或结尾。不允许使用两个连续的下划线。” |
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
字符串 |
供应商名称。 |
|
|
字符串 |
算子的版本号。该值可自由选择,旨在供用户进行版本识别。 |
|
|
字符串数组 |
算子的核心网表列表。第一个字符串必须是
|
|
|
字符串 |
包含该算子高级仿真模型的软件库(动态链接库)的文件名的引号字符串。 |
|
|
字符串 |
包含算子图标的文件名的引号字符串。 |
|
|
字符串数组 |
包含帮助内容(HTML + 图像)的引用文件名列表。第一个文件被视为主要的 HTML 文件。 |
表 7. Operator/Info
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
字符串数组 |
随后定义的 info 结构名称列表
( |
|
|
字符串数组 |
随后定义的 info 结构名称列表
( |
|
|
字符串 |
用于定义 ImgIn 端口处的输入是彼此同步还是异步的字符串。该字符串可以是 “Sync” 或 “Async”。 |
|
|
字符串数组 |
随后定义的 info 结构名称列表
( |
|
|
字符串数组 |
随后定义的 info 结构名称列表
( |
|
|
字符串数组 |
通用信号输入的引脚名称列表。 |
|
|
字符串数组 |
通用信号输出的引脚名称列表。 |
|
|
字符串数组 |
随后定义的 info 结构名称列表
( |
表 8. Operator/IO
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
Integer |
算子消耗的 FPGA LUT 元素数量 |
|
|
Integer |
算子消耗的 FPGA 寄存器数量 |
|
|
Integer |
算子消耗的 Block RAM 元素数量 |
|
|
Integer |
算子消耗的嵌入式乘法器数量 |
表 9. Operator/Properties
图像输入端口规范通过配置文件中的以下语法进行:
<ImgIn name=”IMG_IN_IDENTIFIER”> Parameters </ImgIn>;
在此 IMG_IN_IDENTIFIER 是上述参数中
提供的图像输入端口名称之一 Operator/IO/ImgInInfo。内容 Parameters 用于指定图像接口端口的 Property:
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
Integer |
图像数据端口的宽度 |
|
|
Integer |
输入数据缓存 FIFO 的深度,该深度至少需要由 VA Core 提供。该值必须介于 15 和 1023 之间且为 2 的幂减 1。 |
|
|
记录数组 |
图像格式记录列表 |
表 10. Operator/ImgIn
图像格式记录具有以下结构:
<ImgFormat name=”FORMAT” maxWidth=”X1” maxHeight=”Y1” alias=”NAME1”/>
条目 FORMAT 是一个字符串值,其图像格式采用下文讨论的图像格式命名规则进行编码。属性
maxWidth 和 maxHeight 是可选的,用于固定图像大小的限制。如果不存在这些属性,用户稍后可以在 VisualApplets 中自由选择图像大小约束。属性 alias
也是可选的,如果存在,则定义该格式在 GUI 中显示的名称。
图像输出端口的规范通过配置文件中的以下语法来实现:
<ImgOut name=”IMG_OUT_IDENTIFIER”> Parameters </ImgOut>;
在此 IMG_OUT_IDENTIFIER 是在上述参数中提供的图像输出端口名称之一 Operator/IO/ImgOutInfo内容 Parameters 指定了图像接口端口的 Property:
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
Integer |
图像数据端口的宽度 |
|
|
Integer |
输出数据的缓冲区 FIFO 深度,VA core 至少需要提供该深度。该值必须是介于 15 和 1023 之间的 2 的幂减 1。 |
|
|
记录数组 |
图像格式记录列表 |
表 11. Operator/ImgOut
图像格式采用以下命名规则进行编码:
{BaseFormat}{BitsPerPixel}x{Parallelism}
可选地,可以存在用于图像尺寸以及有符号分量数据通知的后缀:
{BaseFormat}{BitsPerPixel}x{Parallelism}x{Dimension}{Sign}
该维度的含义如下:
-
Dimension = 2– 二维图像意味着该图像由行结束标志和帧结束标志共同构建。 -
Dimension = 1– 一维图像意味着没有将传入的行划分为帧的帧结束标志。
当未指定大小时,默认值为 2。后缀
{Sign} 可以是 s 用于有符号像素分量,或者
u 用于无符号值,如果未提供此类后缀,则默认值为 u
。支持的 Color Format 有 rgb,
yuv, hsi, lab 和
xyz.
示例如下:
-
gray8x4 – 8位像素灰度格式,Parallelism 为 4
-
rgb24x2 – 3x8位像素 RGB Color Format,Parallelism 为 2
-
gray16x1 – 16位像素灰度格式,数据字中仅包含单个像素
-
gray8x4x1 – 每个像素 8 位的一维灰度图像,Parallelism 为 4
-
gray16x1s – 包含带符号 16 位分量的灰度图像,数据字中仅包含单个像素
寄存器输入端口规范通过配置文件中的以下语法进行:
<RegIn name=”REG_IN_IDENTIFIER”> Parameters </RegIn>;
在此 REG_IN_IDENTIFIER 是在上述参数中提供的寄存器输入端口名称之一 Operator/IO/RegInInfo内容 Parameters 用于指定寄存器接口端口的 Property:
寄存器输出端口规范通过配置文件中的以下语法进行:
<RegOut name=”REG_OUT_IDENTIFIER”> Parameters </RegOut>;
在此 REG_OUT_IDENTIFIER 是在上述参数中提供的寄存器输出端口名称之一 Operator/IO/RegOutInfo内容 Parameters 用于指定寄存器接口端口的 Property:
内存接口规范通过配置文件中具有以下语法的区段进行:
<Mem name=”MEM_IDENTIFIER”> Parameters </MEM>
在此 MEM_IDENTIFIER 是在上述参数中提供的内存端口名称之一 Operator/IO/MemInfo。内容 Parameters 用于指定内存接口的 Property:
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
Integer |
数据宽度 |
|
|
Integer |
地址宽度 |
|
|
Integer |
用于标记写访问权限的标志宽度。此参数必须 >= 1。 |
|
|
Integer |
用于标记读访问权限的标志宽度。此参数必须 >= 8。 |
|
|
Integer |
用于传达可用写命令数量的端口 Width |
|
|
Integer |
用于传递可用读取命令数量的端口宽度 |
|
|
字符串 |
此参数表示内存接口时钟与设计时钟之间的关系。支持以下值:
|
表 14. Operator/Mem
IP 核网表规范通过配置文件中具有以下语法的区段进行:
<Core name=”CORE_IDENTIFIER”> Parameters </Core>
在此 Core_IDENTIFIER 是在上述参数中提供的核心名称之一 Operator/Cores。该内容
Parameters 指定了 IP core 的 Property:
|
参数名称 |
键入 |
描述 |
|---|---|---|
|
|
字符串数组 |
core 支持的 FPGA 设备名称列表(例如:
|
|
|
字符串 |
网表文件的加引号 UTF-8 编码文件名。 |
|
|
字符串 |
可选约束文件的加引号 UTF-8 编码文件名。 |
|
|
字符串 |
可以使用给定网表的 ISE 工具流的最低版本号
(例如: |
|
|
字符串 |
可以使用给定网表的 Vivado 工具流的最低版本号
(例如: |
表 15. Operator/Core








上一页

