日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fpga c语言教程,FPGA实践教程(一)用HLS将c程序生成IPcore

發布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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選項,運行一整晚卡在一個地方?,F在我們運行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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。