Operator 類型與同步#
關鍵詞
VisualApplets 會使用不同的圖形標示每個運算子以顯示其類型。圓形圖示代表 O 型運算子。正方形圖示代表 M 型或 P 型運算子。M 型與 P 型皆使用正方形圖示,因此無法僅憑圖示形狀來區分。請參閱產品內建說明或運算子參考以確認其類型。主要區別在於:M 型運算子可以封鎖其輸入,而 P 型運算子則不會主動封鎖。
封鎖表示產生的 FPGA 階段在尚未準備好接收更多資料時,可以暫停其輸入。您無法使用一般運算子連接兩個獨立的相機串流,因為它們的時序不同。請使用帶有緩衝區的同步運算子來同步資料串流。
識別運算子類型#
VisualApplets 將運算子分為三大類型。您可以在設計窗格中透過模組圖示的形狀來識別類型。產品內建說明以及運算子參考文件記錄了每個運算子的類型。
| Type | 形狀 | 主要行為 |
|---|---|---|
| O 型 | 圓形:![]() |
|
| M 型 | Square: ![]() |
|
| P 型 | Square: ![]() |
|
每個來源運算子(例如相機模組)都是 M-type 運算子。每個最終目的地,例如 DmaToPC,都是 M-type 運算子。
O 型運算子#
O-type 運算子執行簡單的處理步驟。它們遵循以下規則:
- 輸出上的像素數量等於輸入上的像素數量。
- 輸入和輸出之間存在固定時脈週期的延遲。此時序延遲必須在時序同步期間進行補償。
- 您可以毫無限制地將它們串聯或並聯組合。分割和合併 O-type 管線不需要任何額外的同步。
- 它們本身無法封鎖資料流,但會傳播來自下游模組的封鎖條件。
資訊
Basler 建議您在符合演算法需求時優先使用 O-type 運算子。它們通常比 M-type 運算子使用更少的 FPGA 資源。
M 型運算子#
M-type 運算子執行更複雜的處理。它們遵循以下規則:
- 它們可以更改輸入和輸出之間的像素數量。
- 它們可以延遲輸出。
- 當它們尚未準備好接受更多資料時,可以封鎖輸入。
- 連接它們時,您必須遵守連結規則。
- 合併源自不同 M-type 來源的資料流,只能透過具有非同步輸入的專用運算子來完成(例如,
SYNC,或SourceSelector)。
相機運算子和緩衝區運算子始終是 M-type 運算子。許多濾波器和同步運算子也是 M-type 運算子。
P-Type Operators#
P-type 運算子類似於 M-type 運算子。主要的區別在於它們 不會主動封鎖輸入。它們也不會減少連結上的頻寬,且不會產生比接收更多的資料。它們可用於不可停止的來源。
關鍵詞
不可停止的 資料流會持續執行。不可停止的來源無法由產生的 FPGA 設計之流量控制邏輯來暫停。一個典型的例子是持續發送像素的 相機。相對地,當下一個運算子尚未準備好時,可停止的 資料流可以暫停。相機與下游處理之間的 緩衝區 通常會將不可停止的資料流轉化為可停止的資料流。
關於可停止與不可停止資料流的詳細資訊,請參見 Stoppable and Non-Stoppable Data Streams 教學主題。
除非 Operator Reference 中另有例外規定,否則相同的連接規則適用於 P 型和 M 型 operator。然而,與 M 型 operator 不同的是,P 型 operator 可以與不可停止的來源搭配使用。
Synchronous and Asynchronous Inputs#
具有多個輸入的 M 型 operator 接受 同步 輸入、非同步 輸入,或兩者皆接受。某些 operator 提供多組同步輸入,這些輸入彼此之間可能是非同步的。產品內建說明與 Operator Reference 記錄了每個連接埠所需的輸入類型。
同步輸入#
許多 operator 要求全部或部分輸入連接埠必須具備同步輸入。同步是指這些輸入上的資料串流已對齊:資料的協定、輸入像素數量以及時序必須完全相符。
當所有輸入皆源自透過 O 型 operator 網路專屬路由的共用 M 型來源時,即可保證同步行為。只要未引入其他來源(即 M 型 operator),這些輸入即可透過任意數量的 O 型 operator 進行連接。
屬於同一同步群組的所有輸入一律共用單一 M 型來源。
一個典型的範例是 RemoveImage 其中包含來自同一個的兩個影像輸入 LineBuffer:

非同步輸入#
只有少數 operator 支援非同步輸入。非同步是指這些輸入上的資料串流未對齊:時序、協定以及輸入像素的數量可能會有所不同。非同步輸入之間可能不同的特定屬性取決於 operator。非同步輸入也可以透過各自來源的 O 型 operator 網路進行連接。請僅將非同步輸入用於明確支援該功能的 operator。這些 operator 會將非同步資料串流轉換為同步資料串流。
支援非同步影像輸入的 operator 包含:
SYNCInsertLineInsertImageSourceSelector.
FrameBufferRandomRead 進行明確的生命週期管理即呼叫 FrameBufferMultiRoiDyn 也接受非同步影像連結,但其座標輸入仍必須保持同步。
您無法使用一般多輸入 operator 來合併兩個獨立的 M 型來源。為此,您需要一個支援非同步輸入的 operator:

同步規則#
在 O 型網路中,所有 O 型模組(無論網路複雜度為何)都必須由相同的 M 型或 P 型模組提供來源。來自此來源的連結可以通過其他 O 型模組或 O 型子網路。
分割與合併 O 型管線非常直接,不需要額外的同步化。

當網路中引入 M 型或 P 型 operator 時,它就會成為新的資料來源。如果源自不同來源的分支在下游合併,該合併動作就需要進行同步,也就是說,您必須新增一個具有非同步輸入的 operator,例如 SYNC, InsertLine, InsertImage,或 SourceSelector。這些分支無法連接到標準的多輸入 operator。
VisualApplets 會在設計窗格中以紫色連結標示同步違規:

此 O 型網路規則可確保輸入同步:屬於同一同步輸入群組的所有分支都必須源自單一 M 型或 P 型來源,且只能透過 O 型 operator 傳遞。
O 型網路規則不適用於使用以下項目的信號連結: Image Protocol = VALT_SIGNAL。如需詳細資訊,請參閱 訊號連接的不同規則 使用者手冊中的
合併獨立來源#
當兩個或多個獨立來源提供資料給同一個處理路徑時,您必須同步處理時序與影像尺寸。
- 時序同步化會對齊像素到達每個分支的時間。
- 影像尺寸同步化會對齊寬度、高度以及影像協定。
同步化通常使用 operator 來完成 SYNC。針對特定情況,還有其他幾種同步化選項。
錯誤的時間同步可能會導致死結(deadlock)、頻寬不足或資料遺失。
資訊
為避免死結,請在 ImageFifo 或 ImageBufferoperator之前放置記憶體 operator(例如 SYNC ),適用於來源以不同速度運行或某個分支引入延遲的情況。必須適當調整記憶體元件的大小:您需要知道預期的延遲,以便選擇足夠的緩衝區大小。
無法透過 VisualApplets 中的模擬可靠地偵測死結,死結只會在硬體中出現。若要偵測死結,請監控 FillLevel 參數(屬於 ImageFifo operator或其他緩衝區 operator (在取像卡上)例如在 microDisplay X中。持續維持在 100% 的 FIFO 通常表示死結的來源。您無法在 VisualApplets 設計窗格中觀察到該 Fill 程度。
如需有關死結的更多詳細資訊,請參閱 Troubleshooting: Deadlock
當您合併非同步串流時,請確保行速率、影格速率和像素速率相符。如果一台相機的運行速度比另一台快,緩衝區就會填滿直到溢位並遺失資料。當您需要以相同速率從多台相機進行長時間取像時,請使用觸發系統。
使用 SYNC 運算子進行同步#
當 SYNC operator會同步所有輸入連結上的時間和影像尺寸。當您實例化該 operator 時,輸入的數量是固定的。所有輸出都是同步的。下游的 O 型 operator 接著可以處理合併的串流。
當 SYNC operator 的作用就像所有輸入上的閥門。它會等待,直到每個輸入上都有一個有效的像素。然後它會同時在所有輸出上轉發像素。
當輸入影像的大小不同時, SYNC 會將其對齊。根據參數設定,它會放大較小的影像或裁剪較大的影像。請參閱 Operator Reference 中的 operator 說明 SYNC 以及章節 使用 SyncToMin 與 SyncToMax 參數值 以了解 SyncToMin 進行明確的生命週期管理即呼叫 SyncToMax 行為。
資訊
請使用 SYNC 只有在相機同步觸發時,才在設計中的相機附近使用 operator。否則緩衝區可能會迅速填滿。
典型的雙相機路徑如下所示:

緩衝區可吸收相機之間的時間偏移。在沒有緩衝區且沒有 SYNC的情況下,設計可能會面臨死結或 DRC 警告的風險。
如需逐步的覆疊和拼接操作說明,請參閱使用者手冊中的 Synchronization of Asynchronous Image Pipelines。
使用 SyncToMin 與 SyncToMax 參數值#
如果來源包含 不同尺寸的影像,請使用 SyncMode 參數(屬於 SYNC 運算子來對齊其尺寸。您可以在下列數值中進行選擇 SyncToMin 進行明確的生命週期管理即呼叫 SyncToMax.
同步化可確保所有輸出影像都具有相同的尺寸。 SYNC 運算子支援兩種模式:
-
SyncToMin:透過裁切較大的影像,將所有影像對齊至最小的影像尺寸。
-
SyncToMax:透過擴充較小的影像,將所有影像對齊至最大的影像尺寸。在SyncToMax模式中,任何額外區域都會以虛擬零像素填滿(顯示為黑色)。
在模擬中,其外觀如下:
SyncToMin:較大的影像會遭到裁切。

SyncToMax:較小的影像會以虛擬像素填滿。

使用 InsertLine 與 InsertImage 運算子進行同步#
InsertLine 透過插入來自多個來源的行來組合影像。當兩個來源依序提供行時,可用於基於行的拼接。
當相機同步觸發時,您可以使用較小的 ImageFifo 運算子來代替 LineBuffer 運算子。這會降低資源使用量。

資訊
InsertLine 進行明確的生命週期管理即呼叫 InsertImage 通常與 CONST 運算子一起使用。在這種情況下, CONST 指定該影像或行是否包含在輸出串流中。資料隨都會進行處理,但 CONST 決定它是否會出現在輸出串流中,或是在內部遭到捨棄(亦即傳送至內部垃圾路徑)。
InsertImage 透過插入來自多個來源的影像來組合影像序列。可用於將來自兩部相機的影像多工處理成一個輸出序列。

兩個運算子皆可接受非同步輸入。若這些運算子搭配無法停止的來源使用,請在其前方放置足夠大小的緩衝區,以避免發生死結 (deadlock)。另請參閱運算子參考手冊中的 InsertLine 與 InsertImage。
使用 SourceSelector 運算子進行同步#
SourceSelector 可用於在多個影像來源(例如兩部相機)之間進行選擇。它能在維持所接收影像完整性的同時,於非同步來源之間進行切換。
僅會將所選的輸入轉發至輸出;所有其他輸入都會被捨棄。如果在某個輸入仍在傳輸影像時發生切換,系統會先完成該傳輸,然後才啟用新的來源。
請使用 SelectSource 用於在執行階段控制作用中來源的參數。
運算子會在切換至其他輸入之前先完成目前的影格。請將 InfiniteSource 設為 ENABLED 設定為此值(當相機提供輸入時)。請將其設定為 DISABLED (當輸入來自具備緩衝區且可停止的串流時)。

Basler 建議您使用 IF 或 CASE 而不是 SourceSelector (當所有輸入皆來自同一個 M 型模組時)。這些運算子使用的資源較少。例如,請參閱以下搭配 CASE 運算子:

另請參閱運算子參考手冊中的 SourceSelector。
避免同步#
由於用於同步與緩衝的運算子會消耗大量 FPGA 資源,因此請盡可能避免進行同步。在許多情況下,這可以透過套用替代的設計技術來達成。此類技術可能包括在所需的 M 型運算子之前合併資料,並在之後分割資料。以下螢幕截圖顯示了類似工作流程的兩種實作方式,其中一次使用 MergePixel 進行明確的生命週期管理即呼叫 ADD,另一次使用 SYNC:
![]()
疑難排解:死結#
最常見且最難處理的同步錯誤之一是死結 (deadlock)。
當兩個來源直接進行同步(例如透過使用 SYNC 運算子且沒有任何緩衝區)時,就會發生死結。在這種情況下,每個來源都在等待對方:A 等待 B,而 B 等待 A。其結果就是無法傳輸任何資料。
下圖顯示下方的路徑上有一個分支模組接收到停止訊號,因此其輸入不再接受資料。結果,上方的路徑也停止接收資料,導致整個管線暫停:

死結在模擬中通常無法察覺,此時系統可能看起來正常執行。然而,在硬體上,它們通常會導致沒有輸出。在這種情況下,硬體 Applet 會凍結、停止向 PC 傳輸資料,並最終導致 DMA 逾時。
資訊
死結很難偵測,因為它們在模擬中通常無法察覺。若要識別可能的死結,請使用 microDisplay X 等執行階段工具來監控硬體中的 FIFO Fill 層級。100% 容量的 FIFO 表示可能存在死結或瓶頸。
死結的常見原因:
- 缺少緩衝區
- 同步不正確
如何修復死結:
若要解決死結,請插入基於 FIFO 的緩衝區,例如 ImageBuffer 或 ImageFifooperator之前放置記憶體 operator(例如 SYNC operator。這可讓一個來源稍微超前執行,並防止相互等待條件:

使用 DRC 驗證您的設計#
在連接匯合的分支後,執行 Analysis → Design Rules Check Level 1。Level 1 會回報同步違規,並以紫色標記受影響的連結。
Design Rules Check Level 2 會執行擴充檢查並估計 FPGA 資源。在建置之前,請先修正來自 Level 1 的形式錯誤。
請閱讀 DRC 記錄檔以及反白顯示的模組與連結。如需完整的工作流程,請參閱 從空白設計到執行中的 Applet 教學課程主題。
相關主題#
- 使用者手冊中的 Rules of Links — O 型網路規則與信號連結
- 教學主題 Stoppable and Non-Stoppable Data Streams — 無限來源與流量控制
- Memory 元素 教學主題 — 之前的緩衝區
SYNC - 教學主題 Pipeline Concept — 阻塞與背壓
- 基礎與範例中的 Synchronization of Asynchronous Image Pipelines
- 從空白設計到執行 Applet 教學主題 — DRC、模擬與建置
- 教學主題 Parameterization — 匯合點處的連結屬性


