fpga c语言教程,FPGA实践教程(一)用HLS将c程序生成IPcore
本文檔系列是我在實(shí)踐將神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)到Xilinx 的zynq的FPGA上遇到的問(wèn)題和解決方法。
目標(biāo):本文檔重點(diǎn)探討vivado HLS軟件的使用,描述如何將相應(yīng)的c程序用HLS轉(zhuǎn)換為硬件可以實(shí)現(xiàn)的IPcore。
完成本過(guò)程可以參閱的文檔有:
UG902:Vivado Design Suite User Guide: High-Level Synthesis
該文檔主要涉及vivado HLS的理解,vivado HLS軟件的初步使用,以及相應(yīng)的HLS相關(guān)的c語(yǔ)言庫(kù)等,我們主要關(guān)注該文檔的第一章:用vivado HLS軟件實(shí)現(xiàn)HLS(高層綜合High-level Synthesis)
UG871:Vivado Desigh Suite Tutoril:High-level Synthesis
該文檔主要涉及vivado HLS軟件的具體操作過(guò)程,包括HLS的介紹、c的驗(yàn)證、管腳綜合、任意精度數(shù)、設(shè)計(jì)分析、優(yōu)化分析、RTL驗(yàn)證、用HLS生成集成IP、在Zynq的AP Soc設(shè)計(jì)中用HLS生成的IP、這個(gè)文檔是操作的重點(diǎn)。文檔中有較多設(shè)計(jì)實(shí)例可以參考。
一、二、三為軟件用法和具體操作步驟,四、為我們實(shí)現(xiàn)我們的代碼需要完成的工作。
一、打開及創(chuàng)建工程
打開軟件,creat project這些基礎(chǔ)的操作就不講了。我們的版本是vivado HLS 2016.4
相應(yīng)的LeNet-5的源碼去github上下載,注意需要是c或者c++版本的代碼。運(yùn)行前務(wù)必看懂其中的代碼,至少知道每個(gè)函數(shù)的意思和調(diào)用關(guān)系,這樣后面操作才會(huì)順暢。(HLS只可以synthesis部分的c和c++程序,所以有部分源碼不可用,這個(gè)是后面討論的內(nèi)容。)
1.1. 下面我們就打開軟件,create new project,輸入相應(yīng)的工程名和工程位置。
1.2. 把相應(yīng)的文件添加到對(duì)應(yīng)位置。注意一個(gè)加入的是source file,意思是用于進(jìn)行HLS綜合的源c代碼,另一個(gè)加入的是testbench,就是用于測(cè)試和后續(xù)驗(yàn)證的c語(yǔ)言代碼和相應(yīng)的數(shù)據(jù)。
top function意思是進(jìn)行synthesis的c的最高級(jí)別的函數(shù)。
1.3. 創(chuàng)建solution,period是時(shí)鐘周期,默認(rèn)10ns,旁邊uncertainty為時(shí)鐘不確定性,點(diǎn)part selection
因?yàn)槲覀冇玫氖荴ilinx zynq 7z035和7z020的測(cè)試板,為具體的每個(gè)板子的型號(hào)。點(diǎn)擊finish就進(jìn)入下面界面。
把面板中各個(gè)部分和相應(yīng)的按鈕熟悉一下。一會(huì)會(huì)在操作中用到這里的按鈕,不要找不到對(duì)應(yīng)的命令按鈕。
二、進(jìn)行相應(yīng)的synthesis
可以按照UG902文檔中Chapter1的流程把相應(yīng)的例程運(yùn)行一遍。該例子按順序?qū)崿F(xiàn)了管理端口接口、優(yōu)化設(shè)計(jì)、進(jìn)行RTL驗(yàn)證、輸出RTL設(shè)計(jì)。為c到RTL語(yǔ)言的全部流程。
這里我們只運(yùn)用涉及我們項(xiàng)目進(jìn)行到的操作。synthesis步驟之中只需要進(jìn)行一步,就是加入derective優(yōu)化之后進(jìn)行c synthesis,其他步驟只是為了驗(yàn)證和debug程序用的。
2.1. 將程序添加到相應(yīng)的目錄
把面板中各個(gè)部分和相應(yīng)的按鈕熟悉一下。一會(huì)會(huì)在操作中用到這里的按鈕,不要找不到對(duì)應(yīng)的命令按鈕。
二、進(jìn)行相應(yīng)的synthesis
可以按照UG902文檔中Chapter1的流程把相應(yīng)的例程運(yùn)行一遍。該例子按順序?qū)崿F(xiàn)了管理端口接口、優(yōu)化設(shè)計(jì)、進(jìn)行RTL驗(yàn)證、輸出RTL設(shè)計(jì)。為c到RTL語(yǔ)言的全部流程。
這里我們只運(yùn)用涉及我們項(xiàng)目進(jìn)行到的操作。synthesis步驟之中只需要進(jìn)行一步,就是加入derective優(yōu)化之后進(jìn)行c synthesis,其他步驟只是為了驗(yàn)證和debug程序用的。
2.1. 將程序添加到相應(yīng)的目錄
注意source中為子程序,test bench中為測(cè)試的程序和需要讀入的東西。
2.2. 我們先進(jìn)行相應(yīng)的仿真驗(yàn)證,上面圖1-8中的operation中的點(diǎn)擊c simulation,進(jìn)行c語(yǔ)言的仿真,會(huì)發(fā)現(xiàn)程序正常運(yùn)行。
2.3. 但是在進(jìn)行C/RTL cosimulation(非必要步驟)的時(shí)候,出現(xiàn)了一定的問(wèn)題
ERROR: [SYNCHK 200-61] src/top.cpp:49: unsupported memory access on variable 'sample' which is (or contains) an array with unknown size at compile time.
ERROR: [HLS 200-70] Synthesizability check failed.
command 'ap_source' returned error code
while executing
我們可以發(fā)現(xiàn)問(wèn)題的所在,用于c與RTL協(xié)同synthesis中的top.cpp中的neural中的一個(gè)sample的指針,在c編譯的時(shí)候可以用指針,但是vivado HLS并不知道這個(gè)sample的大小,因此不知道如何在板子中給sample分配內(nèi)存,因此synthesis失敗了。同時(shí),另一個(gè)問(wèn)題可能與ap_source有關(guān)。
我們所以要解決這個(gè)問(wèn)題,必須搞明白數(shù)組是如何在FPGA中存儲(chǔ)的。同時(shí)搞明白ap_source是個(gè)什么。
2.4. 在進(jìn)行搞明白相應(yīng)的存儲(chǔ)以及ap_source之前,我們嘗試在程序中下手解決這個(gè)問(wèn)題,首先在top.h中把top.h中加入#define N 480,然后把1830行的聲明去掉nerual(float *sample, unsigned int *result),top.cpp中也去掉輸入的參數(shù)int N。
程序synthesis了很久,沒(méi)有像第一次那樣快速的報(bào)錯(cuò)。
為了避免重復(fù)的操作耗費(fèi)時(shí)間,我們將程序中的sample加入axi4總線。然后在幾個(gè)主要的底層的for循環(huán)之中運(yùn)用PIPELINE。(不知這個(gè)步驟對(duì)于縮減運(yùn)行時(shí)間而言有用與否。并且具體的優(yōu)化比較繁雜,后面再看)
終于完成了c的synthesis。完成synthesis之后,會(huì)生成一個(gè)相應(yīng)的報(bào)告,大致涉及運(yùn)用的資源以及時(shí)鐘周期,我們先不管報(bào)告內(nèi)容,那是后面優(yōu)化所需要做的內(nèi)容(優(yōu)化相關(guān)知識(shí)在UG902 中的Optimizing the design中)。我們先繼續(xù)往下運(yùn)行,把流程先跑通。
2.5. 點(diǎn)擊C/RTL cosimulation(非必要步驟),進(jìn)行c與RTL的協(xié)同綜合(UG902中Verifying the RTL)。運(yùn)行依然非常慢。(但是此步驟可以略過(guò),完成輸出RTL此步驟并非必須的)
運(yùn)行一晚上之后進(jìn)展緩慢,我們可以重新開始一下試一下。
第一次勾選的是VHDL,并且沒(méi)有勾選optimizing compile選項(xiàng),運(yùn)行一整晚卡在一個(gè)地方。現(xiàn)在我們運(yùn)行verilog,并且勾選Optimizing compile選項(xiàng)。
以下選項(xiàng)含義(UG902 Using C/RTL co-simulation):
Setup Only: 只創(chuàng)建所需要的文檔(wrappers, adapters, and scripts),只運(yùn)行simulation但不執(zhí)行simulator,要想執(zhí)行在RTL文件夾下/sim/.運(yùn)行
Dump Trace:會(huì)生成一個(gè)trace 文檔,在/sim/文檔中,可以選擇trace的信號(hào),例如top-level的端口。具體內(nèi)容參見RTL simulator
Optimizing Compile:會(huì)增加compile的時(shí)間,但是simulation會(huì)執(zhí)行的更快
Reduce Disk Space:TRL simulation會(huì)產(chǎn)生大量數(shù)據(jù),此步可以把分成N個(gè)分開的RTL仿真,但是會(huì)運(yùn)行變慢。
Compiled Library Location:確定compiled library的位置,以便于用第三方的RTL simulatior
Input Arguments:為test bench確定任何輸入的arugments
這次沒(méi)有像上次一樣卡在一個(gè)地方不動(dòng),但是RTL仿真時(shí)十分慢,運(yùn)行了兩天左右達(dá)到了這個(gè)進(jìn)度,并且進(jìn)度大于100%,為了解決這個(gè)問(wèn)題我們需要查閱文檔找出原因。
在運(yùn)行了三天之后,我們停止了此過(guò)程,此時(shí)已經(jīng)可以進(jìn)行export RTL,(其實(shí)在進(jìn)行synthesis之后就能export RTL了)
三、輸出RTL為IPcore
點(diǎn)擊export RTL,輸出RTL成功表明生成IP core成功,我們?cè)诤罄m(xù)的工作中可以通過(guò)vivado驗(yàn)證這一點(diǎn)。
在進(jìn)行完這些步驟后,我們大致可以認(rèn)為已經(jīng)可以將c語(yǔ)言通過(guò)vivado HLS轉(zhuǎn)化為相應(yīng)的硬件RTL語(yǔ)言,下面我們就開始進(jìn)行相應(yīng)的系統(tǒng)設(shè)計(jì)。
四、實(shí)現(xiàn)cnn主程序編譯為IPcore
1.創(chuàng)建工程,添加源碼這些就不說(shuō)了,我們需要給兩個(gè)參數(shù)加入相應(yīng)Interface的axi總線協(xié)議,這樣才能通過(guò)單片機(jī)與相應(yīng)的IPcore實(shí)現(xiàn)傳遞數(shù)據(jù)。
要給相應(yīng)的輸入輸出流加axis總線協(xié)議。這樣生成的IPcore的才有兩個(gè)接口,不然生成的IPcore接口有很多。例如下圖為一個(gè)典型的錯(cuò)誤的IPcore
2.點(diǎn)擊c synthesis,之后點(diǎn)擊export RTL,就把相應(yīng)的IPcore保存在了對(duì)應(yīng)的solution目錄里面了。
生成的IP為XCI文件,能被加入到project之中。
總結(jié)
以上是生活随笔為你收集整理的fpga c语言教程,FPGA实践教程(一)用HLS将c程序生成IPcore的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java == 如何避免空指针异常
- 下一篇: 计算机一级学ug么,怎样才能学好UG从事