Operator Library: Memory
该算子基于 Frame Grabber RAM(通常为 DRAM)实现了一个大型查找表 (LUT)。 需要一个类型为 RAM 的 VisualApplets 资源(请参见 “Allocation of Device Resources”)。
算子 RamLUT 支持输出端的内核。
有关 operator 延迟的信息,请参见 Table 46, 'Individual Latencies of the Operators in Library Memory'。
该算子的典型用例是色彩空间分类问题。 例如,在 microEnable IV 系列板卡上,该算子允许使用包含 2^24 个条目的查找表, 即可以定义一个分类查找表,其中包含 RGB 24 色彩空间中每种颜色的对应值。 该算子通过两种方式简化了 LUT 内容的编程。 对于这两种方式,都必须在综合过程结束后、于运行时使用小应用程序 (applet) 时对 LUT 进行编程。
-
编程 LUT 的一种可能性是使用寄存器接口,该接口提供地址-值参数 InitAddress 和 InitData。 首先,使用参数 InitAddress 设置地址。 接下来,将数据写入参数 InitData。 写入数据会导致算子实际写入 LUT 并替换先前的值。 如果您使用内核,写入最后一个内核元素会导致算子实际写入 LUT 并替换先前的值。
-
编程 LUT 的第二种可能性是使用包含内容的文件。 文件访问比寄存器访问更快,但需要注意一些事项。文件可以采用不同的格式。 必须通过参数 InitFileMode 定义格式:
-
text_with_checks
在此模式下,初始文件必须是一个文本文件,其中的值字符串由 空格、制表符、换行符 (LF) 或回车换行符 (CRLF) 分隔。 算子会检查这些文件中的错误,如果文件无法使用,则会报告错误。
每个值代表一个内核元素,并且必须是在正确范围内的十进制数。
下图展示了用于 4x3 内核的文件:

-
text_raw
此模式类似于 text_with_checks 模式,但包含较少的错误检查。 在此模式下,每个值必须提供在单独的一行中。 与 text_with_checks 模式相比,在此模式下加载文件的速度更快。 上面的示例在 text_raw 模式下如下所示:

-
binary
binary 模式假定为二进制文件,其中每个 LUT 元素的内核条目使用 8 个字节。 如果内核条目值可以用少于 64 位的比特表示,则忽略未使用的比特。 这是将值写入 LUT 的最快方法。 上面的示例在 binary 模式下如下所示:

在这三种模式下,文件中的条目数不得超过 LUT 元素的数量,并且值的数量 必须是 KernelSize 的倍数。 因此,文件必须包含最多 2^InputBitWidth * KernelSize 个值。
当初始文件包含 2^InputBitWidth * KernelSize 个值时,LUT 内存将被完全覆盖,从 地址 0 开始。 在这种情况下,参数 InitAddress 不受影响。
当初始文件包含较少条目时,将执行部分初始化。 然后,从 InitAddress 参数给定的地址开始进行初始化。 在写入最后一个 LUT 条目后,参数 InitAddress 会自动递增到下一个位置。 这允许监视已写入了多少个 LUT 条目。 当文件包含多于 (2^InputBitWidth - InitAddress) * KernelSize 个值时, 初始化将在写入 LUT 的最后一个条目后停止,并且 InitAddress 设置为 0。
参数 InitFilename 指定包含初始文件的文件。 最后,向参数 LoadInitFile 写入值 1 开始 读取文件,如果被接受,则将值写入硬件。 向参数 LoadInitFile 写入 0 不会触发加载值的操作。 如果您不希望在小程序初始化过程中将初始文件加载到硬件中, 这会非常有用。
在模拟期间,加载初始文件的操作与在运行时相同。 对于部分配置或出现错误的情况,检查模拟日志中的输出可能会很有用 (您可能需要激活 或 对话框)。 -
请注意,DRAM 技术在随机访问方面的性能非常低。 在最坏的情况下,对 DRAM 的每一次连续访问都会导致页面未命中并需要激活新行, DRAM 吞吐量将损失高达 90% 的最大性能,导致带宽利用率仅为 10% 左右。 然而,通过将多个 DRAM 内存库组合在一起,即使在最坏情况下也可以提高吞吐量。 将 2 个或更多 RamLUT 算子连接在一起,并让它们各自处理不同的查找任务。 如果连续的输入值变化不快,该算子的性能会显著提高。 请在硬件用户指南中检查您的采集卡的相应 RAM 技术和尺寸。
流经使用 采集卡 RAM (DRAM) 的算子的理论带宽 [bits/second] 根据以下公式计算:

然而,由于 DRAM 效率的限制,实际带宽总是小于理论带宽。
当 Bit Width 和 Parallelism 的乘积等于内部 RAM 端口宽度 x 2(适用于只读参数)时,通过运算符的 最大带宽 达到最大值。
![]() |
平台特定值 |
|---|---|
|
RAM Port Width 和 System Clock 是平台相关的。 请参阅 Device Resources 以获取有关您各个平台的详细信息。 |
|
允许的输入 Bit Width 取决于采集卡的物理内存以及有多少算子共享对 RAM 的访问。 参数 RamAddressWidth 提供了可使用的最大地址位数。 请注意,此数字可能会根据设计中基于 RAM 的算子数量而变化。 有关详细信息,请查看 Device Resources。 |
|
|
允许的输出 Bit Width 取决于采集卡的物理内存。 Bit Width 限制为 64 bit,但可以存储多个内核组件。 (bit width * kernel size) 的乘积不得超过参数 RamDataWidth 中显示的本地 RAM 数据宽度。 有关详细信息,请查看 Device Resources。 |
| RamDataWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可在 RAM 接口处使用的数据位数。它是输出可以提供的最大位数 (如果正确使用了内核)。 |
|
| RamAddressWidth | |
|---|---|
| 键入 | 静态写参数 |
| 默认 | 不适用 |
| 范围 | 整型数字 |
|
此参数提供可使用的地址位数。 |
|
| InitAddress | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 0 |
| 范围 | [0, 2^InputBitWidth-1] |
|
此参数定义由参数 InitData 定义的数据地址。 请参阅上述说明。 |
|
| InitData | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 0 |
| 范围 | [0, 2^OutputBitWidth-1] |
|
此参数定义要写入参数 InitAddress 所定义地址的数据。 写入此参数将开始实际写入硬件。 请参阅上述说明。 |
|
| InitFileLoadMode | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | text_with_checks |
| 范围 | {text_with_checks, text_raw, binary} |
|
此参数定义加载到查找表中的文件的格式和模式。 请参阅上述说明。 |
|
| InitFileName | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | InitRamLut.txt |
| 范围 | |
|
此参数定义初始化文件的名称。 |
|
| LoadInitFile | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 0 |
| 范围 | [0, 1] |
|
要开始将 InitFileName 参数指定的文件加载到 LUT 中,请向此参数写入值 1。 请参阅上述说明。 |
|
RamLUT 算子的使用方法见以下示例:
-
“使用 Operator RamLUT 的 2D Shading Correction / Flat Field Correction”
示例 - 该示例展示了 2D Shading Correction 的实现。 校正值存储在算子 RamLUT 中。 该小应用程序执行高精度偏移和增益校正。
-
'Functional Example for Specific Operators of Library Color, Base and Memory'
示例 - 演示如何使用该算子

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


上一页

