【引言】
本系列教程演示如何使用xilinx的HLS工具進(jìn)行算法的硬件加速。分為三個(gè)部分,分別為HLS端IP設(shè)計(jì),vivado硬件環(huán)境搭建,SDK端軟件控制。在HLS端,要將進(jìn)行硬件加速的軟件算法轉(zhuǎn)換為RTL級(jí)電路,生成便于嵌入式使用的axi控制端口,進(jìn)行數(shù)據(jù)的傳輸和模塊的控制。【HLS介紹】
HLS可以將算法直接映射為RTL電路,實(shí)現(xiàn)了高層次綜合。vivado-HLS可以實(shí)現(xiàn)直接使用 C,C++ 以及 System C 語(yǔ)言對(duì)Xilinx的FPGA器件進(jìn)行編程。用戶無(wú)需手動(dòng)創(chuàng)建 RTL,通過(guò)高層次綜合生成HDL級(jí)的IP核,從而加速IP創(chuàng)建。HLS的官方參考文檔主要為:ug871( ug871-vivado-high-level-synthesis-tutorial.pdf )和ug902(ug902-vivado-high-level-synthesis.pdf)。 對(duì)于Vivado Hls來(lái)說(shuō),輸入包括Tesbench,C/C++源代碼和Directives,相應(yīng)的輸出為IP Catalog,DSP和SysGen,特別的,一個(gè)工程只能有一個(gè)頂層函數(shù)用于綜和,這個(gè)頂層函數(shù)下面的子函數(shù)也是可以被綜合的,會(huì)生成相應(yīng)的VHDL和Verilog代碼,所以,C綜合后的RTL代碼結(jié)構(gòu)通常是跟原始C描述的結(jié)構(gòu)是一致的,除非是子函數(shù)功能很簡(jiǎn)單,所需要的邏輯量很小。并不是所有的C/C++都可以被綜合,動(dòng)態(tài)內(nèi)存分配和涉及到操作系統(tǒng)層面的操作不可以被綜合。Vivado HLS 的設(shè)計(jì)流程如下:
Step 1: 新建一個(gè)工程
1,Creat New Project新建文檔,輸入工程名稱(chēng)和工程路徑。完成后點(diǎn)擊Next。
2,頭文件。axi_interfaces.h
typedef int din_t;
typedef int dout_t;
typedefintdacc_t;
voidaxi_interfaces(dout_td_o[N],din_td_i[N]);
3,測(cè)試文件。axi_interfaces_test.c
int main () {
// Create input data
din_t d_i[N] = {10, 20, 30, 40, 50, 60, 70, 80,
11, 21, 31, 41, 51, 61, 71, 81,
12, 22, 32, 42, 52, 62, 72, 82,
13, 23, 33, 43, 53, 63, 73, 83};
dout_t d_o[N];
int i, retval=0;
FILE*fp;
// Call the function to operate on the data
axi_interfaces(d_o,d_i);
// Save the results to a file
fp=fopen("result.dat","w");
fprintf(fp, "Din Dout ");
for(i=0;i
fprintf(fp, "%d %d ", d_i[i], d_o[i]);
}
fclose(fp);
// Compare the results file with the golden results
retval = system("diff --brief -w result.dat result.golden.dat");
if (retval != 0) {
printf("Test failed !!! ");
retval=1;
} else {
printf("Test passed ! ");
}
// Return 0 if the test passes
return retval;
}
4,測(cè)試數(shù)據(jù)。result.golden.datDin Dout
10 10
20 20
30 30
40 40
50 50
60 60
70 70
80 80
11 21
21 41
31 61
41 81
51 101
61 121
71 141
81 161
12 33
22 63
32 93
42 123
52 153
62 183
72 213
82 243
13 46
23 86
33 126
43 166
53 206
63 246
73 286
83 326
Step 2: C源代碼驗(yàn)證
本步驟是對(duì)功能代碼的邏輯驗(yàn)證,相當(dāng)于功能前仿。1,測(cè)試程序的代碼入下圖。該程序先調(diào)用綜合的函數(shù),得到計(jì)算結(jié)果,再和預(yù)先的數(shù)據(jù)集進(jìn)行比較,最后返回計(jì)較的結(jié)果。計(jì)算結(jié)果和預(yù)先的數(shù)據(jù)集一致時(shí),測(cè)試通過(guò),不一致時(shí),測(cè)試失敗。需要查看代碼,尋找錯(cuò)誤。
Step 3: 高層次綜合
本步驟是把功能代碼的綜合成RTL邏輯。1,點(diǎn)擊紅框中的按鈕,將C代碼綜合成RTL。綜合完成后,查看結(jié)果。
Step 4: 綜合優(yōu)化
在使用高層次綜合,創(chuàng)造高質(zhì)量的RTL設(shè)計(jì)時(shí),一個(gè)重要部分就是對(duì)C代碼進(jìn)行優(yōu)化。Vivado HLS擁有自動(dòng)優(yōu)化的功能,試圖最小化loop(循環(huán))和function(函數(shù))的latency。除了自動(dòng)優(yōu)化,我們可以手動(dòng)進(jìn)行程序優(yōu)化,即用在不同的solution中添加不同的directive(優(yōu)化指令)的方法,進(jìn)行優(yōu)化和性能對(duì)比。其中,對(duì)同一個(gè)工程,可以建立多個(gè)不同的solution(解決方案),為不同的solution添加directive可以達(dá)到如下目的。優(yōu)化的類(lèi)型可分為如下類(lèi)別:l端口優(yōu)化。指定不同類(lèi)型的模塊端口。l函數(shù)優(yōu)化。加快函數(shù)的執(zhí)行速度,減小執(zhí)行周期。l循壞優(yōu)化。利用展開(kāi)和流水線形式,減小循環(huán)的執(zhí)行周期。1,點(diǎn)擊下面紅框的圖標(biāo),新建solution。
Step 5: 綜合結(jié)果文件
綜合完成后,在各個(gè)solution的syn文件夾中可以看到綜合器生成的RTL代碼。包括systemc,VHDL,Verilog。
Step 6: 導(dǎo)出IP
在菜單里Solution>Export TL,設(shè)置如下,點(diǎn)擊ok。
Step 7: 總結(jié)
本文重點(diǎn)講解了hls軟件的使用方法和優(yōu)化方法,在C語(yǔ)言模塊設(shè)計(jì)上沒(méi)有重點(diǎn)講解。在掌握了hls軟件的基本用法和優(yōu)化方法后,接下來(lái)就可以設(shè)計(jì)更加復(fù)雜的C語(yǔ)言模塊,進(jìn)行rtl綜合,加快設(shè)計(jì)開(kāi)發(fā)的速度。審核編輯 :李倩
-
算法
+關(guān)注
關(guān)注
23文章
4684瀏覽量
94394 -
Xilinx
+關(guān)注
關(guān)注
73文章
2179瀏覽量
123967 -
Vivado
+關(guān)注
關(guān)注
19文章
826瀏覽量
67964
原文標(biāo)題:Vivado-hls使用實(shí)例
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Vivado HLS設(shè)計(jì)流程

算法加速的概念、意義、流程和應(yīng)用
數(shù)據(jù)中心中的FPGA硬件加速器


基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

基于 DSP5509 進(jìn)行數(shù)字圖像處理中 Sobel 算子邊緣檢測(cè)的硬件連接電路圖
TDA4VM上的硬件加速運(yùn)動(dòng)恢復(fù)結(jié)構(gòu)算法

AM62A SoC通過(guò)硬件加速視覺(jué)處理改進(jìn)條形碼讀取器

適用于數(shù)據(jù)中心應(yīng)用中的硬件加速器的直流/直流轉(zhuǎn)換器解決方案

優(yōu)化 FPGA HLS 設(shè)計(jì)
圖形圖像硬件加速器卡設(shè)計(jì)原理圖:270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

評(píng)論