終于到了HLS部分。HLS是High Level Synthesis的縮寫,是一種可以將高級(jí)程序設(shè)計(jì)語言C,C++,SystemC綜合為RTL代碼的工具。生產(chǎn)力的發(fā)展推動(dòng)了設(shè)計(jì)模式。在電子技術(shù)初級(jí)階段,人們關(guān)注的是RLC電路,通過建立微分方程求解電路響應(yīng)。門級(jí)電路是對(duì)RLC的初步封裝,人們進(jìn)而采用布爾代數(shù)、卡諾圖進(jìn)行電路設(shè)計(jì)與分析。之后隨著集成電路進(jìn)一步發(fā)展,門電路可以集成為寄存器、觸發(fā)器、ROM等宏單元,設(shè)計(jì)工具也變得更為高度模塊化。算法級(jí)別的電路設(shè)計(jì),則一直沒有特別好的工具,直到出現(xiàn)了HLS。HLS可以將算法直接映射為RTL電路,實(shí)現(xiàn)了高層次綜合。從這個(gè)層面上講,System Generator也是一種高層次綜合工具,因?yàn)樗鼘?a href="http://www.xsypw.cn/tags/matlab/" target="_blank">matlab算法描述綜合為RTL代碼。如果今后機(jī)器學(xué)習(xí)、人工智能獲得重大突破,或許會(huì)出現(xiàn)將人類自然語言綜合為RTL代碼的工具,不知我們是否能見證它的面世。HLS的學(xué)習(xí)資源可以參考。本節(jié)給出較為通用的矩陣與向量相乘例子,從全串行到全并行進(jìn)行了一步步優(yōu)化實(shí)現(xiàn)。矩陣實(shí)驗(yàn)室Matlab是比較常用的數(shù)學(xué)仿真軟件。本博主用的是R2013a版本。為了驗(yàn)證矩陣向量相乘正確性,我們先用matlab生成測(cè)試矩陣和向量,并利用matlab計(jì)算結(jié)果。代碼如下:[plain]?
?
clear;??
clc;??
close?all;??
??
N?=?5;??
??
A?=?randi([1,100],N,N);??
b?=?randi(100,N,1);??
??
c?=?A*b;??
??
KKK_SaveToCHeaderFile(A,'A.h');??
??
KKK_SaveToCHeaderFile(b,'b.h');??
KKK_SaveToCHeaderFile(c,'c.h');??
?
這里給出的是A*b = c的簡(jiǎn)單例子,A為5X5矩陣,b為5X1向量,結(jié)果c為5X1向量。其中KKK_SaveToCHeaderFile()是將矩陣、向量保存為C語言數(shù)組的子函數(shù),定義如下:[plain]?
?
function?[]?=?KKK_SaveToCHeaderFile(var,fn)??
fid?=?fopen(fn,'w');??
var?=?reshape(var.',1,[]);??
fprintf(fid,'%d, ',var);??
fclose(fid); ?
?
給出測(cè)試?yán)讨校珹如下:[plain]?
?
82??10??16??15??66??
91??28??98??43??4??
13??55??96??92??85??
92??96??49??80??94??
64??97??81??96??68 ?
?
b如下:[plain]?
?
76??
75??
40??
66??
18 ?
?
得到的c如下:980015846165552312422939運(yùn)行matlab腳本之后,生成三個(gè)文件:A.h,b.h,c.h,這些是作為HLS程序的輸入數(shù)據(jù)和參考結(jié)果。下面我們用HLS工具實(shí)現(xiàn)上述矩陣X向量的功能。第一步,運(yùn)行Vivado HLS。
選擇第一項(xiàng),Create New Project,建立新工程MatrixMultiply
輸入路徑和工程名之后,點(diǎn)Next。
添加頂層模塊文件。這里我們Top Functions輸入MatrixMultiply,然后New File...,新建一個(gè).c文件,命名為MatrixMultiply.c(后綴不要省略!),然后點(diǎn)Next添加頂層文件測(cè)試腳本。這里New一個(gè)文件TestMatrixMultiply.c(后綴不要省略!),然后Add前面用Matlab生成的A.h,b.h,c.h,如下圖所示:
點(diǎn)Next,選擇解決方案配置,如下圖所示
其余保持默認(rèn),只修改Part Selection部分,改為ZedBoard。改完后,F(xiàn)inish即可進(jìn)入主界面,如下圖所示
可以看出,Vivado HLS界面很像很像Xilinx SDK,不同的是前者負(fù)責(zé)PL部分開發(fā),后者負(fù)責(zé)PS軟件編寫,定位不同決定了二者今后的路必然走向分歧。將MatrixMultiply.c內(nèi)容改為:[cpp]?
?
typedef?int?data_type;??
#define?N?5??
??
void?MatrixMultiply(data_type?AA[N*N],data_type?bb[N],data_type?cc[N])??
{??
????int?i,j;??
????for(i?=?0;i
????{??
????????data_type?sum?=?0;??
????????for(j?=?0;j
????????{??
????????????sum?+=?AA[i*N+j]*bb[j];??
????????}??
????????cc[i]?=?sum;??
????}??
} ?
?
將TestMatrixMultiply.c內(nèi)容改為:[cpp]?
#include?
typedef?int?data_type;??
#define?N?5 const?data_type?MatrixA[]?=?{??
#include?"A.h"??
};??
const?data_type?Vector_b[]?=?{??
#include?"b.h"??
};??
const?data_type?MatlabResult_c[]?=?{??
#include?"c.h"??
}; data_type?HLS_Result_c[N]?=?{0};??
void?CheckResult(data_type?*?matlab_result,data_type?*?your_result);??
int?main(void)??
{??
?printf("Checking?Results:
");??
?MatrixMultiply(MatrixA,Vector_b,HLS_Result_c);??
?CheckResult(MatlabResult_c,HLS_Result_c);??
?return?0;??
}??
void?CheckResult(data_type?*?matlab_result,data_type?*?your_result)??
{??
?int?i;??
?for(i?=?0;i
?{??
??printf("Idx?%d:?Error?=?%d?
",i,matlab_result[i]-your_result[i]);??
?}??
}??
?
首先進(jìn)行C語言仿真驗(yàn)證,點(diǎn)這個(gè)按鈕:
#include?
typedef?uint15?data_type; ?
?
由于matlab生成的隨機(jī)數(shù)在1~100以內(nèi),乘積范圍不會(huì)超過10000,于是取15bit就能滿足要求。首先驗(yàn)證下結(jié)果的正確性,用C Simulation試一下。結(jié)果如下:
評(píng)論
查看更多