跳至內容

管線概念#

本主題說明影像資料如何流經從 VisualApplets 設計所產生的 FPGA 硬體。讀完本主題後,您將瞭解設計中的模組與連結如何形成管線結構、資料如何進出管線、為什麼大多數階段會立即轉發資料、並行 FPGA 處理如何影響傳輸量,以及哪些連結屬性會限制資料速率。

關於正式的資料流模型,請參閱使用者手冊中的 Data Flow。若要了解如何從頭到尾建構與驗證設計,請參閱 From Empty Design to Running Applet 教學主題。

您可以使用運算子庫中的 operators 來建構 VisualApplets 設計。每個放置的運算子實例都是一個 module。Module 會公開 input 與 output 連接埠。您可以使用 links 連接這些連接埠。圖表中將每個 link 顯示為一個箭頭。

在 VisualApplets 設計中,module 與 link 共同構成影像處理 pipeline。建構過程會將該圖形實作為擷取卡 FPGA 上的硬體階段。處理順序遵循連線順序。分支與合併會在圖形中定義平行路徑與匯合點。

具備分支與合併點的 Pipeline

每個模組會在輸入資料可用時立即開始處理。當計算完成且輸出未被阻擋時,它會將結果轉發到其輸出連結上。在執行階段,此行為是由模組所產生的 FPGA 邏輯來實作,而非由 VisualApplets 中的圖形符號來實作。因此,管線結構定義了資料的分裂位置、匯合位置,以及哪些模組以串聯或 Parallelism 方式執行。

像素並非在一步之間以完整影像的形式進入幀擷取器。相機會將它們一個接一個地傳輸至擷取路徑中——或者由小程式內部影像來源逐一產生這些像素。這些像素隨後會依照相同的順序,依次通過各階段的處理流程:

穿越 Pipeline 的像素

關鍵詞

可以將像素想像成道路上的汽車:它們沿著路徑彼此跟隨。在任何時刻,不同的汽車(像素)位於道路(管線階段)上的不同位置。道路本身就是您在 VisualApplets 設計中佈線的管線結構。建置完成後,該道路是畫面擷取卡 FPGA 上的硬體,而不是 VisualApplets 編輯器內的路徑。

在這個比喻中,Parallelism 就是道路上的車道數:車道越多,就能有越多車輛(像素)同時向前移動。

Pipeline 輸入與輸出#

每個 pipeline 至少有一個 source 將資料饋送至設計中,以及一個或多個離開 FPGA 處理路徑的 sinks。Source 與 sink 通常是 M 型運算子。哪些運算子可用取決於您的目標硬體平台。

Inputs#

資料可以透過以下方式進入管線:

  • 來自相機或其他影像源:平台特定的相機運算子會將來自已連接相機的連續像素串流傳送至擷取路徑中。
  • 在 applet 內部產生:諸如以下的運算子 CreateBlankImage 或 CoefficientBuffer 等運算子可在沒有實時相機的情況下建立或播放影像資料。您可將這些來源用於 Test Patterns、從主機上傳的參考資料,或是未從相機擷取的設計。

信號路徑也可以從數位輸入(例如透過 GPI) 或來自 applet 內部的訊號產生器。關於流量控制下相機來源與可停止的 applet 內部來源有何不同,請參閱 可停止與不可停止的資料流 教學主題。

Outputs#

處理過後的結果可以透過以下方式離開管線:

  • DMA 至主機之後: DmaToPC 運算子透過直接記憶體存取將影像資料傳輸至主機 PC memory。這是主機軟體中擷取處理後影像的常用路徑。
  • 透過 GPO 發出訊號之後: GPO 運算子會驅動擷取卡上的數位輸出接腳。請將此路徑用於主機 PC 外部的觸發、狀態或其他硬體控制信號。
  • 事件至主機之後: EventToHost 和 EventDataToHost 運算子會向主機發送軟體事件。主機應用程式透過 Framegrabber API 接收這些事件,並能對小程式中的狀況做出反應。 EventToHost 會在信號輸入的上升緣觸發事件且不帶有效負載(payload)。 EventDataToHost 會觸發事件並連同可配置的資料有效負載一起傳送。
  • 僅限暫存器資訊:某些結果會作為可讀取的數值保留在擷取卡上。諸如 GetStatus 等運算子會儲存主機軟體作為動態參數讀取的值。當應用程式只需要狀態或量測數值時,不需要影像串流或 DMA 傳輸。

一個設計可以結合其中多個輸出。例如,一個分支可以透過 DmaToPC 發送影像,而另一個分支則在發生特定狀況時斷言 GPO 接腳或引發主機事件。

如需運算子詳細資訊,請參閱 Operator Reference 中的 DmaToPC、Operator Reference 中的 GPO、Operator Reference 中的 EventToHost、Operator Reference 中的 EventDataToHost 以及 Operator Reference 中的 GetStatus。

未緩衝的 Pipeline 流程#

大多數模組並不會在內部儲存完整的影像。它們會計算輸出值,並在資訊可用時立即將其傳送出去。

並非所有運算子都會在資料抵達輸入端時立即輸出結果。 M型 等運算子特別會延遲輸出。這些不只限於緩衝區運算子,例如 LineBuffer 或 ImageFifo ——許多濾波和同步運算子也屬於 M 類型。延遲的時間長短取決於運算子。如需詳細資訊,請參閱 Operator 類型與同步 教學主題與 延遲 教學主題。

緩衝運算子會儲存資料,直到下游模組能夠接收為止。

這種 unbuffered 行為可維持較低的 latency。像素可以在同一格畫面中其他像素仍在相機輸入端時就到達輸出端。擷取、處理與 DMA 的時間可以重疊。

關鍵詞

您可以將產生的 FPGA 管線想像成一個帶有分支和閥門的管道系統。一旦有空間,水就會流過管道。緩衝運算子就像一個小水庫,當排水口無法負荷時就會進行 Fill。

如需關於路徑上延遲的累積方式,以及頻寬和延遲之間差異的資訊,請參閱 Latency 教學主題。

硬體中的並行處理#

在擷取卡 FPGA 上,所有管線階段都會同時執行。這與通常主要依序執行指令的典型 CPU 程式不同。

當一個 FPGA 模組處理像素時,其他模組會在路徑更後方處理不同的像素。管線填滿後,多個模組會同時處理同一張影像。FPGA 會將您的 VisualApplets 設計實作為結構符合管線圖的專用硬體。

關鍵詞

在由 VisualApplets 設計產生的 FPGA 硬體中,處理路徑是作為擷取卡上的專用硬體邏輯來實作的。資料會像輸送帶上的物品一樣在這些硬體階段中移動。CPU 通常會載荷整塊資料並依序執行步驟。

如需關於建置的 Applet 與可編輯 *.vad 設計之間關係的詳細資訊,請參閱 VisualApplets Fundamentals 教學主題。

產出與瓶頸#

Throughput 是流經管線的持續資料速率。在 VisualApplets 設計中,它與所產生 FPGA 硬體連結上的 bandwidth 息息相關。

設計中的模組數量不會降低產出量。所有產生的 FPGA 階段都可以以 Parallelism 方式執行。平行分支的數量也不會降低產出量。分支會增加硬體資源,但它們本身不會降低個別路徑上的資料速率。正如您在以下兩個設計中所見,兩個擷取路徑可以使用不同的模組數量,卻仍能提供相同的產出量:

兩個具有相同輸送量的設計

吞吐量取決於以下因素:

  • Link capacity:模組之間的連線可以承載多少資料。容量是由模組與連結的參數化(特別是 Parallelism、Bit Width 和最大影像尺寸)以及 Base Design Clock 所決定。如需有關 Link Property 和模組參數的詳細資訊,請參閱 Parameterization 教學主題。
  • Downstream readiness:模組是否能持續接受資料。如果模組無法永久接收資料(例如因為緩衝區已滿或後續模組遭到阻擋),流量控制就會停止資料流,進而導致阻塞、反壓,或兩者皆有。
  • Operator limits:某些運算子無法處理其輸入連結所提供的完整頻寬。Operator Reference 記錄了每個受影響運算子的這些限制。

以像素速率(每秒像素數)表示的連結 bandwidth 遵循以下公式:

Bandwidth = parallelism × Base Design Clock

此像素速率公式不包含 Bit Width 或核心大小。較寬的 Bit Width 或較大的核心會增加每個時脈的資料量(位元或數值),這對 DRAM 存取和 FPGA 資源很重要,但它不會改變此像素速率數字。如需 DRAM 資料寬度,請參閱 Memory Elements 教學主題。如需核心與像素速率頻寬的比較,請參閱 Working with Kernels 教學主題。

基礎設計時脈取決於您的擷取卡平台。請在 Device Resources 中查詢該數值。

最大影像尺寸也不會出現在這個像素速率公式中,但它們仍然會影響設計:它們會限制管線能處理的影像大小。這些鏈結 Property 加上 Parallelism 和 Bit Width,必須與您的相機或線掃描來源相符。

路徑的 bottleneck 是該路徑上最低的頻寬。設計的整體輸送量始終受限於這個最窄點。一條較窄的連結或一個頻寬受限的運算子,會限制同一路上所有在其上游的輸送量。因此,輸送量是由路徑上的最窄頻寬以及下游模組是否持續接受資料所決定。

設計準則

僅將 Parallelism 和鏈結 Property 設定為支援相機或線掃描來源所需速率的程度。如果其他元件已經是瓶頸,進一步提高這些數值只會消耗額外的 FPGA 資源,並不會提升吞吐量。

某些運算子會在其輸入與輸出之間改變 Parallelism。其他運算子會減少像素數量,例如透過裁剪影像。因此,所需的輸出頻寬可能與輸入頻寬不同。在可能的情況下,運算子會自動調整 Parallelism。如果無法調整,VisualApplets 會回報 Design Rules Check 錯誤。

如需關於計算與調整 Parallelism 的資訊(包含如何計算設計所需頻寬的範例,以及當運算子合併資料流時如何對應頻寬瓶頸的疑難排解),請參閱 Parallelism 教學主題與 Troubleshooting Bottlenecks 教學主題。

設計中的產出視覺化#

您可以使用 Link Info 和 Throughput 旗標,在設計中顯示 parallelism 和資料產出量。使用工具列中的下列按鈕來啟用這些旗標:

在設計中啟用 Link Info 與 Throughput 旗標

因此,Link Info 與 Throughput 旗標將會顯示在您的設計中:

Link Info 與 Throughput 旗標

比較路徑沿線的數值以找出最窄的鏈結。該鏈結就是該路徑的瓶頸,除非更下游的運算子無法跟上。

資訊

Throughput 旗標並未顯示所有效能限制。例如,當多個 DRAM 運算子共用相同的記憶體介面時,來自 Shared Memory 的所得 DRAM 頻寬限制不會反映在輸送量顯示中。其他 DRAM 效率低下的情況,以及阻擋和潛在的 deadlocks 也未顯示。如需 Shared Memory 使用方式與 DRAM 頻寬規劃的指導方針,請參閱 Memory Elements 教學主題。如需有關死結的詳細資訊,請參閱 Operator Types and Synchronization 教學主題。

產出量與資料格式取決於Link Property與模組參數。除了上述涵蓋的容量相關屬性(Parallelism、Bit Width 與最大影像尺寸)之外,其他典型屬性還包括影像協定與 Color Format。

Link properties 會在管線中傳遞。您可以在相機輸出連結或早期處理階段上設定許多 Property。它們適用於所有下游連結,直到有運算子變更它們為止。模組參數必須與所連接連結上的 link properties 相符。因此,上游連結上的變更會影響所有後續運算子,直到另一個運算子重設 Property 為止。

如需連結 Property 的完整清單與傳播規則,請參閱使用者手冊中的 Parameterization 教學主題與 Rules of Links。

image protocol 定義了連結上資料串流的結構。VisualApplets 支援不同的資料類型 / 串流格式:

Protocol 典型用途
VALT_IMAGE2D 具有行結尾與影格結尾標記的二維影像,例如來自面陣相機的影像。影格內的各行可以有不同的長度。
VALT_LINE1D 無盡或連續的行資料,例如來自線陣相機的資料。
VALT_PIXEL0D 不含影像尺寸資訊的非結構化連續像素串流。
VALT_SIGNAL 在每個時脈週期都有效的單位元信號,例如在觸發邏輯中。

像素會依掃描順序在管線中移動:在行內由左至右,然後在影格內由上至下。某些相機來源會使用不同的順序。當來源不符合此慣例時,請使用適當的運算子來修正順序。

如需關於 image protocols 與像素順序的詳細資訊,請參閱使用者手冊中的 Image Protocols, Image Dimensions and Data Structure。

來源是否能在 flow control 下暫停,會影響您連接管線的方式。相機算子屬於 non-stoppable 來源。您通常會在相機算子後面直接放置一個緩衝區算子。如需詳細資訊,請參閱下方 Flow Control, Blocking, and Backpressure 以及 Stoppable and Non-Stoppable Data Streams 教學主題。

流量控制、阻擋與背壓#

產生的 FPGA 管線會在各個階段之間套用 flow control。當某個階段尚未準備好接受更多資料時,它可以 block its input:它會停止向上一階段請求資料,而上一階段也會停止輸出。這種阻擋會以 backpressure 的形式向後傳播穿過管線。請注意,只有 M 型算子可以阻擋輸入。VisualApplets 中的圖形模組描述了此硬體行為;它們本身不會套用 flow control。

假設 DmaToPC 無法以足夠快的速度將資料傳輸至主機電腦。它會不時封鎖其輸入。封鎖信號會向上游傳播至緩衝區運算子。當封鎖處於作用中狀態時,緩衝區會停止轉發資料。它會儲存傳入的像素,且其 Fill 等級會上升。當相機停止傳送資料時,緩衝區會再次排空。

具備緩衝區與 DMA 的簡易擷取路徑

緩衝區運算子將以不同速率處理的階段進行解耦。如果在不可停止的相機來源後面沒有緩衝區,下游模組的封鎖將無法減慢相機串流的速度。因此,設計可能會未能通過 Design Rules Check 或在硬體上死結。

關於算子類型以及阻擋行為在 O 型、M 型和 P 型模組上的運作方式,請參閱 Operator Types and Synchronization 教學主題。

關鍵詞

Blocking 是指產生的 FPGA 階段無法接受進一步的輸入資料,例如因為後續階段不接受資料,或是階段內部的處理需要更多時間。VisualApplets 中的模組圖示代表該階段;圖示本身並不會等待或阻擋。
Backpressure 是背後的機制:「壓力」會向後作用。如果某個階段接收資料的速度夠快,上一階段就必須等待且資料流會遭到阻擋。實際上:下游階段無法接受資料(例如因為緩衝區已滿),因此上游階段必須等待。
本主題中的 Bandwidth 是指連接的像素速率:每秒有多少像素可以通過此連結。Bit width 與核心大小會改變每個像素所承載的資料量,這是不同的數量。請參閱 Parallelism 教學主題。