資源描述:
《Board從入門到精通系列(八).doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、Board從入門到精通系列(八) 終于到了HLS部分。HLS是HighLevelSynthesis的縮寫,是一種可以將高級程序設(shè)計(jì)語言C,C++,SystemC綜合為RTL代碼的工具。生產(chǎn)力的發(fā)展推動了設(shè)計(jì)模式。在電子技術(shù)初級階段,人們關(guān)注的是RLC電路,通過建立微分方程求解電路響應(yīng)。門級電路是對RLC的初步封裝,人們進(jìn)而采用布爾代數(shù)、卡諾圖進(jìn)行電路設(shè)計(jì)與分析。之后隨著集成電路進(jìn)一步發(fā)展,門電路可以集成為寄存器、觸發(fā)器、ROM等宏單元,設(shè)計(jì)工具也變得更為高度模塊化。算法級別的電路設(shè)計(jì),則一直沒有特別好的工具,直到出現(xiàn)了HLS。HLS可
2、以將算法直接映射為RTL電路,實(shí)現(xiàn)了高層次綜合。從這個(gè)層面上講,SystemGenerator也是一種高層次綜合工具,因?yàn)樗鼘atlab算法描述綜合為RTL代碼。如果今后機(jī)器學(xué)習(xí)、人工智能獲得重大突破,或許會出現(xiàn)將人類自然語言綜合為RTL代碼的工具,不知我們是否能見證它的面世。HLS的學(xué)習(xí)資源可以參考。本節(jié)給出較為通用的矩陣與向量相乘例子,從全串行到全并行進(jìn)行了一步步優(yōu)化實(shí)現(xiàn)。矩陣實(shí)驗(yàn)室Matlab是比較常用的數(shù)學(xué)仿真軟件。本博主用的是R2013a版本。為了驗(yàn)證矩陣向量相乘正確性,我們先用matlab生成測試矩陣和向量,并利用matl
3、ab計(jì)算結(jié)果。代碼如下:[plain] clear; clc; closeall; 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
4、()是將矩陣、向量保存為C語言數(shù)組的子函數(shù),定義如下:[plain] funcTIon[]=KKK_SaveToCHeaderFile(var,fn) fid=fopen(fn,’w’); var=reshape(var.’,1,[]); fprintf(fid,’%d,r’,var); fclose(fid); 給出測試?yán)讨?,A如下:[plain] 8210161566 912898434 1355969285 9296498094 6497819668 b如下:[plain]
5、 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)行VivadoHLS?! ∵x擇第一項(xiàng),CreateNewProject,建立新工程MatrixMulTIply 輸入路徑和工程名之后,點(diǎn)Next。 添加頂層模塊文件。這里我們TopFuncTIons輸入MatrixMulTIply,然后NewFile...,新建一個(gè).c文
6、件,命名為MatrixMultiply.c(后綴不要省略?。缓簏c(diǎn)Next添加頂層文件測試腳本。這里New一個(gè)文件TestMatrixMultiply.c(后綴不要省略?。缓驛dd前面用Matlab生成的A.h,b.h,c.h,如下圖所示: 點(diǎn)Next,選擇解決方案配置,如下圖所示 其余保持默認(rèn),只修改PartSelection部分,改為ZedBoard。改完后,F(xiàn)inish即可進(jìn)入主界面,如下圖所示 可以看出,VivadoHLS界面很像很像XilinxSDK,不同的是前者負(fù)責(zé)PL部分開發(fā),后者負(fù)責(zé)PS軟件編寫,定位不同決定
7、了二者今后的路必然走向分歧。將MatrixMultiply.c內(nèi)容改為:[cpp] typedefintdata_type; #defineN5 voidMatrixMultiply(data_typeAA[N*N],data_typebb[N],data_typecc[N]) { inti,j; for(i=0;i