跳至內容

管線概念#

本主題說明影像資料如何透過由VisualApplets 設計所產生的FPGA硬體進行傳輸。閱讀完本主題後,您將了解設計中的模組與連結如何構成管線結構、資料如何進入與離開管線、為何大多數階段會立即轉發資料、並行FPGA處理如何影響吞吐量,以及哪些連結屬性會限制資料傳輸速率。

有關正式的資料流模型,請參閱《使用者手冊》中的「資料流」章節。關於如何從頭到尾建構並驗證設計,請參閱「從空白設計到可執行的 Applet」教學主題。

您可透過運算子函式庫中的運算子來建構VisualApplets 設計。每個放置的運算子實例皆為一個模組。模組會公開輸入與輸出連接埠。您可透過連結來連接這些連接埠。圖中將每個連結以箭頭表示。

在「VisualApplets 」設計中,模組與連結共同構成了影像處理管線。此建置將該圖形實作為幀擷取器 FPGA 上的硬體階段。處理順序遵循連接順序。分支與合併定義了圖形中的平行路徑與匯合點。

具有分支和合併點的管線

每個模組一有輸入資料,便會立即開始處理。當計算完成且輸出未被阻塞時,它會將結果傳送至其輸出連結。在執行階段,此行為是由模組所產生的 FPGA 邏輯來實現的,而非由VisualApplets 中的圖形符號所實現。因此,管線結構定義了資料在何處分支、何處匯合,以及哪些運算子以串聯或並聯方式執行。

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

穿梭於處理流程中的像素

關鍵詞

不妨將像素想像成道路上的汽車:它們沿著路徑依序行駛。在任何時刻,不同的汽車(像素)都會位於道路上的不同位置(處理管線階段)。這條道路本身,就是您在VisualApplets 設計中架設的處理管線結構。建置完成後,這條道路便成為幀擷取卡FPGA上的硬體,而非VisualApplets 編輯器內的路徑。

在此比喻中,並行處理就如同道路上的車道數:車道越多,就能讓更多車輛(像素)同時向前行駛。

管線的輸入與輸出#

每個資料管線至少有一個將資料輸入設計的「來源」,以及一個或多個將資料從 FPGA 處理路徑輸出的「匯出點」。來源和匯出點通常是 M 型運算子。可用的運算子取決於您的目標硬體平台。

Inputs#

資料可透過以下方式進入處理流程:

  • 來自攝影機或其他影像來源:專為特定平台設計的攝影機操作程式,會將連線攝影機所產生的連續像素流傳輸至擷取路徑中。
  • 在 Applet 內部產生: 例如以下運算子: CreateBlankImage 或 CoefficientBuffer 在不使用即時攝影機的情況下,建立或播放影像資料。這些來源可用於測試圖案、從主機上傳的參考資料,或是無需透過攝影機擷取影像的設計。

訊號路徑也可以從數位輸入開始(例如透過 GPI) 或來自小程式內部訊號產生器。關於在流量控制下,攝影機來源與可中斷的小程式內部來源有何不同,請參閱 可停止與不可停止的資料串流 教學主題。

Outputs#

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

  • DMA 傳輸至主機: DmaToPC 操作員透過直接記憶體存取(DMA)將影像資料傳輸至主機電腦的記憶體中。這是主機軟體中取得已處理影像的常見途徑。
  • 透過 GPO 傳遞訊號: GPO 此運算子會驅動幀擷取卡上的數位輸出腳位。若需在主機電腦之外傳輸觸發訊號、狀態訊號或其他硬體控制訊號,請使用此路徑。
  • 活動主辦方: EventToHost 進行明確的生命週期管理即呼叫 EventDataToHost 操作員將軟體事件傳送至主機。主機應用程式透過Framegrabber API 接收這些事件,並能針對小程式中的狀況做出反應。 EventToHost 在訊號輸入端的上升沿觸發一個事件,且不攜帶任何有效載荷。 EventDataToHost 會觸發一個事件,並附帶可配置的資料載荷。
  • 僅供註冊參考: 某些結果會以可讀取的數值形式保留在幀擷取器中。諸如 GetStatus 儲存主機軟體讀取作為動態參數的數值。當應用程式僅需狀態或測量數值時,無需進行影像串流或 DMA 傳輸。

一個設計可以結合其中幾種輸出方式。例如,某個分支可以透過 DmaToPC 而另一個分支則主張一個 GPO 當發生某種情況時,會觸發或引發一個主機事件。

有關運算子的詳細資訊,請參閱《運算子參考手冊》中的「DmaToPC」、「GPO」、「EventToHost」、「EventDataToHost」及「GetStatus」。

無緩衝的管線流量#

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

並非所有運算子都會在資料送達輸入端時立即輸出結果。 M 型 尤其是某些運算子可能會延遲輸出。這些不僅限於緩衝區運算子,例如 LineBuffer 或 ImageFifo — 許多濾波器和同步運算子也是 M 型。延遲的大小取決於運算子。詳情請參閱 Operator 類型與同步 教學主題以及 延遲 教學主題。

緩衝器會將資料儲存起來,直到下游模組能夠接收為止。

這種無緩衝的運作方式能將延遲維持在低水平。當同一幀中的其他像素仍處於相機輸入端時,某個像素便已傳輸至輸出端。擷取、處理與 DMA 可在時間上重疊進行。

關鍵詞

不妨將生成的 FPGA 管線視為一個帶有分支和閥門的管道系統。只要管道中有空間,水就會立即流過。緩衝運算子就像一個小型水庫,當排水速度跟不上時,水庫便會開始蓄水。

關於延遲如何沿著路徑累積,以及頻寬與延遲之間的差異,請參閱「延遲教學」主題。

硬體中的並行處理#

在幀擷取器 FPGA 上,所有管線階段皆同時運行。這與典型的 CPU 程式有所不同,後者大多是依序執行指令。

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

關鍵詞

在由VisualApplets 設計所產生的 FPGA 硬體中,處理路徑是以專用硬體邏輯的形式實作於幀擷取器上。資料如同輸送帶上的物品般,依序通過這些硬體階段。CPU 通常會載入整塊資料,並依序執行各個步驟。

有關已建置的 Applet 與可編輯的*.vad設計之間關聯的詳細資訊,請參閱VisualApplets 中的「基礎教學」主題。

吞吐量與瓶頸#

吞吐量是指資料在處理管線中持續傳輸的速率。在VisualApplets 設計中,它與生成的FPGA硬體中各連結的頻寬密切相關。

設計中的運算子數量並不會降低吞吐量。所有生成的 FPGA 級均可並行執行。並行分支的數量也不會降低吞吐量。分支雖會增加硬體資源,但其本身並不會減慢單一路徑上的資料傳輸速率。如下列兩個設計所示,兩條擷取路徑即使使用的運算子數量不同,仍能提供相同的吞吐量:

兩種具有相同吞吐量的設計

吞吐量取決於以下因素:

  • 鏈路容量:模組間連線所能傳輸的資料量。容量由模組與鏈路的參數設定決定,尤其是並行度、位元寬度及 最大影像尺寸,再加上基礎設計時脈。有關鏈路與模組屬性的詳細資訊,請參閱「參數設定教學」主題。
  • 下游就緒狀態:模組能否持續接收資料。若模組無法永久接收資料(例如因緩衝區已滿或後續模組阻塞),流量控制會中斷資料流,進而導致阻塞和/或背壓。
  • 營運商限制:部分營運商無法處理其輸入鏈路所提供的全部頻寬。《營運商參考手冊》載明了各受影響營運商的相關限制。

以像素速率(每秒像素數)表示的鏈路頻寬,可按以下公式計算:

頻寬 = Parallelism × 基礎設計時脈 (Base Design Clock)

此像素速率公式未包含位元寬度或核心大小。較寬的位元寬度或較大的核心會增加每時鐘週期所處理的資料量(位元或數值),這對 DRAM 存取和 FPGA 資源而言至關重要,但並不會改變此像素速率數值。關於 DRAM 資料寬度,請參閱《記憶體元件教學》主題;關於核心與像素速率頻寬的關係,請參閱《核心操作教學》主題。

基本設計時鐘取決於您的幀擷取卡平台。請在「裝置資源」中查詢該數值。

影像的最大尺寸雖未出現在此像素速率公式中,但仍會影響設計:它們限制了處理流程所能處理的影像尺寸範圍。這些連結特性必須與您的相機或線掃描來源相匹配,同時還需考量並行處理能力與位元寬度。

路徑的瓶頸是指該路徑上頻寬最低的部分。設計的整體吞吐量總是受限於這個最窄的點。一個狹窄的鏈路或一個受頻寬限制的運算器,便會限制同一路徑上其上游所有元件的吞吐量。因此,吞吐量取決於路徑上最窄的頻寬,以及下游模組能否持續接收資料。

設計指南

請僅將並行度與連結屬性設定為足以支援您的攝影機或線掃描來源所需傳輸速率的最高值。若另一組元件已是瓶頸,進一步提高這些數值不僅會消耗更多 FPGA 資源,也不會提升吞吐量。

某些運算子會改變其輸入與輸出之間的並行度。另一些則會減少畫素數量,例如透過裁切影像。因此,所需的輸出頻寬可能與輸入頻寬不同。在可行情況下,運算子會自動調整並行度。若無法進行調整,VisualApplets 將回報「設計規則檢查」錯誤。

有關平行處理能力的計算與調整資訊,包括如何計算設計所需頻寬的範例,以及操作員合併資料流時如何排除頻寬瓶頸,請參閱 Parallelism 「教學」主題以及「排除瓶頸故障」教學主題。

在設計中可視化吞吐量#

您可以透過使用 Link Info 和 Throughput 標誌,在您的設計中顯示 Parallelism 和資料傳輸量。請使用工具列中的下列按鈕啟用這些標誌:

在設計中啟用 Link Info 和 Throughput 標誌

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

Link Info 和 Throughput 標誌

比較路徑上的各項數值,以找出最窄的連結。除非更下游的操作員無法跟上,否則該連結即是該路徑的瓶頸。

資訊

吞吐量標誌並未顯示所有效能限制。例如,當多個 DRAM 運算子共用同一記憶體介面時,由此產生的「共用記憶體」所造成的 DRAM 頻寬限制,並不會反映在吞吐量顯示中。其他DRAM 效率低下的情況,以及阻塞和潛在的死鎖,同樣也不會顯示。有關「共用記憶體」的使用指引與 DRAM 頻寬規劃,請參閱《記憶體元件教學》主題。 有關死鎖的詳細資訊,請參閱《運算子類型與同步》教學主題。

吞吐量與資料格式取決於鏈路屬性與模組屬性。除了上文所述與傳輸容量相關的屬性(並行度、位元寬度及最大影像尺寸)之外,其他常見的屬性還包括影像協定與色彩格式。

連結屬性會沿著處理流程傳遞。您可在攝影機輸出連結或早期處理階段設定許多屬性,這些屬性將套用至所有下游連結,直到有操作員進行變更為止。模組參數必須與相連連結上的連結屬性相符。因此,上游連結上的變更會影響所有後續的操作員,直到有其他操作員重設該屬性為止。

有關連結屬性及傳播規則的完整清單,請參閱《參數化教學指南》主題以及《使用者手冊》中的「連結規則」章節。

影像通訊協定定義了鏈路上資料流的結構。VisualApplets 支援不同的資料類型/資料流格式:

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

像素會依照掃描順序通過處理流程:先在一條線內由左至右移動,再在一個畫面內由上至下移動。某些攝影機來源會採用不同的順序。當您的來源不符合此慣例時,請使用適當的運算子來修正順序。

有關影像協定與像素順序的更多資訊,請參閱《使用者手冊》中的「影像協定」、「影像尺寸」及「資料結構」章節。

來源是否能在流量控制下暫停,會影響您如何配置管線。攝影機運算子屬於不可暫停的來源。您通常會直接在它們後面接上緩衝運算子。詳細資訊請參閱下文的「流量控制、阻塞與背壓」,以及「可暫停與不可暫停的資料流」教學主題。

流量控制、阻塞與背壓#

生成的 FPGA 管線會在各階段之間實施流量控制。當某個階段尚未準備好接收更多資料時,它可以封鎖其輸入:停止向上游階段請求資料,而上游階段則停止輸出。這種封鎖會以背壓的形式向後傳播至管線中。請注意,只有 M 型運算子才能封鎖輸入。VisualApplets 中的圖形化模組描述了此硬體行為;它們本身並不會實施流量控制。

假設 DmaToPC 無法以足夠快的速度將資料傳輸至主電腦。這會導致輸入不時被阻塞。阻塞訊號會向上傳遞至緩衝區操作器。在阻塞狀態下,緩衝區會停止轉發資料。它會儲存傳入的像素,且其填充水準隨之上升。當攝影機停止傳送資料時,緩衝區便會再次清空。

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

緩衝器運算子可將處理速度不同的階段解耦。若在不可停止的攝影機來源之後未設置緩衝器,下游模組的阻塞便無法減緩攝影機資料流的速度。因此,此設計可能會無法通過設計規則檢查,或在硬體上發生死鎖。

有關運算子類型,以及 O 型、M 型和 P 型模組上的阻塞行為,請參閱「運算子類型與同步」教學主題。

關鍵詞

阻塞(Blocking)意指已生成的 FPGA 階段無法接收進一步的輸入資料,例如因為後續階段不接受資料,或是該階段內的處理耗時較長。VisualApplets 中的模組圖示代表該階段;圖示本身並不會等待或產生阻塞。
背壓(Backpressure)正是其背後的機制:這種「壓力」是向後作用的。若某個階段無法足夠快速地接收資料,上游階段就必須等待,而資料流也會因此受阻。 實際應用:若某個下游階段無法接收資料(例如緩衝區已滿),則上游階段便會等待。
本主題中的「頻寬」指的是連線的像素速率:每秒可透過該連線傳輸的像素數量。位元寬度與核心大小會改變每個像素所攜帶的資料量,這屬於不同的量值。請參閱 Parallelism 教學主題。