終于到了HLS部分。HLS是High Level Synthesis的縮寫,是一種可以將高級程序設(shè)計語言C,C++,SystemC綜合為RTL代碼的工具。生產(chǎn)力的發(fā)展推動了設(shè)計模式。在電子技術(shù)初級階段,人們關(guān)注的是RLC電路,通過建立微分方程求解電路響應(yīng)。門級電路是對RLC的初步封裝,人們進而采用布爾代數(shù)、卡諾圖進行電路設(shè)計與分析。之后隨著集成電路進一步發(fā)展,門電路可以集成為寄存器、觸發(fā)器、ROM等宏單元,設(shè)計工具也變得更為高度模塊化。算法級別的電路設(shè)計,則一直沒有特別好的工具,直到出現(xiàn)了HLS。HLS可以將算法直接映射為RTL電路,實現(xiàn)了高層次綜合。從這個層面上講,System Generator也是一種高層次綜合工具,因為它將matlab算法描述綜合為RTL代碼。如果今后機器學(xué)習(xí)、人工智能獲得重大突破,或許會出現(xiàn)將人類自然語言綜合為RTL代碼的工具,不知我們是否能見證它的面世。HLS的學(xué)習(xí)資源可以參考。本節(jié)給出較為通用的矩陣與向量相乘例子,從全串行到全并行進行了一步步優(yōu)化實現(xiàn)。矩陣實驗室Matlab是比較常用的數(shù)學(xué)仿真軟件。本博主用的是R2013a版本。為了驗證矩陣向量相乘正確性,我們先用matlab生成測試矩陣和向量,并利用matlab計算結(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的簡單例子,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); ?
?
給出測試?yán)讨?,A如下:[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運行matlab腳本之后,生成三個文件:A.h,b.h,c.h,這些是作為HLS程序的輸入數(shù)據(jù)和參考結(jié)果。下面我們用HLS工具實現(xiàn)上述矩陣X向量的功能。第一步,運行Vivado HLS。
選擇第一項,Create New Project,建立新工程MatrixMultiply
輸入路徑和工程名之后,點Next。
添加頂層模塊文件。這里我們Top Functions輸入MatrixMultiply,然后New File...,新建一個.c文件,命名為MatrixMultiply.c(后綴不要省略?。?,然后點Next添加頂層文件測試腳本。這里New一個文件TestMatrixMultiply.c(后綴不要省略!),然后Add前面用Matlab生成的A.h,b.h,c.h,如下圖所示:
點Next,選擇解決方案配置,如下圖所示
其余保持默認(rèn),只修改Part Selection部分,改為ZedBoard。改完后,F(xiàn)inish即可進入主界面,如下圖所示
可以看出,Vivado HLS界面很像很像Xilinx SDK,不同的是前者負責(zé)PL部分開發(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;??
????}??
} ?
?
評論
查看更多