Operator RamLUT (imaFlex)

Operator Library: Memory

该算子基于 Frame Grabber RAM(通常为 DRAM)实现了一个大型查找表 (LUT)。 需要一个 RAM 类型的 VisualApplets 资源(参见 'Allocation of Device Resources')。多个 RAM 类型的资源通过共享内存概念使用相同的物理 RAM。有关如何使用共享内存的文档可在以下内容中找到: Application Note: Shared Memory。

算子 RamLUT 支持输出端的内核。

该算子的典型用例是色彩空间分类问题。

该算子提供两种简化 LUT 内容编程的方式。 对于这两种方式,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 的每次连续访问都会导致页未命中 (page miss) 并需要激活新行, DRAM 吞吐量会遭受最大性能 90% 的损失,导致带宽利用率仅为 10% 左右。

输入链路可以处理动态线宽,以及空行和空帧。因此,输出链路可以 处理相同的图像尺寸。

带宽优化

为了获得最佳性能,所使用的数据比特数应尽可能接近模块 参数 RamDataWidth 中提供的值。如果比特数与内核大小的乘积等于 内部 RAM 端口宽度 RamDataWidth,则达到通过算子的最大带宽。

适用于 Hardware Platform
imaFlex CXP-12 Penta
imaFlex CXP-12 Quad

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, 64]2
Arithmetic unsigned as I
Parallelism 1 as I
Kernel Columns 1 [1, Ram 数据宽度 / Bit Width]
Kernel Rows 1 [1, Ram Data Width / Bit Width / Kernel Columns]
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

允许的输入比特数取决于帧grabber的物理内存以及有多少算子共享 RAM。 参数 RamAddressWidth 提供可使用的最大地址比特数。 请注意,此数字可能会根据设计中基于 RAM 的算子数量而变化。

2

允许的输出 Bit Width 取决于采集卡的物理 memory。 Bit Width 限制为 64 bit,但可以存储多个内核组件。 (Bit Width * kernel size) 的乘积不得超过参数 RamDataWidth 中显示的本机 RAM 数据宽度。

参数

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。 请参阅上述说明。