多 DMA 通道設計

大多數 VisualApplets 應用程式都需要擷取相機影像、透過影像處理演算法處理影像,並將結果輸出至主機 PC。 除此之外,使用者還想監控原始監控影像。 因此我們需要兩個影像輸出: 原始監控影像以及演算法實作的處理結果。 接下來,我們將實作一個 VisualApplets 設計,以滿足以下規格:

  • 使用基礎組態模式下的 Camera Link 相機拍攝灰階影像
  • 最高解析度 = 1024 x 1024 像素 @ 8 位元/像素
  • 進行影像緩衝,並將每擷取的第 10 張影像轉發至主機 PC(用於監控)
  • 使用閾值處理對每個擷取的影像進行二值化,並將產生的影像輸出至主機 PC
  • 二值化輸出影像的格式必須為:0 = 黑色,white = 255 (8Bit/Pixel)

根據此規格,我們可以產生方塊圖。

具備監控功能的閾值二值化設計方塊圖

圖 206:具備監控功能的閾值二值化設計方塊圖


如我們所見,系統會擷取並緩衝影像。 緩衝後,處理管線會分岔為兩個路徑。 第一條路徑負責輸出每 10 張影像中的 1 張供監控使用。 第二條路徑則包含二值化處理與二值影像的輸出。

大多數 VisualApplets 的實作都遵循相同的原則: 首先是影像擷取與緩衝。 緩衝之後則是影像處理邏輯。 在 'Data Flow ' 中,您可以找到更多關於 VisualApplets 處理管線與設計基本設定的資訊。 接下來,我們將逐步完成符合規格的 VisualApplets 設計實作。 除了 VisualApplets 實作之外,我們還會使用內建模擬功能來驗證設計,並將設計應用於實際硬體中。

具備監控功能的二值化 VisualApplets 實作

  1. 我們將從先前範例中使用過的基本運算子開始。 這些運算子包括相機運算子 CameraGrayAreaBase、緩衝區 ImageBuffer 以及將結果傳輸至主機 PC 的運算子,即 DmaToPC。 相對地,這次我們需要在設計中使用第二個 DmaToPC 模組,以同時傳輸原始影像與二值化結果。 尋找並重新命名所有運算子,如以下設計所示。

  2. 如您所見,我們將 DMA 模組重新命名為 DMA0_OriginalImages 和 DMA1_BinarizedImages,藉此賦予它們索引。 這是因為每個 DMA 通道都使用通道索引。 此通道索引可用於從任何 PC 軟體存取資料。 大多數非 FPGA 內部的資源都會使用索引來指定其位置。 部分使用 FPGA 外部硬體的運算子包括:相機運算子、使用 DRAM 的運算子(例如 ImageBuffer)、 使用通用輸入輸出的運算子(例如觸發信號)以及 DMA 運算子。 事實上,我們目前設計中的所有運算子都使用了外部資源,並且都可以配置索引。 相機運算子可以配置給 Camera Link 連接埠 A 或 B。 緩衝區可以配置給 microEnable IV VD4-CL 上的四個 DRAM 之一,而 DMA 則可配置給其中一個 DMA 通道。 如需詳細說明裝置資源的使用方式,請參閱 'Allocation of Device Resources'。 所有支援硬體平台的可用裝置資源清單則列於 Device Resources 中。

    大多數裝置資源都可以透過 VisualApplets 中的資源對話方塊來變更。 有些則可以透過運算子的參數來變更資源。 若要變更裝置資源,我們必須開啟資源對話方塊,可以從 Design → Resource 存取, 或者使用編輯功能表列中的圖示。

    請確保 DMA 模組 DMA0_OriginalImages 配置給索引 0,而 DMA1_BinarizedImages 配置給索引 1。 相機模組應配置給代表 Camera Link 連接埠 A 的索引 0。 我們其實不在乎緩衝區使用哪一個 DRAM 晶片,因此如果記憶體運算子之間發生衝突,我們會讓 VisualApplets 自動選擇索引。 一般來說,VisualApplets 總是會選擇未使用的索引。 如果您有兩個相機模組並刪除了使用索引 0 的模組,則剩餘的相機模組將會使用索引 1。 因此,請務必在開始建置小程式(applet)之前檢查所有裝置資源索引。 合成之後將無法變更資源索引。

  3. 接著,我們需要加入影像處理演算法。 由於我們必須實作兩個不同的影像處理演算法,因此需要將管線分岔為兩個路徑。 這只需透過分岔運算子即可輕鬆完成。在基本運算子程式庫中尋找該運算子,並將其拖曳至您的設計中。 當您放開滑鼠按鈕時,會彈出一個視窗,允許使用者指定輸出連結的數量(即 分岔數量)。選取「兩個」並按一下「確定」。現在您的設計中就會有一個具有兩個輸出連結和一個輸入連結的分岔模組。 將該模組移動到緩衝區旁並將它們連接起來。

    我們現在已經將管線分岔,並可在分岔與 DMA 模組之間實作這兩個影像處理演算法。

    1. 首先,我們將實作原始影像輸出路徑,在此路徑中僅需輸出每 10 張影像中的 1 張。 我們不將所有必要的運算子放在主要的設計層級上,而是使用階層式方塊。 藉由階層式模組的協助,在設計中實作階層式結構,並 將任意數量的運算子組合成一個新運算子是非常實用的做法。 使用階層式模組可讓建構區域的概覽更清晰易懂。 在您的設計中插入一個具有一個輸入和一個輸出的階層式方塊。 您可以在基本運算子程式庫中、設計區域的彈出式功能表中,或從 主功能表「Design」找到階層式方塊。

      將 HierarchicalBox 模組放置在分岔與 DMA 之間並將它們連接起來。 您可以透過其內容功能表或選取該模組並按下 F2 鍵來重新命名模組。

      若要編輯階層式模組的內容,只需按兩下即可。 隨即會開啟一個新的空白設計視窗,其中僅包含輸入和輸出連接器。 我們將在中間放置所需的運算子,並將其連接至連接埠。 若要結束階層式模組,請按下 Backspace 鍵或圖示 .

      若要移除 10 張影像中的 9 張,我們需要如以下所示的運算子。

      以及參數設定:

      • 模組 CountFrames 的屬性

      • 模組 CountFrames 輸出的連結屬性

      • 模組 Not0 的屬性

      運作原理: CountFrames 模組會將每個影像的像素替換為介於 0 到 9 之間的數值。 因此,它會隨著每個影像重複從 0數到 9。 如果目前的計數值不為 0,Not0 模組會將每個影像的每個像素替換為數值 1。 如果第二個輸入「Rem」的像素值為 1,RemoveImage 模組就會刪除該影像。 因此,編號 0、10、20、30... 的影像將會被略過。所有其他影像都會被刪除。

    2. 為了實現二值化,我們將在設計中新增另一個階層式模組。

      此階層式模組中的運算子為「Is_GreaterThan」與「Scale」。

      ThresholdFrom 模組代表實際的二值化處理。 對於大於參數 Number 所指定數值的每個輸入像素值,會輸出數值 1,否則輸出 0。 因此,該模組的輸出位元深度將為 1 位元。您可以在開啟連結屬性 (Link Properties) 時檢查此設定。 由於我們不想輸出 1 位元的數值,我們需要將結果轉換為 8 位元的數值。 一個非常簡單的解決方案是將每個數值乘以 255。因此,二進位值 1 會變成 255, 而二進位值 0 則維持 0。請將 ScaleBy255 模組的參數設定為下列數值。

      如您所見,我們已將參數 ScaleFactor 的參數類型設定為 Static。對於此運算子而言,這非常 重要,因為與動態參數相比,它所需的 FPGA 資源會少得多。 一般而言,如果您確定在合成 (Synthesis) 後不需要變更參數,請務必將其設定為靜態類型。

  4. 您實作的最後一個步驟是檢查設計規則錯誤。請執行 DRC 以檢查錯誤。 如果您沒有任何錯誤,現在就可以建置您的設計並將其用於硬體中。 或者,您也可以使用下一節中介紹的模擬來驗證您的實作。 別忘了隨時儲存您的設計。

使用模擬驗證二值化設計

對於大多數設計而言,在實際 FPGA 硬體中使用之前, 使用模擬來驗證實作的功能性是非常有幫助的。 接下來我們將使用模擬來驗證我們的設計。

  1. 準備工作

    首先,我們需要一張用於模擬的影像。 您需要使用 TIFF 或 BMP 格式的影像檔案。 如果您想將影像資料注入至使用灰階影像的影像處理管線中(如我們的範例所示), 則必須使用具有單一色彩元件的影像。 關於允許用於模擬的影像檔案的更多資訊,可以在 'Simulation' 中找到。 VisualApplets 安裝資料夾中提供了一些範例影像。

  2. 來源與探棒

    影像檔案可以使用 "simulation_source" 模組注入至任何影像傳輸連結中,並可以使用 "simulation_probe" 模組在任何其他連結上進行監控。 在我們的範例中,我們在相機與緩衝區之間的連結上新增了一個模擬來源,並根據 以下螢幕擷取畫面新增了模擬探棒。 您可以從 "Analysis" 選單、設計視窗的內容功能表,或直接從圖中標示的圖示 新增模擬來源與探棒。

  3. 新增影像檔案

    若要將影像檔案新增至模擬來源,請在設計中的來源上按兩下以開啟模擬來源檢視器 (Simulation Source Viewer)。 現在只需將您的影像檔案拖放至模擬來源檢視器視窗,或使用 File → Open 選單。

    影像檔案現已新增至模擬來源。您只需將其他檔案拖曳至 該模組或視窗上,即可將其新增至來源。 在模擬來源檢視器視窗的底部,您可以看到序列中的所有影像。

  4. 開始模擬

    我們現在準備好開始模擬。請選取 Analysis → Start Simulation ( F9 ) 以開啟主要的模擬視窗。 每次開啟此視窗時,都會自動執行設計規則檢查。 無法模擬未通過設計規則檢查的設計。

    在 VisualApplets 中,模擬是以循環 (Cycle) 方式處理的。 每個循環代表從設計中的所有模擬來源注入一張影像。 只需按一下 Start 即可開始模擬。 VisualApplets 現在將執行模擬。 根據設計的複雜度,這可能需要幾秒鐘的時間。

  5. 檢查結果

    我們現在可以檢查模擬結果。 關閉模擬視窗。 此時模擬探棒應已填入結果。

    如果您開啟位於二值化後方的探棒之模擬探棒檢視器 (Simulation Probe Viewer),您可以立即看出 模擬是否成功運作。影像應包含數值為 0 和 255 的像素。

    如果需要,結果現在可以儲存到磁碟中。

  6. 序列模擬

    我們已在上一個步驟中驗證了二值化。 然而,單一模擬影像不足以驗證監控輸出,因為預期只有每 10 張影像中 的 1 張會傳輸到主機 PC。 因此,我們需要模擬影像序列。

    1. 再次開啟模擬視窗。

    2. 按一下 Reset 以重設先前模擬的序列。 一般而言,如果您想要開始新的模擬,最好一律重設模擬以避免使用者錯誤。

    3. 按一下 Start 以模擬一張影像。 我們將在每個模擬探棒中得到一個結果。 此時不需要關閉模擬視窗。 您透過查看設計視窗中模組的編號,即可取得模擬探棒中的目前影像數量。

    4. 現在請點擊以下按鈕,執行另一個循環: 「開始」。 這次,除了位於 DMA0 模組的那個探針之外,所有模擬探針的影像編號都應已增加至二。

      請重複此步驟,直到總共模擬了 11 個週期為止。 此時,位於 DMA 0 的探針應包含兩張影像。這顯示了我們的實作功能運作正常。

    5. 與其點擊 「開始」 ,您也可以透過「模擬」視窗中的旋轉方塊來設定處理週期數。 模擬結果將完全相同。 此外,您也可以先設定 10 個模擬週期並執行,隨後再開始下一個 10 個週期。隨您喜歡……

硬體中二值化設計的驗證

在驗證實作的功能後,我們便可在硬體上進行測試並使用。 您需要建置您的設計,以取得硬體小程式檔案 HAP。(使用者手冊:'建置') 請確保您的設計與硬體平台相符,例如本範例中的 mE4VD4-CL。 此外,請確保您的專案使用正確的架構,例如「Windows 64 Bit」。 該架構必須與已安裝的「Framegrabber SDK 」相同。 透過以下方式開始建置: 建置 → 「合成」 ( F7 )。 VisualApplets 現將使用 FPGA 製造商的工具,將您的設計轉換為 FPGA 位元流。

重複此步驟,直到總共模擬 11 個循環。 DMA 0 上的探針現在應該包含兩個影像。這顯示了我們實作的正確功能。

您不需要按一下 Start 11 次,而是可以在 Simulation 視窗中的微調方塊中設定處理循環的數量。 模擬結果將會相同。 此外,您可以設定 10 個模擬循環並啟動它們,然後再啟動接下來的 10 個循環。隨您的喜好...

在我們驗證了實作的功能之後,我們可以在硬體中進行測試與使用。
                     			您需要建置設計以取得硬體 applet 檔案 HAP。(使用者手冊:<a wg-1="">'Build'</a>)
                     			請確保您的設計符合硬體平台,例如我們範例中的 mE4VD4-CL。
                     			此外,請確保您的專案使用正確的架構,例如 Windows 64 Bit。
                     			它必須與安裝的 Framegrabber SDK 相同。
                     			透過以下方式開始建置:
                     			<span wg-2=""><strong wg-3="">Build</strong></span> → <span wg-4=""><strong wg-5="">Synthesize</strong></span> (<span wg-6=""><strong wg-7="">
                           					F7
                           				</strong></span>)。
                     			VisualApplets 現在將會使用 FPGA 製造商工具,將您的設計轉譯為 FPGA 位元串流。

圖 207. 在 microDisplay 中使用二值化小程式