您現在的位置是:首頁 > 攝影首頁攝影

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

由 Tronlong創龍科技 發表于 攝影2022-12-19
簡介圖 62PS端IP核測試裸機工程說明PS端執行32*32的浮點矩陣乘法運算,並將PS端和PL端用時進行比較

演算法怎麼嵌入硬體

前 言

本文主要介紹HLS案例的使用說明,適用開發環境:Windows 7/10 64bit、Xilinx Vivado 2017。4、Xilinx Vivado HLS 2017。4、Xilinx SDK 2017。4。

Xilinx Vivado HLS(High-Level Synthesis,高層次綜合)工具支援將C、C++等語言轉化成硬體描述語言,同時支援基於OpenCL等框架對Xilinx可程式設計邏輯器件進行開發,可加速演算法開發的程序,縮短產品上市時間。

本次案例用到的是創龍科技的TLZ7x-EasyEVM-S開發板,它是一款基於Xilinx Zynq-7000系列XC7Z010/XC7Z020高效能低功耗處理器設計的異構多核SoC評估板,處理器整合PS端雙核ARM Cortex-A9 + PL端Artix-7架構28nm可程式設計邏輯資源,評估板由核心板和評估底板組成。

核心板經過專業的PCB Layout和高低溫測試驗證,穩定可靠,可滿足各種工業應用環境。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

TLZ7x-EasyEVM-S評估板

TLZ7x-EasyEVM-S評估板

評估板介面資源豐富,引出千兆網口、雙路CAMERA、

USB、Micro SD、CAN、UART等介面,支援LCD顯示拓展及Qt圖形介面開發,方便快速進行產品方案評估與技術預研。

matrix_demo案例

案例功能:實現32*32浮點矩陣乘法運算功能,同時提供提高運算效率的方法。

HLS工程說明

時鐘

HLS工程配置的時鐘為100MHz。如需修改時鐘頻率,請開啟HLS工程後點擊後,在彈出的介面中的Synthesis欄目進行修改。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 42

(2)頂層函式

案例有兩個可選的頂層函式,分別為standalone_mmult()和HLS_accel()。前者為矩陣乘法運算函式,用於模擬階段;後者基於前者將資料輸入輸出介面封裝成AXI4-Stream介面,用於綜合階段。工程預設配置為standalone_mmult()。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 43

點選後矩陣乘法運算函式如下:

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 44

矩陣乘法運算函式如下:

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 45

matrix_demo_test。cpp中提供了矩陣乘法運算函式mmult_sw(),程式將mmult_sw()的運算結果和頂層函式standalone_mmult()的運算結果進行對比。如結果一致,則說明頂層函式邏輯正確。mmult_sw()函式不呼叫邏輯資源,而standalone_mmult()函式呼叫邏輯資源。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 46

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 47

編譯與模擬

請參考本文件HLS開發流程說明章節,進行編譯。編譯完成後,進入模擬介面點選綜合

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 48

執行完畢後,將在Console視窗列印如下提示資訊,說明頂層函式邏輯正確。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 49

綜合

案例提供三個solution,每個solution的演算法執行效率不同。由於solution3所用資源較多,xc7z010無法滿足資源要求,因此案例預設使用solution2生成IP核。

進行綜合時,需將頂層函式修改為HLS_accel()。修改頂層函式後請點選

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 50

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 51

綜合完成後,可看到三個solution的詳細資訊。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 52

從上圖可看出solution3的執行效率最高,但消耗資源最多。

solution1分析

雙擊選中solution1,然後點選Analysis。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 56

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 54

可看到矩陣乘法運算函數里的三個for迴圈均為順序執行,因此耗時最長。

2。solution2分析

雙擊開啟solution2的directives。tcl,可看到下圖語句。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 55

PIPELINE的作用是允許在函式中併發執行操作,減少函式執行時間。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 56

solution2將mmult_hw()的L2 for迴圈進行了PIPELINE最佳化。開啟solution2的Analysis,可看到矩陣乘法運算函數里的L1/L2 for迴圈並行執行,因此耗時較短。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 57

3。solution3分析

雙擊開啟solution3的directives。tcl,可看到下圖語句。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 58

ARRAY_PARTITION指令的作用是將大陣列劃分為多個小陣列或單獨的暫存器,以提高對資料的訪問效率。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 59

solution3在solution2的基礎上,使用了ARRAY_PARTITION指令將函式mmult_hw()的陣列a、b分別分拆為16個數組,增加了資料吞吐量,提高了運算效率。

開啟標頭檔案matrix_demo。h,然後雙擊選中solution3開啟工程Directive,可對編譯指令進行修改或最佳化。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 60

IP核測試

請參考本文件HLS開發流程說明章節,完成IP核測試前的準備工作。

HLS工程生成的IP核為HLS_accel_0。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 61

PL端IP核測試Vivado工程說明

浮點矩陣乘法運算加速器IP核透過AXI DMA IP核連線到PS端ACP介面,從而連通到PS端L2快取。ACP為64位AXI從介面,它提供了一個非同步快取相關接入點,實現了PS和PL端加速器之間的低延遲路徑。

AXI Timer IP核用於計數,可透過其暫存器來計算浮點矩陣乘法運算加速器IP核的運算時間。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 62

PS端IP核測試裸機工程說明

PS端執行32*32的浮點矩陣乘法運算,並將PS端和PL端用時進行比較。PL端的浮點矩陣乘法運算用時從AXI Timer IP核中讀取。

開啟裸機工程,確保lscript。ld檔案的“Stack Size”為0x3000,然後進行編譯。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 63

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 64

測試說明

參考PS端裸機與FreeRTOS案例開發手冊說明,載入PS端裸機

。elf格式可執行檔案

、PL端

。bit格式可執行檔案

後,即可看到PS端串列埠除錯終端列印如下資訊。

可看出PS端執行矩陣乘法運算消耗了25880個時鐘,PL端(solution2)消耗了20587個時鐘,PL端執行效率為PS端的1。256倍。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 65

若使用solution3生成的IP核,PL端消耗了5246個時鐘,PL端執行效率為PS端的4。933倍。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 66

sobel_demo案例

案例功能:對YUV格式影片進行Sobel(邊緣檢測)演算法處理。

Sobel詳細開發說明可參考產品資料“6-開發參考資料\Xilinx官方參考文件\”目錄下的如下文件。

xapp1167。pdf

xapp890-zynq-sobel-vivado-hls。pdf

HLS工程說明

時鐘

HLS工程配置的時鐘為100MHz。如需修改時鐘頻率,請開啟HLS工程後點擊,在彈出的介面中的Synthesis欄目進行修改。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 67

頂層函式

案例頂層函式為opencv_top。cpp中的hls_image_filter()。首先在sobel_demo。cpp中呼叫image_filter(),最終呼叫opencv_top。cpp中的頂層函式hls_image_filter()。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 68

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖69

點選後,可在彈出的介面中的Synthesis欄目檢視或設定頂層函式。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 70

輸入輸出影象在sobel_demo。h中已定義,解析度均為1920*1080。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 71

Sobel運算元在sobel_demo。cpp中已定義。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 72

編譯與模擬

請參考本文件HLS開發流程說明章節,進行編譯。編譯完成後,進入模擬介面點選進行全速執行。

執行完畢後,將在Console視窗列印如下提示資訊,說明頂層函式邏輯正確。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 73

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 74

同時得到經過hls_image_filter()和opencv_image_filter()函式處理的圖片。

程式將opencv_image_filter()的運算結果和頂層函式hls_image_filter()的運算結果進行對比。如結果一致,則說明頂層函式邏輯正確。opencv_image_filter()函式不呼叫邏輯資源,而hls_image_filter()函式呼叫邏輯資源。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 75 hls_image_filter()處理結果

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 76 opencv_image_filter()處理結果

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 77 原始影象

IP核測試

請參考本文件HLS開發流程說明章節,完成IP核測試前的準備工作。

HLS工程生成的IP核為image_filter_0。

嵌入式硬體開發學習教程——Xilinx Vivado HLS案例(3)

圖 78

由於產品資料“4-軟體資料\Demo\All-Programmable-SoC-demos\”目錄下的camera_edge_display案例使用到本案例IP核,因此請參考PS + PL異構多核案例開發手冊的camera_edge_display案例說明進行IP核測試。