基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
基于PYNQ-Z2開發(fā)板實現(xiàn)矩陣乘法加速
主要內(nèi)容
1、在Vivado HLS中生成矩陣乘法加速的IP核。
2、在Vivado中完成Block Design。
3、在Jupyter Notebook上完成IP的調(diào)用。
完整項目工程文件下載鏈接見文末
所需硬件
PYNQ-Z2開發(fā)板、USB數(shù)據(jù)線、網(wǎng)線
SD卡、讀卡器
開發(fā)板配置參考鏈接
1、Vivado HLS生成矩陣乘法加速IP
- HLS硬件配置信息
- mul.h關(guān)鍵代碼
定義輸入的a,b矩陣維度和輸出矩陣的維度
- mul.cpp關(guān)鍵代碼
- 在約束文件中添加接口約束和循環(huán)流水,實現(xiàn)矩陣乘法的硬件加速
此處IP核使用ap_ctrl_none接口協(xié)議,輸入的a,b矩陣和輸出的res矩陣均使用axis流數(shù)據(jù),注意流數(shù)據(jù)傳輸中Block Design中需添加DMAip核進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換。 - 編寫相關(guān)的C仿真代碼,此處不表,詳見項目文件。
進(jìn)行C仿真
- C仿真結(jié)果
- 進(jìn)行C綜合
- 進(jìn)行IP導(dǎo)出
- 生成的IP在./solution1/impl/ip路徑下,為一壓縮包,如下圖所示。
2、Vivado進(jìn)行Block Design
-
Vivado硬件配置信息
-
添加Vivado HLS生成的IP,PROJECT MANAGER->Settings
-
Project Settings->IP->Repository
- 點擊+號,選擇IP所在路徑進(jìn)行IP的添加
- 然后進(jìn)行Block Design
- 首先添加ZYNQ的IP
- 雙擊生成的ZYNQip核,進(jìn)行配置參數(shù)的修改,首先使能HP接口
- 取消勾選USB接口,然后點擊OK
- 添加HLS編寫的IP
- 添加兩個DMA的IP
- 結(jié)果如下
- 因為我們有兩個AXI流數(shù)據(jù)的入口,一個AXI流數(shù)據(jù)的輸出,所以要對DMA的讀寫端口數(shù)量進(jìn)行修改,配置兩個DMA的讀端口,1個DMA的寫端口。下面對DMA的IP參數(shù)進(jìn)行設(shè)置。
- DMA0:
- DMA1:
- 之后進(jìn)行手動連線,下圖中標(biāo)黃的部分
- 然后繼續(xù)自動完成連線
- 最終的Block如下圖所示
- 進(jìn)行驗證
- 此處出現(xiàn)警告信息,可以不管,主要是流數(shù)據(jù)的Last信號缺失。
- 之后生成頂層調(diào)用文件,右擊頂層模塊,點擊Create HDL Wrapper…
- 之后生成BIT文件 PROGRAM AND DEBUG->Generate Bitstream
- Bitstream生成后彈出彈窗,點擊cancel。然后點擊File->Export->Export Hardware
- 然后點擊File->Export->Export Bitstream File,輸出路徑選擇項目根目錄。
- 在下圖所示的路徑中,找到.hwh文件,拷貝到文件的根目錄。
- 將bit文件、tcl文件和hwh文件重命名成一個名字,如下所示。
至此完成了Vivado相關(guān)的工作。
3、Jupyter Notebook進(jìn)行矩陣乘法加速IP的調(diào)用
PYNQ-Z2板的詳細(xì)配置過程見文章頂?shù)南嚓P(guān)鏈接,此處默認(rèn)大家能正常啟動板子。
- 在Jupyter Notebook上新建文件夾,進(jìn)行文件的上傳。點擊Upload上傳之前生成的bit文件、tcl文件和hwh文件。
- 進(jìn)行新建python文件操作
- python調(diào)用IP相關(guān)代碼
- 點擊run查看結(jié)果
傳入的a,b矩陣為32*32的矩陣,元素均為8。結(jié)果顯示乘法IP核調(diào)用正常。
項目工程下載鏈接
[2020.6.18更新,解決Block Design中TLAST管腳警告的問題]
改變數(shù)據(jù)類型
mul.c:
mul.h:
#ifndef __MATRIXMUL_H__ #define __MATRIXMUL_H__#include <cmath> #include <ap_axi_sdata.h>// Uncomment this line to compare TB vs HW C-model and/or RTL //#define HW_COSIM#define MAT_A_ROWS 32 #define MAT_A_COLS 32 #define MAT_B_ROWS 32 #define MAT_B_COLS 32 #define SIZE 1024typedef ap_axis<32,0,0,0> mat_a_t; typedef ap_axis<32,0,0,0> mat_b_t; typedef ap_axis<32,0,0,0> result_t;// Prototype of top level function for C-synthesis void matrixmul(mat_a_t a[SIZE],mat_b_t b[SIZE],result_t res[SIZE]);template <typename T> ap_axis<32,0,0,0> push_stream(T const &v, bool last = false) { #pragma HLS INLINEap_axis<32,0,0,0> e;//assert(sizeof(T) == sizeof(int));union{int oval;T ival;} converter;converter.ival = v;e.data = converter.oval;e.strb=-1;e.keep=15;e.last = last ? 1 : 0;return e; }#endif // __MATRIXMUL_H__ not defined使用ap_axis數(shù)據(jù)類型,其中含有l(wèi)ast信號,需對最后一次輸出的信號的last信號賦1。或者自己定義數(shù)據(jù)類型的結(jié)構(gòu)體,含last信號即可。這時進(jìn)行Block Design的驗證時不會再報TLAST信號丟失的Warning。
總結(jié)
以上是生活随笔為你收集整理的基于PYNQ-Z2开发板实现矩阵乘法加速详细流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器上装filezilla serve
- 下一篇: 填问卷,得《2015中国呼叫中心知识库现