本周刚刚打算入手一个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