Operator RamLUT

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

  1. 编程 LUT 的一种可能性是使用寄存器接口,该接口提供地址-值参数 InitAddress 和 InitData。 首先,使用参数 InitAddress 设置地址。 接下来,将数据写入参数 InitData。 写入数据会导致算子实际写入 LUT 并替换先前的值。 如果您使用内核,写入最后一个内核元素会导致算子实际写入 LUT 并替换先前的值。

  2. 编程 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 以获取有关您各个平台的详细信息。

I/O Property

Property 值
Operator Type M
Input Link I,读取地址输入
Output Link O,图像数据输出

Supported Link Format

Link Parameter Input Link I Output Link O
Bit Width [1, RAM 地址宽度]1 [1, Ram Data Width]2
Arithmetic unsigned as I
Parallelism 1 as I
Kernel Columns 1 [1, Ram 数据宽度 / Bit Width]2
Kernel Rows 1 [1, Ram Data Width / Bit Width / Kernel Columns]2
Img Protocol {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} as I
Color Format VAF_GRAY as I
Color Flavor FL_NONE as I
Max. Img Width any as I
Max. Img Height any 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}

此参数定义加载到查找表中的文件的格式和模式。 请参阅上述说明。

InitFileName
键入 动态写入参数
默认 InitRamLut.txt
范围

此参数定义初始化文件的名称。

LoadInitFile
键入 动态写入参数
默认 0
范围 [0, 1]

要开始将 InitFileName 参数指定的文件加载到 LUT 中,请向此参数写入值 1。 请参阅上述说明。

使用示例

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