硬體 Applet:從構想至應用

在本應用說明中,您將學習如何在VisualApplets 中設計與建立影像處理 應用程式(即 Applet),以及如何在幀擷取卡上使用它。您還將 學習如何透過 microDisplay 和Framegrabber API 在執行期間使用此 Applet,以及 如何在此軟體中設定 Applet 的參數。 您可在以下連結找到關於如何 在 microDisplay 中設計、建置及於執行期間使用小程式的介紹: 《入門指南》中。在本應用說明中,您將透過索貝爾邊緣濾波器應用的範例,了解上述 Applet 開發與使用的各階段。

Workflow Description

工作流程如下:

  1. 在 VisualApplets 中設計 applet。

  2. 在 VisualApplets 中模擬 applet 並執行設計規則檢查 (DRC)。

  3. 建置 applet。

  4. 針對 mE5 平台:燒錄 applet。

  5. 透過 microDisplay 或 Framegrabber API 在硬體上使用 applet。

在 VisualApplets 中設計 Applet

建立新專案

applet 的設計階段是在 VisualApplets 中進行。若要開啟 VisualApplets,請按一下 VisualApplets.exe 表格中顯示 bin VisualApplets 安裝目錄中的資料夾,或是 Windows 開始功能表中的 VisualApplets 程式圖示,或是桌面上的圖示。

  1. 首先會開啟 VisualApplets 主視窗,且未載入任何專案。

    VisualApplets 主視窗

    圖 186. VisualApplets 主視窗


  2. 按一下 File+New ( Ctrl+N ),或使用 File 圖示列中的 New 圖示。此時會開啟 New Project 視窗,讓您指定專案名稱、目標硬體平台以及目標執行階段。您隨時可以之後再變更這些設定。

  3. 若要跟隨此處的範例,請使用下列設定:

    專案名稱:Sobel_Filter

    硬體平台:microEnable 5 marathon VCL

    目標執行階段:Win 64 (Windows/AMD64)

  4. 按一下 OK 確認您的設定。

    新專案視窗

    圖 187. 新專案視窗


VisualApplets 現在會啟動一個新專案,您會在程式視窗中央看到一個空白的設計視窗。右側的 Project Info 標籤頁會顯示目前專案的相關資訊,例如專案名稱、目標硬體、目標平台等。

Operators and Links

在 VisualApplets 中,影像處理作業是以算子(operator)來表示。您可以在 VisualApplets 設計視窗右側的 Operator Library 中找到所有這些算子。您可以使用拖放方式輕鬆地將算子放置到設計視窗中。

算子在設計中的執行個體稱為模組(module)。算子可以具有輸入連接埠和輸出連接埠。設計中的算子(即模組)可以使用這些連接埠進行連接。模組之間的連接稱為連結(link),在設計視窗中以箭頭表示。這些模組與連結代表了影像(或信號)處理管線。因此,作業的順序是由模組的順序所決定。

算子與連結具有屬性,這些屬性描述了與目前影像處理管線相關的設定,例如影像尺寸。若要檢視與編輯這些屬性,請按兩下算子。算子的屬性會在 Help 下的算子說明文件中詳細說明。

VisualApplets 中的算子說明文件

圖 188. VisualApplets 中的算子說明文件


設計實作

此範例實作了 Sobel 邊緣濾波器演算法。

在 VisualApplets 設計範例庫中,有適用於邊緣濾波與其他影像處理應用的「隨裝即用」範例。您可以在以下位置找到這些設計範例: Examples\Processing 位於您的 VisualApplets 安裝目錄中,並附有對應的文件,請參閱 Processing Examples。您可以將這些範例設計用作您自訂應用的基礎。

為了實作這個範例 Sobel 濾波器設計,請在 Operator Library 中尋找運算子,將其拖曳至設計中,並依照 Getting Started 一節所述使用連結將其連接。

您稍後可以重新命名模組,以便在設計中獲得更好的總覽,並在執行階段中更妥善地使用。

只要合適,請使用 HierarchicalBoxes 來組織設計,以獲得更好的設計總覽。

並且別忘了不時儲存設計。

Design Components

此應用筆記中的範例設計由以下元件組成,如以下圖示所示:

範例設計實作 Sobel_Filter.va

圖 189. 範例設計實作 Sobel_Filter.va


  • 一個 Camera Link 灰階相機介面

  • 一個影像緩衝區

  • 具備 x 和 y 方向邊緣濾波功能的 Sobel 邊緣濾波器模組(基於位於 SobelMultiGradient.vad 下的 Examples\Processing\Filter\EdgeDetection\Sobel_Multi_Gradient VisualApplets 安裝目錄中的範例)

  • 一個可調整的二值化閾值以及一個縮放運算子,以便在執行階段更好地在顯示器上將二值化影像視覺化

  • 傳送至 PC 的 DMA。

您可以在設計中使用 CoefficientBuffer 作為影像的模擬來源,而非使用相機擷取的影像。透過運算子 SourceSelector,您可以在 VisualApplets 中以及執行階段期間選擇處理管線的影像輸入來源。

Parameter Settings

若要為運算子與連結設定參數,您可以透過雙擊每個 元件來編輯其參數。

Link Parameters

連結具有若干屬性,這些屬性定義了經處理影像的特性, 例如最大影像尺寸、影像協定、位元寬度,以及一項 與最大可用頻寬相關的參數:並行度 (即在一個設計時鐘週期內傳輸的像素數量)。 若這些連結 已連接至特定運算子(請參閱對應的運算子文件), 例如相機介面運算子,您即可根據需求 編輯並調整這些屬性。

您選擇的最大影像尺寸和並行度越高, FPGA 資源消耗就越大。因此,Basler 建議僅將 這些數值設定為必要範圍內,以節省 FPGA 資源。連結 屬性僅能在設計階段於VisualApplets 中進行變更。

Link Properties

圖 190. 連結屬性


Operator Properties

運算子屬性有兩種類型: 靜態 與 動態。您僅能在 設計階段於VisualApplets 中變更靜態參數,而動態參數則可在 設計階段及執行階段進行變更。請參閱下方的螢幕截圖,其中展示了運算子 IS_GreaterThan 的靜態 與動態參數範例。

靜態與動態運算子參數

圖 191. 靜態與動態運算子參數


在此範例設計中,請設定下列參數:

運算子 IS_GreaterThan:

將參數 Number 設定為 600。

這會識別邊緣的灰階。如果您想找出邊緣的灰階,可以在 IS_GreaterThan 運算子之前設定模擬探棒 (Simulation Probe)、執行模擬,並放大包含邊緣的像素以查看其灰階。這是一個動態參數,您可以在執行階段進行更改。

運算子 SCALE:

將參數 ScaleFactor 設定為 255。

這會增強邊緣的可見性。這是一個動態參數。不過,為了節省 FPGA 資源,您可以將此參數設定為 Static。

執行階段參數存取準備

在執行階段期間,您可以變更動態參數。常見的使用情境是:您的設計中包含許多運算子,且您需要為設計中的許多不同運算子變更相同的參數(例如影像尺寸)。

程式庫 Parameters 提供的運算子只需控制一個參數,就能存取設計中的不同模組參數。此外,這些運算子還能讓存取參數顯示在特定的階層層級上。這些選項可讓您在執行階段更容易進行參數設定。範例設計 Sobel_Filter.va (請參閱 圖 189「範例設計實作 Sobel_Filter.va'」使用轉譯與參照參數,以便在階層層級輕鬆存取影像寬度和高度、影像來源選擇器、閾值與比例因子 Parameters。為此,請建立一個空的 HierarchicalBox,將其命名為 Parameters ,並將對應轉譯與參照參數的 DisplayHierarchy 參數設定為 Parameters。您可以在對應的文件中找到有關 Parameters 程式庫的詳細說明,請參閱 Library Parameters.

完成設計

模擬來源與探棒

在設計階段中,模擬來源和探棒非常有用。使用模擬來源,您可以在幾個 momen 內載入 Test Images,並檢查處理管線中每個連結上的處理後影像。例外狀況:訊號無法模擬。此外,模擬會執行設計規則檢查第 1 級,以檢查實作的形式正確性。模擬結果與執行階段的結果相同。您可以在 VisualApplets 的圖示選單中或文字選單的 Analysis 下找到模擬來源和探棒。如需模擬來源和探棒用法的詳細說明,請參閱 'Simulation' 下的詳細說明。

在 圖 189「範例設計實作 Sobel_Filter.va' 您可以在範例設計的模擬來源中看到已載入的 Test Image Sobel_Filter.va。在閾值之後和 DMA 之前,您可以看到目前處理步驟的結果。

Design Rule Check (DRC)

完成實作後,建議執行設計規則檢查第 1 級和第 2 級。若要執行設計規則檢查第 1 級和第 2 級,請選取 Analysis+Design Rules Check Level 1 and 2,或使用圖示列中的圖示 Design Rules Check Level 1 and 2。

設計規則檢查第 1 級會回報實作中的形式錯誤及其在設計中的確切位置。在將設計轉譯為硬體 applet 之前,您必須修正這些錯誤。

設計規則檢查第 2 級還會提供有關設計中所使用估計 FPGA 資源的資訊。利用此資訊,您可以檢查是否有足夠的 FPGA 資源可用於您的影像處理實作。如果資源超過其中一個 FPGA 資源的 100%,您需要重新設計實作以節省資源。

在 圖 192,「範例設計的設計規則檢查 1 與 2 Sobel_Filter.va' 顯示了設計規則檢查 1 與 2 的結果:設計完全正確,大約使用了 36% 的可用尋找表 (Lookup Tables)、22% 的正反器 (FlipFlops)、15% 的區塊 RAM (Block RAM) 以及 2% 的可用嵌入式 ALU。您可以在以下位置檢視詳細的概覽,了解設計中每個元素消耗了多少 FPGA 資源(請參見 圖 193,「FPGA 資源估算」)於 Analysis+FPGA 資源估算

範例設計 Sobel_Filter.va 的設計規則檢查 1 與 2

圖 192. 範例設計的設計規則檢查 1 與 2 Sobel_Filter.va


FPGA 資源估算

圖 193:FPGA 資源估算


在 VisualApplets 中建置 Applet

前置條件

硬體 applet 建置程序必須在正確安裝 Xilinx 工具的情況下才能執行。在 https://docs.baslerweb.com/visualapplets/installing-visualapplets#which-xilinx-toolchain-and-version-for-which-frame-grabber-platform 下方,您可以找到詳細的概覽,了解哪些 Xilinx 版本適用於您的擷取卡平台。在此範例設計中 Sobel_Filter.va 選定了 microEnable 5 marathon VCL 平台。因此,適用 Xilinx ISE 14.7 版或 2016.1 至 2020.1 之間的 Vivado 版本。

編輯建置設定

現在您已經完成了範例設計 Sobel_Filter.va 並且想要將設計轉譯為硬體 applet。對於此轉譯程序(稱為 build ),您需要選取正確的 Xilinx 建置設定。開啟 設定+Build Settings,並從您的檔案系統中選取對應 Xilinx 版本的批次檔 settings64.bat (建議使用:Xilinx Vivado 2018.2),然後按一下「確定」確認。您可以在以下位置找到編輯建置設定的詳細說明: 「建置設定」.

建置硬體 Applet 對話方塊

圖 194. 建置硬體 Applet 對話方塊


VisualApplets 現在會使用 Xilinx 工具將應用程式轉譯為 FPGA 位元串流 (bitstream),也就是 程式 或 applet。 此程序的時間長度取決於設計的複雜度。高度複雜設計的建置可能需要數小時。對於此範例實作 Sobel_Filter.va,建置時間約為 15 分鐘。建置成功後,applet 即完全產生。applet 的名稱 (*.hap 檔案)與設計檔案的名稱相同 (*.va): Sobel_Filter.hap

在硬體上執行 Applet

前置條件

若要在擷取卡上的硬體中執行 Applet,系統必須安裝可程式化(V 系列)擷取卡(硬體)。此外,PC 上必須安裝 Framegrabber SDK 軟體。針對 microEnable 5 marathon VCL 的這個範例 Applet,支援的最新 Framegrabber SDK 版本為 5.7。

燒錄

如果您像本範例一樣使用 microEnable 5 marathon 擷取卡,則需要使用 microDiagnostics 將新的 Applet 燒錄至擷取卡中。

如果您要在 microEnable IV 擷取卡或最新 CXP 12 系列擷取卡上使用新的 Applet,請直接略過此章節。

若要燒錄擷取卡,請執行下列步驟:

  1. 啟動位於 bin 中的 microDiagnostics 工具 Framegrabber SDK 安裝目錄。

  2. 選擇您的擷取卡。

  3. 在對話方塊左側選擇 Firmware。

  4. 將您的硬體 Applet 指派給其中一個顯示的分割區(0 到 7): 前往建立的硬體 Applet 所在的目錄並選擇 該檔案。

    microDiagnostics 中顯示的韌體分割區

    圖 195. microDiagnostics 中顯示的韌體分割區


  5. 按一下 Flash Now

  6. 等待新韌體完全安裝。燒錄完成後, microDiagnostics 中會顯示訊息。

  7. 請遵循訊息中的指示。

在 microDisplay 中測試並載入 Applet

若要測試您的 Applet Sobel_Filter.hap 並設定一些初始 參數,請使用 microDisplay 程式。載入 Applet 需要執行下列步驟:

  1. 儲存 Applet(此處: Sobel_Filter.hap)於 Hardware Applets\<your frame grabber> (此處: mE5-MA-VCL)於 Framegrabber SDK 安裝目錄中。

  2. 從 bin 資料夾啟動 microDisplay Framegrabber SDK 安裝目錄。

  3. 在 microDisplay 中,於 Acquisition Devices 下方選擇您要使用的擷取卡。選定擷取卡後,所有可用的 Applet 將立即顯示。

  4. 選擇您要使用的 *.hap 您要使用的檔案(此處: Sobel_Filter.hap)連按兩下。

引數設定與擷取

載入 Applet 後,您可以在 microDisplay 中看到參數樹狀結構和影像擷取視窗。以下顯示載入至 microDisplay 中的 Applet Sobel_Filter.hap 的畫面擷取畫面。

microDisplay 中的參數樹與影像擷取視窗

圖 196:microDisplay 中的參數樹與影像擷取視窗


左側顯示的是參數樹。這些參數在 VisualApplets 的設計階段相當於運算子名稱。為運算子命名時採用良好的命名方式非常重要,這樣才能找到您想要調整以進行擷取的正確參數。動態參數可在執行階段進行調整。動態參數分為兩種:僅能在擷取開始前調整的參數(例如 DMA dimensions),以及甚至能在影像擷取期間進行調整的參數(例如運算子 IS_GreaterThan 的閾值)。

在此範例中,您使用來自模擬器來源的影像執行影像擷取,並將二值化閾值設為 150。如果您在 VisualApplets 的設計階段中整合了 Parameters 庫的參數,您就可以在參數樹中的 Parameters 階層層級下設定所有相關的動態參數。否則,您需要逐一瀏覽不同的階層層級,以找到我們要設定的正確參數。

在此範例中,前往 Parameters 階層層級並將其展開:

  1. 在 Parameter Simulation Image 上按一下滑鼠右鍵。隨後,您可以選取您要用於影像擷取的範例影像。

  2. 按一下 Load Simulation Image 來載入此影像。

  3. 將 ImageSource selector 參數設為 Simulator,並將 Binarization Threshold 設為值 150。

  4. 將影像尺寸設為 1024x1024 像素。

設定好這些參數(或對您的 Applet 而言的所有相關參數)後,您就可以開始擷取。在這裡,您可以選擇連續擷取、擷取序列或單一影格。若要停止連續擷取,請按一下「停止」按鈕。若是多處理程序設計,您可以分別啟動和停止單一處理程序的擷取。

如需 Applet 設定與使用 microDisplay 進行擷取的詳細說明,請參閱 https://docs.baslerweb.com/frame-grabbers/what-is-micro-display-x。

在您自己的 SDK 中啟動 Applet

您也可以選擇不要在 microDisplay X 中執行 Applet 設定與擷取,而是將其整合至您自己的 SDK 環境中。在本節中,您將找到影像擷取與設定相關 SDK 元件之基本功能的介紹。

作為 C++ SDK 的基礎,您可以使用 VisualApplets 內部 SDK 程式碼產生器,您可以在圖示選單中或 VisualApplets 的 Build+Generate SDK Example 下找到它。此功能會自動產生對應的 CMake 檔案與 VisualStudio 專案檔案,您可以將其用作 SDK 程式碼的基礎。

產生的 SDK 專案檔案

圖 197:產生的 SDK 專案檔案


專案檔案中產生的 C++ 程式碼 vasFgProject.cpp 包含下列程式碼元件:

  1. 圖形擷取卡:初始化

    定義擷取循環次數、定義應屬索引、呼叫函數 Fg_Init("Sobel_Filter.hap", boardIndex) 來啟動 Applet。

  2. 為擷取緩衝區配置記憶體。

    函數: Fg_AllocMemEx(fg, ..., ...)

  3. 圖形擷取卡:取得與設定 Process0 的參數 (Get* and Set*)

    函數: Fg_setParameterWithType(fg, ..., ..., ...) 進行明確的生命週期管理即呼叫 Fg_getParameterWithType(fg, ..., ..., ...)

    此處列出了設計中包含的所有參數。為了便於檢視,Basler 建議刪除所有在執行階段不需要調整的參數。

  4. 建立顯示畫面

    函數 CreateDisplay()

  5. 針對每個現有的連接埠,在 applet 和相機上啟動擷取:

    函數: Fg_AcquireEx(fg, 0, nrOfCycles, ...,...);

  6. 擷取影像:

    函數: Fg_getLastPicNumberBlockingEx(fg, ..., ..., ..., ...);

  7. 停止擷取

    功能 Fg_stopAcquireEx(fg, .., .., ...)

  8. 關閉顯示

    函數 CloseDisplay(...);

  9. 釋放緩衝區的記憶體

    函數 Fg_FreeMemEx(fg, ..);

  10. 擷取卡取消初始化

    函數 Fg_FreeGrabber(fg);

如需 SDK 函數的詳細說明與解釋,請參閱 https://docs.baslerweb.com/frame-grabbers/sdk/basler__fg_8h.html

如需 Framegrabber API 的簡介,請參閱 https://docs.baslerweb.com/frame-grabbers/framegrabber-api.html。

您可以將產生的 SDK 範例程式碼整合至較大的 SDK 環境中,以進行擷取卡(預先)處理之影像的後續軟體處理。