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 進行程式設計。
-
程式設計 LUT 的其中一種可能性是暫存器介面,其提供位址值參數 InitAddress 與 InitData。 首先,使用參數 InitAddress 設定位址。 接著,將資料寫入參數 InitData。 寫入資料會促使運算子實際寫入 LUT 並取代先前的數值。 如果您使用 kernel,寫入最後一個 kernel 元素會促使運算子實際寫入 LUT 並取代先前的數值。
-
程式設計 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 初始化程序期間將初始檔案載入硬體,這會非常有用。
在模擬期間,載入初始檔案的方式與執行階段相同。 針對部分組態或發生錯誤的情況,檢查模擬記錄檔中的輸出可能會很有幫助 (您可能需要啟用 資料夾內的 對話方塊)。 -
請注意,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。 |
|
允許的輸入 Bit Width 取決於擷取卡的實體記憶體,以及有多少個運算子共用對 RAM 的存取權。 參數 RamAddressWidth 提供可使用的最大位址位元。 請注意,此數字可能會根據設計中基於 RAM 的運算子數量而有所變更。 請參閱 Device Resources 以取得更多資訊。 |
|
|
允許的輸出 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 運算子的使用方式:
-
'使用 RamLUT Operator 進行 2D Shading Correction / 平場校正'
範例 - 此範例顯示了 2D Shading Correction 的實作。 校正值儲存在 operator RamLUT 中。 此 applet 執行高精確度的位移和增益校正。
-
'Functional Example for Specific Operators of Library Color, Base and Memory'
範例 - 如何使用此運算子的示範

![[備註]](../common/images/admon/note.png)


上一頁

