連接規則

在VisualApplets 中建立的任何圖,皆為運算子實例(模組)所組成的網路。它可能由多個子網路組合而成。

與其他程式語言一樣,您在VisualApplets 中建立的圖表須遵循一套規則,其中包含允許、 不允許及受限的結構。 以下各節將說明模組連接的基本規則。

Operator 類型

首先,讓我們來看看您正在使用的各種運算子類型。

有關運算子類型與同步的實務指引,請參閱 「運算子類型與同步」教學主題。

在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 型運算子所產生的資料量不會超過輸入所提供的資料量。

  • P 型運算子絕不會主動阻塞輸入。(有關 P型運算子阻塞行為的詳細資訊,請參閱「P 型運算子」。)

在下文中,凡是針對 M 型運算子所定義的所有規則,若未特別提及 P 型運算子的例外情況, 則同樣適用於 P 型運算子。

O-Type 網路

O 型網路是由 O 型模組組合而成的。 在 O 型網路中,模組既可串聯,也可並聯。 O型網路的起點與終點必須分別由M型或P型模組組成。 根據此定義,可確立一項重要規則:

[提示] O 型網路規則

在 O 型網路中,無論其結構多麼複雜,每個 O 型模組都必須由同一個 M 型或 P 型模組提供訊號來源。 它可透過其他 O 型模組,甚至 O 型(子)網路,連接至此訊號來源。 (請注意,此規則不適用於訊號鏈路。)

下圖顯示了一個包含模組並聯與串聯連接的 O 型網路。 如您所見,所有 O 型模組均由同一個 M 型模組(M_source)供電。

O型網路

圖 53. O 型網路


相較之下,下一幅圖所示的 O 型網路違反了 O 型網路規則,因為ADD 模組的源極由不同的 M 型 模組(M_source_0和M_source_1)提供。

O型網路故障

圖 54. 故障的 O 型網路


VisualApplets (版本 2.2 及以上) 會在設計圖中直接且可靠地標示出任何同步規則 遭違反的情況。 相關的連結會以紫色標示。 這些連結會從接收未正確同步資料的運算子,一直標示回對應的 M 運算子 來源。

在VisualApplets 2.2 及更高版本中顯示未正確同步的資料流

圖 55. 在VisualApplets 2.2 及更高版本中顯示未正確同步的資料流


DRC 1 和 DRC 2 會顯示相應的警告。

例如,針對上述設計,DRC 1 會產生以下警告:

[重要] 例外情況:訊號連結

O 型網路規則不適用於傳輸訊號鏈路的 O 型運算子(請參閱「訊號鏈路的特殊規則」)。

M-Type 網路

任何包含 M 型模組的網路,若該網路中的 M 型模組不僅作為來源與目的地, 更在中間用於影像處理,則稱為 M 型網路。 在 M 型網路中,M 型模組既可並聯,亦可串聯。 M 型模組亦可不受限制地進行分支連接。 M 型網路可能變得相當複雜,因為 M 型模組的並聯連接可能需要同步影像 尺寸以及時序。 (請注意:M 型模組可以改變輸入與輸出之間的像素/資料數量;它們也可能延遲輸出。)

下圖展示了一個非常簡單的 M 型網路範例。 此圖中的 M 型模組僅以串聯或分支方式連接。 由於圖中唯一的 O 型網路由同一個 M 型模組(ImageBuffer)供電, 因此此圖符合我們迄今所知的所有圖示規則:

M型與O型網路

圖 56. M 型與 O 型網路


在大多數情況下,M 型網路要複雜得多。 若與上述範例不同,M 型模組以並聯方式連接 (即匯合路徑由不同的 M 型來源供電), 則必須同步時序與影像尺寸。 這可透過 M 型運算子使用多個輸入來實現。

具有多個輸入的 M-type Operators

若要合併來自不同 M 型源的網路,必須使用具有多個輸入的 M 型運算子。 (無法使用具有多個輸入的 O 型運算子,因為這將違反 上述所述的 O 型網路規則。) 但在深入探討同步機制之前,讓我們先概略地了解具有多個輸入的 M 型運算子。

具有多個輸入的 M 型運算子可以有兩類輸入:

  • 同步輸入

  • 非同步輸入

同步輸入與同步輸入群組

若模組的某些輸入為同步輸入,則這些同步輸入共同構成一個同步輸入群組。 因此,同步輸入群組即是一組同步輸入。 一個同步輸入群組的輸入,必須始終由同一個 M 型源透過任意的 O 型運算子網路 提供。 一個 M 型運算子可以擁有任意數量的同步輸入群組。

在下圖中,您可以看到 M 型運算子搭配同步輸入群組的使用範例。 RemoveImage運算子的兩個輸入皆由同一個 M 型運算子(ImageBuffer)提供。 這兩個輸入共同構成同步輸入群組。 RemoveImage運算子不允許在其輸入埠使用不同的 M 型來源。

具有一個同步輸入群組的 M 型運算子

圖 57. 具有一個同步輸入群的 M 型運算子


非同步輸入

非同步輸入並非同步的。 它們可透過由 O 型運算子組成的任意網路,由不同的 M 型運算子提供。 此外,某些具有多個輸入的 M 型運算子,實際上必須由不同的 M 型運算子提供。 具有多個輸入的 M 型運算子是否必須由不同的 M 型運算子提供輸入,取決於 該運算子本身的特性。 您可在《運算子參考》中查閱所有運算子的詳細資訊。 一個 M 型運算子可以擁有任意數量的非同步輸入。

以下螢幕截圖展示了一個具有兩個非同步輸入的 M 型運算子的典型範例。 該 SYNC 模組的兩個輸入均由不同的 M 型源供電,即DRAM0和DRAM1。

具有非同步輸入的 M 型運算子

圖 58. 具有非同步輸入的 M 型運算子


SYNC 模組之後接一個MergePixel運算子。 若未在兩者之間插入 SYNC 運算子,則無法使用此運算子來合併這兩個 M 型光源。

[重要] M 型操作員輸入

M 型模組的輸入端可由不同的 M 型電源供電。

然而,同步輸入群的輸入必須由同一個 M 型源,透過任意由 O 型運算子組成的網路 提供。

每個具有多個輸入的 M 型運算子的文件,都對該運算子可能或必需的輸入 進行了非常詳盡的說明。 如需所有運算子的完整說明,請參閱《運算子參考》。

不同影像尺寸的同步化

M 型運算子可在其輸入端同步不同的影像維度。 一個重要的例子是運算子 SYNC。 有關此運算子的詳細說明,請參閱《運算子參考手冊》。

時序同步

對於 O 型網路,VisualApplets 會自動執行時間同步。

對於 M 型網路,同步作業必須由 M 型營運商負責執行。

如果時序同步設計不當,

  • 將會發生所謂的「死鎖」狀況,

  • 頻寬不足,或

  • 資料將會遺失。

[警告] 確保時間同步正確

由於時間同步取決於您在VisualApplets 中實作的演算法行為,因此您必須 確保您圖表中的時間同步是正確的。

在以下範例中,我們將更深入地探討時序同步。

  1. 獨立來源的同步

    讓我們來看看圖 59「獨立來源的同步」中所示的一個簡單的雙鏡頭拼接範例。 在此範例中,使用兩台攝影機作為來源。 ImageBuffer運算子將負責緩衝資料。 最後,M 型運算子InsertLine會將兩台攝影機的影像行多工匯集至單一輸出鏈路。 此運算子會合併這兩條並行鏈路。

    獨立來源的同步

    圖 59. 獨立電源的同步


    試想一下,如果這兩台攝影機無法同步,會發生什麼情況。 假設其中一台攝影機的幀率高於另一台。 InsertLine運算子會嚴格地進行行多工處理,也就是說,會依序使用各輸入訊號。 由於幀率不同,其中一個 DRAM 緩衝區將需要實際緩衝資料。其填滿程度將 持續增加。 一旦發生溢出狀況,便無法再緩衝資料,資料將會遺失。

    [重要] 確保資料傳輸速率一致

    因此,若要將非同步串流合併在一起,請確保其線速率/幀率/像素速率相等,且能夠 進行同步。

  2. 來自同一來源的資料同步

    某些 M 型運算子會在輸出結果之前產生一段延遲。 一個顯著的例子是運算子 FIRkernelNxM ,該運算子即用於我們將在以下圖示中探討的流程圖中。 此運算子會輸出一個像素及其周邊鄰近像素,以形成一個核。 為了輸出這些鄰近像素,該運算子必須等待直至這些(所需的鄰近像素) 在輸入端準備就緒。 它會將中間結果儲存起來。 在我們的範例中,FIRkernelNxM 運算子必須等到有四條完整的影像行被送入 該運算子後,才能輸出首批結果。 因此,在目前的配置下,該運算子會產生四條影像行的延遲。

    讓我們來仔細看看這個例子。

    前置條件

    首批像素由相機透過緩衝區傳送至分支。 在此處,資料會被複製,並轉發至SYNC和FIRkernelNxM模組。 如前所述,FIRkernelNxM存在四行的延遲,因此無法立即輸出首批像素:

    SYNC 中的死鎖,圖 a

    圖 60. SYNC 處的死鎖,圖 a


    死鎖

    SYNC 運算子試圖同步兩個輸入。 由於第二個輸入沒有傳來任何資料,因此它會在第一個輸入產生一個 STOP 訊號。 此 STOP 訊號會沿著處理管線向後傳播,直至緩衝區。 此時,我們面臨死鎖狀況: 核心運算子需要更多資料才能輸出資料,但由於 SYNC 阻斷了所有後續輸入,因此沒有新的資料可供使用。

    SYNC 中的死鎖,圖 b

    圖 61. SYNC 處的死鎖,圖 b


    解決死鎖問題

    為了解決此死鎖,我們必須在上層路徑中加入一個緩衝區,以便補償核心運算子的延遲, 如下所示:

    已解決死鎖問題

    圖 62. 固定死鎖


    避免死鎖

    最佳解決方案是完全避免同步。這通常是可行的。 在下方的解決方案範例中,圖中僅包含一個由 M 型運算子組成的串列管線,因此, 在匯流處無需進行同步。

    成功避免死鎖

    圖 63. 避免死鎖


頻寬瓶頸

M 型網路中的另一項重要現象,在於某個運算子的頻寬會減少,同時 此限制可能會向後傳播至模組網路中。 下圖展示了一個會產生頻寬限制的示意圖。

頻寬限制

圖 64. 頻寬限制


在此圖中,ModuloCount與RemoveLine運算子的組合將刪除每兩行中的一行。 正如我們在「Applet 的頻寬」中所知,最大頻寬取決於所使用的並行度。 經過RemoveLine運算子處理後,所需頻寬已減少一半。 因此,我們可以透過PARALLELdn運算子(「並行度降低」)將並行度降低一半。 然而,這也會使上層路徑中每隔一行所需的頻寬減少一半。

當在RemoveLine運算子處刪除一行時,不會有任何像素被傳入PARALLELdn模組。 圖表輸入端所提供的完整並行處理能力,可同時應用於兩條路徑中。 相較之下,當RemoveLine運算子未刪除某條線時,當前線的像素 會被傳送至PARALLELdn 的輸入端。 此時PARALLELdn會將並行度降低兩倍,也就是說,相較於輸入,輸出一個值所需的時鐘週期數會增加一倍。 因此,PARALLELdn運算子將每隔一個時鐘週期阻塞其輸入。 由於第一個Branch 運算子與PARALLELdn運算子之間未使用緩衝器,此阻塞訊號會 向後傳播至管線中。 因此,上層路徑也會每隔一個時鐘週期遭到阻塞。

解決此問題的方法是在PARALLELdn運算子之前新增一個 FIFO,該 FIFO 至少能緩衝一行資料, 藉此平衡峰值與閒置時期。 下圖顯示了此解決方案:

頻寬限制補償

圖 65. 頻寬限制補償


P-Type Operators

P 型運算子與 M 型運算子相似,唯有一點不同: 它們無法主動阻擋輸入。

然而,當處理管線中位於更上游的模組阻塞其輸入時, 該輸入阻塞會沿著管線向後傳播。若 P 型運算子位於管線更下游處,該 P 型 運算子的輸入埠也會被阻塞(被動地)。P 型運算子 會將阻塞資訊向後傳播至處理管線中緊接其後的模組。

範例: 相較於資料輸入到運算子所需的時間,M 型運算子PARALLELdn輸出結果所需的時間較長。 因此,它會不時阻塞輸入。 相較之下,P 型運算子PARALLELup的輸出頻寬總是高於輸入頻寬。 當將無限來源與 P 型及 M 型運算子連接時,此行為至關重要。 關於無限來源的詳細說明,將於下文「無限來源/連接攝影機」中闡述。

Infinite Sources / Connecting Cameras

無限來源是指無法被VisualApplets 流量控制所中斷的操作元。 一個例子就是攝影機運算子。 這些運算子透過其輸入鏈路接收來自攝影機的資料,並透過其輸出鏈路將這些資料轉發至 圖表中的下一個模組。 由於攝影機運算子內部沒有緩衝區,且無法指示攝影機停止資料傳輸, 因此這些運算子屬於 無限來源。

有關可中斷與不可中斷資料流的實務指引,請參閱 《可中斷與不可中斷資料流教學指南》一文。

無限源僅能連接至可接受無限源的 M 型運算子。 個別 M 型運算子是否可連接無限源,詳見該運算子的相關文件 (參見《運算子參考》)。 若將無限源連接至無法接受無限源的 M 型運算子,DRC 第 2 級將 產生錯誤:

Infinite Source 連線錯誤

圖 66. 無限源連接錯誤


所有 P 型和 O 型運算子皆可連接至無限資料源。 無限資料源的資訊將透過運算子傳遞,直到管線中的某個運算子將無限 資料源的資料流轉換為可控的資料流為止。 通常,這些轉換運算子是緩衝器。 緩衝運算子能夠在其輸出端使用流量控制,並將輸入資料流進行緩衝,而無需阻塞 輸入。

因此,如果我們將前一個範例中的運算子對調,DRC 第 2 級就不會產生錯誤:

「無限源頭」連線正常

圖 67. 無限源連接正常


某些轉換運算子的行為可透過設定是否接受無限來源來調整。 這些運算子包含一個名為「InfiniteSource」的參數,可將其設定為「Enabled」或「Disabled」。

未連接至無限電源的轉換運算子 必須 必須設定為「停用」。

連接至非無限源的無限源轉換模組(Buffer1)

圖 68. 連接至非無限源的無限源轉換模組(Buffer1)


[警告] 警告

若某個模組的InfiniteSource參數設定為「啟用」,則該模組必須連接至無限電源。

未連接至無限電源的轉換運算子,必須設定為「停用」。

[提示] 提示

若不確定,請始終將參數設定為「停用」,並在完成 DRC 第 2 級檢查後,再修改出現錯誤的模組。

有關模組參數設定的詳細說明,請參閱「模組屬性」。

訊號連接的不同規則

訊號連結傳輸單位元訊號資料,該資料在每個時脈週期皆為有效。 對於具有訊號傳輸輸入連結的模組,其連結規則與迄今所述的連結規則 有兩點不同:

  • 所有具備訊號鏈路輸入的 O 型與 M 型模組,均可由不同的 M 型電源供電。

  • 具有訊號鏈接輸入的模組,始終可連接至無限源。

具有訊號鏈路輸入的 O 型模組,其訊號由不同的 M 型模組提供

圖 69. 具有訊號鏈接輸入的 O 型模組,其電源由不同的 M 型模組提供


有關訊號連結的更多資訊,請參閱《影像通訊協定、影像尺寸與資料結構》。

摘要

在本章中,您已了解連結的規則。 在實作VisualApplets 應用程式時,連結的規則至關重要。

O 型網路的起點與終點必須皆為 M 型模組。 每個 O 型模組必須透過由其他 O 型模組組成的任意網路,由同一個 M 型或 P 型模組提供源電流。 不同 M 型源電流的匯合,僅能由 M 型模組執行。

M型網路既可依序串聯,亦可任意分支。 在模組中合併不同的 M 型訊源時,需進行時序同步與影像尺寸同步。 具有多個輸入的 M 型模組可設有同步輸入群組。 同步輸入群組必須透過任一 O 型網路,由同一個 M 型訊源供訊。

時序同步可將存在時間延遲的不同來源進行同步。 時序同步需要了解使用者實作的細節。 若時序同步處理不當,將導致死鎖或緩衝區溢位。

無限源無法透過整合式流量控制進行控制。 僅有獲准連接至無限源的 M 型操作元件,方可連接至無限源。

對於具有訊號連結輸入的模組,一般同步規則依然適用,但有兩項修改: 訊號連結輸入(M 型 及 O 型模組)可由不同的 M 型源供電。 具有訊號連結輸入的模組,始終可連接至無限源。

[警告] 警告

VisualApplets 無法偵測邏輯同步錯誤,因為這些錯誤取決於使用者專案的實作方式。 請仔細閱讀各 M 型運算子的文件,以了解其在時序與延遲方面的行為。