Operator Library: Memory
该算子基于 Frame Grabber RAM(通常为 DRAM)实现了一个大型查找表 (LUT)。 需要一个 RAM 类型的 VisualApplets 资源(参见 'Allocation of Device Resources')。多个 RAM 类型的资源通过共享内存概念使用相同的物理 RAM。有关如何使用共享内存的文档可在以下内容中找到: Application Note: Shared Memory。
算子 RamLUT 支持输出端的内核。
该算子的典型用例是色彩空间分类问题。
该算子提供两种简化 LUT 内容编程的方式。 对于这两种方式,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 的每次连续访问都会导致页未命中 (page miss) 并需要激活新行, DRAM 吞吐量会遭受最大性能 90% 的损失,导致带宽利用率仅为 10% 左右。
输入链路可以处理动态线宽,以及空行和空帧。因此,输出链路可以 处理相同的图像尺寸。
为了获得最佳性能,所使用的数据比特数应尽可能接近模块 参数 RamDataWidth 中提供的值。如果比特数与内核大小的乘积等于 内部 RAM 端口宽度 RamDataWidth,则达到通过算子的最大带宽。
| 适用于 Hardware Platform |
|---|
| imaFlex CXP-12 Penta |
| imaFlex CXP-12 Quad |
| 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。 请参阅上述说明。 |
|



上一页

