Library: Memory 運算子
| 適用於硬體平台 |
|---|
| imaFlex CXP-12 Penta |
| imaFlex CXP-12 Quad |
此運算子可讓您將影像資料 從主機電腦上傳至影像擷取卡的 RAM(DRAM)。它能針對 任意數量的感興趣區域(ROI)提供連續的資料輸出。此處使用影像檔案作為 通用資料容器。 因此,上傳的影像可包含任何資料,例如 係數。每張影像皆會被指派至一個輸出核。此外,此運算子 提供與RamLUT 運算子相同的初始化介面,其中每個記憶體位址皆可透過手動、文字檔或 二進位檔進行初始化。所有係數影像皆儲存於 幀擷取器 RAM(DRAM)中。需配置一個 類型為RAM的VisualApplets 資源。更多資訊請參閱「裝置資源的分配」。關於 此運算子的延遲資訊,請參閱表 46,「庫記憶體中各運算子的個別延遲」。 多個 RAM類型的資源會透過共享 記憶體的概念,共用同一組實體 RAM。有關如何使用共享記憶體的文件,請參閱 《應用說明:共享記憶體》。
此運算子 CoefficientBufferMultiRoi支援在輸出端使用核函數。 若以影像檔案初始化此運算子,每個影像檔案將被指派至 對應的輸出核。若以文字檔案或 二進位檔案手動初始化緩衝區,則必須確保資料順序正確。確切的資料 格式說明如下。

該運算子透過多種方式簡化了 緩衝區內容的編程。無論採用何種方式,都必須在 合成過程完成後、於執行時使用該小程式之際,對緩衝區進行編程。
編程緩衝區的一種方式是透過寄存器介面,該介面提供 InitAddress和 InitData 兩個參數。首先,使用 InitAddress參數設定地址。接著,將資料 寫入InitData參數中。
寫入資料會使運算子實際將資料寫入緩衝區,並 覆寫先前值。 寫入最後一個 平行核心的最後一個核心元素時,會導致運算子實際寫入 RAM 並取代 先前值。RAM 位址處的資料必須依下列方式組織(亦 參見上方的動畫):
-
每個 RAM 位址包含O.Parallelism* O.KernelColumns*O.KernelRows 個值。
-
因此,InitData是一個由 O.Parallelism* O.KernelColumns*O.KernelRows 值所組成的陣列。
-
首先,必須列出核函數每一行的所有值,也就是說,必須 對每個核函數的 欄。
-
接著,資料會遍歷所有核心 列。
-
最後,對所有平行資料核心重複執行上述步驟。

設定緩衝區的第二種方式是使用一個或多個 包含內容的檔案。存取檔案的速度比存取寄存器更快,但 需要特別留意。檔案可以採用不同的格式。您必須透過 InitFileMode參數來定義該格式。
在此模式下,初始化檔案必須為純文字檔案,其中數值字串 須以空格、制表符、換行符 (LF) 或回車 換行符 (CRLF) 作為分隔符。系統會檢查這些檔案是否有錯誤, 若檔案無法使用,則會回報錯誤。
每個值代表一個核心元素,且必須是 位於正確範圍內的十進位數。該檔案所包含的 核心元素數量必須與值數完全相符。若您使用的並行度大於 1,則 值的數量必須等於並行度 * 核心 元素的數量。
下圖展示了一個 4x3 核心的檔案:

此模式與text_with_checks模式類似,但其 錯誤檢查較少。在此模式下,每個值都必須在 獨立的一行中提供。相較於 text_with_checks模式。由於每個值都寫在 獨立的一行中,因此並行處理不會影響此 檔案格式中的資料順序。上述範例在 text_raw模式下呈現如下:

二進位模式假設使用二進位檔案,其中每個核心條目佔用 8 位元組。若核心條目的值可由 少於 64 位元表示,則未使用的位元將被忽略。 這是將值寫入 RAM 的 最快方法。由於所有值皆連續寫入,因此 對於此檔案格式而言,並行處理不會影響資料值的順序 。上述範例在二進位 模式下的呈現如下:

image_file模式需要一個以逗號或分號分隔的 InitFileName參數中,並以 逗號或分號分隔。每個檔案皆用於初始化一個核心值: 第一個初始化檔案會指派給第一個核心值,第二個檔案則 指派給第二個核心值,以此類推……
由於此模式使用一般影像,因此並行處理與
檔案的資料格式無關。初始化檔案可以採用影像格式
*.tif 或 *.bmp. 個別
影像檔案的格式不一定要相同,且其
像素數量也不必相同。
若每行影像的最大位元組數達到 32 位元整數值的邊界,操作員可能會無法載入該影像。此情況 僅會在O.Max.Img.Width接近 其最大寬度 (2^RamAddressWidth),且 O.Parallelism 亦大於 1 時才會發生。
當一個初始化檔案包含2^RamAddressWidth* KernelSize *Parallelism 個值時,記憶體將會被完全覆寫, 從位址 0 開始。在此情況下,參數 InitAddress將不會被修改。
當初始化檔案所含的資料量超過可寫入 RAM 的容量時,系統僅會 使用該初始化檔案的一部分。系統會先使用檔案開頭的資料, 直到記憶體空間用盡為止。
當初始化檔案中的條目較少時,系統會執行 部分初始化。在此情況下,初始化將從 InitAddress參數指定的位址開始。該參數 InitAddress會自動遞增至 最後一個寫入的記憶體條目之後的下一個位置。 這使得系統能夠監控 已寫入的記憶體項目數量。當檔案所含的項目數超過 (2^RamAddressWidth- InitAddress) * KernelSize* Parallelism 個值時,初始化會在 寫入最後一個記憶體條目後停止, 並將InitAddress設為 0。
對於上述指定的初始化模式, InitFilename參數用於指定 包含初始值的檔案。最後,將值1寫入 LoadInitFile參數將開始讀取該檔案, 若讀取成功,則將這些值寫入硬體。 若將0寫入 LoadInitFile參數,則不會觸發 數值的載入。若您不希望在 Applet 初始化過程中 將初始檔案載入至硬體,此功能將十分實用。
在模擬過程中,載入初始化檔案的方式與 執行時相同。若需進行部分設定,或發生錯誤時, 查看模擬日誌中的輸出內容可能會有所幫助:啟用 選項,位於 對話方塊中啟用顯示 詳細資訊。
一旦操作員的 幀擷取卡的 RAM(DRAM) 經 影像資料初始化後,便會讀取多個感興趣區域(ROI)。您可以透過 以下參數來定義這些 ROI:
-
讀取的 ROI 數量:MaxNumRoI及 NumRoI
-
ROI 的大小與位置:XOffset、 XLength、 YOffset 以及 YLength
MaxNumRoI 參數指定可讀取的 ROIs 最大數量。每個 ROI 座標 參數欄位XLength、 YLength、XOffset及 YOffset皆包含MaxNumRoI 個項目。
參數 NumRoI指定該 運算子在輸出端提供的實際 ROIs 數量。若將NumRoI設定為 dynamic,其數值不得超過 MaxNumRoI 的數值。若設定為dynamic, NumRoI可在影像擷取過程中進行更新。 在擷取執行期間,運算子會週期性地讀取指定數量的 ROI。運算子會等待一個ROI 週期結束,直到 其數值變更為NumRoI 為止。
所有 ROI 皆會依序讀取,並 以獨立影像的形式輸出至操作員介面:ROI 0、ROI 1、ROI 2、……直至 ROI N-1。其中 N 為當前已讀取的 ROI 數量,由 參數NumRoI 指定。 參數欄位 XOffset、XLength、 YOffset及YLength 用於指定一組 ROI。您可以將這些參數設定為動態或 靜態,這決定了您是否能在 執行期間調整該參數。 當其中一個 ROI 參數的 參數類型被設定時,所有 ROI 參數的類型會自動調整。請參閱「參數編輯」章節, 了解如何設定欄位 參數。
只要不超過最大輸出幀尺寸, 所有可能的矩形區域皆可 作為 ROI 的定義,也就是說,單一像素、單一行、單一列、矩形區域, 或整個幀皆可定義為 ROI。
不同的 ROIs 無需具有相同的 大小。
每個 ROI 都可以個別定義。
ROI 可以重疊,也可以重複。
X 座標參數 XOffset和XLength 必須與輸出並行度的步長一致。
您可以透過將 XLength或YLength設定為 零,來定義空的 ROI。此時,該運算子會在輸出端提供一張空影像(或連結類型為 VALT_LINE1D 的線)。 一張空影像不包含任何像素。若 空 ROI 的連結類型為VALT_PIXEL0D,則 完全不會產生任何輸出。
若將此運算子與影像協定 VALT_LINE1D或VALT_PIXEL0D 時,ROI 的定義是 依據初始化檔案(或多個初始化檔案)而定,該檔案始終被視為二維 影像。系統會讀取二維 ROI,但根據連結類型不同,輸出 結果將是一系列 ROI 幀、線或像素。
在連結類型 VALT_LINE1D 下,輸出為一組無限的線段序列,其中 各獨立定義的 ROI 之間並無分隔。同樣地,在連結類型 VALT_PIXEL0D下,該運算子會產生一組無限的像素序列, 其中各獨立 ROI 之間,甚至各 ROI 線段之間皆無分隔。
該運算子會在 資料擷取開始後,且其輸出未被 後續運算子阻塞時,立即於其輸出端提供 ROI 資料。有關該運算子延遲的詳細資訊,請參閱表 46,「庫記憶體中各運算子的個別延遲」。
若將 ROI 參數類型設定為「動態」,即可動態更新所有 ROI。然而,更新後的 ROI 將 僅在當前「ROI 週期」完成,且所有 NumRoI個 ROI 皆已讀取後,才會生效。
![]() |
大量感興趣區域(ROI)與時序 |
|---|---|
|
隨著最大 ROI 定義數量增加(由參數MaxNumRoI 決定), 運算元的 BRAM 消耗量也會隨之增加。這可能會在 高時鐘頻率下導致時序問題。例如,當MaxNumRoI設定為 65536 時, 可能無法滿足完整設計的時序要求。 |
以下限制適用於 CoefficientBufferMultiRoi運算子:
-
若 DRAM 未完全初始化,系統將不會檢查 ROI 座標是否實際包含影像資料。在此情況下,操作員會從記憶體中讀取 隨機的虛假值。
-
最大連線屬性會因運算子的使用方式而異。如需詳細資訊,請參閱下方的 Supported Link Format 一節。
-
若MaxNumRoI值過高(接近其最大值 65536),可能會導致時序問題。
-
當 InitFileLoadMode設定為 image_file模式時,過寬的影像可能無法載入。
為了獲得最佳效能,所使用的 資料位元數應盡可能與模組的 參數RamDataWidth 中指定的數值相符。 當位元寬度、核心大小與 並行度的乘積等於內部 RAM 埠寬度 RamDataWidth 時, 運算子即可達到最大頻寬。請注意,內部位元寬度可 透過使用核心來增加,但完整的核心仍會被視為 單一像素。
| RamDataWidth | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 不適用 |
| Range | 整數 |
|
此參數指定可在 RAM 中使用的最大資料寬度。 此參數取決於所使用的硬體平台。 |
|
| RamAddressWidth | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 不適用 |
| Range | 整數 |
|
此參數指定可用的位址位元數。 可用的 RAM 插槽數量由 2^RamAddressWidth 所決定。當前的 RamAddressWidth取決於硬體 平台,以及設計中當前的記憶體運算子數量(即 使用 RAM 資源的運算子)。 |
|
| InitAddress | |
|---|---|
| Type | dynamic write parameter |
| Default | 0 |
| Range | [0, 2^RamAddressWidth-1] |
|
此參數定義由參數 InitData 所定義之資料的位址。當使用初始化檔案初始化 RAM 時,此參數亦可作為 偏移位址使用。請參閱 上方的說明。 |
|
| InitData | |
|---|---|
| Type | dynamic write parameter |
| Default | 0 |
| Range | [0, 2^O.BitWidth-1] |
|
此欄位參數定義了寫入至 由參數InitAddress 所定義之位址的資料。 InitData包含 O.Parallelism* O.KernelColumns* O.KernelRows個值。 寫入 InitData陣列的最後一個 欄位,將觸發實際 寫入硬體的動作。詳情請參閱上文說明。 |
|
| InitFileLoadMode | |
|---|---|
| Type | dynamic write parameter |
| Default | image_file |
| Range | {帶核對符號的文字, 原始文字, 二進位檔, 圖片檔案} |
|
此參數用以定義載入至查閱表中的檔案之 檔案格式與模式。
詳情請參閱上文的說明。 |
|
| InitFileName | |
|---|---|
| Type | dynamic write parameter |
| Default | InitCoefficientBuffer.tif |
| Range | |
|
此參數用於定義初始化檔案的名稱。 若InitFileLoadMode設定為 image_file,則此參數將包含一組 檔案清單,而非單一檔案名稱。在檔案清單中,每個項目必須 以逗號或分號分隔。 在 image_file模式下,所指定檔案的數量必須與 可用核心值(O.KernelColumns* O.KernelRows)的數量相等,當使用 LoadInitFile 載入這些檔案時。 此參數可接受在檔案名稱開頭或結尾含有空白字元, 以及開頭或結尾含有「"」或「'」 字元的檔案名稱。 |
|
| LoadInitFile | |
|---|---|
| Type | dynamic write parameter |
| Default | 0 |
| Range | [0, 1] |
|
若要開始將由 InitFileName參數指定的檔案載入至 RAM, 請將值1寫入此參數。詳情請參閱 上方的說明。 |
|
| MaxNumRoI | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 1 |
| Range | [1, 65536] |
|
此參數定義操作員可儲存的 ROIs 最大數量。 若將NumRoI設定為靜態,此 參數將無法編輯。相反地,它會自動採用與 NumRoI 相同的數值。 最大 ROI 數量設定得過高 MaxNumRoI可能會導致 在建構小程式時出現時間同步問題。 |
|
| NumRoI | |
|---|---|
| Type | 動態/靜態寫入參數 |
| Default | 1 |
| Range | [1, MaxNumRoI] |
|
此參數定義實際使用的 ROIs 數量。該運算子 會先讀取NumRoI 個ROIs,然後從 第一個 ROI 開始重新讀取。在擷取執行期間,該運算子會循環 輸出NumRoI 個ROIs,直到輸出被 後續的運算子阻塞為止。 若將此參數設定為 static,其取值範圍為 [1, 65536],且 MaxNumRoI將被停用。 |
|
| XOffset | |
|---|---|
| Type | 動態/靜態讀寫參數 |
| Default | 0 |
| Range | [0, O.MaxImgWidth - XLength] |
|
此欄位參數定義了 ROI 最 左側欄位的 x 座標陣列。 步階大小即為 Parallelism。 了解如何在 'Parameter Editing' 中設定欄位參數。 |
|
| XLength | |
|---|---|
| Type | 動態/靜態讀寫參數 |
| Default | 1024 |
| Range | [0, O.MaxImgWidth - XOffset] |
|
此欄位參數定義 ROI 寬度的陣列。 步階大小即為 Parallelism。 了解如何在 'Parameter Editing' 中設定欄位參數。 |
|
| YOffset | |
|---|---|
| Type | 動態/靜態讀寫參數 |
| Default | 0 |
| Range | [0, O.MaxImgHeight - YLength] |
|
此欄位參數定義了 ROI 第一行 的 y 座標陣列。 了解如何在 'Parameter Editing' 中設定欄位參數。 |
|
| YLength | |
|---|---|
| Type | 動態/靜態讀寫參數 |
| Default | 1024 |
| Range | [0, O.MaxImgHeight - YOffset] |
|
此欄位參數定義 ROI 高度的陣列。 了解如何在 'Parameter Editing' 中設定欄位參數。 |
|
| LinesToSimulate | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 1 |
| Range | {1, 2³¹-1} |
|
此參數僅在設計階段進行模擬時使用,且僅 當O.LinkType設定為 VALT_LINE1D 時才適用。 此參數用以定義該 運算子應模擬多少條 ROI 線。 ROI 是在初始化 影像中定義的二維區域,但模擬輸出會提供一組線段序列,該序列會循環 遍歷所有指定的 ROI(在讀取 NumRoI條 ROI 線段後,將從 ROI 0 重新開始)。 |
|
| PixelsToSimulate | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 1 |
| Range | {1, 2³¹-1} |
|
此參數僅在設計階段進行模擬時使用,且僅 當O.LinkType設定為 VALT_PIXEL0D 時才適用。 此參數定義該 運算子應模擬多少個 ROI 像素。 ROI 被定義為初始化 影像中的二維區域,但模擬輸出將提供一組像素序列,該序列會循環 遍歷所有指定的 ROI,並在讀取 NumRoI個 ROI 的像素後,從 ROI 0 重新開始。 |
|

![[注意]](../common/images/admon/note.png)



上一頁

