跳至內容

Operator 類型與同步#

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

關鍵詞

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

阻擋 (Blocking)意指當產生的 FPGA 階段尚未準備好接受更多資料時,可以暫停其輸入。您無法使用一般運算子連接兩個獨立的相機串流,因為它們的時序不同。請使用帶有緩衝區的同步運算子來同步資料串流。

識別運算子類型#

VisualApplets 將運算子分為三大類型。您可透過設計面板中的模組圖示形狀來識別類型。產品內建說明以及運算子參考手冊記錄了每個運算子的類型。

Type 形狀 主要行為
O-type 圓形:

O 型運算子
  • 簡單處理
  • 像素數量不變
  • 串聯或並聯
M型 方形:

M 型運算子
  • 複雜處理
  • 可以改變像素數量與尺寸
  • 可以阻塞輸入
P型 方形:

P 型運算子
  • 類似 M-type,但不會主動阻塞輸入

每個來源 operator(例如相機模組)都是 M-type operator。每個最終目的地(例如 DmaToPC)都是 M-type operator。

O 型運算子#

O-type operators 執行簡單的處理步驟。它們遵循以下規則:

  • 輸出的像素數量等於輸入的像素數量。
  • 輸入與輸出之間存在固定時脈週期的延遲。在時序同步期間必須補償此時序延遲。
  • 您可以毫無限制地將它們串聯或並聯組合。分割與合併 O-type 管線不需要任何額外的同步。
  • 它們本身無法阻塞資料串流,但會傳播來自下游模組的阻塞條件。

資訊

Basler 建議您在符合演算法需求時優先使用 O-type operators。與 M-type operators 相比,它們通常使用較少的 FPGA 資源。

M 型運算子#

M-type operators 執行更複雜的處理。它們遵循以下規則:

  • 它們可以改變輸入與輸出之間的像素數量。
  • 它們可以延遲輸出。
  • 當它們尚未準備好接受更多資料時,可以阻塞輸入。
  • 連接它們時,必須遵守連線規則。
  • 合併來自不同 M-type 來源的資料串流,只能透過具有非同步輸入的專用運算子來完成(例如 SYNC或 SourceSelector)。

Camera 運算子和 Buffer 運算子一律為 M-type 運算子。許多濾波和同步運算子也屬於 M-type。

P-Type Operators#

P 型運算子與 M 型運算子相似。主要的差別在於它們不會主動阻擋輸入。它們也不會降低鏈路上的頻寬,且產生的資料不會大於接收的資料。它們可用於不可停止的來源。

關鍵詞

一個無法停止的 (non-stoppable) 資料流會持續不斷地運行。無法停止的來源無法被所產生的 FPGA 設計之流量控制邏輯所暫停。典型的例子是持續發送像素的相機。相對地,一個可停止的 (stoppable) 資料流在下一個運算子尚未準備好時可以暫停。相機與下游處理之間的緩衝區通常能將無法停止的資料流轉化為可停止的資料流。

如需關於可停止與無法停止資料流的詳細資訊,請參閱Stoppable and Non-Stoppable Data Streams教學主題。

除非在Operator Reference中另有例外說明,否則相同的連線規則同時適用於 P-type 與 M-type 運算子。然而,與 M-type 運算子不同的是,P-type 運算子可搭配無法停止的來源使用。

同步與非同步輸入#

具有多個輸入的 M-type 運算子可接受同步 (synchronous) 輸入、非同步 (asynchronous) 輸入,或是兩者皆可。部分運算子提供多組同步輸入,彼此之間可能是非同步的。產品內建說明與Operator Reference中記錄了每個連接埠所需的輸入類型。

同步輸入#

許多運算器要求其所有輸入埠或部分輸入埠必須為同步輸入。所謂「同步」,意指這些輸入埠上的資料流必須對齊:通訊協定、傳入像素的數量以及資料的時序都必須完全吻合。

當所有輸入皆源自透過 O-type 運算子網路專門繞徑的共同 M-type 來源時,即可保證同步行為。只要未引入其他來源(即 M-type 運算子),這些輸入就可以透過任意數量的 O-type 運算子進行連接。

屬於同一同步群組的所有輸入一律共用單一 M-type 來源。

一個典型的例子是 RemoveImage 其中包含來自同一個 LineBuffer:

同步輸入

非同步輸入#

僅有少數運算子支援非同步輸入。非同步意味著這些輸入上的資料串流未對齊:時序、協定和傳入像素數量可能會有所不同。非同步輸入之間可能不同的特定屬性取決於運算子。非同步輸入也可以透過各自來源的 O-type 運算子網路進行連接。請僅將非同步輸入用於明確支援它們的運算子。這些運算子會將非同步資料串流轉換為同步資料串流。

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

  • SYNC
  • InsertLine
  • InsertImage
  • SourceSelector.

FrameBufferRandomRead 和 FrameBufferMultiRoiDyn 也接受非同步影像鏈路,但其座標輸入必須保持同步。

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

非同步輸入

同步規則#

在 O-type 網路中,所有 O-type 模組(無論網路複雜度為何)都必須來自同一個 M-type 或 P-type 模組。來自此來源的鏈路可以通過其他 O-type 模組或 O-type 子網路。

分割與合併 O-type 管線非常簡單,不需要額外的同步。

O-Type 網路

當網路中引入 M-type 或 P-type 運算子時,它會成為新的資料來源。如果源自不同來源的分支在下游合併,則合併需要同步,即您必須新增具備非同步輸入的運算子,例如 SYNC, InsertLine, InsertImage或 SourceSelector。這些分支無法連接至標準的多輸入運算子。

VisualApplets 會在設計窗格中以紫色連線突顯同步違規 (synchronization violations):

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

此O-type 網路規則可確保同步輸入:屬於同一同步輸入群組的所有分支,都必須源自單一 M-type 或 P-type 來源,且只能透過 O-type 運算子傳遞。

O-type 網路規則不適用於使用 Image Protocol = VALT_SIGNAL。如需詳細資訊,請參閱 信號連線的不同規則 在《使用者手冊》中。

合併獨立來源#

當兩個或多個獨立來源饋送至同一個處理路徑時,您必須同步處理時間 (timing) 與影像尺寸 (image dimensions)。

  • 時間同步 (Timing synchronization) 會對齊像素到達每個分支的時間點。
  • 影像尺寸同步 (Image dimension synchronization) 會對齊寬度、高度與影像協定。

同步通常透過 SYNC運算子來完成。在某些情況下,還有其他幾種同步選項。

不正確的時序同步可能會導致死結(Deadlock)、頻寬不足或資料遺失。

資訊

為了避免死結,當來源以不同速度運行或某個分支增加了延遲時,請在 ImageFifo 或 ImageBuffer運算子之前放置一個記憶體運算子,例如 SYNC 。記憶體元件的大小也必須適當:您需要知道預期的延遲,以便選擇足夠的緩衝區大小。

在 VisualApplets 中使用模擬無法可靠地偵測死結,死結通常只會在硬體中出現。若要偵測死結,請監視 FillLevel 運算子的 ImageFifo 運算子或其他緩衝區運算子 在擷取卡上,例如在 microDisplay X中。持續維持 100% 的 FIFO 通常表示死結 (deadlock) 的來源。您無法在 VisualApplets 設計窗格中觀察到該 Fill 程度。

如需關於死結的更多詳細資訊,請參閱Troubleshooting: Deadlock

當您合併非同步串流時,請確保行速率、影格速率和像素速率相匹配。如果一台相機的運行速度比另一台快,緩衝區就會填滿直到溢位並導致資料遺失。當您需要以相同的速率從多個相機進行長時間擷取時,請使用觸發系統。

使用 SYNC 運算子進行同步#

影像 SYNC 運算子會同步所有輸入連結上的時序和影像尺寸。輸入的數量在您實例化該運算子時即已固定。所有輸出都是同步的。下游的 O 型運算子隨後可以處理合併後的串流。

影像 SYNC 運算子就像所有輸入端上的閥門一樣運作。它會等待直到每個輸入端上都有有效的像素存在。然後它會同時在所有輸出端上轉發像素。

當輸入影像的大小不同時, SYNC 會將其對齊。根據參數設定的不同,它會擴展較小的影像或裁切較大的影像。請參閱運算子說明 SYNC 於 Operator Reference 與章節 使用 SyncToMin 和 SyncToMax 參數值 中,以了解 SyncToMin 和 SyncToMax 行為。

資訊

請使用 SYNC 只有在相機受到同步觸發時,才在設計中靠近相機的位置使用

典型的雙相機路徑如下所示:

使用 SYNC 運算子進行同步

緩衝區可吸收相機之間的時序偏移。如果沒有緩衝區且沒有 SYNC,該設計將面臨死結或 DRC 警告的風險。

如需逐步疊加與拼接的完整操作指南,請參閱使用者手冊中的Synchronization of Asynchronous Image Pipelines。

使用 SyncToMin 和 SyncToMax 參數值#

如果來源包含 不同尺寸的影像, use the SyncMode 運算子的 SYNC 運算子來對齊其尺寸。您可以在以下值之間進行選擇 SyncToMin 和 SyncToMax.

同步可確保所有輸出影像具有相同的大小。 SYNC 運算子支援兩種模式:

  • SyncToMin:透過裁剪較大的影像,將所有影像對齊至最小的影像尺寸。

    使用 SyncToMin 裁剪較大影像

  • SyncToMax:透過擴展較小的影像,將所有影像對齊至最大的影像尺寸。在 SyncToMax 模式下,任何額外區域都會填滿虛擬的零像素(顯示為黑色)。

    使用 SyncToMax 填充較大影像

在模擬中,情況如下:

SyncToMin:較大的影像會遭到裁剪。

模擬中的 SyncToMin

SyncToMax:較小的影像會以虛擬像素 (dummy pixels) 進行填充。

模擬中的 SyncToMax

使用 InsertLine 和 InsertImage 運算子進行同步#

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

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

使用 InsertLine 進行同步

資訊

InsertLine 和 InsertImage 經常與 CONST 運算子一起使用。在這種情況下, CONST 指定影像或行是否包含在輸出串流中。資料會持續處理,但 CONST 決定它是顯示在輸出串流中還是內部丟棄(即發送到內部垃圾路徑)。

InsertImage 透過插入來自多個來源的影像來組合影像序列。可用於將來自兩台相機的影像多工處理成一個輸出序列。

使用 InsertImage 進行同步

這兩個運算子 (operator) 都接受非同步輸入。如果在無法停止的來源上使用這些運算子,請在其前方放置足夠大小的緩衝區 (buffers) 以避免死結 (deadlock)。另請參閱運算子參考手冊 (Operator Reference) 中的 InsertLine 以及運算子參考手冊 (Operator Reference) 中的 InsertImage。

使用 SourceSelector 運算子進行同步#

SourceSelector 在多個影像來源之間進行選擇,例如兩台相機。它在非同步來源之間切換,同時保持傳入影像的完整性。

只有選定的輸入會轉發到輸出;所有其他輸入都會被丟棄。如果在影像仍在輸入端傳輸時發生切換,則會在新的來源生效之前完成傳輸。

請使用 SelectSource 參數來控制執行階段中的活動來源。

運算子會在切換到另一個輸入之前完成目前的影格。設定 InfiniteSource 設定為 ENABLED 當相機提供輸入時。設定為 DISABLED 當輸入來自緩衝的、可停止的串流時。

使用 SourceSelector 進行同步

Basler 建議您使用 IF 或 CASE 而不是 SourceSelector 當所有輸入都來自同一個 M-type 模組時。這些運算子使用的資源較少。例如,請參閱以下設計,其中包含 CASE operator 輸出 link 上的 Bit Width:

使用 CASE 代替 SourceSelector

另請參閱運算子參考手冊 (Operator Reference) 中的 SourceSelector。

避免同步#

由於用於同步和緩衝的運算子會消耗大量 FPGA 資源,因此請盡可能避免同步。在許多情況下,這可以透過套用替代設計技術來實現。此類技術可能包括在所需的 M 型運算子之前合併資料,並在之後拆分資料。以下螢幕截圖顯示了類似工作流程的兩種實作方式,一次使用 MergePixel 和 ADD,另一次使用 SYNC:

避免同步

疑難排解:死結 (Deadlock)#

最常見且最困難的同步錯誤之一就是死結 (deadlock)。

當兩個來源直接同步時(例如透過使用 SYNC 運算子且沒有任何緩衝),就會發生死結。在這種情況下,每個來源都在等待對方:A 等待 B,B 等待 A。因此,不會傳輸任何資料。

下圖顯示了下方路徑上的分支模組,該模組接收到停止訊號,因此其輸入不再接受資料。結果,上方路徑也停止接收資料,整個管線停擺:

死結

死結在模擬中通常是看不見的,系統在模擬中可能看起來正常運作。然而,在硬體上,它們通常會導致沒有輸出。在這種情況下,硬體 Applet 會凍結、停止向 PC 傳輸資料,並最終導致 DMA 逾時。

資訊

死結很難偵測,因為它們通常在模擬中無法被看見。若要識別可能的死結,請使用執行階段工具 (runtime tools)(例如 microDisplay X)來監控硬體中的 FIFO 填充等級。保持在 100% 容量的 FIFO 表示可能存在死結或效能瓶頸。

死結的典型原因:

  • 缺少緩衝區
  • 不正確的同步

如何解決死結:

若要解決死結,請插入基於 FIFO 的緩衝,例如 ImageBuffer 或 ImageFifo運算子之前放置一個記憶體運算子,例如 SYNC 運算子。這允許一個來源稍微超前並防止相互等待狀況:

已解決死結

使用 DRC 驗證您的設計#

在連接會合的分支之後,執行Analysis → Design Rules Check Level 1。Level 1 會回報同步違規,並以紫色標示受影響的連接 (links)。

Design Rules Check Level 2 會執行擴充檢查並估算 FPGA 資源。在建置 (build) 之前,請先修正來自 Level 1 的形式錯誤。

請閱讀 DRC log 以及反白顯示的模組與連結。如需完整的工作流程,請參閱 From Empty Design to Running Applet 教學主題。