数字信号处理相关3(Vivado HLS 开发流程简介(高级综合)(FPGA))

来自:https://blog.csdn.net/gentleman_qin/article/details/79983840

在传统的FPGA设计流程中,一般是自顶向下的模块化设计,这些模块包括用户自己编写的RTL或者是供应商提供的IP核。而在Xilinx新推出的高生产力设计流程中是以IP为核心的,把所有的模块都看做是IP,封装为IP,最主要的是IP的设计是基于C语言的,最后通过HLS将C语言代码转化为RTL,这能极大的加快设计进程。从这段时间的学习来看,HLS综合出来的电路比我自己写的RTL更省资源,在时序方面可能会差一些,因为我自己是习惯性的全流水,但它也满足了时序的要求。HLS还提供了非常多的经过深度优化的库,所以我个人觉得HLS综合的电路已经比很多刚接触FPGA不久的工程师要好了,传统的RTL设计可能不会消失,但很可能会越来越少了。

      HLS在不添加任何优化指令的情况下默认综合电路为最节省资源的情况,即能使用分时复用就使用分时复用,能在一个周期中完成多个操作(满足时钟频率约束的要求)则绝不流水。从这里得到的启发是,设计不要过度的流水,只要能满足时钟频率的需求,我们在一个时钟周期内可以进行多个操作,于是在低频率的系统中,我们可以节省很多的寄存器资源。这样做还有一个好处是我们可以使用assign来完成逻辑设计,然后再对输出进行寄存,可以极大的减少代码量,增加代码的可读性,HLS综合后的RTL代码的风格就是这样的,当然因为命名的原因该代码几乎没有可读性,我们可以不用刻意去读懂它。

     在学习Vivado HLS工具之前,我们需要了解HLS工具在FPGA开发流程中的作用。Vivado工具的设计理念是以IP为核心的,所有的功能模块都可以看做并且封装成一个IP,最后由Vivado集成,以实现最大化的设计复用。所以Vivado HLS可以看做是一个IP封装工具,它封装的是由C、C++、SystemC或者OpenCL等高级语言实现的功能函数。

   

1、写一下我自己理解的Vivado HLS工具学习流程:

 

熟悉GUI,了解每一个按钮的作用和意义
了解从工程创建到设计输出的每个步骤的作用和意义
了解Vivado HLS工具在FPGA设计中的作用和意义
掌握优化指令directive的使用
学习HLS的Coding Styles


2、从一张图简单讲一下Vivado HLS的设计流程


这张图是Xilinx用户指南ug902中的,从图中我们可以看到HLS的设计流程可以分为3个大的部分

设计输入
仿真综合
设计输出


(1)、设计输入里有三个文件是我们需要手动编写的,TestBench、C函数文件、头文件,而Constraints文件是在创建工程的时候完成的,主要是器件和时钟频率的约束,Directive就是优化指令文件,一般是C仿真通过之后添加的,这是综合之前的关键一步,后面会联合综合部分讲到。Xilinx的文档里特别强调了C TestBench的作用,建议不要越过这一步直接综合,HLS一个很大的优越性就是C仿真的速度要比RTL仿真的速度快很多。C函数文件其实对应的就是我们平常编写的RTL,可以把它看成是一个带输入输出端口的盒子,这个盒子完成我们需求的函数功能。而头文件的作用主要是增加代码的可读性和可移植性,头文件里声明任意精度类型,编写宏控制设计的仿真和综合流程。

(2)、仿真综合主要包括两个部分,一是C仿真和C联合RTL仿真,二是C的综合。因为只是为了验证设计的功能正确性,C仿真和C联合RTL仿真较为简单,如果设计没有错误的话,点两下按钮就可以结束了,如果报错,则根据报错信息进行debug就可以了。而C的综合难度较大一点,需要深入了解for循环、数组等结构在不同优化指令下的综合情况,需要看懂综合报告,这就要求对FPGA的底层有一定的了解,如果综合报告没有满足我们的需求,就要修改directive并重新综合,甚至需要修改C代码,这是一个迭代的过程。当综合报告满足我们的需求并且C和RTL联合仿真通过后就可以进行设计输出了。

(3)、设计输出就没什么 了,根据自己需要将该IP用到的地方进行导出就可以了。

 

3、设计步骤:
创建工程,编写设计输入 ——参考资料:ug871,ug902
C仿真和debug ——————-参考资料:ug871,ug902
C综合及结果分析—————-参考资料:ug871,ug902
C联合RTL仿真 ——————-参考资料:ug871,ug902
输出———————————-参考资料:ug871,ug902


4、再提一下HLS的一个好处:可以通过directive来将同样的代码综合成不同结构的电路 
比如我们要重复使用一个模块A,我们可能在资源不够的时候需要对A进行分时复用,在需要高吞吐量的时候又需要对A进行逻辑复制,如果是写RTL代码的话,这两种方式都需要不少的代码量,并且从一种方式换到另一种方式的时候需要重新编写代码,非常耗时。而使用HLS的话,我们只需要一个for循环对A进行调用就可以了,代码非常少,至于我们需要综合成何种结构的电路则添加不同的directive就可以了,并且可以同时生成不同的solution,同时综合成几种不同的电路,非常方便。

 

5、学习资料
Xilinx官方论坛里整理的学习资料 
https://forums.xilinx.com/t5/Vivado%E4%B8%93%E5%8C%BA/Vivado-HLS%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/td-p/362057

推荐高亚军老师的视频教程:《跟着Xilinx SAE学HLS》 
http://xilinx.eetop.cn/viewnews-2721

 

6、好的HLS设计 = Good Coding Styles + Good Directives
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频课程源:http://xilinx.eetop.cn/category-83 目录 1 从软件工程师的角度来看 FPGA 架构 3 2 Vivado HLS的工作机制 5 3-4 HLS设计流程基本概念 9 5 任意精度数据类型 15 5.1 C语言支持的数据类型 15 5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的定义和初始化 17 6.2 定点数据类型 18 6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示数据类型转换 19 7 Vivado HLS中的复合数据类型 20 7.1 结构体 20 7.2 枚举类型 22 8 Vivado HLS中的C++基本运算 23 9 测试平台的基本架构 25 9.1 Test Bench 25 9.2 C Test Bench 26 10 测试激励 28 11 测试输出检测与格式控制 28 11.1 Scoreboard 28 11.2 输出格式控制 30 12 接口综合基本介绍 33 12.1 接口综合概述 33 12.2 block-level interface protocol和port-level interface protocol 34 13 接口综合之数组 35 14 接口综合案例演示 37 14.1 添加寄存器 37 14.2 添加时钟使能信号 38 14.3 指令优化 38 15 for循环优化-基本性能指标 40 15.1 基本衡量指标 40 15.2 for循环pipeline 41 15.3 for循环UNROLL展开 41 15.4 for循环变量i 42 16 for循环优化-循环合并 42 17 for循环优化-数据流 46 18 for循环优化-嵌套的for循环优化 54 18.1 循环嵌套类型 54 18.2 Perfect loop nest示例 55 18.3 Imperfect loop nest示例 56 19 for循环优化-其他优化方法 59 19.1 for循环的并行性 59 19.2 for循环pipeline时的rewind选项 61 19.3 for循环的循环边界是变量时处理方法 64 20 数组优化-数组分割 67 20.1 数组接口 67 20.2 数组分割 67 21 数组优化-数组映射和重组 69 21.1 数组的映射 69 21.2 数组的重组 72 21.3 综合对比 72 22 数组优化-其他优化方法 72 22.1 定义ROM 72 22.2 数组的初始化 74 23 函数层面优化 75 23.1 代码风格 75 23.2 Inline 75 23.3 Allocation 75 23.3 Dataflow 75 24 总结分析 77 24.1 改善吞吐率(Throughput) 77 24.2 改善时延(Latency) 78 24.3 改善资源(Area) 79
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值