連線規則

在 VisualApplets 中建立的任何圖表都是運算子執行個體(模組)的網路。它可能會結合多個子網路。

如同其他程式語言,您在 VisualApplets 中建立的圖表也必須遵循一組規則,其中包含允許、不允許以及受限制的結構。 下列章節定義了連接模組的基本規則。

運算子類型

首先,讓我們來看看您將會操作的不同運算子類型。

如需關於運算子類型與同步處理的實用指導,請參閱 Operator Types and Synchronization 教學主題。

在 VisualApplets 中,您有三種 類型 的運算子:

通用類型 “O”(圓形):
較複雜的類型 “M”(正方形): 在舊版 VisualApplets 以及
說明文件中的某些範例中
為橢圓形:
特殊類型 “P”(正方形): 在舊版 VisualApplets 以及
說明文件中的某些範例中
為橢圓形:

表 4. 運算子類型


您可透過運算子的形狀看出它是屬於通用 “O” 類型,還是屬於較複雜的 “M” 或 “P” 類型。 (如需特定運算子類型的相關資訊,請參閱 Operator Reference 中的該運算子說明文件。)

O 型運算子的功能相當簡單。因此,

  • O 型運算子不會改變輸入與輸出之間的像素/資料數量。所有輸入連結的輸入像素/資料數量等於輸出像素/資料數量, 亦即針對每個輸入值,運算子都會輸出一個值。

  • O 型運算子可能會在輸入與輸出之間增加延遲。不過,此延遲會在延遲平衡期間自動補償。

  • O 型運算子可以依需求以串聯或並聯方式連結。

M 型運算子的功能較為複雜:

  • 它們可以改變輸入與輸出之間的像素/資料數量。

  • 它們可能會延遲輸出。

  • 連結 M 型運算子時,必須注意連結規則以及所連結運算子的功能。

  • M 型運算子可能會封鎖輸入。

  • 圖表中的每一個來源運算子(例如 CameraGrayAreaBase)皆為 M 型運算子。

  • 圖表中的每一個最終目的地運算子(例如 DmaToPC)皆為 M 型運算子。

P 型運算子類似於 M 型運算子,但是

  • P 型運算子不會降低頻寬。(如需此問題的詳細資訊,請參閱 'Infinite Sources / Connecting Cameras'。)

  • P 型運算子不會產生多於輸入端所給定的資料。

  • P-type 運算子絕不會主動阻擋輸入。(如需關於 P-type 運算子阻擋行為的詳細資訊,請參閱「P-Type 運算子」。)

在下列內容中,除非特別提及針對 P-type 運算子的例外情況,否則為 M-type 運算子定義的所有規則也適用於 P-type 運算子。

O 類型網路

O-type 網路是 O-type 模組的組合。 在 O-type 網路中,模組可以串聯或並聯方式組合。 O-type 網路始終以 M-type 或 P-type 模組作為開頭與結尾。 根據此定義,可以確立一項重要規則:

[提示] O-Type 網路規則

在 O-type 網路中,無論其複雜程度如何,每個 O-type 模組都必須由相同的 M-type 或 P-type 模組提供來源。 它可能透過其他 O-type 模組甚至 O-type(子)網路連接至此來源。 (請注意,此規則不適用於訊號連結。)

下圖顯示包含模組並聯與串聯連接的 O-type 網路。 如您所見,所有 O-type 模組均由相同的 M-type 模組(M_source)提供來源。

O-Type 網路

圖 53. O-Type 網路


相比之下,下一張圖顯示了一個違反 O-Type 網路規則的 O-type 網路,因為 ADD 模組是由不同的 M-type 模組(M_source_0 與 M_source_1)提供來源。

失敗的 O-Type 網路

圖 54. 失敗的 O-Type 網路


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

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

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


DRC 1 與 DRC 2 會顯示對應的警告。

例如,對於上述設計,DRC 1 會建立以下警告:

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

O-type 網路規則不適用於傳輸訊號連結的 O-type 運算子(請參閱「訊號連結的不同規則」)。

M 類型網路

任何包含 M-type 模組(不僅作為來源與目的地, 還包括為了影像處理目的而存在於中間)的模組網路,都稱為 M-type 網路。 在 M-type 網路中,M-type 模組可以並聯或串聯方式連結。 M-type 模組也可以進行無限制的分支。 M-type 網路可能會相當複雜,因為 M-type 模組的並聯連結可能會要求影像 尺寸同步以及時序同步。 (請記住:M-type 模組可以改變輸入與輸出之間的像素/資料數量;它們也可能會延遲輸出。)

下圖顯示 M-type 網路的一個非常簡單的範例。 此圖表中的 M-type 模組僅以串聯方式連接,或進行分支。 由於圖表中唯一的 O-type 網路是由相同的 M-type 模組(ImageBuffer)提供來源, 因此該圖表遵循我們迄今所知的所有圖表規則:

M-type 與 O-type 網路

圖 56. M-type 與 O-type 網路


在大多數情況下,M-type 網路要複雜得多。 如果與上述範例相反,M-type 模組是以並聯方式連結 (亦即合併的路徑由不同的 M-type 來源提供來源), 我們就必須同步時序與影像尺寸。 這由使用多個輸入的 M-type 運算子來完成。

具有多個輸入的 M 類型運算子

如果您想合併由不同 M-type 來源提供來源的網路,您必須使用具有多個輸入的 M-type 運算子。 (您不能使用具有多個輸入的 O-type 運算子,因為這會違反上述的 O-type 網路規則。) 但在深入探討同步之前,讓我們先概括了解具有多個輸入的 M-type 運算子。

具有多個輸入的 M-type 運算子可以有兩種輸入:

  • 同步輸入

  • 非同步輸入

同步輸入與同步輸入群組

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

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

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

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


非同步輸入

非同步輸入並不同步。 它們可能會透過 O 型運算子的任意網路由不同的 M 型運算子提供來源。 此外,某些具有多個輸入的 M 型運算子實際上必須由不同的 M 型運算子提供來源。 具有多個輸入的 M 型運算子是否必須由不同的 M 型運算子提供來源,取決於運算子本身的特性。 您可以在 Operator Reference 中找到關於所有運算子的詳細資訊。 一個 M 型運算子可以擁有任意數量的非同步輸入。

以下螢幕截圖顯示了具有兩個非同步輸入之 M 型運算子的典型範例。 SYNC 模組的兩個輸入分別由不同的 M 型來源(即 DRAM0 和 DRAM1)提供來源。

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

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


SYNC 模組後面接著一個 MergePixel 運算子。 如果中間沒有 SYNC 運算子,則無法使用此運算子來合併兩個 M 型來源。

[重要] M 型運算子輸入

M 型模組的輸入可以由不同的 M 型來源提供來源。

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

每個具有多個輸入之 M 型運算子的說明文件,都會詳細解釋該運算子可能或需要的輸入。 如需所有運算子的完整說明,請參閱 Operator Reference。

不同影像尺寸的同步

M 型運算子可以在其輸入端同步不同的影像尺寸。 其中一個重要的範例就是 SYNC 運算子。 請參閱 Operator Reference 以取得此運算子的詳細說明。

時序同步

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

對於 M 型網路,必須由 M 型運算子執行同步。

如果時序同步設計不正確,

  • 將會發生所謂的死結狀況 (deadlock-condition),

  • 頻寬不足,或者

  • 資料將會遺失。

[警告] 確保正確的時序同步

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

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

  1. 獨立來源的同步

    讓我們來看看 圖 59「獨立來源的同步」中所示的簡單雙相機拼接範例。 在此範例中,使用兩部相機作為來源。 ImageBuffer 運算子將會緩衝資料。 最後,M 類型運算子 InsertLine 會將兩個相機的行多工處理至一個輸出鏈結中。 此運算子會合併兩個平行的鏈結。

    獨立來源的同步

    圖 59:獨立來源的同步


    想像一下,如果兩部相機不同步會發生什麼事。 假設其中一部相機的影格速率高於另一部相機。 InsertLine 運算子將會嚴格進行行多工處理,亦即依序使用輸入。 由於影格速率不同,其中一個 DRAM 緩衝區實際需要緩衝資料。其 Fill 層級將會持續增加。 一旦發生溢位狀況,將無法再緩衝資料,且資料將會遺失。

    [重要] 確保相等的資料速率

    因此,如果將非同步串流合併在一起,請確保行速率/影格速率/像素速率相等且可以同步。

  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 運算子的組合將刪除每隔一行。 如我們從 'Bandwidth of an Applet' 中所知,最大頻寬取決於所使用的 Parallelism。 在 RemoveLine 運算子之後,所需的頻寬已減少了一半。 因此,我們可以使用 PARALLELdn(「Parallel down」)運算子將 Parallelism 減少一半。 然而,這也會使每隔一行的上方路徑頻寬減少一半。

當在 RemoveLine 運算子處刪除行時,不會有像素送入 PARALLELdn 模組。 圖表輸入端所提供的完整 Parallelism 可用於兩個路徑中。 相比之下,當 RemoveLine 運算子未移除行時,目前行的像素 會被轉發至 PARALLELdn 的輸入端。 PARALLELdn 現在會將 Parallelism 減少二,亦即與輸入相比,輸出一個值所需的時脈週期數加倍。 因此,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 流量控制停止的運算子。 相機運算子即為一例。 在其輸入連結上,這些運算子會接收來自相機的資料。在其輸出連結上,它們會將此資料轉發至 圖表中的後續模組。 由於相機運算子內沒有緩衝區,且它們無法告知相機停止傳輸, 因此這些運算子屬於 無限來源。

如需關於可停止與不可停止資料流的實用指南,請參閱 Stoppable and Non-Stoppable Data Streams 教學主題。

無限來源只能連接至接受無限來源的 M 型運算子。 個別 M 型運算子是否可以連接至無限來源,會在該運算子的各自說明文件中描述(請參閱 Operator Reference)。 如果將無限來源連接至不接受無限來源的 M 型運算子,DRC 層級 2 將會 產生錯誤:

無限來源連接錯誤

圖 66:無限來源連接錯誤


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

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

無限來源連接正常

圖 67:無限來源連接正常


某些轉換運算子的行為可以更改,以決定它們是否接受無限來源。 這些運算子包含一個名為 InfiniteSource 的參數,可以將其設定為 Enabled 或 Disabled。

未連接至無限來源的轉換運算子必須設定為 Disabled。

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

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


[警告] Warning

若對應模組的 InfiniteSource 參數設定為 Enabled,則該模組必須連線至無限來源。

未連線至無限來源的轉換運算子必須設定為 Disabled。

[提示] 提示

如果不確定,請一律將參數設定為 Disabled,並在通過 DRC 層級 2 檢查後變更失敗的模組。

如需模組參數化的詳細說明,請參閱 'Module Properties'。

信號連線的不同規則

訊號連線傳輸在每個時脈週期皆有效的單位元訊號資料。 具有訊號傳輸輸入連線的模組連線規則,與迄今所述的連線規則在兩個方面有所不同:

  • 所有具有訊號連線輸入的 O 型和 M 型模組皆可由不同的 M 型來源提供來源。

  • 具有訊號連線輸入的模組隨時可以連線至無限來源。

具有訊號連線輸入的 O 型模組,由不同的 M 型模組提供來源

圖 69. 具有訊號連線輸入的 O 型模組,由不同的 M 型模組提供來源


有關訊號連線的更多資訊,請參閱 'Image Protocols, Image Dimensions and Data Structure'。

總結

本章介紹了連線規則。 在實作 VisualApplets 應用程式時,連線規則至關重要。

O 型網路一律以 M 型模組作為開頭與結尾。 每個 O 型模組都必須透過其他 O 型模組的任意網路,由相同的 M 型或 P 型模組提供來源。 不同 M 型來源的合併只能由 M 型模組執行。

M 型網路可以任意進行串聯連線,也可以任意分支。 在模組中合併不同的 M 型來源需要時間同步化與影像尺寸同步化。 具有多個輸入的 M 型模組可以擁有同步輸入群組。 同步輸入群組必須透過任意 O 型網路,由相同的 M 型來源提供來源。

時間同步化將會同步化具有時間延遲的不同來源。 時間同步化需要了解使用者實作。 不良的時間同步化將會導致死結或緩衝區溢位。

無限來源無法由整合式流程控制進行控制。 只有允許連線至無限來源的 M 型運算子才可以連線至無限來源。

對於具有訊號連線輸入的模組,一般同步化規則適用,但有兩項修改: 訊號連線輸入(M 型與 O 型模組)可由不同的 M 型來源提供來源。 具有訊號連線輸入的模組隨時可以連線至無限來源。

[警告] Warning

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