跳至內容

延遲#

本主題說明從 VisualApplets 設計所產生的 FPGA 管線中的 latency 含義、延遲與 bandwidth 的差異,以及典型設計中的延遲大小。讀完本主題後,您將能理解為什麼像素不會立即出現在輸出端、運算子類型與緩衝如何影響延遲,以及在哪裡可以找到各個運算子的延遲值。

關鍵詞

延遲 是指單一像素從相機(或其他來源)輸入通過產生的 FPGA 管線到輸出所需的時間,例如 DmaToPC。該延遲發生在擷取卡上,而不是在 VisualApplets 編輯器中。 頻寬 是指每秒可以流經連結的像素數量。

設計可以同時具有高頻寬和低延遲:許多像素以平行方式在 FPGA 管線中移動,但畫面的第一個像素在交給 DMA 之前仍然需要一些時間。

延遲與頻寬#

Bandwidth 和 latency 描述了同一管線的不同屬性:

頻寬 延遲
問題 每秒流動多少資料? 一個像素要等待多久才會被處理?
取決於 Parallelism 與基礎設計時脈 運算子類型與演算法
公式(連結) 頻寬 = Parallelism × 基礎設計時脈 (Base Design Clock) 由各運算子 (operator) 自行定義;請參閱下方說明

管線 (pipeline) 可以同時傳輸與處理影像資料。例如,當第 1000 個像素已經到達輸出端時,第 5000 個像素可能仍處於相機輸入端。整體資料速率(頻寬)之所以能保持極高,是因為多個像素在設計中是以平行方式運行。延遲 (latency) 僅用來描述單一像素的延遲時間。

設計指南

在由 VisualApplets 設計所產生的 FPGA 管線中,延遲會維持在接近理論上的最小值。大多數運算子不會儲存完整的影像,而是在資訊可用時立即轉發結果。

延遲定義#

延遲 是指設計中像素的延遲時間 — 也就是像素從進入處理鏈到離開處理鏈所需的時間(例如,直到抵達 DmaToPC)。

重點:

  • 延遲由各營運商自行定義,且主要取決於其演算法的實作方式。
  • 新增運算子不會降低吞吐量 (throughput)。所產生的 FPGA 管線中的所有運算子都是以平行方式運作:當某個模組正在處理一個像素時,其他模組正在處理其他像素。在管線填滿 (filled) 後,較長的處理鏈依然可以在每個時脈週期接收新的像素(或像素封包)。
  • 新增運算子可能會增加延遲。每個運算子可能會在單一像素的路徑上增加延遲,而這些延遲會在處理鏈中累積。來自 O 型運算子的少數時脈週期,與緩衝區的行 (line) 或張 (frame) 延遲相比通常微不足道。
  • 延遲不等於阻塞或緩衝區 Fill 等級。如果下游處理速度緩慢,緩衝區可能會填滿,導致延遲進一步增加。本主題說明運算子本身內建的最小延遲。

範例設計#

本主題將全程使用以下設計。它展示了一個包含一個緩衝區與兩個處理步驟的簡單擷取路徑:

具有各運算子延遲標註的範例設計

上方設計中的延遲標註適用於此特定範例:

運算子 此範例中的延遲
CxpCamera 此範例中無額外的演算法延遲
LineBuffer 1 行 (line)
ScaleByN 1 個時脈週期
ShiftRight 無額外延遲
DmaToPC 此範例中無額外的演算法延遲

此路徑上像素的總延遲主要取決於 單行延遲 (one-line delay) 的項 LineBuffer,再加上其他運算子的微小處理延遲。「無額外演算法延遲」適用於 CxpCamera 進行明確的生命週期管理即呼叫 DmaToPC ,表示這些運算子在此範例中不會增加此類型的額外延遲。這並不表示像素會立即顯示在電腦上。相機介面時序、PCIe 傳輸、主機緩衝以及顯示皆不在此表格的討論範圍內。

範例設計中的像素流#

在此範例設計中,像素會透過相機介面從相機傳輸至 LineBuffer中。 LineBuffer 在將資料傳送至輸出之前,會先收集完整的一行。型別:

完整的一行儲存至 LineBuffer後,緩衝區會輸出該行的像素。在 同時,相機已經在傳輸 下一行。這就是所產生的 FPGA 硬體的管線式(pipelined)行為:擷取、緩衝、處理和 DMA 可以重疊執行。VisualApplets 描述了該管線;它本身並不處理相機串流。

計算延遲#

延遲取決於 operator。整個設計並沒有單一數值。您可以將單一像素路徑上的延遲相加(或依時間追蹤)。

基於行的延遲 (緩衝運算子)#

緩衝區 operator,例如 ImageBuffer 進行明確的生命週期管理即呼叫 LineBuffer 需要至少 完整的一行 ,才能輸出該行的第一個像素。以上述範例中的 LineBuffer 為例:

延遲 = 1 行

以時間測量,一行的延遲為:

行延遲 = (每行像素數) / (鏈結的像素速率)

像素速率取決於 Parallelism 和 Base Design Clock。較寬的行或較慢的鏈結會增加第一個像素離開緩衝區的時間。

時脈週期延遲 (處理運算子)#

許多處理 operator 會將像素延遲 固定的時脈週期數。在管線填滿(filled)後,它們仍然可以在每個時脈週期接收並輸出一個像素(或一組並行像素封包)。單一像素的延遲因此僅為這些內部暫存器級別。

在此範例設計中, ScaleByN 新增了:

延遲 = 1 個時脈週期

以時間測量,一個時脈週期的延遲為:

週期延遲 = 1 / Base Design Clock 頻率

例如,在 Base Design Clock 為 312.5 MHz 時,一個時脈週期為 3.2 ns。

Operator,例如 ShiftRight 在此範例中,新增 無有意義的延遲 在實際應用中。它們會在輸入值可用時立即轉發結果。

運算子類型與延遲#

VisualApplets 將運算子分為不同類型。該類型可協助您評估延遲:

Type 圖示形狀 典型的延遲行為
O 型 圓形 極小的固定延遲 — 通常是固定的時脈週期數。例如:約 3.2 ns 的延遲(在 312.5 MHz 基礎設計時脈下的一個週期)。
M 型 方形 可變延遲。可以緩衝列或影格、變更影像尺寸或封鎖輸入。請參閱運算子文件以了解確切的延遲。
P 型 方形 類似於 M 型,但不會主動封鎖輸入。請參閱運算子文件以了解確切的延遲。

CxpCamera, LineBuffer以及 DmaToPC 是 M 型運算子。 ScaleByN 進行明確的生命週期管理即呼叫 ShiftRight 是 O 型運算子。儘管 DmaToPC 屬於 M 型,但它在此範例中並未增加大量的演算法延遲 — 它會在資料到達時立即將資料傳遞給 DMA。影像在主機軟體中可見之前所需的時間則是另一個較晚的延遲。

關鍵詞

可以將 O 型運算子想像成具有固定長度的短管段。可以將 M 型運算子想像成可能包含儲存槽(緩衝區)或更複雜機械的區段。儲存槽必須 Fill 滿才能流出第一滴水 — 這就是基於列的延遲。這些管線與儲存槽是 FPGA 上的硬體階段,由您在 VisualApplets 中放置的模組所產生。

Parallelism 與延遲#

Parallelism 不會消除延遲。它會增加頻寬:每個時脈週期有更多像素通過連結。

範例:在 Parallelism 為 4 的情況下,四個像素會在一個時脈週期內通過連結。一個影格的 第一個像素 仍然需要相同的運算子延遲,例如在 ImageBuffer中的一行。在管線填滿後,四個新像素可以在每個時脈週期離開運算子。

  • 高 Parallelism → 高產出量(頻寬)。
  • 緩衝區與演算法 → 第一個像素的延遲。

兩個屬性是相互獨立的。VisualApplets 設計旨在於產生的 FPGA 管線中實現高頻寬與最低延遲。

尋找運算子的延遲值#

若要尋找您想在設計中使用的算子的延遲值,請使用下列來源:

  1. Operator Reference — 每個算子都在 Operator Reference 中記錄了其延遲(或處理延遲)。
  2. 產品內建說明 — 在設計中選取算子並開啟說明以查看參數和時序細節。這與 Operator Reference 中的內容相同,作為 VisualApplets 的工具內說明提供。

特別是對於 M 型算子,請務必查閱說明文件。延遲可能取決於參數(例如濾波器算子中的核心大小,或記憶體算子中的緩衝區深度)。

大多數算子不會儲存完整影像。只要資訊可用且輸出未被阻擋,它們就會計算輸出結果。這就是為什麼產生的 FPGA 管線中的延遲能保持接近所選演算法的理論最小值。

如果輸出被阻擋(例如因為 PC 無法足夠快地接收資料),緩衝區 Fill 級別就會增加,且像素出現在主機上的時間也會增加。該額外延遲並非固定的算子延遲,而是來自負載下的流量控制與緩衝。