Operator Library: Memory
此運算子允許將主機 PC 的影像檔案上傳至擷取卡,以便連續輸出並作為影像來源使用。此處的影像檔案是用作通用的資料容器。因此,上傳的影像可以包含任何資料,例如係數。所有係數影像必須具有相同的像素寬度和高度,但可以採用完全不同的格式。例如,連結 0 的係數影像可以是 GRAY 8 bit 格式。連結 1 可以提供 RGB16 格式的影像。而連結 2 可以是二進位影像。所有係數影像都儲存在 Frame Grabber RAM (DRAM) 中。這需要一個類型為 RAM 的 VisualApplets 資源。請查看「Allocation of Device Resources」以取得更多資訊。關於運算子的延遲資訊,請參閱「表 46:Library Memory 中運算子的各別延遲」。
![]() |
imaFlex CXP-12 Quad 和 imaFlex CXP-12 Penta 平台不支援 CoefficientBuffer |
|---|---|
|
imaFlex CXP-12 Quad 和 imaFlex CXP-12 Penta 平台不支援 CoefficientBuffer。「使用 ImageInjector 載入測試影像的功能範例」範例展示了如何在 imaFlex CXP-12 Quad 或 imaFlex CXP-12 Penta 上使用 ImageInjector 運算子來替代 CoefficientBuffer 運算子的測試影像來源功能。 範例「使用 RamLUT 運算子進行 2D Shading Correction / 平場校正」展示了如何使用 RamLUT 代替 CoefficientBuffer 來進行 2D shading correction。 |
連結的數量對應於儲存在 CoefficientBuffer 中的係數影像數量。在未執行影像擷取的情況下,只能透過軟體將係數影像上傳到 FPGA 緩衝區。這是透過寫入參數 LoadCoefficients 來完成的。
運算子的輸出連接埠以同步方式運作。第一個影像像素的傳輸在所有輸出連接埠上完全於同一時刻開始。如果所有影像都已傳輸至接收運算子,CoefficientBuffer 會開始再次同步輸出影像。
![]() |
模擬期間的行為 |
|---|---|
|
運算子連結上的影像會同時輸出。在一個模擬步驟中,運算子在每個連結上最多輸出一個影像。如果在模擬步驟中,所有儲存的影像(每個連結一個)都已轉發至接收運算子(即未發生阻擋),則相同的輸出(每個連結一個)將在接下來的模擬步驟中轉發。 |
CoefficientBuffer 也支援感興趣區域 (RoI) 管理。RoI 由 4 個參數 XOffset、XLength、YOffset 和 YLength 定義。XOffset 和 YOffset 定義 RoI 的左上角,即以像素為單位的起始座標。RoI 的尺寸不得超過由參數 BufferWidth 和 BufferHeight 定義的已儲存係數影像尺寸。RoI 可以在擷取期間動態更新,或者在未執行擷取時,透過將所有 4 個 RoI 座標參數設定為新值並寫入參數 UpdateROI 來更新。請注意,XLength 還必須符合連結 Bit Width 的粒度,即 XLength 對 LinkParallelism 取餘數等於 0。
對於每個輸出連結,緩衝區中都會儲存一個係數影像檔案,即係數影像 0 將在連結 0 上提供。係數影像必須在擷取開始之前載入到 CoefficientBuffer 中。係數影像必須儲存在由參數 CoefficientFile N 指定的檔案中。N 分別代表連結編號或係數影像編號。係數檔案必須以 TIF 格式編碼。
BufferWidth 指定儲存在 CoefficientBuffer 中的所有係數影像的寬度,單位為像素。
BufferHeight 指定由 CoefficientBuffer 管理的所有係數影像的高度,單位為像素。BufferWidth 和 BufferHeight 決定所有輸出連結的最大輸出影像尺寸。
對於灰階連結,必須使用灰階影像檔案。對於彩色連結,必須使用 RGB 影像檔案。
如果連結的 Bit Width 大於影像檔案的 Bit Width,運算子將使用多個影像檔案像素來產生輸出像素。例如,22 bit 的連結將需要 8 bit 影像檔案中的 3 個像素。因此,影像檔案的影像寬度必須比參數 BufferWidth 大 3 倍。
如果連結的 Bit Width小於影像檔案的 Bit Width,運算子將僅使用輸入影像檔案的較低位元。例如,8 bit 的影像檔案和 3 bit 的連結將使用檔案的第 0、1 和 2 位元。
應謹慎使用 16 bit TIF 檔案。
參數 LoadCoefficients 用於在影像擷取開始之前,將係數影像載入到緩衝區中。載入是由對此參數的寫入週期或值 1 觸發的。寫入值 0 沒有作用。
參數 UpdateROI 用於在影像擷取正在執行或未擷取影像時,動態更新目前的 RoI。在寫入此參數之前,必須透過 4 個 RoI 座標參數指定新的 RoI。寫入的值不會影響更新過程,只有寫入週期會觸發它,也就是說,寫入的值可以是 0 或 1。
參數 XOffset 指定從左側影像邊界到 RoI 第一欄的水平方向位移。指定的值以像素為單位,且不得超過 BufferWidth-1 的值。
Parameter XLength specifies the length of the RoI in horizontal direction in pixels. The specified value must not exceed BufferWidth and must be divisible by the output link parallelism. Also the following constraint must be met: XOffset + XLength <= BufferWidth.
參數 YOffset 指定從頂部影像邊界到 RoI 第一行的垂直方向位移。YOffset 必須以像素為單位指定,且不得超過 BufferHeight-1。
Parameter YLength specifies the length of the RoI in vertical direction in pixels. The length must not exceed BufferHeight. Furthermore, the following constraint must be met: YOffset + YLength <= BufferHeight.
參數 CoefficientFile N 指定以 TIF 格式儲存的連結 N 係數影像的檔名。
![]() |
注意 |
|---|---|
|
使用此 Operator 的建議設定順序
-
連接 CoefficientBuffer 的所有連線。
-
指定所有連線的連線格式。
-
設定 BufferWidth 和 BufferHeight 參數。
-
設定 RoI 座標。
-
設定係數檔案名稱。
在內部,CoefficientBuffer operator 會從所有係數影像像素產生一個累積像素。這就是所謂的超級像素(super-pixel)。
- 如果 RAM 資料寬度小於超級像素的 Bit Width,則會將超級像素分散到多個 RAM 單元中。
- 如果超級像素小於 RAM 資料寬度,則每個 RAM 單元中只會儲存一個超級像素,即使有多個超級像素可以放入一個 RAM 單元中也是如此。
因此,一個 RAM 單元將只會被一個超級像素佔用,或者屬於一個超級像素的一部分。
Operator 在內部將輸出 Bit Width 的像素儲存在 RAM 資料寬度寬的區塊中,例如,如果在 marathon VCL 平台上將輸出 Bit Width 設定為 8bit(RAM 資料寬度為 256bit),則每個 RAM 單元僅使用 8 bit。其餘的則會被浪費掉。
在這種情況下,僅僅透過增加 Parallelism 來增加頻寬將無助於解決問題。
您可以在本說明文件的平台資源(Platform Resources)章節中查詢您正在使用的 Frame Grabber 的 RAM 資料寬度:
以下提供一些增加頻寬/RAM 效率的想法:
提示 1:
為了增加頻寬,您可以將像素的 Bit Width 定義得更大,然後稍後使用 CastParallel operator 來修正此問題。
範例:您需要一個 Gray 8bit 的影像,但具備 Parallelism 8 的頻寬。為此,您可以將輸出 Bit Width 定義為 64(Parallelism 1),然後稍後使用 operator CastParallel 將連線切換回 8 bit 和 Parallelism 8。
透過這種方式,您的影像也會消耗較少的 RAM,因為 1 個 RAM 單元中儲存了超過 1 個像素。如果直接使用(不透過 operator CastParallel),儲存影像所需的記憶體將會大 8 倍。
提示 2:
如果組合連線的 Bit Width 超過 64 bit,您可以將影像分割為多個影像,並使用 operator CoefficientBuffer 的多個連線。稍後您可以結合所有連線,因為所有輸出都是 O-synchronous。
範例:您想要以 Parallelism 4 傳送 RGB24 影像。累積的像素將會是 4*24 = 96Bit ——這太大了。因此解決這個問題的想法是將影像分割為 4 個子影像,每個子影像具有 ¼ 的像素。
在內部,operator 會將每個輸入的像素累積為一個 96bit 的超級像素。
透過這種方式,RAM 的效率也得到了提升。如果我們在 ironman mE5VQ8-CXPD 平台(128 Bit 寬的 RAM 資料介面)上使用 1024x1024 影像,則儲存在簡單 1 連線 CoefficientBuffer 中的影像為
1024 * 1024 * 128 / 8 Byte = 16MB。
如果套用 4-link 設定,大小為
1024 * 1024 * (128 / 4) / 8 = 4MB
假設 Coefficientbuffer 僅搭配單一係數影像檔案使用,像素的 Bit Width 為每像素 8 bit,且 Parallelism 為 1。在這種情況下,緩衝區的效能將會大幅下降。這是因為僅使用了 1/8 的頻寬。此外,緩衝區會以加倍的設計時脈頻率讀取其數值,亦即僅使用了完整頻寬的 1/16。
為了以最高效能使用緩衝區,必須重新解讀像素資料。在我們的範例中,緩衝區輸出 link 必須參數化為每像素 64 bit,且必須使用 Parallelism 2。這將使緩衝區每個設計時脈讀取 128 bit。請使用 CastParallel operator 將 64 bit 的資料值重新解讀為 8 的 Bit Width 以及 16 的 Parallelism。此外,BufferWidth 參數必須設定為係數影像的影像寬度的 1/8。
總而言之,唯有在輸出 Bit Width 很高(例如 64 bit)時,才能獲得最大頻寬。使用高的輸出 Parallelism 不會增加頻寬。
此 operator 可作為模擬來源使用。在這種情況下,operator 將會嘗試載入並使用由 Coefficient File N 參數指定的影像檔案。請注意,這只有在影像檔案完全符合 link 格式時才能正常運作。如果您有例如 64 Bit 的 link 格式,則您的影像檔案的影像寬度必須是 link 的最大影像寬度的 8 倍,因為該影像將具備每像素 8 bit。高度也必須完全符合 link 上指定的最大影像高度。
通過使用 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 的範圍是 [1, 64]。對於有號輸入,範圍是 [2, 64]。對於無號彩色輸入,範圍是 [3, 63],而對於有號彩色輸入,範圍是 [6, 63]。 |
|
|
Bit Width 與 Parallelism 的乘積不得超過原生 RAM 資料寬度。請參閱 Device Resources 以取得更多資訊。 |
| RamDataWidth | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 不適用 |
| Range | 整數 |
|
此參數提供可用於 RAM 介面的資料位元數。 |
|
| RamAddressWidth | |
|---|---|
| Type | 靜態寫入參數 |
| Default | 不適用 |
| Range | 整數 |
|
此參數提供可用的 RAM 位址位元數。 |
|
| BufferWidth | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
此參數定義以像素為單位的係數影像寬度。此外,此參數定義所有輸出 link 的最大影像寬度。此參數的範圍取決於所使用的擷取卡及其 RAM。 |
|
| BufferHeight | |
|---|---|
| Type | static parameter |
| Default | 1024 |
| Range | [1, 65535] |
|
此參數定義以像素為單位的係數影像高度。此外,此參數定義所有輸出 link 的最大影像高度。此參數的範圍取決於所使用的擷取卡及其 RAM。 |
|
| LoadCoefficients | |
|---|---|
| Type | 動態寫入參數 |
| Default | 0 |
| Range | {0, 1} |
|
此參數用於在影像擷取開始之前,將係數影像開始載入緩衝區中。載入動作是透過將數值 1 寫入此參數的寫入週期來觸發。寫入數值 0 不會觸發係數檔案的載入。 |
|
| UpdateROI | |
|---|---|
| Type | 動態寫入參數 |
| Default | 1 |
| Range | {1} |
|
此參數用於更新硬體中的 ROI 設定。會使用由 4 個 ROI 座標參數定義的數值。隨時都可以進行更新,甚至在執行擷取的過程中也可以。 |
|
| XOffset | |
|---|---|
| Type | dynamic/static read/write parameter |
| Default | 0 |
| Range | [0, Max.Img Width - XLength] |
|
此參數定義 ROI 左上角的 x 座標。變更數值不會直接變更 ROI 設定。您必須寫入參數 UpdateROI 才能套用新設定。 步進大小即為 Parallelism。 |
|
| XLength | |
|---|---|
| Type | dynamic/static read/write parameter |
| Default | 1024 |
| Range | [parallelism, Max.Img Width - XOffset] |
|
此參數定義 ROI 的寬度。變更數值不會直接變更 ROI 設定。您必須寫入參數 UpdateROI 才能套用新設定。 步進大小即為 Parallelism。 |
|
| YOffset | |
|---|---|
| Type | dynamic/static read/write parameter |
| Default | 0 |
| Range | [0, BufferHeight - YLength] |
|
此參數定義 ROI 左上角的 y 座標。變更此數值不會直接改變 ROI 設定。您必須寫入 UpdateROI 參數以套用新設定。 |
|
| YLength | |
|---|---|
| Type | dynamic/static read/write parameter |
| Default | 1024 |
| Range | [1, BufferHeight - YOffset] |
|
此參數定義 ROI 的高度。變更此數值不會直接改變 ROI 設定。您必須寫入 UpdateROI 參數以套用新設定。 |
|
| FillLevel | |
|---|---|
| Type | 動態讀取參數 |
| Default | 0 |
| Range | [0%, 100%] |
|
此參數以 25% 為遞增幅度提供 DRAM 的 Fill 級別。 |
|
| Overflow | |
|---|---|
| Type | 動態讀取參數 |
| Default | 0 |
| Range | [0, 1] |
|
此參數表示緩衝區溢位。 |
|
| Coefficient File N | |
|---|---|
| Type | 動態讀取/寫入參數 |
| Default | coefficients_N.tif |
| Range | 包含選用路徑的任意 tif 檔案檔名 |
|
此參數定義連結 N 的係數影像檔名。 |
|
以下範例顯示了 CoefficientBuffer 運算子的使用方式:
-
範例 - 基於偵錯目的,可以手動插入影像。
-
範例 - 基於偵錯目的,可以調查連結上的影像傳輸狀態。
-
範例 - 此範例展示了 2D Shading Correction 的實作。 校正值會儲存在畫面擷取卡 RAM 中。 該 Applet 會執行高精度的偏移與增益校正。
-
'1D Shading Correction Using Frame Grabber RAM'
範例 - 此範例展示了 1D Shading Correction。 校正值會儲存在畫面擷取卡 RAM 中。

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



上一頁

