XILINX HLS + Vivado + SDK實現通過AXI-Master協議從ARM(PS)傳輸數組到FPGA(PL)端RAM

XILINX HLS + Vivado + SDK實現自定義IP通過AXI-Master協議從ARM(PS)傳輸數組到FPGA(PL)端RAM

簡介

最近在使用XILINX ZYNQ的Soc板子做卷積神經網絡(CNN)加速器,遇到了個問題:如何從PS傳輸批量權重到PL端?
網上找了下發現比較少資料,XILINX官網有一個例程:2013.4 Vivado HLS - Example showing how to use logic debug to test an AXI Lite Slave and AXI Master interface, and then verify it in SDK.
最後通過連夜摸索把問題解決了。

解決思路

將大數組從PS存到BRAM中,再通過塊級控制協議通知ip運行,然後ip使用AXI-Master協議

1.在HLS定義IP的輸出輸入協議,以及使用memcpy複製BRAM的值到PL定義的RAM裏

//addrMaster爲BRAM首地址,result爲神經網絡分類結果
void LeNet(volatile float *addrMaster,int* result){
//管腳協議配置,m_axi 代表 AXI-Master,s_axilite 代表 AXI-Lite
#pragma HLS INTERFACE m_axi depth=62855 port=addrMaster offset=slave bundle=MASTER_BUS
//將兩信號綁到同一個bus口CRTL_BUS
#pragma HLS INTERFACE s_axilite port=result bundle=CRTL_BUS
#pragma HLS INTERFACE s_axilite port=return bundle=CRTL_BUS
//定義一個RAM
float data[62855];
//對內存塊的值進行復制
memcpy(data,(const float*)addrMaster,62855*sizeof(float));

//剩餘代碼省略...
}

實現完成之後封裝成IP導入到Vivado項目

2.在Vivado設計片內連接電路,以及分配地址

2.1.設計電路,左下角爲自定義IP
內部電路
2.2.在Address Editor對內存進行分配,float類型爲32位,62855 只需要不到1M的空間,Offset Address爲始地址內存分配

3.在HLS生成IP後會生成對應的驅動文件,在SDK調用即可

關鍵代碼解讀

3.1 模塊初始化

XLetnet HlsXLetnet;
XLetnet_Config *ExamplePtr;
printf("Look Up the device configuration.\n");
ExamplePtr = XLetnet_LookupConfig(XPAR_LETNET_0_DEVICE_ID);
if (!ExamplePtr) {
printf("ERROR: Lookup of accelerator configuration failed.\n\r");
return XST_FAILURE;
}
printf("Initialize the Device\n");
long status = XLetnet_CfgInitialize(&HlsXLetnet, ExamplePtr);
if (status != XST_SUCCESS) {
printf("ERROR: Could not initialize accelerator.\n\r");
return(-1);
}

3.2 往BRAM存入float參數
XILINX SDK Xil_Out32傳入float類型參數的解決方案

3.3 塊級控制(ap_ctrl),函數皆爲HLS生成的驅動函數

//定義BRAM始地址,XLetnet_Set_addrMaster是一個自動生成的驅動函數,對應HLS自定義IP的addrMaster參數
XLetnet_Set_addrMaster(&HlsXLetnet,XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR);
//模塊啓動
XLetnet_Start(&HlsXLetnet);
//等待運行結束
while (XLetnet_IsDone(&HlsXLetnet) == 0);
//獲得分類結果
u32 res = XLetnet_Get_r(&HlsXLetnet);

運行效果

初始化權重和識別一張圖片只需要0.11秒左右,從BRAM打印出權重和圖片的前十個參數,用於檢查參數傳輸是否成功。
運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章