Operator RamLUT

操作员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 进行编程。

  1. 对 LUT 进行编程的一种方法是使用寄存器接口,该接口提供地址和值参数 InitAddress 和 InitData。 首先,使用参数 InitAddress 设置地址。 接下来,将数据写入参数 InitData。 写入数据会使算子实际写入 LUT 并替换先前的值。 如果您使用 Kernel,则写入最后一个 Kernel 元素会使算子实际写入 LUT 并替换先前的值。

  2. 对 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。

I/O Properties

财产 值
操作员类型 M
Input Link I,读取地址输入
输出链接 O,图像数据输出

Supported Link Format

链接参数 输入链路 I 输出链路 O
Bit Width [1, RAM 地址宽度]1 [1, RAM 数据宽度]2
Arithmetic 未签名 as I
Parallelism 1 as I
内核列 1 [1, RAM 数据宽度 / Bit Width]2
内核行 1 [1, Ram Data Width / Bit Width / Kernel Columns]2
图像协议 {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} as I
Color Format VAF_GRAY as I
颜色口味 FL_NONE as I
Max. Img Width 任何 as I
Max. Img Height 任何 as I

1

允许的输入 Bit Width 取决于采集卡的物理内存以及有多少算子共享对 RAM 的访问。 参数 RamAddressWidth 提供了可使用的最大地址位数。 请注意,此数字可能会根据设计中基于 RAM 的算子数量而变化。 查看 Device Resources 以了解更多信息。

2

允许的输出 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。 请参见上面的说明。

Examples of Use

以下示例展示了 RamLUT 算子的使用方法: