Operator Library: Memory
该算子允许将图像文件从主机 PC 上传到采集卡,以便连续输出并用作图像源。此处,图像文件被用作通用的数据容器。因此,上传的图像可以包含任意数据,例如系数值。所有系数图像必须具有相同的像素宽度和高度,但可以采用完全不同的格式。例如,链路 0 的系数图像可以采用 GRAY 8 位格式,链路 1 可以提供 RGB16 格式的图像,而链路 2 可以是二值图像。所有系数图像均存储在 Frame Grabber RAM (DRAM) 中。这需要一个类型为 RAM 的 VisualApplets 资源。有关更多信息,请参阅 'Allocation of Device Resources'。有关算子延迟的信息,请参阅 Table 46, 'Individual Latencies of the Operators in Library Memory'。
![]() |
CoefficientBuffer 不适用于 imaFlex CXP-12 Quad 和 imaFlex CXP-12 Penta 平台 |
|---|---|
|
imaFlex CXP-12 Quad 和 imaFlex CXP-12 Penta 平台不支持 CoefficientBuffer。'Functional Example for Loading Test Images Using ImageInjector' 示例展示了如何在 imaFlex CXP-12 Quad 或 imaFlex CXP-12 Penta 上使用 ImageInjector 算子替代 CoefficientBuffer 算子作为测试图像源的功能。 '2D Shading Correction / Flat Field Correction Using Operator RamLUT' 示例展示了如何在二维 Shading Correction 中使用 RamLUT 代替 CoefficientBuffer。 |
链路数量对应于存储在 CoefficientBuffer 中的系数图像数量。在没有运行图像采集时,只能通过软件将系数图像上传到 FPGA 缓冲区中。这可以通过写入参数 LoadCoefficients 来完成。
该算子的输出端口同步工作。第一个图像像素的传输在所有输出端口上完全同时开始。如果所有图像都已传输到接收算子,CoefficientBuffer 将再次开始同步输出图像。
![]() |
仿真期间的行为 |
|---|---|
|
算子链路上的图像是同时输出的。在一个仿真步中,算子在每个链路上最多输出一个图像。如果在仿真步期间,所有存储的图像(每个链路一个)都已转发给接收算子(即未发生阻塞),则相同的输出(每个链路一个)将在接下来的仿真步中继续转发。 |
CoefficientBuffer 还支持感兴趣区 (RoI) 管理。RoI 由 4 个参数定义:XOffset、XLength、YOffset 和 YLength。XOffset 和 YOffset 定义 RoI 的左上角,即以像素为单位的起始坐标。RoI 的尺寸不得超过由参数 BufferWidth 和 BufferHeight 定义的存储系数图像的尺寸。可以在采集期间动态更新 RoI,或者在未运行采集时,通过将所有 4 个 RoI 坐标参数设置为新值并写入参数 UpdateROI 来更新。请注意,XLength 还必须满足链路 Parallelism 的粒度,即 XLength 模 LinkParallelism 等于 0。
对于每个输出链路,缓冲区中都会存储一个系数图像文件,即在链路 0 上提供系数图像 0。必须在采集开始之前将系数图像加载到 CoefficientBuffer 中。系数图像必须存储在由参数 CoefficientFile N 指定的文件中。N 分别代表链路编号或系数图像编号。系数文件必须采用 TIF 格式编码。
BufferWidth 以像素为单位指定存储在 CoefficientBuffer 中的所有系数图像的宽度。
BufferHeight 以像素为单位指定由 CoefficientBuffer 管理的所有系数图像的高度。BufferWidth 和 BufferHeight 决定了所有输出链路的最大输出图像尺寸。
对于灰度链路,必须使用灰度图像文件。对于彩色链路,必须使用 RGB 图像文件。
如果链路的 Bit Width 高于图像文件的 Bit Width,算子将使用多个图像文件像素来生成输出像素。例如,22 位链路将需要 8 位图像文件中的 3 个像素。因此,图像文件的图像宽度必须比参数 BufferWidth 大 3 倍。
如果链路的 Bit Width 低于图像文件的 Bit Width,算子将仅使用输入图像文件的低位。例如,8 位图像文件和 3 位链路将使用文件的第 0 位、第 1 位和第 2 位。
应谨慎使用 16 位 TIF 文件。
参数 LoadCoefficients 用于在图像采集开始之前将系数图像加载到缓冲区中。加载操作由写入周期的写操作或向该参数写入值 1 触发。写入值 0 无效。
参数 UpdateROI 用于在图像采集正在运行或未抓取图像时动态更新当前的 RoI。在写入此参数之前,必须通过 4 个 RoI 坐标参数指定新的 RoI。写入的值不影响更新过程,只有写周期才会触发它,即写入的值可以为 0 或 1。
参数 XOffset 指定从左图像边界到 RoI 第一列的水平方向偏移量。指定的值以像素为单位进行测量,且不得超过 BufferWidth-1 值。
Parameter XLength specifies the length of the RoI in horizontal direction in pixels. The specified value must not exceed BufferWidth and must be divisible by the output link parallelism. Also the following constraint must be met: XOffset + XLength <= BufferWidth.
参数 YOffset 指定从顶部图像边界到 RoI 第一行的垂直方向偏移量。YOffset 必须以像素为单位指定,且不得超过 BufferHeight-1。
Parameter YLength specifies the length of the RoI in vertical direction in pixels. The length must not exceed BufferHeight. Furthermore, the following constraint must be met: YOffset + YLength <= BufferHeight.
参数 CoefficientFile N 指定以 TIF 格式存储的用于链路 N 的系数图像的文件名。
![]() |
注意 |
|---|---|
|
使用此算子的推荐设置顺序
-
连接 CoefficientBuffer 的所有链路。
-
指定所有链路的链路格式。
-
设置 BufferWidth 和 BufferHeight 参数。
-
设置 RoI 坐标。
-
设置系数文件名。
在内部,CoefficientBuffer 算子将所有系数字像像素累积为一个累积像素。这就是所谓的超像素 (super-pixel)。
- 如果 RAM 数据宽度小于超像素的 Bit Width,则该超像素将分布在多个 RAM 单元中。
- 如果超像素小于 RAM 数据宽度,则每个 RAM 单元中仅存储一个超像素,即使多个超像素可以放入一个 RAM 单元中也是如此。
因此,一个 RAM 单元将仅被一个超像素占用,或者是超像素的一部分。
该算子在内部将输出 Bit Width 的像素存储在 RAM 数据宽度宽的块中,例如,如果在 marathon VCL 平台上将输出 Bit Width 设置为 8bit(RAM 数据宽度为 256bit),则每个 RAM 单元仅使用 8 bit。其余部分则被浪费了。
在这种情况下,仅通过增大 Parallelism 来增加带宽将 无济于事。
您可以在本文档的 Platform Resources 部分中查阅您所使用的采集卡的 RAM 数据宽度:
以下是一些增加带宽/RAM 效率的建议:
提示 1:
为了增加带宽,您可以将像素的 Bit Width 定义得更大,随后使用 CastParallel 算子来对其进行修正。
示例:您需要一个 Gray 8bit 图像,但具有 Parallelism 8 的带宽。为此,您可以将输出 Bit Width 定义为 64(Parallelism 1),随后使用 CastParallel 算子将链路转换回 8 bit 和 Parallelism 8。
通过这种方式,您的图像还将消耗更少的 Memory,因为 1 个 RAM 单元中存储了 1 个以上的像素。如果直接使用(不使用 CastParallel 算子),存储图像所需的 Memory 将大 8 倍。
提示 2:
如果组合链路的 Bit Width 超过 64 bit,您可以将图像拆分为多个图像,并使用 CoefficientBuffer 算子的多个链路。稍后您可以组合所有链路,因为所有输出都是 O-synchronous 的。
示例:您希望以 Parallelism 4 发送 RGB24 图像。累积的像素将是 4*24 = 96Bit —— 这太大了。因此,解决此问题的思路是将图像拆分为 4 个子图像,每个子图像具有该像素的 ¼。
在内部,该算子会将每个输入的像素累积为大小为 96bit 的一个超像素。
通过这种方式,RAM 的效率也得到了提高。如果我们在 ironman mE5VQ8-CXPD 平台(128 Bit 宽的 RAM 数据接口)上采用 1024x1024 图像,则存储在简单的 1 链路 CoefficientBuffer 中的图像为
1024 * 1024 * 128 / 8 Byte = 16MB。
如果应用 4-link 设置,其大小为
1024 * 1024 * (128 / 4) / 8 = 4MB
假设 Coefficientbuffer 仅与单个系数图像文件一起使用,像素 bit width 为每像素 8 bit,且 Parallelism 为 1。在这种情况下,缓冲区的性能将大大下降。这是因为只使用了 1/8 的带宽。此外,缓冲区以加倍的设计时钟频率读取其数值,即仅使用了完整带宽的 1/16。
为了以最高性能使用缓冲区,必须重新解释像素数据。在我们的示例中,缓冲区输出链路必须参数化为每像素 64 bit,并且必须使用 Parallelism 二。这将导致缓冲区每个设计时钟读取 128 bit。使用 CastParallel 运算符将 64 bit 数据值重新解释为 8 的 bit width 和 16 的 Parallelism。此外,参数 BufferWidth 必须设置为系数图像图像宽度的 1/8。
总之,只有在高输出 bit width(例如 64 bit)的情况下才能获得最大带宽。使用高的输出 Parallelism 不会增加带宽。
该运算符可用作仿真源。在这种情况下,运算符将尝试加载并使用 Coefficient File N 参数指定的图像文件。请注意,这只有在图像文件与链路格式完全匹配时才能正常工作。如果您的链路格式为例如 64 Bit,则图像文件的图像宽度必须是链路最大图像宽度的 8 倍,因为图像将具有每像素 8 bit。高度也必须与链路上指定的最大图像高度完全匹配。
流经使用 采集卡 RAM (DRAM) 的算子的理论带宽 [bits/second] 根据以下公式计算:

然而,由于 DRAM 效率的限制,实际带宽总是小于理论带宽。
当 Bit Width 和 Parallelism 的乘积等于内部 RAM 端口宽度 x 2(适用于只读参数)时,通过运算符的 最大带宽 达到最大值。
![]() |
平台特定值 |
|---|---|
|
RAM Port Width 和 System Clock 是平台相关的。 请参阅 Device Resources 以获取有关您各个平台的详细信息。 |
|
对于无符号输入,输出 bit width 的范围是 [1, 64]。对于有符号输入,范围是 [2, 64]。对于无符号彩色输入,范围是 [3, 63],对于有符号彩色输入,范围是 [6, 63]。 |
|
|
bit width 和 Parallelism 的乘积不得超过原生 RAM 数据宽度。请查看 Device Resources 了解更多信息。 |
| RamDataWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可在 RAM 接口上使用的数据位数。 |
|
| RamAddressWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可用的 RAM 地址位数。 |
|
| BufferWidth | |
|---|---|
| 键入 | static 参数 |
| 默认 | 1024 |
| 范围 | [1, 65535] |
|
此参数定义系数图像的像素宽度。此外,此参数定义所有输出链路的最大图像宽度。该参数的范围取决于所使用的图像采集卡及其 RAM。 |
|
| BufferHeight | |
|---|---|
| 键入 | static 参数 |
| 默认 | 1024 |
| 范围 | [1, 65535] |
|
此参数定义系数图像的像素高度。此外,此参数定义所有输出链路的最大图像高度。该参数的范围取决于所使用的图像采集卡及其 RAM。 |
|
| LoadCoefficients | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 0 |
| 范围 | {0, 1} |
|
此参数用于在图像采集开始之前将系数图像开始加载到缓冲区中。加载由向该参数写入值 1 的写周期触发。写入值 0 不会引起系数文件的加载。 |
|
| UpdateROI | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 1 |
| 范围 | {1} |
|
该参数用于在硬件中更新 ROI 设置。使用由 4 个 ROI 坐标参数定义的值。更新随时可以进行,甚至在运行采集期间也可以进行。 |
|
| XOffset | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 0 |
| 范围 | [0, Max.Img Width - XLength] |
|
此参数定义 ROI 左上角的 x 坐标。更改该值不会直接更改 ROI 设置。您必须写入参数 UpdateROI 才能应用新设置。 步长为 Parallelism。 |
|
| XLength | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 1024 |
| 范围 | [parallelism, Max.Img Width - XOffset] |
|
此参数定义 ROI 的宽度。更改该值不会直接更改 ROI 设置。您必须写入参数 UpdateROI 才能应用新设置。 步长为 Parallelism。 |
|
| YOffset | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 0 |
| 范围 | [0, BufferHeight - YLength] |
|
此参数定义了 ROI 左上角的 y 坐标。更改该值不会直接改变 ROI 设置。您必须写入参数 UpdateROI 才能应用新设置。 |
|
| YLength | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 1024 |
| 范围 | [1, BufferHeight - YOffset] |
|
此参数定义了 ROI 的高度。更改该值不会直接改变 ROI 设置。您必须写入参数 UpdateROI 才能应用新设置。 |
|
| FillLevel | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 0 |
| 范围 | [0%, 100%] |
|
该参数以 25% 的步长提供 DRAM 的 Fill 级别。 |
|
| Overflow | |
|---|---|
| 键入 | 动态只读参数 |
| 默认 | 0 |
| 范围 | [0, 1] |
|
此参数表示发生缓冲区溢出。 |
|
| Coefficient File N | |
|---|---|
| 键入 | 动态读/写参数 |
| 默认 | coefficients_N.tif |
| 范围 | 带可选路径的任意 tif 文件文件名 |
|
此参数定义了链路 N 的系数图像的文件名。 |
|
以下示例展示了算子 CoefficientBuffer 的使用方法:
-
示例 - 出于调试目的,可以手动插入图像。
-
示例 - 出于调试目的,可以检查链接上的图像传输状态。
-
示例 - 该示例展示了 2D Shading Correction 的实现。 校正值存储在采集卡 RAM 中。 该小应用程序执行高精度偏移和增益校正。
-
'使用采集卡 RAM 的 1D Shading Correction'
示例 - 该示例展示了 1D Shading Correction。 校正值存储在采集卡 RAM 中。

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



上一页

