跳至內容

Operator 類型與同步#

本主題說明 `VisualApplets ` 如何對運算子進行分類,以及在分支合併時如何同步資料流。閱讀完本主題後,您將了解 O 型、M 型和 P 型行為、O 型網路規則、同步與非同步輸入,以及何時需要使用諸如 SYNC, InsertLine, InsertImage,或 SourceSelector 以同步資料流。

關鍵詞

VisualApplets 會以代表其類型的圖形標示每個運算子。圓形圖示代表 O 型運算子;方形圖示則代表M 型或 P 型運算子。由於 M 型和 P 型運算子均使用方形圖示,因此僅憑圖形無法區分兩者。請參閱產品內建說明或《運算子參考手冊》以確認類型。兩者的主要差異在於:M 型運算子會阻擋其輸入;P 型運算子則不會主動阻擋輸入。

「阻塞」是指當生成的 FPGA 階段尚未準備好接收更多資料時,可暫停其輸入。您無法使用一般的運算子將兩個獨立的攝影機資料流連接起來,因為它們的時序不同。請使用帶有緩衝區的同步運算子來同步這些資料流。

識別運算子類型#

VisualApplets 將運算子分為三種類型。您可以透過設計窗格中的模組圖示形狀來辨識其類型。產品內建說明及《運算子參考》文件中皆載明了各運算子的類型。

Type 形狀 主要行為
O 型 回合:

O 型運算子
  • 簡單的處理
  • 像素數維持不變
  • 串聯或並聯
M 型 Square:

M 型操作員
  • 複雜的處理流程
  • 可變更像素數與尺寸
  • 可阻擋輸入
P 型 Square:

P 型運算子
  • 與 M 型類似,但不會主動阻斷輸入

每個來源運算子(例如相機模組)都是 M 型運算子。每個最終目的地,例如 DmaToPC, 是一個 M 型算子。

O 型運算子#

O 型運算子執行簡單的處理步驟。它們遵循以下規則:

  • 輸出的像素數等於輸入的像素數。
  • 輸入與輸出之間存在固定數量的時鐘週期延遲。在時序同步過程中,必須對此時序延遲進行補償。
  • 您可以不受限制地將它們串聯或並聯。分割與合併 O 型管線時,無需進行任何額外的同步操作。
  • 它們本身無法阻斷資料流,但會將下游模組傳來的阻斷條件傳遞下去。

資訊

Basler 建議您在演算法允許的情況下,優先選用 O 型運算子。它們通常比 M 型運算子消耗較少的 FPGA 資源。

M 型運算子#

M 型運算子會執行更複雜的處理。它們遵循以下規則:

  • 它們可以調整輸入與輸出之間的像素數量。
  • 它們可能會延遲輸出。
  • 當它們尚未準備好接收更多資料時,便可以阻斷輸入。
  • 在連結這些連結時,您必須遵守連結規則。
  • 唯有使用具有非同步輸入的專用運算子,才能將來自不同 M 型來源的資料流進行合併(例如, SYNC,或 SourceSelector)。

攝影機操作員和緩衝區操作員總是屬於 M 型操作員。許多濾波器和同步操作員也屬於 M 型。

P-Type Operators#

P 型運算子與 M 型運算子相似。兩者的主要差異在於,P 型運算子不會主動阻斷輸入。此外,它們也不會降低鏈路的頻寬,且產生的資料量不會超過接收的資料量。這些運算子可與不可停止的資料源配合使用。

關鍵詞

不可中斷的資料流會持續流動。不可中斷的資料源無法透過生成的 FPGA 設計中的流量控制邏輯暫停。典型的例子是持續傳送像素資料的攝影機。相較之下,可中斷的資料流可在下一道處理單元尚未就緒時暫停。在攝影機與下游處理之間設置緩衝區,通常能將不可中斷的資料流轉變為可中斷的資料流。

有關可中斷與不可中斷資料流的詳細資訊,請參閱「可中斷與不可中斷資料流」教學主題。

除非在「運算子參考」中另有規定,否則相同的連結規則同時適用於 P 型與 M 型運算子。然而,與 M 型運算子不同的是,P 型運算子可與無法停止的來源搭配使用。

Synchronous and Asynchronous Inputs#

具有多個輸入的 M 型運算子可接受同步輸入、非同步輸入,或兩者兼具。某些運算子提供一組同步輸入,而這些輸入之間可能彼此是非同步的。產品內建說明及《運算子參考》文件中皆載明各連接埠所需的輸入類型。

同步輸入#

許多運算器要求其所有輸入埠或其中一部分輸入埠必須具備同步輸入。所謂同步,是指這些輸入埠上的資料流必須保持對齊:通訊協定、輸入像素數以及資料的時序都必須完全吻合。

當所有輸入均源自同一個 M 型來源,且僅透過 O 型運算子網路傳輸時,即可保證同步行為。這些輸入可透過任意數量的 O 型運算子連接,只要不引入其他來源(即 M 型運算子)即可。

所有屬於同一同步群組的輸入,總是共用單一的 M 型來源。

一個典型的例子是 RemoveImage 有兩個來自同一來源的影像輸入 LineBuffer:

同步輸入

非同步輸入#

僅有少數運算子支援非同步輸入。所謂非同步,意指這些輸入上的資料流並未對齊:傳入的像素在時序、通訊協定及數量上可能有所不同。 不同運算子之間的異步輸入可能存在哪些具體差異,取決於該運算子本身。異步輸入亦可透過 O 型運算子網路從各自的來源進行連接。請僅將異步輸入用於明確支援此功能的運算子。這些運算子會將異步資料流轉換為同步資料流。

支援非同步影像輸入的運算子包括:

  • SYNC
  • InsertLine
  • InsertImage
  • SourceSelector.

FrameBufferRandomRead 進行明確的生命週期管理即呼叫 FrameBufferMultiRoiDyn 也接受非同步的圖片連結,但其座標輸入仍須為同步。

您無法使用一般的多輸入運算子來合併兩個獨立的 M 型來源。要達成此目的,您需要一個支援非同步輸入的運算子:

非同步輸入

同步規則#

在 O 型網路中,無論網路複雜度如何,所有 O 型模組都必須由同一個 M 型或 P 型模組作為來源。來自此來源的連結可穿過其他 O 型模組或 O 型子網路。

O 型管線的分拆與合併相當簡單,且無需額外的同步處理。

O 型網路

當將 M 型或 P 型運算子引入網路時,它便會成為新的資料來源。若源自不同來源的分支在下游處合併,則該合併處需進行同步,也就是說,您必須加入一個具有非同步輸入的運算子,例如 SYNC, InsertLine, InsertImage,或 SourceSelector. 這些分支無法連接至標準的多輸入運算子。

VisualApplets 在設計窗格中以紫色連結標示同步違規處:

VisualApplets: 紫色連結標示同步違規

此O 型網路規則確保同步輸入:所有屬於同一同步輸入群組的分支,都必須源自單一的 M 型或 P 型源,且僅能經過 O 型運算子。

O 型網路規則不適用於使用 Image Protocol = VALT_SIGNAL. 如需更多資訊,請參閱 訊號連接的不同規則 使用者手冊中的

合併獨立來源#

當兩個或多個獨立來源將資料傳入同一條處理路徑時,必須同步時序與影像尺寸。

  • 時間同步會使各分支接收到的像素時間點保持一致。
  • 影像尺寸同步可使寬度、高度及影像協定保持一致。

同步通常是透過運算子來實現的 SYNC. 在某些情況下,還有其他幾種同步選項。

時序同步不當可能會導致死鎖、頻寬不足或資料遺失。

資訊

為避免死鎖,請放置一個記憶體運算子,例如 ImageFifo 或 ImageBuffer, 在……之前 SYNC 當來源以不同速度運行時,或當某一分支造成延遲時,需使用此運算子。記憶體單元的大小也必須適當設定:您需要了解預期的延遲,才能選擇足夠大的緩衝區大小。

在VisualApplets 中,無法透過模擬可靠地偵測死鎖,但死鎖僅會出現在硬體環境中。若要偵測死鎖,請觀察 FillLevel 參數(屬於 ImageFifo 運算子或其他緩衝區運算子 在幀擷取卡上,例如在 microDisplay X. 若 FIFO 的填充率始終維持在 100%,通常表示這是死鎖的來源。您無法在「VisualApplets 」設計窗格中觀察到該填充率。

有關死鎖的更多詳細資訊,請參閱「疑難排解:死鎖」

在合併非同步串流時,請確保線速率、幀速率與像素速率相互匹配。若其中一臺攝影機的運作速度比另一臺快,緩衝區將會持續填滿,直至發生溢出而導致資料遺失。當需要從多臺攝影機以相同速率進行長時間擷取時,請使用觸發系統。

與 SYNC 運算子同步#

當 SYNC 此運算子會同步所有輸入連結的時序與影像尺寸。在實例化此運算子時,輸入數量即已固定。所有輸出皆為同步輸出。下游的 O 型運算子隨後即可處理這些合併後的資料流。

當 SYNC 此運算子在所有輸入端上扮演類似閥門的角色。它會等待,直到每個輸入端都出現有效的像素為止。接著,它會同時將像素傳送至所有輸出端。

當輸入影像的大小不同時, SYNC 將它們對齊。根據參數設定的不同,系統會放大較小的圖像,或裁切較大的圖像。請參閱運算子說明 SYNC 在《操作員參考手冊》及該章節中 使用 SyncToMin 和 SyncToMax 參數值 因為 SyncToMin 進行明確的生命週期管理即呼叫 SyncToMax 行為。

資訊

請使用 SYNC 僅當攝影機同步觸發時,才應在設計中將運算子置於攝影機附近。否則,緩衝區可能會迅速填滿。

典型的雙鏡頭路徑如下所示:

與 SYNC 運算子同步

緩衝器可消除各台攝影機之間的時序偏移。若沒有緩衝器,且沒有 SYNC,該設計可能導致死鎖或觸發 DRC 警告。

如需逐步了解疊加與拼接的操作流程,請參閱《使用者手冊》中的「非同步影像處理管線的同步化」一節。

使用 SyncToMin 和 SyncToMax 參數值#

如果來源包含 不同尺寸的圖片, 使用 SyncMode 參數(屬於 SYNC 運算子來對齊其維度。您可以從以下值中選擇: SyncToMin 進行明確的生命週期管理即呼叫 SyncToMax.

此同步機制可確保所有輸出影像的尺寸皆相同。該 SYNC 此運算子支援兩種模式:

  • SyncToMin: 透過裁切較大的圖片,將所有圖片統一調整為最小尺寸。

    使用 SyncToMin 裁切較大的圖片

  • SyncToMax: 將所有圖片對齊至最大圖片尺寸,方法是將較小的圖片放大。在 SyncToMax 在此模式下,任何額外的區域都會被填充為虛擬的零像素(顯示為黑色)。

    使用 SyncToMax 對較大圖片進行填充

在模擬中,情況如下:

SyncToMin:較大的圖片已被裁切。

模擬中的 SyncToMin

SyncToMax:較小的影像中填滿了虛擬像素。

模擬中的 SyncToMax

與 InsertLine 和InsertImage 運算子同步#

InsertLine 透過插入來自多個來源的線段來拼合圖像。當兩個來源皆依序提供線段時,可用於基於線段的拼接。

當相機同步觸發時,您可以使用較小的 ImageFifo 運算子 而不是 a LineBuffer 運算子。這可減少資源使用量。

與 InsertLine 同步

資訊

InsertLine 進行明確的生命週期管理即呼叫 InsertImage 通常會與 CONST 運算子。在此語境下, CONST 指定圖像或線段是否包含在輸出流中。資料會始終被處理,但 CONST 決定該資料是否會出現在輸出流中,或是被內部丟棄(即傳送至內部垃圾路徑)。

InsertImage 透過插入來自多個來源的影像,來組合一組影像序列。可用於將來自兩台攝影機的影像多工整合為一個輸出序列。

與……同步InsertImage

這兩個運算子皆可接受非同步輸入。若將這些運算子與無法停止的來源搭配使用,請在它們前方放置足夠大小的緩衝區,以避免死鎖。另請參閱《運算子參考指南》中的InsertLine以及 InsertImage 《運算子參考指南》中的相關內容。

與 SourceSelector 運算子同步#

SourceSelector 可在多個影像來源(例如兩台攝影機)之間進行選擇。它在不同步的來源之間切換時,能維持輸入影像的完整性。

只有被選中的輸入才會被轉發至輸出;其餘所有輸入均會被捨棄。若在某個輸入通道的影像仍在傳輸過程中發生切換,系統會先完成該次傳輸,才會讓新的來源生效。

請使用 SelectSource 用於在執行時控制有效來源的參數。

操作員會在切換至另一項輸入之前,先完成當前幀。設定 InfiniteSource 設為 ENABLED 當攝影機傳送輸入訊號時,請將其設定為 DISABLED 當輸入來自一個具有緩衝功能且可暫停的資料流時。

與 SourceSelector 同步

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

使用 CASE 取代 SourceSelector

另請參閱《運算子參考》中的SourceSelector。

避免同步#

由於同步和緩衝運算子會消耗大量 FPGA 資源,因此應盡可能避免使用同步操作。在許多情況下,可透過採用替代設計技術來達成此目標。此類技術可能包括在所需的 M 型運算子之前合併資料,並在之後將資料拆分。以下螢幕截圖顯示了兩個類似工作流程的實作方式,其中一種採用 MergePixel 進行明確的生命週期管理即呼叫 ADD,以及曾使用過 SYNC:

避免同步

疑難排解:死鎖#

最常見且最難處理的同步錯誤之一就是死鎖。

當兩個來源直接進行同步時(例如,透過使用一個 SYNC 運算子,且不進行任何緩衝。在此情況下,每個來源都會等待對方:A 等待 B,而 B 則等待 A。結果,便沒有任何資料被傳輸。

下圖顯示下層路徑上的某個分支模組接收到停止訊號,因此其輸入端不再接受資料。結果,上層路徑也停止接收資料,整個管線隨之停頓:

死結

在模擬環境中,死鎖通常難以察覺,此時系統可能看似運作正常。然而,在硬體上,死鎖通常會導致沒有輸出。在此類情況下,硬體小程式會凍結,停止將資料傳輸至個人電腦,並最終引發 DMA 超時。

資訊

死鎖難以偵測,因為在模擬過程中通常無法察覺。若要識別可能發生的死鎖,請使用microDisplay X 等執行時工具,監控硬體中的 FIFO 填滿程度。若 FIFO 容量持續維持在100%,則表示可能發生死鎖或存在瓶頸。

死鎖的常見原因:

  • 缺少緩衝區
  • 同步錯誤

如何解決死鎖:

要解決死鎖問題,請加入基於 FIFO 的緩衝機制,例如: ImageBuffer 或 ImageFifo, 在……之前 SYNC 運算子。這使得其中一個來源能稍微超前執行,並避免相互等待的情況:

死鎖問題已解決

使用 DRC 驗證您的設計#

在完成會匯合的分支佈線後,請執行「 分析」→「設計規則檢查第 1 級」。第 1 級會報告同步違規情況,並將受影響的連結標記為紫色。

設計規則檢查第 2 級會執行擴展檢查,並估算 FPGA 資源。在編譯之前,請先修正第 1 級中發現的形式錯誤。

請閱讀 DRC 記錄檔以及反白顯示的模組與連結。如需完整的工作流程,請參閱 從空白設計到執行中的 Applet 教學課程主題。