跳至內容

Memory 元素#

本主題說明在VisualApplets 設計中,記憶體運算子如何映射至目標硬體上的實體記憶體,以及何時應使用哪種類型。閱讀完本主題後,您將了解FPGA 內部記憶體(例如區塊 RAM)與幀擷取器 DRAM 之間的差異、FIFO 式緩衝區與隨機存取幀緩衝區的區別、共用 DRAM 頻寬如何限制包含多個 RAM 運算子的設計,以及如何在模擬和硬體環境中辨識與記憶體相關的問題。

關鍵詞

VisualApplets 設計中的記憶體運算子會使用目標硬體上的兩個實體記憶體位置之一:位於幀擷取卡上的FPGA 內部(容量小、速度快、本地化),以及位於幀擷取卡上 FPGA 外部(DRAM — 提供更大的行緩衝區和幀緩衝區容量)。

FillLevel可在執行時於硬體端(例如在microDisplay X 中)顯示緩衝區的佔用率(以百分比表示)。若緩衝區佔用率長期維持在 100% 左右,通常表示存在瓶頸或死鎖。作為起點,請將緩衝區置於攝影機之後。

有關平台 RAM 容量、資料位寬及頻寬的數值,請參閱「裝置資源」。

FPGA Memory 與 Frame Grabber DRAM#

VisualApplets 記憶體運算子可根據其在幀擷取器上儲存資料的位置分為兩類。另一項區別在於其存取資料的方式:FIFO 式緩衝區與隨機存取或多 ROI 幀緩衝區。請參閱《運算子參考手冊》中的「Memory Library 概覽」,了解各記憶體運算子儲存資料的位置。VisualApplets 中的 RAM資源是一個裝置資源標記,其對應於板載 DRAM。它並非VisualApplets 應用程式內的記憶體。

Property FPGA 內部記憶體 幀擷取卡 DRAM
常見的運算子 ImageFifo; 對於小型隨機存取案例也是 FrameMemoryRandomRd / LineMemoryRandomRd ImageBuffer, LineBuffer, FrameBufferRandomRead, FrameBufferMultiRoi, FrameBufferMultiRoiDyn
地點 FPGA 內部結構(imaFlex CXP-12 Quad/Penta 上的 BRAM、LUT RAM 或 URAM) 在電路板上,位於 FPGA 外部
容量 有限;全解析度畫面通常會超過可用的 FPGA Memory 較高;適用於多行或完整畫面
延遲 低;無法存取外部 DRAM 匯流排 導向線路的 FIFO 至少會新增一行
VisualApplets RAM 資源 否 — 不會保留 RAM 裝置資源 是 — 每個執行個體一個 RAM 資源,對應至主機板 DRAM
頻寬 本機;運算子不會競爭擷取卡 RAM 介面 在相同實體介面上的 RAM 運算子之間共用 — 請參閱 Sharing DRAM Bandwidth

使用 Choosing a Memory Operator 中的表格來選擇運算子,然後閱讀對應的運算子章節以了解參數和平台詳細資料。

選擇 Memory Operator#

Use Case 偏好
小型緩衝區、低延遲、無 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 operator,以補償來自相機的資料突發流量。該 DRAM 緩衝區是預設的相機解耦路徑(LineBuffer 或 ImageBuffer)。 ImageFifo 在您需要吸收相機突發流量時,並不能取代該 DRAM 緩衝區。

ImageFifo#

影像 ImageFifo 運算子將影像資料排入佇列,作為 先進先出 (first-in, first-out) FPGA 內部 Memory 中的緩衝區。您可以使用下列項目調整緩衝區大小: EntitiesToStore 和 EntityType 參數的狀態。 EntityType 具有值 PIXEL, LINE或 FRAME當輸出可用時,資料會立即轉發。當下游模組阻塞時,緩衝區會填滿。

將 InfiniteSource 運算子的 ImageFifo operator 進行 ENABLED 當輸入來自不可停止的來源(例如相機)時。

資訊

影像 ImageFifo operator 僅緩衝相對少量的像素。因此,存在發生 FIFO 溢位的顯著風險,而 operator 並不一定總能在內部以強健的方式處理此問題。對於不可停止的串流,Basler 建議將 ImageFifo 與前置的 Overflow operator 結合使用,或者使用 ImageFlowControl operator 來替代 ImageFifo 運算子即可完成。該 ImageFlowControl operator,因為它將 FIFO 緩衝與整合式溢位處理結合在一起。

透過參數 ImplementationType ,您可以選擇 AUTO (預設值)、 BRAM, LUTRAM,或者在 imaFlex CXP-12 Quad/Penta 上選擇 URAM. Basler 建議您務必使用 AUTO ,除非特定的 FPGA 資源類型短缺。

如需有關此運算子的詳細資料,請參閱 Operator Reference 中的 ImageFifo。

ImageBuffer 與 LineBuffer#

影像 ImageBuffer (microEnable 5) 與 LineBuffer (imaFlex) 運算子的運作方式類似於 線條導向的 FIFO:所選 ROI 中的已完成線條會在下游模組能夠接收時立即轉發。延遲至少為 一行。如果輸出被封鎖導致緩衝區填滿,延遲將會增加。另請參閱 延遲 教學主題。

Simple Acquisition Path with Buffer

Platform 備註:ImageBuffer 與 LineBuffer#

Operator 平台
ImageBuffer microEnable 5 (mE5)
LineBuffer imaFlex CXP-12 Quad / Penta

imaFlex CXP-12 Quad 和 Penta 不支援 此 ImageBuffer 運算子。當您將設計從 mE5 轉換為 imaFlex 時,VisualApplets 會取代 每一個 ImageBuffer operator 替換為 LineBuffer 運算子即可完成。該 LineBuffer operator,它為 imaFlex 平台提供了相同的核心緩衝和 ROI 功能。

使用 ImageBuffer 與 LineBuffer 定義 Regions of Interest (ROI)#

透過 ImageBuffer 和 LineBuffer operators,您還可以定義感興趣區域 (ROI)。您可透過設定 XOffset, XLength, YOffset的狀態,以及 YLength 參數來做到這一點。邊界情況記錄在 Operator Reference 中:例如,如果輸入小於所要求的 ROI,或者您的設計處於 Line1D 模式,或者當您針對額外像素擁有未定義的内容時。

關於該運算子的詳細資訊,請參閱《Operator Reference》中的 LineBuffer 與《Operator Reference》中的 ImageBuffer。

監控 Buffer 使用率與溢位 (Overflow)#

影像 ImageBuffer 和 LineBuffer operators 提供以下狀態參數來監控緩衝區的使用情況和溢位:

Property 含義
FillLevel 以百分比定義緩衝區 RAM 的滿載程度(在 ImageBuffer 上以 25% 為級距)。
LineCount 表示目前儲存的行數。僅適用於 LineBuffer operator。
Overflow 表示緩衝區無法接受更多資料而不超出容量。此狀態參數與 Synchronization 程式庫中的 Overflow Synchronization library 中的運算子,且與算術溢位不同。請參閱 可停止與不可停止的資料流 教學主題與 位元 Arithmetic 教學主題。

如果發生溢位,傳入的資料可能會被捨棄,且實際影像高度可能會減少。不完整的影像可能會留在 Memory 中,直到運算子恢復正常。 Overflow 適用於來源為不可停止(non-stoppable)且 InfiniteSource 為 ENABLED時,就會套用溢位。 InfiniteSource 設定為 ENABLED 緩衝區直接位於相機或其他無限來源之後的情況。另請參閱 可停止與不可停止的資料流 教學主題。關於如何在偵錯時使用這些參數,請參閱 識別記憶體相關錯誤.

Buffer Operator with InfiniteSource ENABLED

在 LineBuffer operator 上,Basler 建議啟用 WritePriority 參數,當 InfiniteSource 為 ENABLED。如果 WritePriority 為 ENABLED,當暫時寫入速率超過可用的 DRAM 頻寬時,來自相機的寫入叢發(bursts)優先於讀取。然而 平均 頻寬仍必須保持在該運算子可用的配額內。

影像 LineBuffer operator 也可以透過模組參數 ParallelismConverter來轉換輸入和輸出之間的 Parallelism,因此您不一定需要一個獨立的 PARALLELup / PARALLELdn。另請參閱 Parallelism 教學主題。

使用 FrameBuffer Operators 處理 Full Frames、Random Access 與 Multi-ROI#

影像 FrameBufferRandomRead, FrameBufferMultiRoi的狀態,以及 FrameBufferMultiRoiDyn 運算子會儲存 完整影像或大型區域 並以以下順序進行讀取: 不會 嚴格的行 FIFO。當您需要從單一緩衝區進行隨機像素存取或 Multiple ROI 時,請使用它們。

FrameBufferRandomRead#

FrameBufferRandomRead 將輸入影像寫入 DRAM,然後透過以下方式讀取像素: 行與列位址 位於專用位址連接埠上。適用於幾何轉換、重新對應和其他隨機存取模式。

對於小型影格或行,建議使用 FPGA 内部的 operators(例如 FrameMemoryRandomRd 或 LineMemoryRandomRd ),而不是 DRAM operators。

有關該運算子的詳細資訊,請參閱運算子參考手冊中的 FrameBufferRandomRead。

FrameBufferMultiRoi 與 FrameBufferMultiRoiDyn#

影像 FrameBufferMultiRoi 和 FrameBufferMultiRoiDyn 運算子會儲存影像資料並輸出 多個感興趣區域. FrameBufferMultiRoiDyn 允許 動態 來自控制連結的 ROI 大小與位置。

共用 DRAM 頻寬#

每個 DRAM 運算子都需要一個類型為 RAM 的 VisualApplets 資源。該資源是 VisualApplets 資源模型中的一個插槽。它會對應到擷取卡上的實體 DRAM。在 imaFlex 與 microEnable 5 marathon 平台上,所有保留 RAM 資源的運算子會共用實體 DRAM。每個運算子都會獲得一個專屬且不重疊的記憶體區域,但大小與頻寬會在同一實體介面上活動的 RAM 運算子之間分配。

後果:

  • 每個讀取與寫入動作都會消耗共用介面上的頻寬。
  • 當有多個 DRAM 實例或高輸送量時,總流量可能會超過平台限制。
  • 過多的需求會導致阻塞、上升的 FillLevel、溢位,或降低可維持的畫面更新率。

請在裝置資源中尋找您平台對應的 RAM 大小、RAM 資料寬度與RAM 總頻寬 (共用)。

需要在 Resources 對話方塊中配置資源時進行配置;請參閱裝置資源中的裝置資源配置。

頻寬計算備註#

共用記憶體應用筆記說明了如何有效率地使用 RAM 大小與 RAM 資料寬度。

重點:

  1. 讀取與寫入共用介面。對於單一 DRAM 運算子,在估算可用影像資料速率時,請將平台最大頻寬除以 2(一半用於寫入,一半用於讀取),然後套用效率係數。文件記錄的頻寬值為理論最大值;實際效率會較低。

  2. 請盡可能充分利用 RAM 資料寬度。該連結的有效 RAM 資料寬度為:

bit width × Parallelism × kernel elements

該乘積即為每個 DRAM 存取的有效寬度。請勿將其與來自 Parallelism × Base Design Clock 的像素速率頻寬混淆。當乘積符合平台 RAM 資料寬度且不超過該寬度時(例如根據不同的主機板為 256 位元、384 位元或 640 位元),即可達到最大 DRAM 輸貫量。將乘積與最大 RAM 資料寬度相匹配,可充分利用 DRAM 的完整寫入與讀取頻寬;如果數值過低,DRAM 存取可能會成為瓶頸。採用 8 bit × Parallelism 4 的設計僅使用了 256 位元介面中的 32 位元,並浪費了頻寬餘裕。

  1. 多個 DRAM 運算子共用頻寬。在共用記憶體平台上,單一運算子可用的頻寬大約與該介面上的 1 / (RAM 運算子數量) 成比例縮放。詳細資訊因平台而異,如裝置資源與應用筆記:共用記憶體中所述(請參閱相關主題)。

  2. 當平台提供多個實體介面(例如 imaFlex 2 Dual 100)時,請在獨立的 RAM 庫之間平衡運算子。頻寬僅在相同實體庫上的運算子之間共用。

設計準則

及早規劃 RAM 使用量。每個額外的 DRAM operator 都會減少同一實體 memory 介面上其他 operator 可用的頻寬。在新增另一個 DRAM 緩衝區之前,請計算合併的讀取/寫入流量,並將其與您平台可用的共用頻寬進行比較(請參閱 Device Resources)。建議優先使用 ImageFifo (FPGA memory)來處理小型解耦任務,以免不必要地消耗 DRAM 頻寬。

VisualApplets 並不總是能驗證設計是否具有足夠類型與大小的記憶體來應對每個執行階段情境。您必須選擇與您的影像尺寸、速率和同步需求相符的運算子與緩衝區大小。

即使緩衝區大小對於硬體而言過小,模擬也可能會成功執行。錯誤通常只會在擷取卡上出現:例如,儘管模擬看起來正常,但在 SDK 中卻沒有輸出影像。

常見原因包括 SYNC 死結 和 記憶體不足或錯誤.

為避免這些問題,請執行以下檢查:

  • 完成緩衝區和 DMA 路徑的配線後,執行 Design Rules Check Level 1 and Level 2。
  • 在硬體上,請注意 FillLevel (以及 Overflow (如果可用),例如在 microDisplay X 中)。持續 100% 的 Fill 通常表示發生死結或頻寬瓶頸。
  • 若有多個 DRAM 運算子,請開啟 Design → Device Resources 並驗證 RAM 配置與預期的頻寬佔用。
  • 對於無限來源,請確認 InfiniteSource 為 ENABLED 位於接收不可停止串流的每個緩衝區上。

典型管線範例#

透過 DRAM Line Buffer 從 Camera 傳輸至 DMA#

最小的可能設計包含一個相機運算子、一個具備 InfiniteSource 設為時,參數未正確呈現為灰色 ENABLED的 DRAM 緩衝區,以及一個 DmaToPC operator 輸出 link 上的 Bit Width:

啟用 InfiniteSource 的最小化設計

使用此緩衝區來吸收尖峰負載並提供基於行的處理。請注意 FillLevel 在硬體上;保持在 100% 左右的值通常表示發生瓶頸或死結。請參閱 識別記憶體相關錯誤.

透過 LineBuffer 將 Camera 影像輸入至 3×3 Kernel#

在以下設計中,DRAM 緩衝區為建構核心(例如 3×3)的鄰域運算子提供行資料。該緩衝區會增加至少一行的延遲——如果因為濾波器路徑阻塞而導致 Fill,延遲會更長。請同時將 LineBuffer 運算子的共用 DRAM 頻寬納入考量。螢幕截圖中的 Design Rules Check 可確認連結格式與緩衝區設定在建構前保持一致。

啟用 Infinite Source 的 Line Buffer