硬體 Applet:從構想到應用

在本應用手冊中,您將學習如何在 VisualApplets 中設計並建立影像處理應用程式(= applet),以及如何在擷取卡上使用它。您也將學習如何在執行階段透過 microDisplay 與 Framegrabber API 使用此 applet,以及如何在該軟體中設定 applet 的參數。您可以在 Getting Started 中找到關於如何在執行階段設計、建置與使用 applet 的介紹。在本應用手冊中,我們將以 Sobel 邊緣濾鏡應用程式為範例,帶領您學習上述的 applet 開發與使用階段。一個較短的引導路徑是 From Empty Design to Running Applet 教學主題。

工作流程說明

工作流程如下:

  1. 在 VisualApplets 中設計 applet。

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

  3. 建置 applet。

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

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

在 VisualApplets 中設計 Applet

啟動新專案

applet 的設計階段是在 VisualApplets 中進行。若要開啟 VisualApplets,請按一下 VisualApplets 安裝目錄中 VisualApplets.exe 資料夾內的 bin 檔案,或是 Windows Start 功能表中的 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 確認您的設定。

    New Project 視窗

    圖 187. New Project 視窗


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

運算子與連結

在 VisualApplets 中,影像處理作業是以 operators 表示。您可以在 VisualApplets 設計視窗右側的 Operator Library 中找到所有這些 operators。您可以透過拖放(drag-and-drop)非常輕鬆地將 operators 放置到設計視窗中。

設計中的運算子執行個體稱為 module。 運算可以具有輸入和輸出連接埠。設計中的運算(即 modules)可以使用這些連接埠進行連接。modules 之間的連接稱為 links,在設計視窗中以箭頭表示。這些 modules 和 links 代表影像(或訊號)處理管線。因此,運算的順序由 modules 的順序決定。

運算子和 links 具有 properties,用於描述對目前影像處理管線相關的設定,例如影像尺寸。若要檢視和編輯這些 properties,請按兩下運算子。運算子的 properties 將在 Help 底下的運算子說明文件中詳細說明。

VisualApplets 中的運算子說明文件

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


設計實作

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

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

針對此範例 Sobel 濾波器設計的實作,請在 Operator Library 中尋找運算子,將其拖曳至設計中,並依照 Getting Started 一節中的說明使用連結將其連接。

您稍後可以重新命名 modules,以便在設計中獲得更好的概覽,並在執行階段更好地理用。

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

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

設計元件

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

範例設計實作 Sobel_Filter.va

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


  • Camera Link 灰階相機介面

  • 影像緩衝區

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

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

  • 傳送到 PC 的 DMA。

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

Parameter Settings

若要對運算子和連結進行參數化,您可以透過按兩下元素來編輯每個元素的參數。

Link Parameters

Links 具有 properties,可定義已處理影像的 properties,例如最大影像尺寸、image protocol、Bit Width,以及與最大可能頻寬相關的參數:Parallelism(即在一個設計時脈週期中傳輸的像素數量)。如果這些 links 連接到特定的運算子(請參閱對應的運算子說明文件),例如相機介面運算子,您可以根據您的用途編輯和調整這些 properties。

您選擇的最大影像尺寸和 Parallelism 越高,FPGA 資源消耗就越大。因此,Basler 建議僅將這些值設定到所需的程度,以節約 FPGA 資源。Link Property 只能在 VisualApplets 的設計階段進行變更。

Link Properties

圖 190. Link Properties


Operator Properties

Operator Property 有兩種類型:static 和 dynamic。您只能在 VisualApplets 的設計階段變更 Static 參數,而 Dynamic 參數則可以在設計階段和執行階段進行變更。請參閱下方截圖,其中包含 operator IS_GreaterThan 的 Static 和 Dynamic 參數範例。

Static 和 Dynamic Operator Parameters

圖 191. Static and Dynamic Operator Parameters


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

Operator IS_GreaterThan:

將參數 Number 設定為 600。

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

Operator SCALE:

將參數 ScaleFactor 設定為 255。

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

執行階段參數存取準備

在執行階段,您可以變更 Dynamic 參數。常見的使用情境是您的設計中有許多 operator,且您需要變更許多不同 operator 的相同參數(例如影像尺寸)。

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

完成設計

模擬來源與探針

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

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

設計規則檢查 (DRC)

完成實作後,建議執行 Design Rule Check Level 1 和 2。若要執行 Design Rule Check Level 1 和 2,請選取 Analysis+Design Rules Check Level 1 and 2 或使用圖示列中的 Design Rules Check Level 1 and 2 圖示。

Design Rule Check Level 1 會回報實作中的形式錯誤及其在設計中的確切位置。在將設計轉譯為硬體 applet 之前,您必須修正這些錯誤。

Design Rule Check Level 2 另外會提供有關設計中所使用預估 FPGA 資源的資訊。透過此資訊,您可以檢查是否有足夠的 FPGA 資源可用於您的影像處理實作。如果資源超過任何一項 FPGA 資源的 100%,您需要重新設計實作以節省資源。

在 圖 192,「範例設計的 Design Rule Check 1 和 2 Sobel_Filter.va' 顯示了 Design Rule Check 1 和 2 的結果:設計完全正確,並且使用了大約 36% 的可用 Lookup Tables、22% FlipFlops、15% Block RAM 以及 2% 的可用嵌入式 ALU。您可以在 圖 193,「FPGA 資源估算」下看到關於設計中每個元素消耗多少 FPGA 資源的詳細概覽(請參閱 Analysis+FPGA Resource Estimation

範例設計 Sobel_Filter.va 的 Design Rule Check 1 和 2

圖 192. 範例設計的 Design Rule Check 1 和 2 Sobel_Filter.va


FPGA Resource Estimation

圖 193. FPGA 資源估算


在 VisualApplets 中建置 Applet

先決條件

唯有在正確安裝 XILINX 工具的情況下,才能執行硬體 applet 建置程序。在 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 建置設定。開啟 Settings+Build Settings,從您的檔案系統中選取對應 Xilinx 版本的批次檔 settings64.bat (建議:Xilinx Vivado 2018.2)並以 OK 確認。您可以在下方找到編輯建置設定的詳細說明: 'Build Settings'.

Build Hardware Applet Dialog

圖 194. Build Hardware Applet Dialog


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 燒錄 (Flash) 至您的框架擷取卡中。

如果您打算在 microEnable IV 框架擷取卡或最新 CXP 12 系列框架擷取卡上使用新的 applet,請直接跳過此節。

若要燒錄框架擷取卡,請執行以下步驟:

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

  2. 選取您的框架擷取卡。

  3. 選取對話方塊左側的 Firmware。

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

    Firmware Partitions Displayed in microDiagnostics

    圖 195. Firmware Partitions Displayed in microDiagnostics


  5. 按一下 Flash Now

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

  7. 遵循訊息中的指示。

在 microDisplay 中測試與載入 Applet

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

  1. 將 Applet(此處為: Sobel_Filter.hap下看到關於設計中每個元素消耗多少 FPGA 資源的詳細概覽(請參閱 Hardware Applets\<your frame grabber> (此處為 mE5-MA-VCL)儲存在 Framegrabber SDK 安裝目錄中。

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

  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

您也可以將其整合至您自己的 SDK 環境中,而不在 microDisplay X 中執行 Applet 組態與擷取。在本節中,您將找到影像擷取與組態相關 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. 為擷取緩衝區配置 Memory。

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

  3. 擷取卡:取得 Process0 的 Get* 與 Set* 參數

    函式: Fg_setParameterWithType(fg, ..., ..., ...) 和 Fg_getParameterWithType(fg, ..., ..., ...)

    此處列出了設計中包含的所有 Property。為了獲得更好的檢視效果,Basler 建議 刪除所有在執行階段調整時不需要的 Property。

  4. 建立顯示畫面

    函式 CreateDisplay()

  5. 針對每個存在的 Port,啟動 Applet 和相機上的擷取:

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

  6. 擷取影像:

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

  7. 停止擷取

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

  8. 關閉顯示畫面

    函式 CloseDisplay(...);

  9. 釋放緩衝區的 Memory

    函式 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 環境中, 以便對擷取卡(預先)處理過的影像進行進一步的軟體處理。