多 DMA 通道設計

大多數VisualApplets 應用程式都需要擷取攝影機影像,透過影像處理演算法對影像進行處理 ,並將結果輸出至主機電腦。 此外,使用者還希望監看原始監控影像。 因此,我們需要兩種影像輸出。 即原始監控影像,以及演算法實作的處理結果。 以下我們將實作一個符合以下規格的VisualApplets 設計:

  • 使用Camera Link 相機在基本設定模式下拍攝灰階影像
  • maximum resolution = 1024 x 1024 pixel @ 8Bit/pixel
  • 將影像暫存,並將每第 10 張擷取的影像傳送至主電腦(監控)
  • 使用閾值處理將每張擷取的影像二值化,並將處理後的影像輸出至主機電腦
  • 二值化的輸出影像必須符合以下格式:0 = 黑色,白色 = 255(8 位元/像素)

根據規格說明,我們可以繪製出方塊圖。

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

圖 206. 具監測功能的閾值二值化設計方塊圖


如我們所見,影像會被擷取並緩存。 經過緩存後,處理流程會分流為兩條路徑。 第一條路徑負責每 10 張影像輸出 1 張,供監控使用。 第二條路徑則包含二值化處理,並輸出二值化影像。

大多數VisualApplets 的實作都遵循相同的原則: 首先進行影像擷取與緩衝。 緩衝完成後,接著執行影像處理邏輯。 在「資料流」中,您可以找到更多關於VisualApplets 處理管線以及設計基本設定的資訊。 以下我們將逐步說明如何實作一個符合規格的VisualApplets 設計, 一步一腳印地進行。 除了VisualApplets 的實作外,我們還將利用內建的模擬功能驗證該設計,並將其應用於 實際硬體中。

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

  1. 我們將從前幾個範例中使用過的基本運算子開始說明。 這些包括相機運算子CameraGrayAreaBase、緩衝區ImageBuffer 以及將結果傳輸至主機電腦的運算子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 通道。 有關裝置資源使用的詳細說明,請參閱「裝置資源的分配」。 所有受支援硬體平台可用的裝置資源清單,請參閱 裝置資源中。

    大多數裝置資源皆可透過VisualApplets 中的資源對話方塊進行變更。 部分裝置則可透過操作員參數來變更其資源。 若要變更裝置資源,必須開啟資源對話方塊,該對話方塊可透過以下路徑存取: 設計 → 資源 ,或透過編輯選單列中的圖示開啟。

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

  3. 接下來,我們需要加入影像處理演算法。 由於必須實作兩種不同的影像處理演算法,我們需要將處理流程分支為兩條路徑。 這只需透過分支運算子即可輕鬆完成。請在基礎運算子庫中找到該運算子,並將其拖曳至您的設計中。 當您放開滑鼠按鈕時,會彈出一個視窗,讓使用者指定輸出連結的數量,也就是 分支的數量。選擇「二」並按「確定」。此時您的設計中將出現一個分支模組,具有兩個輸出連結和 一個輸入連結。 將該模組移至緩衝器旁邊,並將兩者連接起來。

    我們現在已將管線進行分支,並能在分支模組與 DMA 模組之間實作這兩項影像處理演算法。

    1. 首先,我們將實作原始影像的輸出路徑,其中僅需每 10 張影像輸出 1 張。 與其將所有必要的運算子都放置在主設計層級,我們將使用階層式方塊。 透過階層式模組,您可將階層結構實作至設計中,並 將任意數量的運算子組合成一個新的運算子。 使用階層式模組可使建構區域的整體概況更為清晰。 請在您的設計中插入一個具有一個輸入和一個輸出的階層式方塊。 您可以在基礎運算子庫中、透過設計區域的彈出式選單,或從 「設計」主選單中找到階層式方塊。

      將 HierarchicalBox 模組放置在分支與 DMA 之間,並將兩者連接起來。 您可以透過模組的右鍵選單,或選取模組後按下 F2 鍵來重新命名該模組。

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

      若要移除 10 張圖片中的 9 張,我們需要如下所示的操作符。

      以及參數化:

      • CountFrames 模組的屬性

      • 模組 CountFrames 輸出項目的連結屬性

      • 模組 Not0 的屬性

      運作原理: CountFrames 模組會將每張影像的像素替換為 0 到 9 之間的數值。 因此,它會針對每張影像重複進行 0 到 9 的計數。 模組 Not0 會將每張圖片的每個像素替換為值 1,前提是當前的計數值不為 0。 模組 RemoveImage 會刪除每張圖片,前提是第二個輸入參數「Rem」的像素值為 1。 因此,編號為 0、10、20、30、... 的圖片將被跳過。其餘所有圖片都會被刪除。

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

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

      「ThresholdFrom」模組負責實際的二值化處理。 對於每個大於參數「Number」所指定數值的輸入像素值,將輸出 1;否則輸出 0。 因此,該模組的輸出位元深度將為 1 位元。您可以開啟連結屬性來確認這一點。 由於我們不希望輸出 1 位元值,因此需要將結果轉換為 8 位元值。 一個非常簡單的解決方案,是將每個值乘以 255。如此一來,二進位值 1 將變成 255, 而二進位值 0 則維持為 0。請將 ScaleBy255 模組的參數設定為以下數值。

      如您所見,我們已將參數 ScaleFactor 的參數類型設定為「靜態」。對於此運算子而言,這點非常 重要,因為相較於動態參數,此設定所需的 FPGA 資源將少得多。 一般而言,若您確定在合成後無需變更參數,請務必將參數設定為靜態類型。

  4. 實作的最後一步是檢查設計規則錯誤。執行 DRC 以檢查是否有錯誤。 若無錯誤,您現在即可編譯設計並在硬體中使用。 此外,您也可以透過下一節所述的模擬來驗證您的實作。 請記得不時儲存您的設計。

使用模擬驗證二值化設計

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

  1. 準備工作

    首先,我們需要一張用於模擬的圖片。 您需要使用TIFF或 BMP格式的圖片檔案。 若您希望將圖片資料注入圖片處理管線中 並像本範例一樣使用灰階圖片,則必須使用僅含單一顏色成分的圖片。 有關模擬時允許使用的影像檔案的更多資訊,請參閱「模擬」。 在VisualApplets 的安裝資料夾中,有一些範例影像。

  2. 光源與探針

    可透過「simulation_source」模組將影像檔案注入任何影像傳輸鏈路,並可透過 「simulation_probe」模組在 任何其他鏈路上進行監控。 在本範例中,我們依照 以下螢幕截圖所示,在攝影機與緩衝區之間的鏈路上新增一個模擬來源,並新增模擬探針。 您可以透過「分析」選單、設計視窗的快顯選單,或直接 點擊圖中標示的圖示,來新增模擬來源與探針。

  3. 新增圖片檔案

    若要將影像檔案新增至模擬來源,請在 您的設計中雙擊該來源,以開啟「模擬來源檢視器」。 現在只需將您的影像檔案拖放至「模擬來源檢視器」視窗中,或使用 「檔案」 → 開啟 選單。

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

  4. 模擬開始

    現在我們已經準備好開始執行模擬了。請選取 「分析」 → 開始模擬 ( F9 ) 以開啟主要「模擬」視窗。 每次開啟此視窗時,系統都會自動執行設計規則檢查。 若設計規則檢查未通過,則無法對該設計進行模擬。

    在VisualApplets 中,模擬會以週期為單位進行處理。 每個週期代表從設計中所有模擬來源導入一張影像。 只需點擊 「開始」 即可啟動模擬。 VisualApplets 隨即會執行模擬。 視設計的複雜程度而定,此過程可能需要數秒鐘。

  5. 查看結果

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

    若您開啟位於二值化處理後方的探針之「模擬探針檢視器」,即可立即確認 模擬是否成功。該影像應包含值為 0 和 255 的像素。

    如有需要,現在可以將結果儲存至磁碟。

  6. 序列模擬

    我們可以驗證前一步驟的二值化結果。 然而,單張模擬影像並不足以驗證監控輸出,因為理論上僅有每第 10 張影像 才會傳輸至主機電腦。 因此,我們需要模擬一組連續的影像序列。

    1. 請再次開啟「模擬」視窗。

    2. 點擊 「重設」 以重設先前模擬的序列。 一般而言,若要開始新的模擬,建議始終重設模擬設定,以避免使用者操作錯誤。

    3. 點擊 「開始」 以模擬一張影像。 每個模擬探針都會顯示一個結果。 目前無需關閉「模擬」視窗。 您可以透過查看設計視窗中各模組的編號, 來得知當前模擬探針中的影像數量。

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

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

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

硬體中二值化設計的驗證

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

合成結果為一個 HAP 檔案。 該檔案包含 FPGA 位元流,以及用於存取資料與參數的軟體介面。 HAP 檔案位於您的Framegrabber SDK 安裝目錄中的「Hardware Applets」子目錄內;或者, 若未安裝Framegrabber SDK 或您選擇了其他目標執行環境,則該檔案位於系統設定中指定的 資料夾內(請參閱「系統設定」)。

我們將在Framegrabber SDK 工具「microDisplay」中測試我們的設計。microDisplay 是一款用於對小程式進行初步測試的工具。 開啟 microDisplay 並載入該小程式。 microDisplay 將顯示兩個 DMA 影像視窗, 分別是僅顯示每第 10 張影像的原始影像視窗,以及顯示二值化影像的第二個 DMA 視窗。 關於在Framegrabber SDK 中使用 Applet 的詳細說明,可參閱Framegrabber SDK 的文件。

在 microDisplay 中使用二值化小程式

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