Operator RamLUT

Operator Library: Memory

此運算子會基於 Frame Grabber RAM(通常為 DRAM)實作大型查詢表 (LUT)。 需要一個 RAM 類型的 VisualApplets 資源(請參閱 'Allocation of Device Resources')。

運算子 RamLUT 支援輸出端上的 kernel。

有關 operator 延遲的資訊,請參閱 表 46「Library Memory 中各 operator 的個別延遲」。

此運算子的典型使用情境為色彩空間分類問題。 例如在 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

      在此模式中,初始檔案必須是文字檔,其中數值字串以 空白、定位點 (tab)、換行字元 (LF) 或歸位換行字元 (CRLF) 分隔。 運算子會檢查這些檔案是否有錯誤,如果檔案無法使用則會回報錯誤。

      每個數值代表一個 kernel 元素,且必須是正確範圍內的十進位數字。

      下圖展示了 4x3 kernel 的檔案:

    • text_raw

      此模式類似於 text_with_checks 模式,但包含較少的錯誤檢查。 在此模式中,每個數值必須提供於單獨的行中。 與 text_with_checks 模式相比,在此模式中載入檔案的速度更快。 上述範例在 text_raw 模式下的外觀如下:

    • binary

      binary 模式假設為二進位檔案,其中每個 LUT 元素的每個 kernel 項目使用 8 個位元組。 如果 kernel 項目數值可以用少於 64 bit 表示,則未使用的位元會被忽略。 這是將數值寫入 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 指定包含初始值的檔案。 最後,將數值 1 寫入參數 LoadInitFile 會開始 讀取檔案,若被接受,則將數值寫入硬體。 將 0 寫入參數 LoadInitFile 不會觸發數值的載入。 如果您不希望在 applet 初始化程序期間將初始檔案載入硬體,這會非常有用。

    在模擬期間,載入初始檔案的方式與執行階段相同。 針對部分組態或發生錯誤的情況,檢查模擬記錄檔中的輸出可能會很有幫助 (您可能需要啟用 Show Details 資料夾內的 Simulation 對話方塊)。

請注意,DRAM 技術在隨機存取方面的效能非常差。 在最壞的情況下,每次連續存取 DRAM 都會導致頁面未命中 (page miss) 並需要新的列活化, DRAM 產出量會遭受高達 90% 的極致效能損失,導致頻寬使用率僅剩約 10%。 不過,透過結合多個 DRAM 記憶庫 (bank),即使在最壞情況下也能提升產出量。 將 2 個或更多 RamLUT 運算子串聯在一起,並讓它們各自處理不同的查詢作業。 如果連續輸入值沒有快速變動,運算子的效能會高得多。 請在硬體使用者指南中檢查您的擷取卡的各自 DRAM 技術與尺寸。

頻寬最佳化

通過使用 Frame Grabber RAM (DRAM) 之運算子的理論頻寬 [位元/秒],是根據下列公式計算:

然而,由於 DRAM 效率的關係,實際頻寬總是小於理論頻寬。

當 Bit Width 與 Parallelism 的乘積等於內部 RAM Port Width x 2(適用於唯讀參數)時,穿過 operator 的 maximum bandwidth 達到最大值。

[備註] 平台特定值

RAM Port Width 和 System Clock 是平台特定的。有關您個別平台的詳細資訊,請參閱 Device Resources。

I/O Properties

Property Value
Operator Type M
Input Link I,讀取位址輸入
Output Link O, 影像資料輸出

支援的 Link 格式

Link Parameter Input Link I Output Link O
Bit Width [1, RAM Address Width]1 [1, Ram Data Width]2
Arithmetic unsigned as I
Parallelism 1 as I
Kernel Columns 1 [1, Ram Data Width / 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,但可以儲存多個 kernel 元件。 (bit width * kernel size) 的乘積不得超過參數 RamDataWidth 中顯示的原生 RAM 資料寬度。 請參閱 Device Resources 以取得更多資訊。

參數

RamDataWidth
Type 靜態寫入參數
Default 不適用
Range 整數

此參數提供可在 RAM 介面上使用的資料位元數。這是輸出可以提供的最大位元數 (如果正確使用 kernel)。

RamAddressWidth
Type 靜態寫入參數
Default 不適用
Range 整數

此參數提供可使用的位址位元數。

InitAddress
Type 動態寫入參數
Default 0
Range [0, 2^InputBitWidth-1]

此參數定義由參數 InitData 所定義之資料的位址。 請參閱上方的說明。

InitData
Type 動態寫入參數
Default 0
Range [0, 2^OutputBitWidth-1]

此參數定義寫入至由參數 InitAddress 所定義之位址的資料。 寫入此參數會開始實際寫入至硬體中。 請參閱上方的說明。

InitFileLoadMode
Type 動態寫入參數
Default text_with_checks
Range {text_with_checks, text_raw, binary}

此參數定義載入至查找表中之檔案的檔案格式與模式。 請參閱上方的說明。

InitFileName
Type 動態寫入參數
Default InitRamLut.txt
Range

此參數定義初始化檔案的名稱。

LoadInitFile
Type 動態寫入參數
Default 0
Range [0, 1]

若要開始將 InitFileName 參數指定的檔案載入至 LUT 中,請將值 1 寫入此參數。 請參閱上方的說明。

使用範例

以下範例顯示了 RamLUT 運算子的使用方式: