前 言
本文主要介紹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和高低溫測試驗證,穩定可靠,可滿足各種工業應用環境。
TLZ7x-EasyEVM-S評估板
TLZ7x-EasyEVM-S評估板
評估板介面資源豐富,引出千兆網口、雙路CAMERA、
USB、Micro SD、CAN、UART等介面,支援LCD顯示拓展及Qt圖形介面開發,方便快速進行產品方案評估與技術預研。
matrix_demo案例
案例功能:實現32*32浮點矩陣乘法運算功能,同時提供提高運算效率的方法。
HLS工程說明
時鐘
HLS工程配置的時鐘為100MHz。如需修改時鐘頻率,請開啟HLS工程後點擊後,在彈出的介面中的Synthesis欄目進行修改。
圖 42
(2)頂層函式
案例有兩個可選的頂層函式,分別為standalone_mmult()和HLS_accel()。前者為矩陣乘法運算函式,用於模擬階段;後者基於前者將資料輸入輸出介面封裝成AXI4-Stream介面,用於綜合階段。工程預設配置為standalone_mmult()。
圖 43
點選後矩陣乘法運算函式如下:
圖 44
矩陣乘法運算函式如下:
圖 45
matrix_demo_test。cpp中提供了矩陣乘法運算函式mmult_sw(),程式將mmult_sw()的運算結果和頂層函式standalone_mmult()的運算結果進行對比。如結果一致,則說明頂層函式邏輯正確。mmult_sw()函式不呼叫邏輯資源,而standalone_mmult()函式呼叫邏輯資源。
圖 46
圖 47
編譯與模擬
請參考本文件HLS開發流程說明章節,進行編譯。編譯完成後,進入模擬介面點選綜合
圖 48
執行完畢後,將在Console視窗列印如下提示資訊,說明頂層函式邏輯正確。
圖 49
綜合
案例提供三個solution,每個solution的演算法執行效率不同。由於solution3所用資源較多,xc7z010無法滿足資源要求,因此案例預設使用solution2生成IP核。
進行綜合時,需將頂層函式修改為HLS_accel()。修改頂層函式後請點選
圖 50
圖 51
綜合完成後,可看到三個solution的詳細資訊。
圖 52
從上圖可看出solution3的執行效率最高,但消耗資源最多。
solution1分析
雙擊選中solution1,然後點選Analysis。
圖 56
圖 54
可看到矩陣乘法運算函數里的三個for迴圈均為順序執行,因此耗時最長。
2。solution2分析
雙擊開啟solution2的directives。tcl,可看到下圖語句。
圖 55
PIPELINE的作用是允許在函式中併發執行操作,減少函式執行時間。
圖 56
solution2將mmult_hw()的L2 for迴圈進行了PIPELINE最佳化。開啟solution2的Analysis,可看到矩陣乘法運算函數里的L1/L2 for迴圈並行執行,因此耗時較短。
圖 57
3。solution3分析
雙擊開啟solution3的directives。tcl,可看到下圖語句。
圖 58
ARRAY_PARTITION指令的作用是將大陣列劃分為多個小陣列或單獨的暫存器,以提高對資料的訪問效率。
圖 59
solution3在solution2的基礎上,使用了ARRAY_PARTITION指令將函式mmult_hw()的陣列a、b分別分拆為16個數組,增加了資料吞吐量,提高了運算效率。
開啟標頭檔案matrix_demo。h,然後雙擊選中solution3開啟工程Directive,可對編譯指令進行修改或最佳化。
圖 60
IP核測試
請參考本文件HLS開發流程說明章節,完成IP核測試前的準備工作。
HLS工程生成的IP核為HLS_accel_0。
圖 61
PL端IP核測試Vivado工程說明
浮點矩陣乘法運算加速器IP核透過AXI DMA IP核連線到PS端ACP介面,從而連通到PS端L2快取。ACP為64位AXI從介面,它提供了一個非同步快取相關接入點,實現了PS和PL端加速器之間的低延遲路徑。
AXI Timer IP核用於計數,可透過其暫存器來計算浮點矩陣乘法運算加速器IP核的運算時間。
圖 62
PS端IP核測試裸機工程說明
PS端執行32*32的浮點矩陣乘法運算,並將PS端和PL端用時進行比較。PL端的浮點矩陣乘法運算用時從AXI Timer IP核中讀取。
開啟裸機工程,確保lscript。ld檔案的“Stack Size”為0x3000,然後進行編譯。
圖 63
圖 64
測試說明
參考PS端裸機與FreeRTOS案例開發手冊說明,載入PS端裸機
。elf格式可執行檔案
、PL端
。bit格式可執行檔案
後,即可看到PS端串列埠除錯終端列印如下資訊。
可看出PS端執行矩陣乘法運算消耗了25880個時鐘,PL端(solution2)消耗了20587個時鐘,PL端執行效率為PS端的1。256倍。
圖 65
若使用solution3生成的IP核,PL端消耗了5246個時鐘,PL端執行效率為PS端的4。933倍。
圖 66
sobel_demo案例
案例功能:對YUV格式影片進行Sobel(邊緣檢測)演算法處理。
Sobel詳細開發說明可參考產品資料“6-開發參考資料\Xilinx官方參考文件\”目錄下的如下文件。
xapp1167。pdf
xapp890-zynq-sobel-vivado-hls。pdf
HLS工程說明
時鐘
HLS工程配置的時鐘為100MHz。如需修改時鐘頻率,請開啟HLS工程後點擊,在彈出的介面中的Synthesis欄目進行修改。
圖 67
頂層函式
案例頂層函式為opencv_top。cpp中的hls_image_filter()。首先在sobel_demo。cpp中呼叫image_filter(),最終呼叫opencv_top。cpp中的頂層函式hls_image_filter()。
圖 68
圖69
點選後,可在彈出的介面中的Synthesis欄目檢視或設定頂層函式。
圖 70
輸入輸出影象在sobel_demo。h中已定義,解析度均為1920*1080。
圖 71
Sobel運算元在sobel_demo。cpp中已定義。
圖 72
編譯與模擬
請參考本文件HLS開發流程說明章節,進行編譯。編譯完成後,進入模擬介面點選進行全速執行。
執行完畢後,將在Console視窗列印如下提示資訊,說明頂層函式邏輯正確。
圖 73
圖 74
同時得到經過hls_image_filter()和opencv_image_filter()函式處理的圖片。
程式將opencv_image_filter()的運算結果和頂層函式hls_image_filter()的運算結果進行對比。如結果一致,則說明頂層函式邏輯正確。opencv_image_filter()函式不呼叫邏輯資源,而hls_image_filter()函式呼叫邏輯資源。
圖 75 hls_image_filter()處理結果
圖 76 opencv_image_filter()處理結果
圖 77 原始影象
IP核測試
請參考本文件HLS開發流程說明章節,完成IP核測試前的準備工作。
HLS工程生成的IP核為image_filter_0。
圖 78
由於產品資料“4-軟體資料\Demo\All-Programmable-SoC-demos\”目錄下的camera_edge_display案例使用到本案例IP核,因此請參考PS + PL異構多核案例開發手冊的camera_edge_display案例說明進行IP核測試。