Operator Library: Memory
该算子将输入的图像数据缓冲到 frame grabber RAM (DRAM) 中,并为每个缓冲的图像读出多个动态感兴趣区 (ROI)。要读出的 ROI 坐标是通过使用附加的输入连接来定义的。下图显示了该算子针对一个输入帧和四个 ROI 的行为概览。
需要一个 RAM 类型的 VisualApplets 资源(请参见 “Allocation of Device Resources”)。多个 RAM 类型的资源通过 “ Shared Memory Concept ” 使用相同的物理 RAM。有关如何使用共享内存的文档可在 Application Note: Shared Memory 中找到。
所有 ROI 均作为单独的图像按顺序读取:ROI 0、ROI 1、ROI 2……直到 ROI N-1。N 是要为一个输入帧读出的 ROI 数量,即坐标输入上的图像尺寸。只要不超过最大输入帧尺寸,支持所有可能的矩形区域,即可以将单像素、单行、单列、矩形区域或完整帧定义为 ROI。
不同的 ROI 不需要具有相同的尺寸。
每个 ROI 都可以单独定义。
ROI 可以相互重叠。
如果 ROI 图像为空(即不包含任何像素),则算子在其输出端提供一个空图像。空图像不包含任何像素。
负的 ROI 宽度(XTopLeft > XBottomRight)或 ROI 高度(YTopLeft > YBottomRight)也会导致输出端出现空的 ROI。支持的最大 ROI 数量由 XTopLeft 输入连接上的每幅图像最大像素数决定:XTopLeft.MaxImageWidth * XTopLeft.MaxImageHeight。
ROI 坐标在四个独立的坐标输入连接上提供,作为包含 ROI 坐标的图像:XTopLeft、YTopLeft、XBottomRight、YBottomRight。这些图像中的每个像素都被算子视为有效的 ROI 坐标集。因此,ROI 输入图像的大小定义了输出 ROI 的数量。EoL(行结束)和可变行长度可以使用,但会被忽略,因为对于算子的 ROI 输入,仅评估有效像素和 EoF(帧结束)。对于输入连接 I 上的每个输入图像,都需要一个新的 ROI 坐标图像集。ROI 由左上角的 X,Y 坐标和右下角的 X,Y 坐标定义。
请注意,ROI X 坐标经过转换以满足输入连接 I 由其 Parallelism 定义的 X 粒度,即算子 FrameBufferMultiRoiDyn 只能以 Parallelism 的粒度切割行。当寻址不是 XTopLeft 的并行分量第一个像素的像素,或者不是 XBottomRight 的并行分量最后一个像素的像素时,坐标会被向上或向下取整,并且生成的 ROI 仍然包含并行分量的所有像素。
以下部分通过一个示例来解释算子的行为:
在此示例中,输入连接 I 处的 Parallelism = 4。
因此,XTopLeft 向下取整到并行分量的第一个像素:0、4、8、12、...,而 XBottomRight 向上取整到并行分量的最后一个像素 3、7、11、15、...
例如,对于 ROI X 坐标 3 和 7,ROI 的第一列是输入图像的第 3 列,最后一列是第 7 列。算子将 XTopLeft 向下取整到 0;XBottomRight 保持 7 不变。因此,宽度变为 8。ROI 高度不依赖于 Parallelism,因此可以是任何合法值。
![]() |
公式: |
|---|---|
|
XTopLeft* = floor(XTopLeft / Parallelism) * Parallelism XBottomRight* = ceil((XBottomRight + 1) / Parallelism) * Parallelism - 1 |
![]() |
示例: |
|---|---|
|
当输入连接 I 处的 Parallelism 为 4 时:
|
所有 4 个 ROI 输入彼此同步,即这些连接上的图像必须具有相同的大小并同时同步提供。当它们由同一 M 型模块通过任意 O 型模块网络提供源时,情况总是如此。有关更多信息,请参见 “M-type Operators with Multiple Inputs” 一节。
ROI 坐标与输入连接 I 异步。您可以使用 CreateBlankImage 算子来生成 ROI 坐标。
一旦对应的输入帧被完全缓冲(即接收到输入帧的 EoF (End of Frame) 信号),并且接收到每个 ROI 图像定义输入连接 XTopLeft, YTopLeft, XBottomRight, YBottomRight 上的第一个像素,算子就会在其输出端提供 ROI 图像。如果 DRAM 中有足够的可萨空间,则在读取 ROI 的同时,可以将后续输入帧写入 DRAM。RAM 带宽在写入和读取之间共享,但读取只能在相应的输入帧写入后才能开始。读取输入帧的最后一个 ROI(由 ROI 图像定义输入连接上的最后一个像素定义,即接收到 ROI 图像 EoF (End of Frame))后,当前帧将被丢弃,并且下一个 ROI 图像将寻址下一个输入帧。有关算子延迟的信息,请参见 Table 46, 'Individual Latencies of the Operators in Library Memory'。
该算子支持两种将图像数据缓冲到 DRAM 的模式,您可以通过参数 MaxFrameSizeMode 进行配置:
-
对于 MaxFrameSizeMode = AUTO,DRAM 会缓冲一个具有最大图像尺寸大小的图像,即 I.MaxImgWidth * I.MaxImgHeight。
小于最大图像尺寸的图像在缓冲时不会被修改。但是,读取 ROI 总是基于具有最大可能图像尺寸的缓冲帧进行。在这种情况下,缺失的帧像素会用随机数据 Fill,并且在后续处理中应被视为未定义。
-
对于 MaxFrameSizeMode = CUSTOM,缓冲输入帧的最大尺寸由参数 MaxFrameWidth 和 MaxFrameHeight 定义。即使实际输入帧更大,超出指定参数尺寸的数据也会被丢弃(类似于没有 offset 的 ROI)。在这种情况下,DRAM 会为帧大小 MaxFrameWidth * MaxFrameHeight 保留 Memory。
在这两种情况下,都不会检查输入链接 ROI 坐标是否位于输入图像内。因为坐标可以设置为最大输入帧的任意像素。如果它们位于实际输入图像数据之外,算子会读取随机虚拟值,但 ROI 大小不会改变。
该算子支持所有输入链接上的空帧、空行和变化的行长。
在 InfiniteSource 模式下,图像可能会丢失或损坏。发生这种情况的原因可能是 RAM 已满,无法接受更多数据,或者输入带宽对于共享 Memory 接口而言太高。一旦算子达到溢出状态,所有传入数据都会被丢弃。这会导致帧丢失或损坏。损坏的图像仅在输入带宽过高时出现,因为 Fill 水平是以完整实体计算的。当图像的一部分已经写入 RAM,但由于输入带宽过高且 RAM 无法以足够快的速度接受写入数据而导致图像的一部分被丢弃时,就会出现损坏的图像。因此,读取损坏的图像会导致未定义的输出数据。一旦 RAM 中有足够空间且共享 Memory 接口允许再次向 RAM 写入数据,算子就会从溢出中恢复并停止丢弃输入数据。Overflow 参数指示溢出何时发生。通过 OverflowClearMode 参数,您可以定义是在溢出恢复后立即重置 Overflow 还是手动重置溢出。Overflow 和 OverflowClearMode 参数仅当 InfiniteSource 参数设置为 ENABLED 时才可使用。
-
输入链接的 Parallelism 必须是 2 的幂。
-
该算子支持输入链接 I 上的空帧,但该帧的输出 ROI 会用随机虚拟值 Fill。
-
如果输入图像小于写入 DRAM 的帧,则不会检查 ROI 坐标是否在输入图像内部。在这种情况下,算子会从 Memory 中读取随机虚拟值。
-
最大链接 Property 因算子的使用方式而异。有关详细信息,请参阅下面的 Supported Link Format 一节。
为了获得最佳性能,使用的 Data Bits 数量应尽可能与模块参数 RamDataWidth 中提供的值相匹配。当 Bit Width、Kernel Size 和 Parallelism 的乘积等于内部 RAM 端口宽度 RamDataWidth 时,通过算子的最大带宽即达到峰值。请注意,内部 Bit Width 可以通过使用 Kernel 来增加,但完整的 Kernel 仍将作为单个像素寻址。

为了使算子能够处理超出 RAM 可用最大带宽的长时间写入数据突发,请启用 WritePriority 参数。建议将此参数用于诸如相机之类的无限数据源(InfiniteSource = ENABLED)。如果启用了 WritePriority 参数,则由于写入突发而超出 RAM 可用带宽时,将禁止读取。这允许对 RAM 进行临时更频繁的写入访问。如果相机提供写入数据突发,则预计该突发后面会有写入数据间隙(否则会超出可用 RAM 带宽),然后可以利用该间隙来临时提高读取带宽。
| Property | 值 |
|---|---|
| Operator Type | M |
| 输入链路 | I,图像数据输入 XTopLeft,坐标数据输入 YTopLeft,坐标数据输入 XBottomRight,坐标数据输入 YBottomRight,坐标数据输入 |
| Output Link | O,数据输出 |
同步和异步输入
- 4 个 ROI 坐标输入 XTopLeft、YTopLeft、XBottomRight 和 YBottomRight 彼此同步。
- ROI 坐标输入 XTopLeft、YTopLeft、XBottomRight 和 YBottomRight 相对于输入链接 I 是异步的。
|
输入 bit width 的范围是:
输入 bit width 不得超过原生 RAM 数据宽度 RamDataWidth。 |
|
|
bit width、Parallelism 和 kernel size 的乘积不得超过 原生 RAM 数据宽度。 ![]()
|
|
|
X 坐标输入的 bit width 为: ![]() |
|
|
Y 坐标输入的 bit width 为: ![]() |
|
|
输入链路 I 的最大图像宽度和图像 高度取决于 算子的使用情况:
|
| RamDataWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可在 RAM 中使用的最大数据宽度。 |
|
| RamAddressWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可使用的地址位数。 可用 RAM 插槽的数量由 2^RamAddressWidth 定义。当前的 RamAddressWidth 取决于硬件 平台以及设计中当前的 Memory 算子数量(即使用 RAM 类型资源的算子)。 |
|
| MaxFrameSizeMode | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | Auto |
| 范围 | {Auto, Custom} |
|
此参数用于定义参数 MaxFrameWidth 和 MaxFrameHeight 是否应自动 跟随时输入 I 处的最长图像尺寸 (模式=Auto),或者这些参数是否 可调整(模式=Custom)。 Custom 模式允许设置最大 帧尺寸,该尺寸可针对应用进行自定义,并且可以远小于 输入链路定义的限制。通过这种方式,可以在 RAM 中存储更多帧。 在模式 Auto 下,I 的链路 Property (Max.Img Width 和 Max.Img Height)不得定义大于 Memory 中可用插槽数量(2^RamAddressWidth)的最大图像。 如果 I 的链路 Property Max.Img Width 和 Max.Img Height 定义的最大图像大于 可用 Memory 空间,且您处于 Custom 模式, 则无法再编辑 MaxFrameSizeMode 参数, 直到将输入链路上的最大图像定义得更小。 采集运行时无法写入此参数。 |
|
| MaxFrameWidth | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 1024 |
| 范围 | [1, Max. Image Width at I] |
|
此参数设置当前图像处理 配置的最大图像宽度。超过此限制的输入帧行将被剪切为 MaxFrameWidth。将此数字减小到 最大图像宽度以下可节省 Memory 空间并允许存储更多帧。 此参数仅在 MaxFrameSizeMode 设置为 Custom 时方可编辑。 MaxFrameHeight 和 MaxFrameWidth 的乘积不得大于 可用 Memory 插槽数 2^RamAddressWidth 乘以 输入 Parallelism。采集运行时无法编辑此参数。 |
|
| MaxFrameHeight | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 1024 |
| 范围 | [1, Max. Image Height at I] |
|
此参数设置当前图像处理 配置的最大图像高度。超出此高度限制的输入帧将被剪切为 MaxFrameHeight。将此数字减小到 最大图像高度以下可节省 Memory 空间并允许存储更多帧。 此参数仅在 MaxFrameSizeMode 设置为 Custom 时方可编辑。 MaxFrameHeight 和 MaxFrameWidth 的乘积不得大于 可用 Memory 插槽数 2^RamAddressWidth 乘以 输入 Parallelism。采集运行时无法编辑此参数。 |
|
| FillLevel | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 0 |
| 范围 | [0%, 100%] |
|
此参数提供以百分比表示的 DRAM Fill 水平。 |
|
| MaxFrameCount | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 2^RamAddressWidth / (MaxFrameHeight * (MaxFrameWidth / I.Parallelism)) |
| 范围 | [1, 2^RamAddressWidth] |
|
此参数提供当前可放入 memory 中的最大帧数。可放入 memory 中的最大帧数取决于参数 RamAddressWidth、MaxFrameHeight、I.Parallelism 和 MaxFrameWidth。 MaxFrameCount = 2^RamAddressWidth / (MaxFrameHeight * (MaxFrameWidth / I.Parallelism)) |
|
| FrameCount | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 0 |
| 范围 | [0, MaxFrameCount] |
|
此参数提供 memory 中的当前帧数。 |
|
| InfiniteSource | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | DISABLED |
| 范围 | {ENABLED, DISABLED} |
|
该算子可以直接放置在设计中的相机算子后面。在这种情况下,必须将 InfiniteSource 参数设为 ENABLED。然后,该算子将执行主动溢出管理,并确保算子能够从溢出中正确恢复。当算子后面的数据接收器停止或暂停传输且缓冲区 fill 级别达到最大值时,或者当输入带宽太高导致写入数据无法传输到外部 RAM 时,都可能会发生溢出。当 InfiniteSource 设为 DISABLED 时,如果缓冲区 fill 级别或输入带宽变得过高,将生成一个禁止信号,以阻止后续算子传输数据。 建议对搭配 InfiniteSource 使用的任何算子启用写入优先级。因此,当 InfiniteSource 参数设为 ENABLED 时,建议将 WritePriority 参数设为 ENABLED。 有关更多信息,请参见 “Infinite Sources / Connecting Cameras”。 |
|
| WritePriority | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | DISABLED |
| 范围 | {ENABLED, DISABLED} |
|
' Shared Memory Concept ' 概念通常会在所有连接的 memory 算子(即使用类型为 RAM 的资源的的所有算子)之间平均分配带宽。如果 WritePriority 参数为 DISABLED,则 FrameBufferMultiRoiDyn 算子会为读取和写入分配相同的优先级。通过将 WritePriority 设为 ENABLED,FrameBufferMultiRoiDyn 算子会优先处理写入而非读取,但仅在临时 memory 数据速率高于可用带宽时才会这样。临时优先处理写入数据会导致读取过程暂时减慢。因此,平均带宽不得超过 FrameBufferMultiRoiDyn 算子的可用带宽。建议对将 InfiniteSource 参数设为 ENABLED 的任何算子启用写入优先级。当配合可停止的源使用写入优先级时,请确保写入带宽不会持续保持很高,否则将停止从 FrameBufferMultiRoiDyn 算子读取,直到缓冲区填满为止。由于写入优先级是针对单个算子的配置,因此设计中每增加一个 memory 算子,写入优先级的影响就会减小。 |
|
| Overflow | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 0 |
| 范围 | [0, 3] |
|
此参数表示缓冲区溢出。这是一个 2 位位图,其中每一位表示一种不同类型的溢出。位 0 表示 fill 级别溢出,位 1 表示写入带宽溢出。Overflow 的显示时间取决于所选的 OverflowClearMode。 仅当 InfiniteSource 参数设置为 ENABLED 时,Overflow 参数才处于活动状态 |
|
| OverflowClearMode | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | AutoClear |
| 范围 | {AutoClear, ManualClear, ClearAfterRead, ClearWithProcessReset} |
|
OverflowClearMode 决定了当算子从溢出中恢复时如何清除 Overflow 参数。只有在算子不再处于溢出状态时,您才能使用此参数重置溢出状态。 清除模式:
仅当 InfiniteSource 参数设置为 ENABLED 时,OverflowClearMode 参数才处于活动状态 |
|

![[注意]](../common/images/admon/note.png)












上一页

