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

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

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

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

然而,由于 DRAM 效率的原因,实际带宽总是小于理论带宽。
如果 Bit Width 和 Parallelism 的乘积等于内部 RAM 端口宽度 x 2(对于只读参数成立), 则穿过算子的最大带宽 将达到。
![]() |
平台特定值 |
|---|---|
|
RAM 端口宽度和系统时钟因平台而异。 有关您的各个平台的详细信息,请参见 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} |
|
This parameter defines the file format and the mode of the file that is loaded into the lookup table. See the descriptions above. |
|
| InitFileName | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | InitRamLut.txt |
| 范围 | |
|
此参数定义初始化文件的名称。 |
|
| LoadInitFile | |
|---|---|
| 键入 | 动态写入参数 |
| 默认 | 0 |
| 范围 | [0, 1] |
|
若要开始将 InitFileName 参数指定的文件加载到 LUT 中,请向该参数写入值 1。 请参见上面的说明。 |
|
以下示例展示了 RamLUT 算子的使用方法:
-
'2D Shading Correction / Flat Field Correction Using Operator RamLUT'
示例 - 该示例展示了 2D Shading Correction 的实现。 校正值存储在 RamLUT 算子中。 该小应用程序执行高精度的偏移量和增益校正。
-
'Functional Example for Specific Operators of Library Color, Base and Memory'
示例 - 演示如何使用该算子

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


上一页

