初窺Vivado HLS--轉載我之前的blog的內容
本週剛剛打算入手一個ZYNQ的開發板,想體驗一下賽靈思的最新科技ARM + FPGA架構,於是開始接觸一下vivado的高階綜合令人興奮!下面開始介紹!
1,Vivado的HLS高階綜合。
我是在電子發燒友看到這邊文章:
http://www.elecfans.com/emb/fpga/20171118581798_a.html
設計人員使用賽靈思級高層次綜合工具,能以類似軟體的方式用高階程式設計結構描述包處理系統- ,而使用RTL則難以實現。
2,設計流程:
1.新建工程
2.新增設計資原始檔
3.C程式碼模擬驗證
4.演算法綜合 - 自動生成的Verilog等其他檔案
5.RTL模擬以及檢視波形
6.IP封裝
3,操作流程
1,新建工程
2,選擇自己的目標晶片
3,開始新增自己的設計檔案和testbench檔案。(我是一個簡單的二選一選擇器)
4,點選點選專案設定,進入設定介面,如下圖所示。
5,點選合成,進入下圖所示的介面。
這裡的Top function很重要,設定為自己的top模組的名字。
4,C程式碼模擬驗證
在選單欄中找到Project> Run C Simulation命令,或者直接單擊工具欄中的按鈕(如下圖所示),編譯和執行C程式。
編譯過程以及執行結果會在主介面下方的控制檯自選項卡中列印顯示,如下圖所示。
5,演算法綜合 - 自動生成的Verilog等其他檔案
如下圖所示,在選單中尋找命令:解決方案>執行C Synthesis> Active Solution,點選Active Solution選單(還可以直接點選工具欄中的快捷按鈕),HLS會自動完成綜合工作。
接下來就可以進入工程資料夾,找到綜合資料夾,檢視所綜合出的HDL程式碼,檔案結構如下圖所示。
6.RTL模擬以及檢視波形
解決方案>執行C / RTL Cosimulation,模擬完成後,需要在Vivado下檢視模擬結果。
然後點選如下圖示載入波視窗
或者
開啟Vivado,在tcl控制檯下鍵入以下指令cd E:/ hls / mux21 / solution1 / sim / verilog /
current_fileset
open_wave_database mux21.wdb
open_wave_config mux21.wcfg(最後一步出現問題)我是直接載入波形的,如圖:
生成的波形如下圖所示:
7.IP封裝
解決方案>匯出RTL,開啟匯出RTL對話方塊,如下圖所示。
IP封裝完成後,MUX21資料夾下會出現IMPL資料夾,該資料夾下包含IP,Verilog的,VDHL三個子資料夾,在這些資料夾中,我們可以找到封裝過程中生成的檔案。
綜合的IP
/ ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2015.4
// Copyright (C) 2015 Xilinx Inc. All rights reserved.
//
// ===========================================================
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="mux21,hls_ip_2015_4,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg400-3,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=1.040000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=1}" *)
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[0:0] === 1'b1) ? sig_b : sig_a);
endmodule //mux21