對于Vivado Hls來說,輸入包括Tesbench,C/C++源代碼和Directives,相應(yīng)的輸出為IP Catalog,DSP和SysGen,特別的,一個工程只能有一個頂層函數(shù)用于綜和,這個頂層函數(shù)下面的子函數(shù)也是可以被綜合的,會生成相應(yīng)的VHDL和Verilog代碼,所以,C綜合后的RTL代碼結(jié)構(gòu)通常是跟原始C描述的結(jié)構(gòu)是一致的,除非是子函數(shù)功能很簡單,所需要的邏輯量很小。 通常在main函數(shù)以下的函數(shù)都可以被綜合,也就是說,并不是所有的C/C++都可以被綜合,動態(tài)內(nèi)存分配和涉及到操作系統(tǒng)層面的操作不可以被綜合。
本文結(jié)構(gòu)框架:
1.Creat New Project新建文檔:
新建一個Project name,點next(這里選取簡單的4選1數(shù)據(jù)選擇器為例,主要是說明流程)
在Add Files里添加mux41.c文件,點next
添加mux41_test測試文件,點next
點Part,這里選擇Board下面的Zedboard Zynq開發(fā)板,然后點OK和finish
注釋:
mux41.c代碼: #include "mux41.h" int1 mux41(int1 sig_a, int1 sig_b,int1 sig_c,int1 sig_d, int select) { if(select==0) return sig_a; else if(select==1) return sig_b; else if(select==2) return sig_c; else if(select==3) return sig_d; } mux41.h代碼:(頭文件) #include mux41_tb代碼: #include #include "mux41.h" int main(void) { int res1 = 0; int res2 = 0; int res3 = 0; int res4 = 0; res1=mux41(1,0,0,0,0); res2=mux41(0,1,0,0,1); res3=mux41(0,0,1,0,2); res4=mux41(0,0,0,1,3); if(res1 && res2 && res3 && res4) printf("test passed, well done!/n"); return 0; }
2.C simulation:
在菜單里Project>Run C simulation,C simulation可以得到csim文件
從圖中看到,可以看到test passed,well done!,證明結(jié)果是正確的:
注意綜合得到的verilog代碼的可讀性很差,不需要讀懂,所以大多數(shù)優(yōu)化都在C這個層面去做的,下面是綜合后的verilog代碼:
// ============================================================== // RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC // Version: 2016.3 // Copyright (C) 1986-2016 Xilinx, Inc. All Rights Reserved. // // =========================================================== `timescale 1 ns / 1 ps (* CORE_GENERATION_INFO="mux41,hls_ip_2016_3,{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=5.258000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=41}" *) module mux41 ( ap_start, ap_done, ap_idle, ap_ready, sig_a, sig_b, sig_c, sig_d, select_r, ap_return ); parameter ap_const_lv32_0 = 32'b00000000000000000000000000000000; parameter ap_const_lv32_1 = 32'b1; parameter ap_const_lv32_2 = 32'b10; 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] sig_c; input [0:0] sig_d; input [31:0] select_r; output [0:0] ap_return; wire [0:0] tmp_fu_60_p2; wire [0:0] tmp_1_fu_66_p2; wire [0:0] sel_tmp1_fu_86_p2; wire [0:0] sel_tmp2_fu_92_p2; wire [0:0] sel_tmp_fu_78_p3; wire [0:0] tmp_2_fu_72_p2; wire [0:0] tmp7_fu_106_p2; wire [0:0] sel_tmp5_fu_112_p2; wire [0:0] p_0_fu_98_p3; assign ap_done = ap_start; assign ap_idle = 1'b1; assign ap_ready = ap_start; assign ap_return = ((sel_tmp5_fu_112_p2[0:0] === 1'b1) ? p_0_fu_98_p3 : sig_d); assign p_0_fu_98_p3 = ((sel_tmp2_fu_92_p2[0:0] === 1'b1) ? sig_b : sel_tmp_fu_78_p3); assign sel_tmp1_fu_86_p2 = (tmp_fu_60_p2 ^ 1'b1); assign sel_tmp2_fu_92_p2 = (tmp_1_fu_66_p2 & sel_tmp1_fu_86_p2); assign sel_tmp5_fu_112_p2 = (tmp7_fu_106_p2 | tmp_fu_60_p2); assign sel_tmp_fu_78_p3 = ((tmp_fu_60_p2[0:0] === 1'b1) ? sig_a : sig_c); assign tmp7_fu_106_p2 = (tmp_1_fu_66_p2 | tmp_2_fu_72_p2); assign tmp_1_fu_66_p2 = ((select_r == ap_const_lv32_1) ? 1'b1 : 1'b0); assign tmp_2_fu_72_p2 = ((select_r == ap_const_lv32_2) ? 1'b1 : 1'b0); assign tmp_fu_60_p2 = ((select_r == ap_const_lv32_0) ? 1'b1 : 1'b0); endmodule //mux41
4.RTL級仿真:
在菜單里Solution>RunC/RTL cosimulation,需要對Co-similation Dialog設(shè)置如下:
得到如下結(jié)果,我們會發(fā)現(xiàn)Verilog的Status是pass,證明C/RTL cosimulation成功:
然后我們點開波形查看窗口,此時會自動打開Vivado軟件,從圖中看到,mux41的功能正確:
5.IP封裝:
在菜單里Solution>Export TL,設(shè)置如下:
IP封裝后,會得到impl文件,其中就有我們所需要的三個子文件ip,verilog,vhdl
總結(jié):
事實上,在整個流程中,用戶先創(chuàng)建一個設(shè)計 C、C++ 或 SystemC 源代碼,以及一個C的測試平臺。隨后需要用 GCC/G++或 Visual C++ 仿真器驗證設(shè)計的系統(tǒng)行為。一旦行為設(shè)計運行良好,對應(yīng)的測試臺的問題全部解決,就可以通過 Vivado HLS Synthesis 運行設(shè)計,生成 RTL 設(shè)計,代碼可以是 Verilog,也可以是 VHDL。有了 RTL 后,隨即可以執(zhí)行設(shè)計的 Verilog 或 VHDL 仿真,或使用工具的C封裝器技術(shù)創(chuàng)建 SystemC 版本。然后可以進行System C架構(gòu)級仿真,進一步根據(jù)之前創(chuàng)建的 C 測試平臺,驗證設(shè)計的架構(gòu)行為和功能。設(shè)計固化后,就可以通過 Vivado 設(shè)計套件的物理實現(xiàn)流程來運行設(shè)計,將設(shè)計編程到器件上,在硬件中運行和/或使用 IP 封裝器將設(shè)計轉(zhuǎn)為可重用的 IP。隨后使用 IP 集成器將 IP 集成到設(shè)計中,或在系統(tǒng)生成器 (System Generator) 中運行 IP。
本文轉(zhuǎn)載自:
-
vhdl
+關(guān)注
關(guān)注
30文章
817瀏覽量
128366 -
Vivado
+關(guān)注
關(guān)注
19文章
815瀏覽量
66914 -
HLS
+關(guān)注
關(guān)注
1文章
130瀏覽量
24212
發(fā)布評論請先 登錄
相關(guān)推薦
探索Vivado HLS設(shè)計流,Vivado HLS高層次綜合設(shè)計
請問如何只下載Vivado HLS 2015.2
Vivado HLS設(shè)計流的相關(guān)資料分享
嵌入式硬件開發(fā)學(xué)習(xí)教程——Xilinx Vivado HLS案例 (流程說明)
嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(4)
嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(1)
嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(1)
Hackaday讀者有話說:Vivado HLS使用經(jīng)驗分享
![Hackaday讀者有話說:<b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>使用經(jīng)驗分享](https://file1.elecfans.com//web2/M00/A6/A8/wKgZomUMP22ACg7eAAAS4Iecc64562.jpg)
用Vivado-HLS實現(xiàn)低latency 除法器
![用<b class='flag-5'>Vivado-HLS</b>實現(xiàn)低latency 除法器](https://file.elecfans.com/web2/M00/49/70/poYBAGKhwLSALp-1AABLz8q1CfE363.png)
基于Vivado HLS的計算機視覺開發(fā)
如何創(chuàng)建Vivado HLS項目
如何使用Tcl命令語言讓Vivado HLS運作
關(guān)于Vivado HLS錯誤理解
![關(guān)于<b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>錯誤理解](https://file.elecfans.com/web1/M00/99/4F/pIYBAF0VNwqAKlgbAAB6aroCEaU033.jpg)
UltraFast Vivado HLS方法指南
![UltraFast <b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>方法指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
將VIVADO HLS設(shè)計移植到CATAPULT HLS平臺
![將<b class='flag-5'>VIVADO</b> <b class='flag-5'>HLS</b>設(shè)計移植到CATAPULT <b class='flag-5'>HLS</b>平臺](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論