0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Vivado设计之HLS开发详细步骤

454398 来源:csdn 作者:csdn 2021-01-02 09:45 次阅读

对于Vivado Hls来说,输入包括Tesbench,C/C++源代码和Directives,相应的输出为IP Catalog,DSP和SysGen,特别的,一个工程只能有一个顶层函数用于综和,这个顶层函数下面的子函数也是可以被综合的,会生成相应的VHDL和Verilog代码,所以,C综合后的RTL代码结构通常是跟原始C描述的结构是一致的,除非是子函数功能很简单,所需要的逻辑量很小。 通常在main函数以下的函数都可以被综合,也就是说,并不是所有的C/C++都可以被综合,动态内存分配和涉及到操作系统层面的操作不可以被综合。

本文结构框架:

  • Creat New Project新建文档
  • C simulation
  • C systhesis
  • RTL级仿真
  • IP封装
  • 总结

1.Creat New Project新建文档:

新建一个Project name,点next(这里选取简单的4选1数据选择器为例,主要是说明流程)

o4YBAF9uHoOACY8cAABDDVneib4831.png

在Add Files里添加mux41.c文件,点next

pIYBAF9uHoWAbvXYAABWdrOjBT4239.png

添加mux41_test测试文件,点next

pIYBAF9uHoaACzM7AABQ3x5Cffg232.png

点Part,这里选择Board下面的Zedboard Zynq开发板,然后点OK和finish

pIYBAF9uHoeAHGHGAABNH-Pzt4M317.png

注释:

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文件

o4YBAF9uHomASw5eAACoJCj4CxI828.png

从图中看到,可以看到test passed,well done!,证明结果是正确的:

pIYBAF9uHoqAMPC4AABBpNR5PbY175.png

3.C systhesis:

在菜单里Solution>Run C Systhesis>Active solution,综合会得到syn文件

o4YBAF9uHoyAA-B3AADBDiAllLY194.png

注意综合得到的verilog代码的可读性很差,不需要读懂,所以大多数优化都在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设置如下:

pIYBAF9uHo2AWassAABNWwyjRNk849.png

得到如下结果,我们会发现Verilog的Status是pass,证明C/RTL cosimulation成功:

o4YBAF9uHo-AOlHBAAAqw_j-jV8840.png

然后我们点开波形查看窗口,此时会自动打开Vivado软件,从图中看到,mux41的功能正确:

o4YBAF9uHpGAHnyEAAGbqKThHn4259.png

5.IP封装:
在菜单里Solution>Export TL,设置如下:

pIYBAF9uHpOAQC0GAAA3nBgp5Ew649.png

IP封装后,会得到impl文件,其中就有我们所需要的三个子文件ip,verilog,vhdl

o4YBAF9uHpSATSpHAABfDtn6--4613.png

总结:

事实上,在整个流程中,用户先创建一个设计 C、C++ 或 SystemC 源代码,以及一个C的测试平台。随后需要用 GCC/G++或 Visual C++ 仿真器验证设计的系统行为。一旦行为设计运行良好,对应的测试台的问题全部解决,就可以通过 Vivado HLS Synthesis 运行设计,生成 RTL 设计,代码可以是 Verilog,也可以是 VHDL。有了 RTL 后,随即可以执行设计的 Verilog 或 VHDL 仿真,或使用工具的C封装器技术创建 SystemC 版本。然后可以进行System C架构级仿真,进一步根据之前创建的 C 测试平台,验证设计的架构行为和功能。设计固化后,就可以通过 Vivado 设计套件的物理实现流程来运行设计,将设计编程到器件上,在硬件中运行和/或使用 IP 封装器将设计转为可重用的 IP。随后使用 IP 集成器将 IP 集成到设计中,或在系统生成器 (System Generator) 中运行 IP。

本文转载自:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • vhdl
    +关注

    关注

    30

    文章

    816

    浏览量

    128059
  • Vivado
    +关注

    关注

    19

    文章

    807

    浏览量

    66285
  • HLS
    HLS
    +关注

    关注

    1

    文章

    128

    浏览量

    24014
收藏 人收藏

    评论

    相关推荐

    探索Vivado HLS设计流,Vivado HLS高层次综合设计

    文件来与所得结果进行对比验证。 3.实验步骤 3.1.在Vivado HLS GUI界面中创建项目 3.1.1.启动Vivado HLS 2
    的头像 发表于 12-21 16:27 3559次阅读

    请问如何只下载Vivado HLS 2015.2

    嗨伙计,在我的PC Vivado设计套件2015.2和SDK 2015.2工作,但只有vivado HLS 2015.2没有打开,这就是为什么我想重新安装Vivado
    发表于 12-27 10:57

    Vivado HLS设计流的相关资料分享

    1.实验目的通过例程探索Vivado HLS设计流用图形用户界面和TCL脚本两种方式创建Vivado HLS项目用各种HLS指令综合接口优化
    发表于 11-11 07:09

    嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (流程说明)

    工程vivado_hlsip_packagexxx.zipIP核projectsolution仿真方案srcHLS工程源码test_benchHLS工程仿真程序或测试文件vivado_hls.appHLS工程文件HLS
    发表于 11-11 09:38

    嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(4)

    目 录5 sobel_demo 案例 395.1 HLS 工程说明 405.2 编译与仿真 435.3 IP 核测试 45前 言本文主要介绍 HLS 案例的使用说明,适用开发环境: Windows
    发表于 01-01 23:46

    嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)

    vivado_hls.appHLS 工程文件HLS 详细开发说明可参考产品资料“6-开发参考资料\Xilinx 官方参考文档\”目录下的如下
    发表于 01-01 23:52

    嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)

    仿真程序或测试文件 vivado_hls.appHLS 工程文件 HLS 详细开发说明可参考产品资料“6-开发参考资料\Xilinx 官方参
    发表于 08-24 14:40

    Hackaday读者有话说:Vivado HLS使用经验分享

    是来自新西兰的Mike Field,他是一个硬件Hacker,还建立了自己的网站( ),他详细总结了Vivado HLS的使用步骤,他认为这个很有趣,
    发表于 02-08 20:01 647次阅读
    Hackaday读者有话说:<b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>使用经验分享

    Vivado-HLS实现低latency 除法器

    1 Vivado HLS简介 2创建一个Vivado-HLS工程 2.1打开Vivado HLS GUI 2.2创建新工程 在 Welcom
    发表于 12-04 10:07 0次下载
    用<b class='flag-5'>Vivado-HLS</b>实现低latency 除法器

    基于Vivado HLS的计算机视觉开发

    OPENCV(Open Source Computer Vision)被广泛的使用在计算机视觉开发上。使用Vivado HLS视频库在zynq-7000全可编程soc上加速OPENCV 应用的
    发表于 11-10 10:47 1450次阅读

    如何创建Vivado HLS项目

    了解如何使用GUI界面创建Vivado HLS项目,编译和执行C,C ++或SystemC算法,将C设计合成到RTL实现,查看报告并了解输出文件。
    的头像 发表于 11-20 06:09 3897次阅读

    如何使用Tcl命令语言让Vivado HLS运作

    了解如何使用Tcl命令语言以批处理模式运行Vivado HLS并提高工作效率。 该视频演示了如何从现有的Vivado HLS设计轻松创建新的Tcl批处理脚本。
    的头像 发表于 11-20 06:06 3156次阅读

    关于Vivado HLS错误理解

    尽管 Vivado HLS支持C、C++和System C,但支持力度是不一样的。在v2017.4版本ug871 第56页有如下描述。可见,当设计中如果使用到任意精度的数据类型时,采用C++ 和System C 是可以使用Vivado
    的头像 发表于 07-29 11:07 5456次阅读
    关于<b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>错误理解

    UltraFast Vivado HLS方法指南

    电子发烧友网站提供《UltraFast Vivado HLS方法指南.pdf》资料免费下载
    发表于 09-13 11:23 1次下载
    UltraFast <b class='flag-5'>Vivado</b> <b class='flag-5'>HLS</b>方法指南

    VIVADO HLS设计移植到CATAPULT HLS平台

    电子发烧友网站提供《将VIVADO HLS设计移植到CATAPULT HLS平台.pdf》资料免费下载
    发表于 09-13 09:12 2次下载
    将<b class='flag-5'>VIVADO</b> <b class='flag-5'>HLS</b>设计移植到CATAPULT <b class='flag-5'>HLS</b>平台