CoefficientBufferMultiRoi 算子 (imaFlex)

Operator Library: Memory

适用于以下硬件平台
imaFlex CXP-12 Penta
imaFlex CXP-12 Quad

该算子允许您将图像数据从主机 PC 上传到图像采集卡 RAM (DRAM)。它为任意数量的感兴趣区 (ROI) 提供连续的数据输出。此处图像文件被用作通用的数据容器。因此,上传的图像可以包含任意数据,例如系数。每个图像都被分配给一个输出内核。此外,该算子提供了与 RamLUT 算子相同的初始化接口,其中每个内存地址都可以通过手动、文本文件或二进制文件进行初始化。所有系数图像都存储在 Frame Grabber RAM (DRAM) 中。需要一个类型为 RAM 的 VisualApplets 资源。请查看 'Allocation of Device Resources' 了解更多信息。有关算子延迟的信息,请参见 Table 46, 'Individual Latencies of the Operators in Library Memory'。多个类型为 RAM 的资源通过共享内存概念使用相同的物理RAM。有关如何使用共享内存的文档,请参阅 Application Note: Shared Memory。

算子 CoefficientBufferMultiRoi 在输出端支持内核。如果使用图像文件初始化算子,则每个图像文件都会分配给相应的输出内核。如果使用文本文件或二进制文件手动初始化缓冲区,则必须确保数据的顺序正确。精确的数据格式化说明如下。

算子初始化

该算子通过多种方式简化了缓冲区内容的编程。对于每种方式,都必须在综合过程之后、在运行时使用小程序的时刻对缓冲区进行编程。

寄存器访问

编程缓冲区的一种可能性是使用寄存器接口,该接口提供参数 InitAddress 和 InitData。首先,使用 InitAddress 参数设置地址。然后,将数据写入 InitData 参数。

写入数据会促使算子实际写入缓冲区并替换先前的值。写入最后一个并行内核的最后一个内核元素会导致算子实际写入 RAM 并替换先前的值。RAM 地址处的数据必须按如下方式组织(另请参阅上面的动画):

  • 每个 RAM 地址包含 O.Parallelism * O.KernelColumns * O.KernelRows 个值。

  • 因此,InitData 是一个包含 O.Parallelism * O.KernelColumns * O.KernelRows 个值的数组。

  • 首先,必须列出内核行的所有值,即在每个内核 column 上进行迭代。

  • 然后,数据在所有内核 rows 上进行迭代。

  • 最后,对所有并行数据内核重复相同的操作。

文件访问

编程缓冲区的第二种可能性是使用一个或多个包含内容的文件。文件访问比寄存器访问更快,但需要注意一些事项。文件可以采用不同的格式。您必须使用 InitFileMode 参数定义格式。

text_with_checks

在此模式下,初始化文件必须是一个文本文件,其中值字符串由空格、制表符、换行符 (LF) 或回车换行符 (CRLF) 分隔。算子会检查这些文件中的错误,如果文件无法使用,则会报告错误。

每个值代表一个内核元素,并且必须是在正确范围内的十进制数。文件需要包含作为值的精确数量的内核元素。如果您使用的 parallelism 大于 1,则值的数量必须为 parallelism * kernel elements。

下图展示了用于 4x3 内核的文件:

text_raw

此模式类似于 text_with_checks 模式,但错误检查较少。在此模式下,每个值必须在单独的行中提供。与 text_with_checks 模式相比,在此模式下加载文件的速度更快。由于每个值都写入单独的行中,因此 parallelism 不会影响此文件格式中的数据序列。上面的示例在 text_raw 模式下如下所示:

binary

binary 模式假定为二进制文件,其中每个内核条目使用 8 个字节。如果内核条目值可以用少于 64 位表示,则忽略未使用的位。这是将值写入 RAM 的最快方法。由于所有值都是连续写入的,因此 parallelism 不会影响此文件格式的数据值序列。上面的示例在 binary 模式下如下所示:

image_file

image_file 模式期望在 InitFileName 参数中提供由逗号或分号分隔的图像文件列表。每个文件用于初始化一个内核值:第一个初始化文件分配给第一个内核值,第二个文件分配给第二个内核值,以此类推...

由于此模式使用常规图像,因此 parallelism 与文件的的数据格式无关。初始化文件可以采用图像格式 *.tif 或 *.bmp。各个图像文件不必采用相同的格式,也不必包含相同数量的像素。

如果每行图像的最大字节数达到 32 位整数值的边界,则算子可能无法加载图像。这种情况仅在 O.Max.Img.Width 接近其最大宽度 (2^RamAddressWidth) 且 O.Parallelism 也大于 1 时才会发生。

当初始化文件包含 2^RamAddressWidth * KernelSize * Parallelism 个值时,内存将被完全覆盖,从地址 0 开始。在这种情况下,不触及参数 InitAddress。

当初始化文件包含的数据超过可写入 RAM 的数据量时,仅使用初始化文件的一部分。使用文件开头的数据,直到没有可用的内存空间为止。

当初始化文件包含较少的条目时,将执行部分初始化。在这种情况下,初始化从由 InitAddress 参数给定的地址开始。参数 InitAddress 自动递增到最后一个写入的内存条目之后的位置。这允许监视写入了多少个内存条目。当文件包含的值多于 (2^RamAddressWidth - InitAddress) * KernelSize * Parallelism 个时,初始化将在写入内存的最后一个条目后停止,并且 InitAddress 设置为 0。

对于上面指定的初始化模式,InitFilename 参数指定包含初始文件的文件。最后,将值 1 写入 LoadInitFile 参数开始读取文件,如果被接受,则将值写入硬件。将 0 写入 LoadInitFile 参数不会导致加载这些值。如果您不希望在小程序初始化过程中将初始文件加载到硬件中,这会很有用。

在仿真期间,加载初始化文件的操作与在运行时相同。对于部分配置或在出现错误的情况下,检查仿真日志中的输出可能会很有用:在 Simulation 对话框中激活 Show Details。

ROI 定义

一旦算子的 frame grabber RAM (DRAM) 使用图像数据进行初始化,它就会读出多个感兴趣区 (ROI)。您可以使用以下参数定义 ROI:

  • 读取的 ROI 数量:MaxNumRoI 和 NumRoI

  • ROI 的大小和位置:XOffset、 XLength、 YOffset 以及 YLength

MaxNumRoI 参数指定可读取的最大 ROI 数量。每个 ROI 坐标 参数字段 XLength、 YLength、XOffset 和 YOffset 均有 MaxNumRoI 个条目。

参数 NumRoI 指定运算符在输出端提供的实际 ROI 数量。如果 NumRoI 设置为 dynamic,其值不能超过 MaxNumRoI 的值。如果设置为 dynamic, NumRoI 可以在图像采集期间进行更新。 在采集运行期间,运算符会循环读取指定数量 的 ROI。运算符会等待 ROI cycle 结束, 直到其更改为 NumRoI。

所有 ROI 均按顺序读取,并作为单独的图像在运算符输出端提供:ROI 0、ROI 1、ROI 2...直至 ROI N-1。其中 N 是由参数 NumRoI 指定的当前读取的 ROI 数量。参数字段 XOffset、XLength、 YOffset 和 YLength 指定了一组 ROI。您可以将这些参数设置为 dynamic 或 static,这指定了您是否可以在运行时调整该参数。当设置了一个 ROI 参数的参数类型时,所有 ROI 参数的参数类型都会自动调整。了解如何配置字段 参数,请参见 'Parameter Editing'。

只要不超过最大输出帧尺寸,支持将所有可能的矩形区域用作 ROI 定义,即可以将单像素、单行、单列、矩形区域 或完整帧定义为 ROI。

不同的 ROI 不需要具有相同的 尺寸。

每个 ROI 都可以单独定义。

ROI 可以重叠,也可以重复。

X 坐标参数 XOffset 和 XLength 必须为输出 parallelism 的步长倍数。

通过将 XLength 或 YLength 设置为 零,您可以定义空的 ROI。然后,运算符会在其输出端提供一个空图像(或链接类型为 VALT_LINE1D 的行)。空图像不包含任何像素。链接类型为 VALT_PIXEL0D 的空 ROI 将导致根本无输出 。

如果运算符使用的图像协议为 VALT_LINE1D 或 VALT_PIXEL0D,则是相对于初始化文件来定义 ROI 的,该文件始终被视为二维 图像。系统会读取二维 ROI,但根据链接类型的不同,输出 是一系列 ROI 帧、行或像素。

对于链接类型 VALT_LINE1D,输出是无限的行序列,其中单独定义的 ROI 之间不存在 分隔。类似地,对于链接类型 VALT_PIXEL0D,运算符提供无限的像素序列, 其中单独的 ROI 甚至 ROI 行之间不存在任何分隔。

一旦采集开始且运算符的输出未被后续运算符阻塞,运算符就会在其输出端提供 ROI 数据。 有关运算符延迟的信息,请参阅 Table 46, 'Individual Latencies of the Operators in Library Memory'。

如果 ROI 参数类型设置为 dynamic,您可以动态更新所有 ROI。 但是,更新后的 ROI 只有在当前的“ROI cycle”完成且读取了所有 NumRoI ROI 后才会生效。

[注意] 高 ROI 数量与时序

随着由参数 MaxNumRoI 定义的最大 ROI 定义数量的增加, 运算符的 BRAM 消耗也会增加。这可能会导致高时钟速率下的时序问题。例如, MaxNumRoI 为 65536 可能无法在完整设计中满足时序要求。

算子限制

以下限制适用于 CoefficientBufferMultiRoi 运算符:

  • 如果 DRAM 未完全初始化,则不会检查 ROI 坐标是否实际包含图像数据。在这种情况下,运算符会从 内存中读取随机虚拟值。

  • 最大链接 Property 因算子的使用方式而异。有关详细信息,请参阅下面的 Supported Link Format 一节。

  • 高 MaxNumRoI(接近其最大值 65536)可能会导致时序问题。

  • 当 InitFileLoadMode 设置为 image_file 模式时, 可能会无法加载过宽的图像。

带宽优化

为了获得最佳性能,所使用的数据位数应尽可能与模块参数 RamDataWidth 中提供的位数相匹配。如果位宽、内核大小和 parallelism 的乘积等于内部 RAM 端口宽度 RamDataWidth,则达到流经运算符的最大带宽。 请注意,内部位宽可以通过使用内核来增加,但完整的内核仍将作为 单个像素寻址。

I/O Property

Property 值
Operator Type M
Output Link O,数据输出

Supported Link Format

Link Parameter Output Link O
Bit Width [1, 64]12
Arithmetic any
Parallelism [1, RamDataWidth / BitWidth / KernelColumns / KernelRows]2
Kernel Columns [1, RamDataWidth / Bit Width / Parallelism / KernelRows]2
Kernel Rows [1, RamDataWidth / Bit Width / Parallelism / KernelColumns]2
Img Protocol any
Color Format any
Color Flavor any
Max. Img Width [1, 2^RamAddressWidth * Parallelism]3
Max. Img Height [1, 2^RamAddressWidth]3

1

输入 bit width 的范围是:

  • 对于无符号输入:[1, 64]

  • 对于有符号输入:[2, 64]

  • 对于无符号彩色输入:[3, 63]

  • 对于有符号彩色输入:[6, 63]。

输入 bit width 不得超过原生 RAM 数据宽度 RamDataWidth。

2

位宽、Parallelism 和核大小的乘积不得超过原生 RAM 数据宽度:

3

最大图像尺寸不得 超过可用的 RAM:

这会针对 O.MaxImageWidth 和 O.MaxImageHeight 产生以下条件:

参数

RamDataWidth
键入 静态写参数
默认 不适用
范围 整型数字

此参数提供可在 RAM 中使用的最大数据宽度。 此参数取决于所使用的硬件平台。

RamAddressWidth
键入 静态写参数
默认 不适用
范围 整型数字

此参数提供可使用的地址位数。可用 RAM 插槽的数量由 2^RamAddressWidth 定义。当前的 RamAddressWidth 取决于硬件平台以及设计中当前的 Memory 运算符数量(即使用 RAM 资源的运算符)。

InitAddress
键入 动态写入参数
默认 0
范围 [0, 2^RamAddressWidth-1]

此参数定义由参数 InitData 定义的数据的地址。在使用初始化文件初始化 RAM 时,此参数也可以用作偏移地址。请参阅上面的说明。

InitData
键入 动态写入参数
默认 0
范围 [0, 2^O.BitWidth-1]

此字段参数定义写入由参数 InitAddress 定义的地址的数据。InitData 包含 O.Parallelism * O.KernelColumns * O.KernelRows 个值。写入 InitData 数组的最后一个字段将触发实际的硬件写入操作。请参阅上面的详细说明。

InitFileLoadMode
键入 动态写入参数
默认 image_file
范围 {text_with_checks, text_raw, binary, image_file}

此参数定义加载到查找表中的文件的文件格式和模式。

  • text_with_checks:一个文本文件,其中的内核值由空格、制表符等分隔。

  • text_raw:一个文本文件,其中的内核值按单独的行写入。

  • binary:一个二进制文件,其中的内核值由 8 字节组成。

  • image_file:文件列表(*.tiff 或 *.bmp),由逗号或分号分隔,其中每个图像文件都分配给一个内核索引。

请参阅上面的详细说明。

InitFileName
键入 动态写入参数
默认 InitCoefficientBuffer.tif
范围

此参数定义初始化文件的名称。

如果 InitFileLoadMode 设置为 image_file,则此参数包含一个文件列表,而不是单个文件名。在文件列表中,每个条目必须使用逗号或分号分隔。使用 LoadInitFile 加载文件时,在 image_file 模式下指定的文件的数量必须与可用内核值的数量(O.KernelColumns * O.KernelRows)相同。

此参数接受包含前导和尾随空白以及前导和尾随 “"” 或 “'” 字符的文件名。

LoadInitFile
键入 动态写入参数
默认 0
范围 [0, 1]

要开始将由 InitFileName 参数指定的文件加载到 RAM 中,请将值 1 写入此参数。请参阅上面的详细说明。

MaxNumRoI
键入 静态写参数
默认 1
范围 [1, 65536]

此参数定义运算符可以存储的最大 ROI 数量。

如果 NumRoI 设置为 static,则此参数无法编辑。相反,它将自动具有与 NumRoI 相同的值。

在构建 Applet 时,最大 ROI 计数 MaxNumRoI 的数值如果设置得过高,可能会导致时序问题。

NumRoI
键入 动态/静态写入参数
默认 1
范围 [1, MaxNumRoI]

此参数定义实际使用的 ROI 数量。运算符在重新开始读取第一个 ROI 之前会读取 NumRoI 个 ROI。在采集运行期间,运算符会循环输出 NumRoI 个 ROI,直到输出被后续运算符阻止。如果该参数设置为 static,则范围为 [1, 65536],并且 MaxNumRoI 将被禁用。

XOffset
键入 动态/静态读/写参数
默认 0
范围 [0, O.MaxImgWidth - XLength]

此字段参数定义 ROI 最左侧列的 x 坐标数组。

步长为 Parallelism。

了解如何配置字段参数,请参见 'Parameter Editing'。

XLength
键入 动态/静态读/写参数
默认 1024
范围 [0, O.MaxImgWidth - XOffset]

此字段参数定义 ROI 宽度的数组。

步长为 Parallelism。

了解如何配置字段参数,请参见 'Parameter Editing'。

YOffset
键入 动态/静态读/写参数
默认 0
范围 [0, O.MaxImgHeight - YLength]

该字段参数定义了 ROI 第一行的 y 坐标数组。

了解如何配置字段参数,请参见 'Parameter Editing'。

YLength
键入 动态/静态读/写参数
默认 1024
范围 [0, O.MaxImgHeight - YOffset]

该字段参数定义了 ROI 高度数组。

了解如何配置字段参数,请参见 'Parameter Editing'。

LinesToSimulate
键入 静态写参数
默认 1
范围 {1, 2^31-1}

此参数在设计时用于模拟,且仅在 O.LinkType 设置为 VALT_LINE1D 时有效。

此参数定义了算子应模拟多少条 ROI 线。ROI 在初始化图像中被定义为二维区域,但模拟输出提供了一个线序列,该序列在所有指定的 ROI 之间循环迭代(在读取 NumRoI 个 ROI 的线后,从 ROI 0 重新开始)。

PixelsToSimulate
键入 静态写参数
默认 1
范围 {1, 2^31-1}

此参数在设计时用于模拟,且仅在 O.LinkType 设置为 VALT_PIXEL0D 时有效。

此参数定义了算子应模拟多少个 ROI 像素。ROI 在初始化图像中被定义为二维区域,但模拟输出将提供一个像素序列,该序列在所有指定的 ROI 之间循环迭代,在读取 NumRoI 个 ROI 的像素后从 ROI 0 重新开始。