前言
本文主要講解了使用Vivado HLS設計簡單C語言的二選一選擇器算法的硬件HLS開發的全流程,包括工程創建-算法驗證和仿真-算法綜合-RTL仿真-IP封裝等步驟。
參考網站:
http://blog.chinaaet.com/cuter521/p/36069
http://blog.chinaaet.com/cuter521/p/36119
公司想要將立體匹配的算法進行硬件實現,無奈本人硬件小白一枚,看了基於verilog硬件實現的相關文檔之后還是找不到感覺,其實FPGA進行硬件實現功能也挺強大的,手邊有zedboard開發板,正好看到可以使用Vivado可以將c/c++轉換為FPGA實現,最讓人驚喜的是還有HLS圖像庫,和opencv比較相似,果斷選擇了Vivado,只是還需要從頭開始!加油!
內容:
1. 熟悉Vivado HLS的使用以及開發流程;
2.使用Vivado HLS進行C/C++算法的仿真驗證;
3.對C語言的算法進行綜合,查看RTL方則很難結果,並將設計進行IP封裝;
操作步驟:
1.新建工程
2.添加設計資源文件
3.C代碼仿真驗證
4.算法綜合-自動生成verilog等其他文件
5.RTL仿真以及查看波形
6.IP封裝
操作過程:
1.新建工程
雙擊Vivado HLS打開HLS;
單擊“Create New Project”,打開新建工程向導,第一個界面如下圖所示。

謹慎起見,將工程名和設計的模塊名保持一致,設置完畢后,點擊Next,進入下面的界面。

建立空工程,先不添加,進入工程之后再自行添加設計文件,點擊Next,進入如下圖所示的測試文件添加界面。

直接跳過點擊Next,進入下一界面,如下圖所示。

這一步需要進行設置,否則Finish按鈕一直是灰化的,不能生成工程。紅色方框內的提示可以看出,這里是選擇所用芯片的型號的。點擊綠色橢圓內的按鈕,進入芯片選擇對話框,如下圖所示。

這里不用多說,兩種方式,一種好似逐一選擇Family, Package, Speed Grade等參數,直到定位到你想要的芯片,如下圖所示。

另一種方法是直接選擇開發板,如下圖所示。

選擇完成后點擊OK,返回發現part部分已經選中Zedboard開發板,Finish按鈕可用。點擊Finish按鈕完成向導,進入HLS主界面,如下圖所示。

2.添加設計資源文件
2.1添加設計文件
選中左側Explorer子窗體下的Source目錄,郵件,彈出Add/New Files菜單,點擊添加資源文件,如下圖所示(注:有些圖因為當時沒有保存,直接借用原作者的圖)。

Top Function:mux21
mux21源碼如下:
#include "mux21.h" int1 mux21(int1 sig_a, int1 sig_b, int1 select) { if(0==select) return sig_a; else return sig_b; }
mux21.h的內容是:
#include <ap_cint.h>
ap_cint.h這個頭文件的包含,是為了使用int1類型,int1表示1位整型數。
注意:.h文件是不用添加的,HLS會自動包含相應的頭文件,但是路徑要正確。
2.2添加測試文件和數據
單擊Test Bench目錄,添加測試文件和數據,添加文件夾時,需要選擇“Add Folder…”選項。如果把測試文件添加到Source目錄中,編譯會產生問題。
testbench mux21_tb.c源碼為:
#include <stdio.h> #include "mux21.h" int main(void) { int1 res1 = 0; int1 res2 = 0; res1=mux21(1,0,0); res2=mux21(0,1,1); if(res1 && res2) printf("test passed, well done!\n"); return 0; }
2.3設置工程屬性
選中mux21文件夾,右擊,彈出如下圖所示的菜單。

點擊Project Setting,進入設置界面,如下圖所示。

點擊Synthesis,進入下圖所示的界面。

3.C代碼仿真驗證
在菜單欄中找到Project > Run C Simulation命令,或者直接單擊工具欄中的按鈕(如下圖所示),編譯和執行C程序。

編譯過程以及執行結果會在主界面下方的Console自選項卡中打印顯示,如下圖所示。

注意:編寫代碼時,沒有正確包含 .h文件,不能進行C代碼的仿真和驗證。發現錯誤,修改了之后,IDE可能不會自動檢測,這里可以嘗試使用Index功能,IDE會檢測改動,消除錯誤提示。
使用了int1類型,但是沒有包含ap_cint.h文件,顯示效果如下圖所示。

這時,就算修改代碼,包含了ap_cint.h文件,錯誤提示依舊存在。需要手動Index C source,提示才會消除。操作如下圖所示:Project > Index C Source,或者點擊工具欄中的快捷按鈕,下圖所示紅色方框內的圖標。

4.算法綜合-自動生成verilog等其他文件
如下圖所示,在菜單中尋找命令:Solution > Run C Synthesis > Active Solution,點擊Active Solution菜單,HLS會自動完成綜合工作。

此外,還可以直接點擊工具欄中的快捷按鈕(下圖紅色方框內),在下拉菜單中選擇“Active Solution”命令,也能夠啟動綜合進程。

接下來就可以進入工程文件夾,找到綜合文件夾,查看所綜合出的HDL代碼,文件結構如下圖所示。

rpt文件顯示“General Information(基本信息)”、“Performance Estimates(性能估算)”、“Utilization Estimates(資源利用估算)”、“(Interface接口)”等信息。
verilog文件夾下是綜合出來的.v文件,vhdl文件夾下綜合出來的是.vhd文件,打開mux21.v,代碼為:
`timescale 1 ns / 1 ps (* CORE_GENERATION_INFO="mux21,hls_ip_2014_2,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg484-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=1.370000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=0}" *) module mux21 ( ap_start, ap_done, ap_idle, ap_ready, sig_a, sig_b, select_r, ap_return ); parameter ap_const_logic_1 = 1'b1; parameter ap_const_logic_0 = 1'b0; input ap_start; output ap_done; output ap_idle; output ap_ready; input [0:0] sig_a; input [0:0] sig_b; input [0:0] select_r; output [0:0] ap_return; assign ap_done = ap_start; assign ap_idle = ap_const_logic_1; assign ap_ready = ap_start; assign ap_return = ((select_r)? sig_b: sig_a); endmodule //mux21
主要功能語句:
assign ap_return = ((select_r) ? sig_b : sig_a);
由於這個設計過於簡單,ap_start、ap_ready、ap_done、ap_idle以及ap_return信號的作用不太能體現出來,從命名來看,主要是用於控制模塊工作的信號。
5.RTL仿真以及查看波形
Solution > Run C/RTL Cosimulation,仿真完成后,需要在Vivado下查看仿真結果。
注意:Dump Trace選項要選擇all,否則不會產生波形數據,位置如下圖所示。

cd E:/hls/mux21/solution1/sim/verilog/
current_fileset
open_wave_database mux21.wdb
open_wave_config mux21.wcfg
注釋:
更改路徑
加載工程
加載仿真數據
打開波形窗口

生成的波形如下圖所示:

6.IP封裝
Solution > Export RTL,或者點擊工具欄快捷按鈕
,打開Export RTL對話框,如下圖所示。

命令行會打印提示整個IP封裝過程,如下圖所示。

IP封裝完成后,mux21文件夾下會出現impl文件夾,該文件夾下包含ip、verilog、vdhl三個子文件夾,在這些文件夾中,我們可以找到封裝過程中生成的文件。

7.結論
本渣只是根據cuter的博客練習使用Vivado,其實還沒有使用到HLS,所以本博客的大部分內容是重復的,只是本渣自己實現了整個過程,當然在這個過程中也遇到了一些其他的問題,所以總結一下,留作以后的參考。
做的過程中很多圖沒有截下來,直接拿過來使用了,望勿噴!可交流!
當然,這離HLS的實現還有好遠!
完
