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