Memory 元素#
本主題說明 VisualApplets 設計中的 memory operators 如何對應至目標硬體上的實體記憶體,以及何時應使用哪種類型。讀完本主題後,您將了解 FPGA 內部記憶體(例如區塊 RAM)與 取像卡 DRAM 之間的差異、FIFO 風格緩衝區與隨機存取影格緩衝區的不同、共用 DRAM 頻寬如何限制具有多個 RAM operators 的設計,以及如何在模擬和硬體上識別記憶體相關的問題。
關鍵詞
FillLevel 可讓您在硬體執行階段(例如在 microDisplay X 中)了解緩衝區的滿載程度(以百分比表示)。持續接近 100% 的緩衝區通常指出存在瓶頸或死結。作為起點,請在相機後方放置緩衝區。
關於平台 RAM 大小、資料寬度和頻寬值,請參閱裝置資源。
FPGA 記憶體與取像卡 DRAM#
VisualApplets memory operators 根據其在取像卡上儲存資料的位置分為兩群組。第二個區分方式是它們存取該資料的方式:FIFO 風格緩衝區與隨機存取或多重 ROI 影格緩衝區。Operator Reference 中的 Overview of the Memory Library 顯示了每個 memory operator 儲存其資料的位置。VisualApplets 中的 RAM 資源是對應至主機板 DRAM 的裝置資源權杖。它並非 VisualApplets 應用程式內部的記憶體。
| Property | FPGA 內部記憶體 | 取像卡 DRAM |
|---|---|---|
| 典型 operators | ImageFifo; 針對小型隨機存取情況亦適用 FrameMemoryRandomRd / LineMemoryRandomRd | ImageBuffer, LineBuffer, FrameBufferRandomRead, FrameBufferMultiRoi, FrameBufferMultiRoiDyn |
| 位置 | 在 FPGA 內部(imaFlex CXP-12 Quad/Penta 上的 BRAM、LUT RAM 或 URAM) | 在機板上,FPGA 外部 |
| 容量 | 受限;全解析度影格通常超過可用的 FPGA 記憶體 | 較高;適用於許多行或全影格 |
| 延遲 | 低;無法存取外部 DRAM 匯流排 | 基於行的 FIFO 至少會增加一行 |
| VisualApplets RAM 資源 | 否 — 不保留 RAM 裝置資源 | 是 — 每個執行個體一個 RAM 資源,對應至機板 DRAM |
| 頻寬 | 本機;運算子不會爭奪擷取卡 RAM 介面 | 在相同實體介面上的 RAM 運算子之間共用 — 請參閱 Sharing DRAM Bandwidth |
使用 Choosing a Memory Operator 中的表格來挑選運算子,然後閱讀對應的運算子章節以了解參數與平台詳細資料。
選擇 Memory Operator#
| 使用情境 | 偏好 |
|---|---|
| 小緩衝區、低延遲、無 DRAM 頻寬成本 | ImageFifo (FPGA 內部) |
| mE5 上的 Image FIFO、尖峰吸收、ROI | ImageBuffer (DRAM) |
| imaFlex CXP-12 Quad/Penta 上的 Line FIFO | LineBuffer (DRAM) |
緩衝區位於 SYNC 具備微小延遲 | ImageFifo (若延遲較大,則使用較大的 DRAM 緩衝區) |
| 具備隨機像素讀取的全影格儲存區 | FrameBufferRandomRead (DRAM) |
| 從單一緩衝區取得多個或動態的 ROI | FrameBufferMultiRoi / FrameBufferMultiRoiDyn (DRAM) |
設計指南
Basler 建議您在設計中使用至少一個 DRAM 運算子,以補償來自相機的資料叢發 (data bursts)。該 DRAM 緩衝區是預設的相機去耦路徑 (LineBuffer 或 ImageBuffer)。 ImageFifo 當您需要吸收相機叢發資料時,無法取代該 DRAM 緩衝區。
ImageFifo#
當 ImageFifo 運算子將影像資料排隊作為 先進先出 (FIFO) 緩衝區,儲存於 FPGA 內部記憶體中。您可以使用 EntitiesToStore 進行明確的生命週期管理即呼叫 EntityType 參數。 EntityType 來調整緩衝區大小,其值包含 PIXEL, LINE,或 FRAME。當輸出可用時,資料會立即轉發。當下游模組阻塞時,緩衝區就會 Fill。
將相機中的 InfiniteSource 參數(屬於 ImageFifo 運算子至 ENABLED ,當輸入來自無法停止的來源(例如相機)時。
資訊
當 ImageFifo 運算子僅緩衝相對少量的像素。因此,存在 FIFO 溢位 (overflow) 的重大風險,而該運算子並非總是能在內部以穩健的方式處理此情況。對於無法停止的串流,Basler 建議將 ImageFifo 與先前的 Overflow 運算子結合使用,或使用 ImageFlowControl 運算子來取代 ImageFifo operator 來完成。的 ImageFlowControl 運算子結合了 FIFO 緩衝與整合式溢位處理。
透過參數 ImplementationType 您可以選擇 AUTO (預設值)、 BRAM, LUTRAM,或在 imaFlex CXP-12 Quad/Penta 上選擇 URAM。Basler 建議一律使用 AUTO ,除非特定的 FPGA 資源類型短缺。
如需該運算子的詳細資訊,請參閱運算子參考手冊中的 ImageFifo。
ImageBuffer 與 LineBuffer#
當 ImageBuffer (microEnable 5) 與 LineBuffer (imaFlex) 運算子的運作方式類似 面向線條的 FIFO:所選 ROI 中的已完成行會在下游模組能夠接受時立即轉發。延遲至少為 一行。如果輸出受阻導致緩衝區填滿,延遲將會增加。另請參閱 延遲 教學主題。

平台注意事項:ImageBuffer 與 LineBuffer#
| 運算子 | Platforms |
|---|---|
ImageBuffer | microEnable 5 (mE5) |
LineBuffer | imaFlex CXP-12 Quad / Penta |
imaFlex CXP-12 Quad and Penta 不支援 此 ImageBuffer 運算子。當您將設計從 mE5 轉換為 imaFlex 時,VisualApplets 會 取代 每個 ImageBuffer 運算子,其搭配一個 LineBuffer operator 來完成。的 LineBuffer 運算子為 imaFlex 平台提供相同的核心緩衝和 ROI 功能。
使用 ImageBuffer 與 LineBuffer 定義感興趣區域 (ROI)#
透過 ImageBuffer 進行明確的生命週期管理即呼叫 LineBuffer 運算子,您還可以定義感興趣區域 (ROI)。您可以透過設定 XOffset, XLength, YOffset以及 YLength 參數。邊界情況已記錄於《運算子參考手冊》中:例如,若輸入小於所要求的 ROI,或您的設計位於 Line1D 模式來做到這一點,或者如果您有額外像素的未定義內容。
有關該運算子的詳細資訊,請參閱運算子參考中的 LineBuffer 以及運算子參考中的 ImageBuffer。
監控緩衝區使用率與溢位#
當 ImageBuffer 進行明確的生命週期管理即呼叫 LineBuffer 運算子提供下列狀態參數來監控緩衝區使用情況與溢位:
| 參數 | 含意 |
|---|---|
FillLevel | 以百分比定義緩衝區 RAM 的 Fill 程度(在 ImageBuffer 以 25% 為單位)。 |
LineCount | 指示當前儲存的行數。僅適用於 LineBuffer 的輸出連結處降低至 |
Overflow | 表示緩衝區無法接受更多資料而不會超出容量。此狀態參數與 Synchronization 庫中的 Overflow 運算子不同,也與 Arithmetic 溢位不同。請參閱 可停止與不可停止的資料串流 教學主題與 位元 Arithmetic 教學主題。 |
如果發生溢位,可能會丟棄傳入的資料,並降低有效的影像高度。不完整的影像可能會留在記憶體中,直到操作員復原為止。 Overflow 適用於來源無法停止且 InfiniteSource 是 ENABLED。設定 InfiniteSource 設為 ENABLED 當緩衝區直接位於相機或其他無限來源之後時。另請參閱 可停止與不可停止的資料串流 教學主題。關於如何在偵錯時使用這些參數,請參閱 識別記憶體相關錯誤.

在 LineBuffer operator,Basler 建議啟用 WritePriority 引數,當 InfiniteSource 是 ENABLED。如果 WritePriority 是 ENABLED時,暫時寫入速率超過可用的 DRAM 頻寬,相機的寫入叢發會優先於讀取。然而, 平均 頻寬仍必須保持在該 operator 可用的配額內。
當 LineBuffer operator 也可以透過模組參數在輸入和輸出之間轉換 Parallelism ParallelismConverter,因此您不一定需要一個獨立的 PARALLELup / PARALLELdn。另請參閱 Parallelism 教學主題。
使用 FrameBuffer operators 處理完整影格、隨機存取、Multi-ROI#
當 FrameBufferRandomRead, FrameBufferMultiRoi以及 FrameBufferMultiRoiDyn operators 儲存 完整影像或大型區域 並以不同於 不 嚴格行 FIFO 的順序讀取它們。當您需要隨機像素存取或來自單一緩衝區的 Multiple ROI 時,請使用它們。
FrameBufferRandomRead#
FrameBufferRandomRead 將輸入影像寫入 DRAM,然後透過專用位址連接埠上的 欄和列位址 讀取像素。將其用於幾何轉換、重新對應和其他隨機存取模式。
對於小畫面或行,建議使用 FPGA 內部 operators(例如 FrameMemoryRandomRd 或 LineMemoryRandomRd ),而不是 DRAM operators。
如需 operator 的詳細資料,請參閱 Operator Reference 中的 FrameBufferRandomRead。
FrameBufferMultiRoi 與 FrameBufferMultiRoiDyn#
當 FrameBufferMultiRoi 進行明確的生命週期管理即呼叫 FrameBufferMultiRoiDyn operator 會儲存影像資料並進行輸出 多個興趣區 (ROI). FrameBufferMultiRoiDyn 允許 動態 透過控制連結調整 ROI 大小與位置。
共用 DRAM 頻寬#
每個 DRAM operator 都需要一個 RAM 類型的 VisualApplets 資源。該資源是 VisualApplets 資源模型中的一個插槽 (slot),會對應至擷取卡上的實體 DRAM。在 imaFlex 與 microEnable 5 marathon 平台上,所有保留 RAM 資源的 operator 會共用實體 DRAM。每個 operator 都會獲得一個 專屬且不重疊的記憶體區域,但 大小與頻寬 會在同一實體介面上的作用中 RAM operator 之間進行分配。
後果:
- 每一個 讀取 與每一個 寫入 操作都會消耗共用介面上的頻寬。
- 若有多個 DRAM 執行個體或高傳輸量,總流量可能會超出平台限制。
- 過量的需求會導致阻塞、增加
FillLevel、溢位,或是降低可維持的影格率。
請參閱 裝置資源 (Device Resources),以查詢您平台的 RAM 大小、RAM 資料寬度以及 RAM 總頻寬 (共用)。
需要在 資源 (Resources) 對話方塊中配置資源時進行配置;請參閱「裝置資源」中的 裝置資源配置 (Allocation of Device Resources)。
頻寬計算注意事項#
共用記憶體 (Shared Memory) 應用說明 (Application Note) 解釋了如何有效率地使用 RAM 大小和 RAM 資料寬度。
重點:
-
讀取與寫入會共用介面。 對於單一 DRAM operator,在估算可用的影像資料速率時,請將平台最大頻寬除以 2(一半用於寫入,一半用於讀取),然後套用效率係數。記錄的頻寬值為 理論最大值;實際效率會較低。
-
盡可能善用 RAM 資料寬度。 鏈結的有效 RAM 資料寬度為:
bit width × Parallelism × 核心元素
該乘積即為每個 DRAM 存取的有效寬度。請勿將其與來自 Parallelism × Base Design Clock 的像素速率頻寬混淆。當乘積符合平台 RAM 資料寬度且未超出時(例如根據應用的不同為 256 bit、384 bit 或 640 bit),即可達到最大 DRAM 傳輸量。將乘積匹配至最大 RAM 資料寬度可以充分利用 DRAM 的完整寫入與讀取頻寬;如果數值過低,DRAM 存取可能會成為瓶頸。採用 8 bit × Parallelism 4 的設計僅使用了 256-bit 介面中的 32 bit,因而浪費了頻寬餘裕。
-
多個 DRAM operator 會共用頻寬。 在共用記憶體平台上,單一 operator 可用的頻寬大致會與該介面上的 1 / (RAM operator 數量) 成比例縮放。詳細資訊因平台而異,如「裝置資源」與應用說明「共用記憶體」中所述(請參閱 相關主題 (Related Topics))。
-
當平台提供一個以上的實體介面時(例如 imaFlex 2 Dual 100),請將 operator 平均分配至獨立的 RAM 通道 (bank)。頻寬僅會在位於相同實體通道上的 operator 之間共用。
設計指南
請及早規劃 RAM 的使用。每一個額外的 DRAM operator 都會減少同一實體記憶體介面上其他 operator 可用的頻寬。在新增另一個 DRAM 緩衝區之前,請計算綜合的讀/寫流量,並將其與平台可用的共用頻寬進行比較(請參閱「裝置資源」)。建議優先使用 ImageFifo (FPGA 記憶體)來執行小型解耦任務,以免不必要地耗用 DRAM 頻寬。
識別記憶體相關錯誤#
VisualApplets 並不一定能隨時驗證某個設計是否針對各種執行階段情境具備足夠類型與大小的記憶體。您必須選擇符合影像尺寸、速率與同步需求的 operator 和緩衝區大小。
即使緩衝區大小小於硬體需求,模擬 (Simulation) 仍可能順利執行。失敗情況通常只會在擷取卡上顯現:例如,儘管模擬看起來一切正常,但 SDK 中卻沒有輸出任何影像。
常見的原因包括: SYNC 死結(deadlock) 進行明確的生命週期管理即呼叫 記憶體不足或錯誤.
為避免這些問題,請執行以下檢查:
- 在完成緩衝區和 DMA 路徑的連線後,執行 Design Rules Check Level 1 and Level 2。
- 在硬體上,請留意
FillLevel(以及Overflow(若適用)),例如在 microDisplay X 中。持續達 100% 的 Fill 通常表示發生死結或頻寬瓶頸。 - 如果有數個 DRAM 運算子,請開啟 Design → Device Resources 並驗證 RAM 配置與預期的頻寬佔比。
- 對於無限來源(Infinite Sources),請確認
InfiniteSource是ENABLED適用於接收不可停止串流的每個緩衝區。
典型管線範例#
透過 DRAM Line Buffer 從相機到 DMA#
最小型的設計包含一個相機運算子、一個具有 InfiniteSource 設定為 ENABLED的 DRAM 緩衝區,以及一個 DmaToPC 運算子:

使用此緩衝區來吸收尖峰負載並提供基於行的處理。請留意 FillLevel 在硬體上的表現;若數值持續接近 100%,通常表示存在瓶頸或死結。請參閱 識別記憶體相關錯誤.
透過 LineBuffer 將相機連接至 3×3 Kernel#
在以下設計中,DRAM 緩衝區為鄰域運算子(neighborhood operator)提供行資料以建立核心(例如 3×3)。緩衝區會增加至少一行的延遲——若因濾波器路徑阻塞而導致 Fill,延遲會更長。同時也請考量 LineBuffer 運算子共用的 DRAM 頻寬。螢幕截圖中的 Design Rules Check 可確認連結格式與緩衝區設定在建置前是否一致。

相關主題#
- 可停止與不可停止的資料串流 教學主題 —
InfiniteSource、溢位、相機去耦合 - Parallelism 教學主題 — 頻寬、RAM 資料寬度、
LineBufferparallelism 轉換 - Latency 教學主題 — 緩衝區運算子的行延遲
- Operator 類型與同步 教學主題 — 之前的緩衝區
SYNC - Device Resources — 平台 RAM 與 Shared Memory 概念
- Shared Memory 應用筆記 — 高效率的 DRAM 使用與頻寬範例
- Memory Library 運算子參考手冊 — 依記憶體類型列出的運算子概覽