在VisualApplets 中建立的任何圖,皆為運算子實例(模組)所組成的網路。它可能由多個子網路組合而成。
與其他程式語言一樣,您在VisualApplets 中建立的圖表須遵循一套規則,其中包含允許、 不允許及受限的結構。 以下各節將說明模組連接的基本規則。
首先,讓我們來看看您正在使用的各種運算子類型。
有關運算子類型與同步的實務指引,請參閱 「運算子類型與同步」教學主題。
在VisualApplets 中,共有三種 種類 運算子:
| 通用型「O」型(圓形): |
|
|
|
| 較複雜的「M」型(方形): |
|
在較舊版本的 VisualApplets 以及文件中的某些範例 中,橢圓形: |
|
| 特殊型號「P」(方形): |
|
在較舊版本的 VisualApplets 以及文件中的某些範例 中,橢圓形: |
|
表 4. 運算子類型
您可以根據運算子的形狀,判斷它屬於通用的「O」型,還是屬於較複雜的「M」型或「P」型之一。 (有關特定運算子類型的資訊,請參閱《運算子參考》中該運算子的說明文件。)
O 型運算子的工作原理相當簡單。因此,
-
O 型運算子不會改變輸入與輸出之間的像素/資料數量。所有 輸入連結的輸入像素/資料數量,均等於輸出像素/資料的數量, 也就是說,對於每個輸入值,該運算子都會輸出一個值。
-
O 型運算子可能會在輸入與輸出之間產生延遲。然而,在延遲 平衡過程中,系統會自動補償此延遲。
-
O 型操作器可依需求串聯或並聯。
M 型運算子的功能較為複雜:
-
它們可以變更輸入與輸出之間的像素數/資料量。
-
這可能會延遲產出。
-
連結 M 型運算子時,必須留意連結規則以及被連結運算子的功能。
-
M 型運算子可能會阻擋輸入。
-
圖中每個來源運算子(例如 CameraGrayAreaBase)皆為 M 型運算子。
-
圖中每個最終目的地運算子(例如 DmaToPC)皆為 M 型運算子。
P 型運算子與 M 型運算子相似,但
-
P 型運算子不會降低頻寬。(有關此問題的更多資訊,請參閱「無限來源/連接攝影機」。)
-
P 型運算子所產生的資料量不會超過輸入所提供的資料量。
在下文中,凡是針對 M 型運算子所定義的所有規則,若未特別提及 P 型運算子的例外情況, 則同樣適用於 P 型運算子。
O 型網路是由 O 型模組組合而成的。 在 O 型網路中,模組既可串聯,也可並聯。 O型網路的起點與終點必須分別由M型或P型模組組成。 根據此定義,可確立一項重要規則:
![]() |
O 型網路規則 |
|---|---|
|
在 O 型網路中,無論其結構多麼複雜,每個 O 型模組都必須由同一個 M 型或 P 型模組提供訊號來源。 它可透過其他 O 型模組,甚至 O 型(子)網路,連接至此訊號來源。 (請注意,此規則不適用於訊號鏈路。) |
下圖顯示了一個包含模組並聯與串聯連接的 O 型網路。 如您所見,所有 O 型模組均由同一個 M 型模組(M_source)供電。
相較之下,下一幅圖所示的 O 型網路違反了 O 型網路規則,因為ADD 模組的源極由不同的 M 型 模組(M_source_0和M_source_1)提供。
VisualApplets (版本 2.2 及以上) 會在設計圖中直接且可靠地標示出任何同步規則 遭違反的情況。 相關的連結會以紫色標示。 這些連結會從接收未正確同步資料的運算子,一直標示回對應的 M 運算子 來源。
DRC 1 和 DRC 2 會顯示相應的警告。
例如,針對上述設計,DRC 1 會產生以下警告:

![]() |
例外情況:訊號連結 |
|---|---|
|
O 型網路規則不適用於傳輸訊號鏈路的 O 型運算子(請參閱「訊號鏈路的特殊規則」)。 |
任何包含 M 型模組的網路,若該網路中的 M 型模組不僅作為來源與目的地, 更在中間用於影像處理,則稱為 M 型網路。 在 M 型網路中,M 型模組既可並聯,亦可串聯。 M 型模組亦可不受限制地進行分支連接。 M 型網路可能變得相當複雜,因為 M 型模組的並聯連接可能需要同步影像 尺寸以及時序。 (請注意:M 型模組可以改變輸入與輸出之間的像素/資料數量;它們也可能延遲輸出。)
下圖展示了一個非常簡單的 M 型網路範例。 此圖中的 M 型模組僅以串聯或分支方式連接。 由於圖中唯一的 O 型網路由同一個 M 型模組(ImageBuffer)供電, 因此此圖符合我們迄今所知的所有圖示規則:
在大多數情況下,M 型網路要複雜得多。 若與上述範例不同,M 型模組以並聯方式連接 (即匯合路徑由不同的 M 型來源供電), 則必須同步時序與影像尺寸。 這可透過 M 型運算子使用多個輸入來實現。
若要合併來自不同 M 型源的網路,必須使用具有多個輸入的 M 型運算子。 (無法使用具有多個輸入的 O 型運算子,因為這將違反 上述所述的 O 型網路規則。) 但在深入探討同步機制之前,讓我們先概略地了解具有多個輸入的 M 型運算子。
具有多個輸入的 M 型運算子可以有兩類輸入:
-
同步輸入
-
非同步輸入
同步輸入與同步輸入群組
若模組的某些輸入為同步輸入,則這些同步輸入共同構成一個同步輸入群組。 因此,同步輸入群組即是一組同步輸入。 一個同步輸入群組的輸入,必須始終由同一個 M 型源透過任意的 O 型運算子網路 提供。 一個 M 型運算子可以擁有任意數量的同步輸入群組。
在下圖中,您可以看到 M 型運算子搭配同步輸入群組的使用範例。 RemoveImage運算子的兩個輸入皆由同一個 M 型運算子(ImageBuffer)提供。 這兩個輸入共同構成同步輸入群組。 RemoveImage運算子不允許在其輸入埠使用不同的 M 型來源。
非同步輸入
非同步輸入並非同步的。 它們可透過由 O 型運算子組成的任意網路,由不同的 M 型運算子提供。 此外,某些具有多個輸入的 M 型運算子,實際上必須由不同的 M 型運算子提供。 具有多個輸入的 M 型運算子是否必須由不同的 M 型運算子提供輸入,取決於 該運算子本身的特性。 您可在《運算子參考》中查閱所有運算子的詳細資訊。 一個 M 型運算子可以擁有任意數量的非同步輸入。
以下螢幕截圖展示了一個具有兩個非同步輸入的 M 型運算子的典型範例。 該 SYNC 模組的兩個輸入均由不同的 M 型源供電,即DRAM0和DRAM1。
SYNC 模組之後接一個MergePixel運算子。 若未在兩者之間插入 SYNC 運算子,則無法使用此運算子來合併這兩個 M 型光源。
![]() |
M 型操作員輸入 |
|---|---|
|
M 型模組的輸入端可由不同的 M 型電源供電。 然而,同步輸入群的輸入必須由同一個 M 型源,透過任意由 O 型運算子組成的網路 提供。 |
每個具有多個輸入的 M 型運算子的文件,都對該運算子可能或必需的輸入 進行了非常詳盡的說明。 如需所有運算子的完整說明,請參閱《運算子參考》。
對於 O 型網路,VisualApplets 會自動執行時間同步。
對於 M 型網路,同步作業必須由 M 型營運商負責執行。
如果時序同步設計不當,
-
將會發生所謂的「死鎖」狀況,
-
頻寬不足,或
-
資料將會遺失。
![]() |
確保時間同步正確 |
|---|---|
|
由於時間同步取決於您在VisualApplets 中實作的演算法行為,因此您必須 確保您圖表中的時間同步是正確的。 |
在以下範例中,我們將更深入地探討時序同步。
-
獨立來源的同步
讓我們來看看圖 59「獨立來源的同步」中所示的一個簡單的雙鏡頭拼接範例。 在此範例中,使用兩台攝影機作為來源。 ImageBuffer運算子將負責緩衝資料。 最後,M 型運算子InsertLine會將兩台攝影機的影像行多工匯集至單一輸出鏈路。 此運算子會合併這兩條並行鏈路。
試想一下,如果這兩台攝影機無法同步,會發生什麼情況。 假設其中一台攝影機的幀率高於另一台。 InsertLine運算子會嚴格地進行行多工處理,也就是說,會依序使用各輸入訊號。 由於幀率不同,其中一個 DRAM 緩衝區將需要實際緩衝資料。其填滿程度將 持續增加。 一旦發生溢出狀況,便無法再緩衝資料,資料將會遺失。
![[重要]](../common/images/admon/important.png)
確保資料傳輸速率一致 因此,若要將非同步串流合併在一起,請確保其線速率/幀率/像素速率相等,且能夠 進行同步。
-
來自同一來源的資料同步
某些 M 型運算子會在輸出結果之前產生一段延遲。 一個顯著的例子是運算子 FIRkernelNxM ,該運算子即用於我們將在以下圖示中探討的流程圖中。 此運算子會輸出一個像素及其周邊鄰近像素,以形成一個核。 為了輸出這些鄰近像素,該運算子必須等待直至這些(所需的鄰近像素) 在輸入端準備就緒。 它會將中間結果儲存起來。 在我們的範例中,FIRkernelNxM 運算子必須等到有四條完整的影像行被送入 該運算子後,才能輸出首批結果。 因此,在目前的配置下,該運算子會產生四條影像行的延遲。
讓我們來仔細看看這個例子。
前置條件
首批像素由相機透過緩衝區傳送至分支。 在此處,資料會被複製,並轉發至SYNC和FIRkernelNxM模組。 如前所述,FIRkernelNxM存在四行的延遲,因此無法立即輸出首批像素:
死鎖
SYNC 運算子試圖同步兩個輸入。 由於第二個輸入沒有傳來任何資料,因此它會在第一個輸入產生一個 STOP 訊號。 此 STOP 訊號會沿著處理管線向後傳播,直至緩衝區。 此時,我們面臨死鎖狀況: 核心運算子需要更多資料才能輸出資料,但由於 SYNC 阻斷了所有後續輸入,因此沒有新的資料可供使用。
解決死鎖問題
為了解決此死鎖,我們必須在上層路徑中加入一個緩衝區,以便補償核心運算子的延遲, 如下所示:
避免死鎖
最佳解決方案是完全避免同步。這通常是可行的。 在下方的解決方案範例中,圖中僅包含一個由 M 型運算子組成的串列管線,因此, 在匯流處無需進行同步。
M 型網路中的另一項重要現象,在於某個運算子的頻寬會減少,同時 此限制可能會向後傳播至模組網路中。 下圖展示了一個會產生頻寬限制的示意圖。
在此圖中,ModuloCount與RemoveLine運算子的組合將刪除每兩行中的一行。 正如我們在「Applet 的頻寬」中所知,最大頻寬取決於所使用的並行度。 經過RemoveLine運算子處理後,所需頻寬已減少一半。 因此,我們可以透過PARALLELdn運算子(「並行度降低」)將並行度降低一半。 然而,這也會使上層路徑中每隔一行所需的頻寬減少一半。
當在RemoveLine運算子處刪除一行時,不會有任何像素被傳入PARALLELdn模組。 圖表輸入端所提供的完整並行處理能力,可同時應用於兩條路徑中。 相較之下,當RemoveLine運算子未刪除某條線時,當前線的像素 會被傳送至PARALLELdn 的輸入端。 此時PARALLELdn會將並行度降低兩倍,也就是說,相較於輸入,輸出一個值所需的時鐘週期數會增加一倍。 因此,PARALLELdn運算子將每隔一個時鐘週期阻塞其輸入。 由於第一個Branch 運算子與PARALLELdn運算子之間未使用緩衝器,此阻塞訊號會 向後傳播至管線中。 因此,上層路徑也會每隔一個時鐘週期遭到阻塞。
解決此問題的方法是在PARALLELdn運算子之前新增一個 FIFO,該 FIFO 至少能緩衝一行資料, 藉此平衡峰值與閒置時期。 下圖顯示了此解決方案:
P 型運算子與 M 型運算子相似,唯有一點不同: 它們無法主動阻擋輸入。
然而,當處理管線中位於更上游的模組阻塞其輸入時, 該輸入阻塞會沿著管線向後傳播。若 P 型運算子位於管線更下游處,該 P 型 運算子的輸入埠也會被阻塞(被動地)。P 型運算子 會將阻塞資訊向後傳播至處理管線中緊接其後的模組。
範例: 相較於資料輸入到運算子所需的時間,M 型運算子PARALLELdn輸出結果所需的時間較長。 因此,它會不時阻塞輸入。 相較之下,P 型運算子PARALLELup的輸出頻寬總是高於輸入頻寬。 當將無限來源與 P 型及 M 型運算子連接時,此行為至關重要。 關於無限來源的詳細說明,將於下文「無限來源/連接攝影機」中闡述。
無限來源是指無法被VisualApplets 流量控制所中斷的操作元。 一個例子就是攝影機運算子。 這些運算子透過其輸入鏈路接收來自攝影機的資料,並透過其輸出鏈路將這些資料轉發至 圖表中的下一個模組。 由於攝影機運算子內部沒有緩衝區,且無法指示攝影機停止資料傳輸, 因此這些運算子屬於 無限來源。
有關可中斷與不可中斷資料流的實務指引,請參閱 《可中斷與不可中斷資料流教學指南》一文。
無限源僅能連接至可接受無限源的 M 型運算子。 個別 M 型運算子是否可連接無限源,詳見該運算子的相關文件 (參見《運算子參考》)。 若將無限源連接至無法接受無限源的 M 型運算子,DRC 第 2 級將 產生錯誤:
所有 P 型和 O 型運算子皆可連接至無限資料源。 無限資料源的資訊將透過運算子傳遞,直到管線中的某個運算子將無限 資料源的資料流轉換為可控的資料流為止。 通常,這些轉換運算子是緩衝器。 緩衝運算子能夠在其輸出端使用流量控制,並將輸入資料流進行緩衝,而無需阻塞 輸入。
因此,如果我們將前一個範例中的運算子對調,DRC 第 2 級就不會產生錯誤:
某些轉換運算子的行為可透過設定是否接受無限來源來調整。 這些運算子包含一個名為「InfiniteSource」的參數,可將其設定為「Enabled」或「Disabled」。
未連接至無限電源的轉換運算子 必須 必須設定為「停用」。
![]() |
警告 |
|---|---|
|
若某個模組的InfiniteSource參數設定為「啟用」,則該模組必須連接至無限電源。 未連接至無限電源的轉換運算子,必須設定為「停用」。 |
![]() |
提示 |
|---|---|
|
若不確定,請始終將參數設定為「停用」,並在完成 DRC 第 2 級檢查後,再修改出現錯誤的模組。 |
有關模組參數設定的詳細說明,請參閱「模組屬性」。
訊號連結傳輸單位元訊號資料,該資料在每個時脈週期皆為有效。 對於具有訊號傳輸輸入連結的模組,其連結規則與迄今所述的連結規則 有兩點不同:
-
所有具備訊號鏈路輸入的 O 型與 M 型模組,均可由不同的 M 型電源供電。
-
具有訊號鏈接輸入的模組,始終可連接至無限源。
有關訊號連結的更多資訊,請參閱《影像通訊協定、影像尺寸與資料結構》。
在本章中,您已了解連結的規則。 在實作VisualApplets 應用程式時,連結的規則至關重要。
O 型網路的起點與終點必須皆為 M 型模組。 每個 O 型模組必須透過由其他 O 型模組組成的任意網路,由同一個 M 型或 P 型模組提供源電流。 不同 M 型源電流的匯合,僅能由 M 型模組執行。
M型網路既可依序串聯,亦可任意分支。 在模組中合併不同的 M 型訊源時,需進行時序同步與影像尺寸同步。 具有多個輸入的 M 型模組可設有同步輸入群組。 同步輸入群組必須透過任一 O 型網路,由同一個 M 型訊源供訊。
時序同步可將存在時間延遲的不同來源進行同步。 時序同步需要了解使用者實作的細節。 若時序同步處理不當,將導致死鎖或緩衝區溢位。
無限源無法透過整合式流量控制進行控制。 僅有獲准連接至無限源的 M 型操作元件,方可連接至無限源。
對於具有訊號連結輸入的模組,一般同步規則依然適用,但有兩項修改: 訊號連結輸入(M 型 及 O 型模組)可由不同的 M 型源供電。 具有訊號連結輸入的模組,始終可連接至無限源。
![]() |
警告 |
|---|---|
|
VisualApplets 無法偵測邏輯同步錯誤,因為這些錯誤取決於使用者專案的實作方式。 請仔細閱讀各 M 型運算子的文件,以了解其在時序與延遲方面的行為。 |







![[提示]](../common/images/admon/tip.png)






![[警告]](../common/images/admon/warning.png)











上一頁

