延遲#
關鍵詞
延遲 是指單一像素從相機(或其他來源)輸入通過產生的 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 管線中實現高頻寬與最低延遲。
尋找運算子的延遲值#
若要尋找您想在設計中使用的算子的延遲值,請使用下列來源:
- Operator Reference — 每個算子都在 Operator Reference 中記錄了其延遲(或處理延遲)。
- 產品內建說明 — 在設計中選取算子並開啟說明以查看參數和時序細節。這與 Operator Reference 中的內容相同,作為 VisualApplets 的工具內說明提供。
特別是對於 M 型算子,請務必查閱說明文件。延遲可能取決於參數(例如濾波器算子中的核心大小,或記憶體算子中的緩衝區深度)。
大多數算子不會儲存完整影像。只要資訊可用且輸出未被阻擋,它們就會計算輸出結果。這就是為什麼產生的 FPGA 管線中的延遲能保持接近所選演算法的理論最小值。
如果輸出被阻擋(例如因為 PC 無法足夠快地接收資料),緩衝區 Fill 級別就會增加,且像素出現在主機上的時間也會增加。該額外延遲並非固定的算子延遲,而是來自負載下的流量控制與緩衝。
相關主題#
- Pipeline Concept 教學主題 — 無緩衝串流與並行處理
- Parallelism 教學主題 — Parallelism 與延遲
- Operator Types and Synchronization 教學主題 — 算子類型與延遲
- Memory Elements 教學主題 — 緩衝算子的行延遲
- Working with Kernels 教學主題 — 與核心相關的延遲
- 使用者手冊中的 Bandwidth of an Applet — 頻寬與延遲的比較
- Operator Reference — 個別算子的延遲值
- Device Resources — Base Design 時脈頻率