精华内容
下载资源
问答
  • 该方案为hls教程以及例子,按照教程都来一遍,相信你对hls有深入的理解
  • Vivado HLS入门笔记

    2020-03-04 00:10:57
    Vivado HLS的说明 C/C++: HLS“利用C直接写出硬件”,优化算法+指导综合工具→HDL(IP)。 过程 Scheduling: 时钟周期完成什么操作,是否有并行操作; Control logic extraction: 生成状态机(状态机控制算法...

     

    视频(B站也有):

    跟 Xilinx SAE 学 HLS

     

    • Vivado HLS的说明
      1. C/C++: HLS“利用C直接写出硬件”,优化算法+指导综合工具→HDL(IP)。
      2. 过程
        1. Scheduling: 时钟周期完成什么操作,是否有并行操作;
        2. Control logic extraction: 生成状态机(状态机控制算法进程);
        3. Binding:操作与资源映射;
      3. 不可综合:动态内存分配、设计操作系统层面的;
    • Vivado HLS实践演示
      1. 首先要写有:
        1. Source: 实践的函数 adder.c + adder.h  void add()
        2. Test bench: int main(){测试,调用add()}
      2. Vivado HLS 创建工程,添加Top Function(adder.c -> add()),添加test bench,指定芯片型号。
      3. C simulation (利用Test bench: main()测试)
      4. C synthesis(获得综合报告)
      5. C/RTL Co-simulation观察RTL仿真结果(Vivado simulator, Dump Trace=Port),  Open Wave Viewer
      6. Export RTL: 生成IP Core
    • Vivado HLS高级实践
      1. New Solution (e.g. Pipeline…)
        1. 在solution – constrains – directives.tcl存放directives
        2. 循环前用 标签 标记(directives容易找到)
          1. Myloop – insert directive (pipeline) (%表示在directives.tcl内约束directive;#表示在源文件内约束(#pragma HLS))
        3. 综合后:compare reports – 添加两个要比较的solutions
      2. 数据类型
        1. 不支持char
        2. 任意精度数据类型:在头文件声明#define W 18; typedef ap_int<W> data_t
        3. 返回数据类型sizeof()(的1, 2, 4…bytes)
        4. 让Visual Studio支持任意精度数据类型:
        5. 数值初始化:
        6. 数据类型转换赋值
          1. 小范围数赋给大范围数:有符号数(扩展符号),无符号数(向上填0)
          2. 大范围数赋给小范围数:可能有数据损失
          3. 两数相加:位宽+1;两数相乘:位宽之和。

     

    展开全文
  • System Generator从入门到放弃...文章目录System Generator从入门到放弃(九)-利用Vivado HLS block实现Vivado HLS调用C/C++代码一、利用Vivado HLS block实现Vivado HLS调用C/C++代码1、简介2、利用Vivado HLS bloc...

    System Generator从入门到放弃(九)-利用Vivado HLS block实现Vivado HLS调用C/C++代码



      System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。


    一、利用Vivado HLS block实现Vivado HLS调用C/C++代码


    1、简介

      Vivado HLS是Xilinx FPGA开发套件中的一款软件,可以使用C/C++语言进行设计,并转换为RTL级模型。System Generator中的Vivado HLS block可以将HLS开发软件设计的C/C++代码整合到Simulink环境中,利用Simulink强大的仿真特性对设计进行仿真测试。
      ug948中提供的官方例程为图像的中值滤波,该设计将一副256*256大小的RGB图像,添加噪声后提取出其中的Y通道,使用C++语言完成中值滤波。该设计将在Simulink环境下进行仿真。
      本次设计的流程是利用Vivado HLS建立C/C++代码,Export RTL–>System Generator–>Vivado。


    2、利用Vivado HLS block实现Vivado HLS调用C/C++代码 流程

    2.1 Vivado HLS完成中值滤波设计

      建立相关HLS中的程序,其中Source中建立MedianFilter.cpp程序,程序如下:
    PS:这部分例程在官方ug948-design-files.zipLab2中找到。


    MedianFilter.cpp

    #include "MedianFilter.h"
    #define WINDOW_SIZE  3
    typedef unsigned char PixelType;
    
    #define PIX_SWAP(a,b) { PixelType temp=(a);(a)=(b);(b)=temp; }
    #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
    
    PixelType OptMedian9(PixelType * p)
    {
    	PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    	PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
    	PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    	PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
    	PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
    	PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
    	PIX_SORT(p[4], p[2]) ; 
        return(p[4]) ;
    }
    
    PixelType Mean(PixelType* buffer)
    {
        PixelType i, j, min;
        unsigned int sum;
        for (i = 0;i<9; i++) {
        	sum+=buffer[i];
        }
        sum/=(WINDOW_SIZE*WINDOW_SIZE);
        return sum;
    }
    
    PixelType Min(PixelType* buffer)
    {
        PixelType i, j, min;
        min = buffer[0];
        for (i = 1;i<9; i++) {
            if (min>buffer[i]) min = buffer[i];
        }
        return min;
    }
    
    
    
    void MedianFilter(PixelType row1, PixelType row2, PixelType row3, PixelType* V)
    {
    #pragma AP PIPELINE  II=1
    	/*
    	 * Create a local Pixel Buffer based on WindowSize
    	 */
    	static PixelType pixelWindowBuffer[WINDOW_SIZE*WINDOW_SIZE];
    
    	PixelType sortBuffer[WINDOW_SIZE*WINDOW_SIZE];
    
        /*
        * Each Iteration Interval Update the Pixel Buffers
        */
    	for(int i = 0;i<WINDOW_SIZE;++i) {
    		for(int j=0;j<(WINDOW_SIZE-1);++j) {
    			pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)] = pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)-1];
    		}
    	}
    
        /*
         * Update the first Pixel of each row
         */
        pixelWindowBuffer[0] = row1;
        pixelWindowBuffer[3] = row2;
        pixelWindowBuffer[6] = row3;
    
        for(int k = 0;k<9;++k) {
        	sortBuffer[k] = pixelWindowBuffer[k];
        }
    
        *V = OptMedian9(sortBuffer);
    }
    
    
    
    

    MedianFilter.h

    
    #ifndef __MEDIAN__FILTER__
    #define __MEDIAN__FILTER__
    void MedianFilter(unsigned char R, unsigned char G, unsigned char B, unsigned char* V);
    #endif
    
    

      右键Solution->C Synthesis->Active Solution,综合设计源文件。

    在这里插入图片描述
      当综合完成时, Vivado HLS displays 将显示this message:

    • Finished C synthesis.

      完成后,再右键Solution->Export RTL,Format Selection选择为“System Generator for DSP”,点击OK将设计源文件打包为System Generator可以使用的形式。
    在这里插入图片描述

    当Export RTL完成时, Vivado HLS displays 将显示:

    • Finished export RTL

    2.2 将HLS设计导入System Generator


    Xilinx block

    • Vivado HLS block(->Index):调用HLS代码
    • System Generator(->Basic Elements):系统管理
    • Gateway In(->Basic Elements):数据输入
    • Gateway Out(->Basic Elements):数据输出

    其它block

    • 图像处理相关Block
    • Scope(Simulink->Commonly Used Blocks):示波器

      添加一个Vivado HLS block,双击打开该block:
    在这里插入图片描述

      点击Browse,将路径指定到HLS工程的Solution文件夹下。如果路径选择错误,或者HLS工程综合或导出失败导致solution文件夹下没有可用的System Generator文件,软件会提示错误。
    在这里插入图片描述

      设置完毕后,block端口也会随之改变,部分端口名称以ap_开头,表示与block之间的ap_hs通信协议。model的整体连接图如下:
    在这里插入图片描述

      其中包含几个子系统,各子系统及其作用如下:

    • Noisy Image:导入一副256*256的图像,转换为一维数据,并为其添加椒盐噪声;
    • RGB2Y:将R、G、B通道转换为Y通道(Y=0.299R+0.587G+0.114B,可以简化为只用两个乘法器的形式Y=0.299(R-G)+0.114*(B-G)+G);
    • LineBuffer:缓存器存储数据;
    • Noisy Input Image/Filtered Image:缓存数据,将一维数据转换为二维图像显示。

    2.3 仿真测试

      在Noisy Image子系统下,打开Image From File这个block(属于Computer Vision System Toolbox库)。点击Browse,将路径指向一副256256大小的彩色图片。将仿真时间设置为256256*2,确保可以完成一次图像滤波。运行结果如下:
    在这里插入图片描述
      Use the toolbar button Up 在这里插入图片描述 to Parent to return to the top level
      保存后,进行仿真,结果如下:
    PS:运行时间比较久,要耐心等待!!
    在这里插入图片描述
      可以看到经过中值滤波后,很好地滤除了图像中的椒盐噪声。


    3、Vivado HLS block详解

    摘自:https://blog.csdn.net/FPGADesigner/article/details/80985418
      该block支持C、C++和System C三种设计源文件。使用是首先需要在Vivado HLS开发环境下将设计源文件打包到Solution目录下,然后在block中指向该目录,将设计导入到System Generator设计中。
    在这里插入图片描述
      点击“Edit”可以打开与该solution对应的Vivado HLS工程,允许设计者修改;修改后点击“Refresh”更新block的端口信息。

      block默认采用RTL-model进行仿真,如果HLS中包含C仿真模型,可以选中“Use C simulation model if available”,选择C仿真模型。

      当选中“Display signal types”时,输入和输出的数据类型会显示在图标上,设计者可以根据该提示设置向此block输入的数据,如下图:
    在这里插入图片描述

      C/C++数据类型和System Generator数据类型之间的转换关系如下表:

    在这里插入图片描述
      在Vivado HLS中进行设计时有如下限制:

    • 设计不能是纯组合逻辑,综合到RTL设计后必须包含一个时钟和时钟使能输入信号;
    • 顶层模块中不能包含C/C++模板语法;
    • C仿真模型与block通信时支持ap_hs通信协议,但不支持ap_memory和ap_bus接口。




    展开全文
  • 我的第一篇博客——Vivado HLS ug902文档(1) HLS Vivado HLS能够将C、C++、SystemC语言描述的算法转换成RTL级电路,FPGA并行架构在性能、成本和功耗方面要优于传统的架构。 HLS的优点 HLS桥接起软件和硬件领域,...

    我的第一篇博客——Vivado HLS ug902文档 ------- Vivado HLS简介(1)

    HLS

    Vivado HLS能够将C、C++、SystemC语言描述的算法转换成RTL级电路,FPGA并行架构在性能、成本和功耗方面要优于传统的架构。

    HLS的优点

    HLS桥接起软件和硬件领域,具有以下优点:

    1. 提高硬件开发效率;
    2. 提高软件系统性能;

    使用Vivado HLS能够:

    1. 在C语言上开发算法,在抽象级别上工作能够减小开发周期。
    2. 通过C语言验证算法,比传统的硬件描述语言更加快速。
    3. 通过优化指令控制C综合,建立特定的高性能的硬件实现。
    4. 通过优化方案能创建多个实现(solution),探索设计空间以寻找最佳实现。
    5. 创建具有可读性和可移植性的C源代码,能够在不同设备上实现。

    高级综合基础

    高级综合包括以下几个阶段:

    • 调度
      确定每个时钟周期内的操作:
      • 时钟周期或者时钟频率。
      • 操作完成所需要的时间,有目标设备决定。
      • 指定优化指令。
    • 绑定
      指定由哪些资源执行调度阶段所要完成的功能,为了找到最优解决方案,HLS需要知道目标设备的信息。
    • 控制逻辑提取
      提取控制逻辑建立有限状态机(FSM),控制RTL设计序列的操作。

    高层次综合(HLS)综合C的代码如下:

    • 顶层模块参数综合成RTL级I/O口;
    • C函数综合成RTL的模块,如果C代码包含子函数的层次结构,那么最终的RTL设计包含模块或实体的层次结构,这些模块或实体与原始的C函数层次结构具有一对一的对应关系。函数的所有实例都使用相同的RTL实现或块;
    • C函数中循环默认不展开(roll),可以使用优化指令进行unroll、pipeline、dataflow;
    • 数组在C代码中最终会被综合RAM或UltraRAM。如果数组在顶层函数接口,高级综合会将会实现为访问外部RAM的设计。

    要确定设计是否满足需求,可以在高级综合生成的综合报告中查看性能指标。在分析报告之后,可以使用优化指令来改进实现。综合报告包含关于以下性能指标的信息:

    • 范围(Area): 根据FPGA中可用的资源实现设计所需的硬件资源数量,包括查找表 (LUT)、寄存器、block ram和DSP48。
    • 延迟(Latency):函数计算所有输出值所需的时钟周期数。
    • 起始间隔( Initiation interval, II):函数接受新输入数据前的时钟周期数。
    • 循环迭代延迟(Loop iteration latency):完成循环的一次迭代所需的时钟周期数。
    • 循环启动间隔( Loop initiation interval):循环的下一个迭代开始处理数据之前的时钟周期数。
    • 循环延迟( Loop latency):执行循环所有迭代的循环数。

    在高层次综合中,数组默认被综合成RAM,可以通过优化指令综合成FIFOs、存储器和寄存器等。当在顶级函数中使用数组作为参数时,高级综合假设块RAM位于顶级函数之外,并自动创建端口来访问设计之外的块RAM,例如数据端口、地址端口以及任何必需的芯片使能或写信号。

    理解Vivado HLS

    Xilinx Vivado HLS工具将C函数合成到一个IP块中,可以将该IP块集成到硬件系统中。它与Xilinx的其他设计工具紧密集成,并提供了全面的语言支持和特性,用于为您的C算法创建最佳实现。
    以下是Vivado HLS设计流程:

    • 编译、执行(模拟)和调试C算法。
    • 将C算法合成为RTL实现,可以选择使用用户优化指令。
    • 生成全面的报告并分析设计。
    • 运行联合仿真,验证RTL实现。
    • 打包RTL实现为IP格式文件。

    输入和输出

    下面是Vivado HLS的输入:

    • C函数的编写采用C、C++或者SystemC
      这是Vivado HLS的主要输入。该函数可以包含子函数的层次结构。
    • 约束
      需要约束,包括时钟周期、时钟不确定性和FPGA目标。时钟不确定性默认为时钟周期的12.5%(如果没有指定)。
    • 指令
      指令是可选的,并指导合成过程实现特定的行为或优化。
    • C测试台和任何相关文件
      Vivado HLS使用C测试台模拟合成前的C函数,并使用C/RTL协仿真验证RTL输出。可以在命令提示符下使用Vivado HLS图形用户界面(GUI)或使用Tcl命令交互地将C输入文件、指令和约束添加到Vivado HLS项目中。还可以创建一个Tcl文件并以批处理模式执行命令。

    下面是Vivado HLS的输出:

    • 硬件描述语言(HDL)格式的RTL实现文件。
      Vivado HLS将实现文件打包为IP块,以便与其他工具一起使用。
    • 报告文件
      该输出是综合、C/RTL联合仿真和IP打包的结果。

    测试台、支持语言和C语言库

    在任何C程序中,顶层函数都称为主函数(main())。在Vivado®HLS设计流中,可以将main()下面的任何子函数指定为用于综合的顶层函数。不能综合函数main()。以下是附加规则:

    • 只允许一个函数作为综合的顶层函数。
    • 任何在顶层函数下面的子函数也会被综合。
    • 如果想要综合不在顶层函数下的函数,则必须将这些函数放到到单个顶层函数中进行综合。

    测试台

    在使用Vivado HLS设计流时,要综合一个功能不正确的C函数,然后分析实现细节,以确定该函数为何不能按预期执行,这是非常耗时的。为了提高生产力,在合成之前,使用一个测试平台(test bench)来验证C函数在功能上是否正确。
    C测试台包含main()函数和任何不在用于综合的顶级函数的层次结构中的子函数。这些函数通过向用于综合的函数激励并提供其预输出来验证用于合成的顶级函数在功能上是否正确。
    Vivado HLS使用测试平台编译和执行C仿真。在编译过程中,您可以选择Launch Debugger选项来打开一个完整的C-debug环境,能够对C仿真进行分析。
    因为Vivado HLS使用测试台在合成之前验证C函数,并自动验证RTL输出,所以强烈建议使用测试台(test bench为非必要条件)。

    支持语言

    Vivado HLS 下面标准的C编译/仿真:

    • ANSI-C (GCC 4.6)
    • C++ (G++ 4.6)
    • SystemC (IEEE 1666-2006, version 2.2)

    C、C++和SystemC的语言结构

    Vivado HLS支持许多C、c++和SystemC语言构造以及每种语言的所有本地数据类型,包括float和double类型。但是,有些结构不支持综合,包括:

    • 动态内存分配
      FPGA有固定的资源,动态创建和释放内存资源不支持。
    • 操作系统(OS)的操作
      所有进出FPGA的数据必须从输入端口读取或写入输出端口。不支持OS操作,如文件读/写或OS查询(如时间和日期)。相反,C测试台可以执行这些操作,并将数据作为函数参数传递到函数中进行综合。

    C库

    C库包含为在FPGA中实现而优化的函数和构造。使用这些库有助于确保高质量的结果(QoR),也就是说,最终的输出是优化资源使用的高性能设计。因为库是用C语言提供的,在c++或SystemC中,可以将库合并到C函数中,并在综合之前对它们进行仿真,以验证函数的正确性。
    Vivado®HLS提供了以下C库来扩展标准C语言:

    • 任意精度数据类型(1 - 1024 bit)
    • 半精度(16位)浮点数据类型
    • 数学操作(Math)
    • Xilinx®IP函数,包括快速傅里叶变换(FFT)和有限脉冲响应(FIR)
    • FPGA资源功能,以帮助最大限度地利用移位寄存器LUT (SRL)资源

    仅在函数边界上需要任意精度类型,因为Vivado HLS会优化内部逻辑,并删除不向输出端口扩展的数据位和逻辑。

    综合、优化和分析

    Vivado®HLS是基于项目的。每个项目包含一组C代码,并且可以包含多个解决方案。每个解决方案可以有不同的约束和优化指令。可以在Vivado HLS GUI中分析和比较每个解决方案的结果。
    以下是Vivado HLS设计过程中的综合、优化和分析步骤:

    1. 创建具有初始解决方案的项目。
    2. 验证C仿真执行无误。
    3. 运行综合获得结果。
    4. 分析结果。

    在分析结果之后,可以为具有不同约束和优化指令的项目创建一个新的解决方案,并综合新的解决方案。重复此过程,直到设计具有所需的性能特征。使用多个解决方案可以在继续开发的同时仍然保留以前的结果。

    优化

    使用Vivado®HLS,可以在设计中应用不同的优化指令,包括:

    • 指示任务在管道(pipeline)中执行,允许任务的下一次执行在当前执行完成之前开始。
    • 指定函数、循环和区域完成的延迟。
    • 指定使用资源数量的限制。
    • 覆盖代码中固有的或隐含的依赖关系,并允许指定的操作。
    • 选择I/O协议,确保最终设计可以连接到其他具有相同I/O协议的硬件块。

    Vivado HLS自动确定任何子函数使用的I/O协议。不能控制这些端口,除非指定端口已注册。
    可以使用Vivado HLS GUI将优化指令直接放到源代码中。或者,可以使用Tcl命令来应用优化指令。

    分析

    当综合完成时,Vivado HLS自动创建合成报告,以帮助了解实现的性能。在Vivado HLS GUI中,Analysis透视图包含Performance选项卡,它允许您交互地详细分析结果。

    RTL验证

    如果你添加了一个C test bench项目,可以使用它来验证RTL功能相同的C函数。 C试验台验证综合和顶层的输出函数,如果RTL功能是相同的返回0到顶层函数main()。Vivado HLS在C模拟和C/RTL联合模拟中都使用这个返回值来确定结果是否正确。如果C测试台返回一个非零值,Vivado HLS报告模拟失败。
    注意:如果测试工作台没有将值0返回给函数main(),即使输出数据正确有效,Vivado HLS也会报告仿真失败。
    提示:Vivado HLS自动创建执行C/RTL联合仿真设施,并使用以下受支持的RTL模拟器之一自动执行仿真:

    • Vivado Simulator (XSim)
    • ModelSim simulator
    • VCS
    • NCSim
    • Riviera
    • Xcelium

    如果选择Verilog或VHDL HDL进行仿真,Vivado HLS将使用您指定的HDL模拟器。Xilinx设计工具包括Vivado模拟器。第三方HDL模拟器需要来自第三方供应商的许可证。VCS和NCSim模拟器仅在Linux操作系统上受支持。

    RTL导出

    使用Vivado HLS,可以导出RTL,并将最终的RTL输出文件打包成以下任何一种Xilinx IP格式的IP:

    • Vivado IP Catalog
      导入到Vivado IP目录,以便在Vivado设计套件中使用。
    • System Generator for DSP
      将HLS设计导入系统生成器。
    • Synthesized Checkpoint (.dcp)
      像导入任何Vivado设计套件检查点一样,直接导入Vivado设计套件。

    注意:综合检查点格式调用逻辑综合并将RTL实现编译为gate级实现,后者包含在IP包中。
    对于除综合检查点之外的所有IP格式,可以选择在Vivado HLS中执行逻辑综合,以评估RTL综合或实现的结果。这个可选步骤允许您在交付IP包之前确认Vivado HLS提供的时间和区域估计。这些门级结果不包括在打包的IP中。
    注意:Vivado HLS基于每个FPGA的内置库估计时间和区域资源。当你使用逻辑综合将RTL编译成门级实现、在FPGA中执行门的物理位置以及门之间互连的路由时,逻辑综合可能会进行额外的优化,从而更改Vivado HLS估计。

    展开全文
  • System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码夜未央,流星落,情已殇文章目录System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码一、利用...

    System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码

    夜未央,流星落,情已殇

    文章目录

    • System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码

    • 一、利用Vivado HLS block实现Vivado HLS调用C/C++代码

    • 1、简介

    • 2、利用Vivado HLS block实现Vivado HLS调用C/C++代码 流程

      • 2.1 Vivado HLS完成中值滤波设计

      • 2.2 将HLS设计导入System Generator

      • 2.3 仿真测试

    • 3、Vivado HLS block详解


      System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。


    一、利用Vivado HLS block实现Vivado HLS调用C/C++代码


    1、简介

      Vivado HLS是Xilinx FPGA开发套件中的一款软件,可以使用C/C++语言进行设计,并转换为RTL级模型。System Generator中的Vivado HLS block可以将HLS开发软件设计的C/C++代码整合到Simulink环境中,利用Simulink强大的仿真特性对设计进行仿真测试。
      ug948中提供的官方例程为图像的中值滤波,该设计将一副256*256大小的RGB图像,添加噪声后提取出其中的Y通道,使用C++语言完成中值滤波。该设计将在Simulink环境下进行仿真。
      本次设计的流程是利用Vivado HLS建立C/C++代码,Export RTL–>System Generator–>Vivado。


    2、利用Vivado HLS block实现Vivado HLS调用C/C++代码 流程

    2.1 Vivado HLS完成中值滤波设计

      建立相关HLS中的程序,其中Source中建立MedianFilter.cpp程序,程序如下:
    PS:这部分例程在官方ug948-design-files.zipLab2中找到。


    MedianFilter.cpp

    #include "MedianFilter.h"
    #define WINDOW_SIZE 3
    typedef unsigned char PixelType;

    #define PIX_SWAP(a,b) { PixelType temp=(a);(a)=(b);(b)=temp; }
    #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }

    PixelType OptMedian9(PixelType * p)
    {
    PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
    PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
    PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
    PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
    PIX_SORT(p[4], p[2]) ;
    return(p[4]) ;
    }

    PixelType Mean(PixelType* buffer)
    {
    PixelType i, j, min;
    unsigned int sum;
    for (i = 0;i<9; i++) {
    sum+=buffer[i];
    }
    sum/=(WINDOW_SIZE*WINDOW_SIZE);
    return sum;
    }

    PixelType Min(PixelType* buffer)
    {
    PixelType i, j, min;
    min = buffer[0];
    for (i = 1;i<9; i++) {
    if (min>buffer[i]) min = buffer[i];
    }
    return min;
    }



    void MedianFilter(PixelType row1, PixelType row2, PixelType row3, PixelType* V)
    {
    #pragma AP PIPELINE II=1
    /*
    * Create a local Pixel Buffer based on WindowSize
    */
    static PixelType pixelWindowBuffer[WINDOW_SIZE*WINDOW_SIZE];

    PixelType sortBuffer[WINDOW_SIZE*WINDOW_SIZE];

    /*
    * Each Iteration Interval Update the Pixel Buffers
    */
    for(int i = 0;i for(int j=0;j pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)] = pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)-1];
    }
    }

    /*
    * Update the first Pixel of each row
    */
    pixelWindowBuffer[0] = row1;
    pixelWindowBuffer[3] = row2;
    pixelWindowBuffer[6] = row3;

    for(int k = 0;k<9;++k) {
    sortBuffer[k] = pixelWindowBuffer[k];
    }

    *V = OptMedian9(sortBuffer);
    }




    MedianFilter.h


    #ifndef __MEDIAN__FILTER__
    #define __MEDIAN__FILTER__
    void MedianFilter(unsigned char R, unsigned char G, unsigned char B, unsigned char* V);
    #endif


      右键Solution->C Synthesis->Active Solution,综合设计源文件。

    2d46de81f2721271f4d3aa22740a21de.png
      当综合完成时, Vivado HLS displays 将显示this message:

    • Finished C synthesis.

      完成后,再右键Solution->Export RTL,Format Selection选择为“System Generator for DSP”,点击OK将设计源文件打包为System Generator可以使用的形式。f1de2d4afa6e044965eee07e319f68fa.png

    当Export RTL完成时, Vivado HLS displays 将显示:

    • Finished export RTL

    2.2 将HLS设计导入System Generator


    Xilinx block

    • Vivado HLS block(->Index):调用HLS代码

    • System Generator(->Basic Elements):系统管理

    • Gateway In(->Basic Elements):数据输入

    • Gateway Out(->Basic Elements):数据输出

    其它block

    • 图像处理相关Block

    • Scope(Simulink->Commonly Used Blocks):示波器


      添加一个Vivado HLS block,双击打开该block:77dfb981f7353a99e180fb6e0c94c137.png

      点击Browse,将路径指定到HLS工程的Solution文件夹下。如果路径选择错误,或者HLS工程综合或导出失败导致solution文件夹下没有可用的System Generator文件,软件会提示错误。aac6c0385c56da1de8f84eff34c28887.png

      设置完毕后,block端口也会随之改变,部分端口名称以ap_开头,表示与block之间的ap_hs通信协议。model的整体连接图如下:d057a4053007ebb15bdb3fb476777167.png

      其中包含几个子系统,各子系统及其作用如下:

    • Noisy Image:导入一副256*256的图像,转换为一维数据,并为其添加椒盐噪声;

    • RGB2Y:将R、G、B通道转换为Y通道(Y=0.299R+0.587G+0.114B,可以简化为只用两个乘法器的形式Y=0.299(R-G)+0.114*(B-G)+G);

    • LineBuffer:缓存器存储数据;

    • Noisy Input Image/Filtered Image:缓存数据,将一维数据转换为二维图像显示。

    2.3 仿真测试

      在Noisy Image子系统下,打开Image From File这个block(属于Computer Vision System Toolbox库)。点击Browse,将路径指向一副256256大小的彩色图片。将仿真时间设置为256256*2,确保可以完成一次图像滤波。运行结果如下:f37d77f96080f9be221fbcece4b8b6e2.png
      Use the toolbar button Up 9d9a332d8779f43e0b1eb569ea119611.png to Parent to return to the top level
      保存后,进行仿真,结果如下:
    PS:运行时间比较久,要耐心等待!!e8133296174b81bcfac66a8aa7d4f115.png
      可以看到经过中值滤波后,很好地滤除了图像中的椒盐噪声。


    3、Vivado HLS block详解

    摘自:https://blog.csdn.net/FPGADesigner/article/details/80985418
      该block支持C、C++和System C三种设计源文件。使用是首先需要在Vivado HLS开发环境下将设计源文件打包到Solution目录下,然后在block中指向该目录,将设计导入到System Generator设计中。ded30ab291647a9fe30f1c21481c5cf5.png
      点击“Edit”可以打开与该solution对应的Vivado HLS工程,允许设计者修改;修改后点击“Refresh”更新block的端口信息。

      block默认采用RTL-model进行仿真,如果HLS中包含C仿真模型,可以选中“Use C simulation model if available”,选择C仿真模型。

      当选中“Display signal types”时,输入和输出的数据类型会显示在图标上,设计者可以根据该提示设置向此block输入的数据,如下图:45ab08a992b32f19f52a156c7fa1d931.png

      C/C++数据类型和System Generator数据类型之间的转换关系如下表:

    f67ecddf7739e65c7698309711e15477.png
      在Vivado HLS中进行设计时有如下限制:

    • 设计不能是纯组合逻辑,综合到RTL设计后必须包含一个时钟和时钟使能输入信号;

    • 顶层模块中不能包含C/C++模板语法;

    • C仿真模型与block通信时支持ap_hs通信协议,但不支持ap_memory和ap_bus接口。


    5f41dd2f29ea4f726ded775b0606a5d0.png

    a81d86abe19f8480e3fe386ede4172be.png

    展开全文
  • vivado hls

    2015-06-11 09:48:38
    Zynq-7000 All Programmable SoC Accelerator for Floating-Point Matrix Multiplication using Vivado HLS
  • VivadoHLS 学习使用Vivado HLS 2018.3开发数字系统所需的高级综合设计方法。 所有项目基于pynq-z2
  • project: https://github.com/Xilinx/HLx_Examples/tree/master/Acceleration/tcp_iptool version: vivado and vivado_hls is 2015.4compile problems:1.run make_tcp_ip.sh to compile but some csim or csyn ...
  • vivado_hls_tutorial:使用HLS openCV函数的Xilinx Vivado基本HLS图像处理教程的源代码
  • Vivado HLS 入门实验

    万次阅读 多人点赞 2017-11-21 12:10:45
    当我们安装好Vivado 的时候,也同时装好了Vivado HLS.。 这是个什么东西?我就有一种想一探究的感觉。网上一查,Vivado High-Level Synthesis。学习了一段时间的Zynq 7000, 找了一个HLS的教程,就开始了如下入门...
  • vivado hls教程

    热门讨论 2013-05-20 14:12:06
    vivado hls的官方教程,通过多个实验快速掌握高层次综合
  • XILINX HLS + Vivado + SDK实现自定义IP通过AXI-Master协议从ARM(PS)传输数组到FPGA(PL)端RAM 简介 最近在使用XILINX ZYNQ的Soc板子做卷积神经网络(CNN)加速器,遇到了个问题:如何从PS传输批量权重到PL端? 网上...
  • vivado HLS 入门

    2019-11-02 10:50:46
    vivado HLS 入门简介1st-9th vivado HLS基本概念1 Xilinx FPGA架构2 HLS工作机制3 HLS设计流程4 Demo5 任意精度的数据类型6 数据类型的转换 简介 资料来源于Xilinx官方视频课,由Lauren Gao讲解,共25讲,相比于看...
  • Vivado HLS 指导手册

    2018-01-23 22:46:15
    Vivado HLS 指导手册 英文版 用于学习Xilinx IP核制作
  • CNN VivadoHLS

    2017-01-02 14:06:37
    使用HLS实现的CNN
  • System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码 文章目录 System Generator从入门到放弃(六)-利用Vivado HLS block实现Vivado HLS调用C/C++代码 一、利用Vivado HLS block...
  • Xilinx Vivado HLS license

    2014-10-06 23:43:46
    vivado 2014.2 license. 主要包含了Vivado HLS的永久license
  • Vivado HLS教程

    2020-04-07 19:11:22
    想学Vivado HLS,这里做个记录。 本着先感性再理性的学习规律,首先学习Xilinx提供的教程ug871,上手操作。 教程描述 本教程是一些较小的教程的集合,这些教程说明和演示了使用高级综合将C,C ++和SystemC代码转换为...
  • Vivado hls 入门二

    2018-05-31 17:28:24
    Vivado hls 入门二作者:OpenS_Lee1 概述Vivado HLS 是 Xilinx 提供的一个工具,是 Vivado Design Suite 的一部分,能把基于 C 的...
  • Vivado HLS 教程.pptx

    2020-07-07 08:28:47
    Vivado Hls C入门详解教程,附带有各个流程的使用和配合,并附有代码示例,可在Vivado 2017.4 上进行学习测试
  • vivado HLS图像处理了解

    2018-06-06 17:14:17
    使用vivado HLS 进行图像处理,需要了解的一些基本知识!
  • Vivado HLS Design Flow Lab

    2017-03-12 19:16:17
    This lab provides a basic introduction to high-level synthesis using the Vivado HLS tool flow. You will use Vivado HLS in GUI mode to create a project. You will simulate, synthesize, and implement the...
  • Xilinx ISE14.4(ISE、VivadoVivado HLS)全部License,里面包含"xilinx_ise.lic" 、"xilinx_vivado.lic"、"xilinx_hls.lic"等3个license。在ISE14.4上亲测可用,Xilinx ISE、VivadoVivado HLS等组件功能全部...
  • Vivado HLS初体验

    千次阅读 2016-11-22 10:20:15
    该笔记主要是Vivado HLS开发流程的学习心得,掌握HLS开发的全流程:从工程创建到算法仿真到综合再到设计实现,由于截图较多,暂时只写到前两部分。 2、目标 1)熟悉Vivado HLS GUI的使用 2)如何进行C/C++算法...
  • ise14.3 vivado hls license

    热门讨论 2013-01-25 09:47:26
    ise14.3 vivado hls license
  • 可以通过Directives将HLS INLINE功能关闭,该函数就不会被inline掉。 案例 分别是头文件、源文件和TestBench。 创建工程 添加顶层函数: 加入testbench 创建Solution,用于迭代开发 执行C的仿真 执行综合 ...
  • 本博客为跟Xilinx SAE 学HLS系列视频讲座-高亚军的学习笔记。 软件工程师怎么了解FPGA架构 FPGA属于硬件可编程器件,Xilinx的FPGA分为两类:传统的FPGA和SOC 对于软件工程师,我们更关注的是逻辑单元、内存单元和...
  • Vivado HLS教程.pdf

    2020-11-16 17:08:58
    关于用vivado进行HLS开发的资料,其中有笔记对应的视频链接,可以配套视频进行学习,属于个人学习资料,不喜勿喷
  • #pragma HLS dataflow //任务级流水化而不是顺序执行 默认用double-buffer来实现 一个比较经典的方式来展示templete参数,unroll、dataflow使用的例子,如下所示,它实现了N个testCore模块并行执行。 templete<...
  • vivadoHLS优化

    2019-09-25 13:11:00
    //HLS数据类型: ap_fixed<总位宽,整数位宽>-------------------------------------------------------------------------- (优化)Directive (函数/类 -> 变量/对象)Insert Directive  (优化措施 ug...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 792
精华内容 316
关键字:

hlsvivado