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

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

3天内不再提示

XIlinx利用HLS进行加速设计进度

FPGA之家 来源:陈年丽 2019-07-31 09:45 次阅读

据观察,HLS的发展呈现愈演愈烈的趋势,随着Xilinx Vivado HLS的推出,intel也快马加鞭的推出了其HLS工具。HLS可以在一定程度上降低FPGA的入门门槛(不用编写RTL代码),也可以在某些场合加速设计与验证(例如在FPGA上实现OpenCV函数),但个人还是喜欢直接从RTL入手,这样可以更好的把握硬件结构。Xilinx官方文档表示利用HLS进行设计可以大大加速设计进度:

XIlinx官方文档片段

所以为了紧随时代潮流,所以也抽空玩了一下Xilinx的HLS工具,下面把整个过程分享给大家。我这里选择Cordic算法作为我的实现目标。Cordic算法原理很简单,所以这里不再赘述。首先介绍一下Vivado HLS设计流程:

Vivado HLS设计流程

可以看出我们需要做的是完成C/C++设计、Testbench编写以及Constraints/directives的添加。其中Constraints/directives是指利用约束/指令使HLS综合出的RTL代码更符合要求。接着,我们就可以利用HLS进行C层仿真与验证、C/RTL混合仿真与验证以及RTL代码的生成与打包。综上,HLS设计的主要工作内容包括三点:C/C++设计、Testbench设计以及约束的添加。下面就从这三点开始介绍。

一. Cordic算法的C++实现

算法头文件Cordic.h代码如下:

#include #include #define WA 17#define FA 14#define WS 16#define FS 14typedef ap_fixed di_t;typedef ap_fixed do_t;typedef ap_uint<2> flag_t;const do_t Kn = 0.607252935;const di_t PI = 3.1415926;void cir_cordic(di_t alpha, do_t &mysin, do_t &mycos);

头文件的重点是声明数据类型。这里采用HLS中特有的定点数形式,包含ap_fixed.h与ap_int.h即可。由于输入为有符号弧度制(-3.1415~+3.1415),输出为-1~+1,所以定义两种数据精度:

di_t :17bits = 1bit符号位 + 2bit整数 + 14bit小数

do_t:16bits = 1bit符号位 + 1bit整数 + 14bit小数

接着声明了函数与两个算法所需参数

算法文件Cordic.cpp代码如下(注意:由于使用C++头文件ap_fixed.h,所以必须采用.cpp文件,否则编译出错):

#include"Cordic.h"void pre_cir_cordic(di_t full_alpha, di_t &alpha, flag_t &flag){ if(full_alpha > PI/2) { alpha = PI - full_alpha; flag = 2; } else if(full_alpha < -PI/2) { alpha = -PI - full_alpha; flag = 3; } else { alpha = full_alpha; flag = 0; }}void cir_cordic_calculate(di_t alpha, flag_t flag, do_t &mysin, do_t &mycos, flag_t &flag_delay){ const int N = 15; do_t xi[N]; do_t yi[N]; di_t zi[N]; flag_t flag_delay_a[N]; xi[0] = Kn; yi[0] = 0; zi[0] = alpha; flag_delay_a[0] = flag; const di_t myarctan[15] = { 0.7853981, 0.4636476, 0.2449787, 0.1243549, 0.0624188, 0.0312398, 0.0156237, 0.0078123, 0.0039062, 0.0019531, 0.0009765, 0.0004883, 0.0002441, 0.0001221, 0.0000610 }; int m = 0; for(m = 0; m= 0) { xi[m+1] = xi[m] - (yi[m] >> m); yi[m+1] = yi[m] + (xi[m] >> m); zi[m+1] = zi[m] - myarctan[m]; } else { xi[m+1] = xi[m] + (yi[m] >> m); yi[m+1] = yi[m] - (xi[m] >> m); zi[m+1] = zi[m] + myarctan[m]; } flag_delay_a[m+1] = flag_delay_a[m]; } mysin = yi[N-1]; mycos = xi[N-1]; flag_delay = flag_delay_a[N-1];}void post_cir_cordic(do_t mysin, do_t mycos, flag_t flag_delay, do_t &sin_out, do_t &cos_out){ switch(int(flag_delay)) { case 2: sin_out = mysin; cos_out = -mycos; break; case 3: sin_out = mysin; cos_out = -mycos; break; default: sin_out = mysin; cos_out = mycos; break; }}void cir_cordic(di_t full_alpha, do_t &sin_out, do_t &cos_out){ di_t alpha; flag_t flag; do_t mysin; do_t mycos; flag_t flag_delay; pre_cir_cordic(full_alpha, alpha, flag); cir_cordic_calculate(alpha, flag, mysin, mycos, flag_delay); post_cir_cordic(mysin, mycos, flag_delay, sin_out, cos_out);}

算法主要有三个函数组成:

1.pre_cir_cordic:将输入角度从-π~+π映射到 -π/2~+π/2中。

2.cir_cordic_calculate:利用旋转公式进行Cordic算法计算,这里设置旋转次数为15次,精度较高。

3.post_cir_cordic:根据输入角度矫正输出值正负。

最后,通过cir_cordic函数实现上述三个函数的整合。至此,Cordic算法的C++设计结束。

二. Testbench设计

为了验证设计的正确性,需要编写Testbench对C++代码以及综合后的RTL进行测试。本文的Testbench.cpp代码如下:

#include "Cordic.h"#include #include #include #include #include #include using namespace std;#define RAND (rand()%181) - (rand()%181)#define Test_round 100#define STANDARD 0.01int main(){ srand(RAND_MAX); int i; for(i=0; iSTANDARD || abs((float)(cos_ref - cos_out))>STANDARD) { cout<<"Error: error is too big"<

本测试平台利用随机数生成-π~+π的测试向量对程序进行测试。以math.h中的三角函数作为评判标准。为了缩短时间,选择100组测试向量进行测试,若算法误差大于给定值,则报错;若算法误差均小于给定值,则输出验证通过信息。C验证平台设计完成。

三. 验证与directives的添加

1.初步算法的C仿真与综合

根据上述代码,可以对工程进行C仿真,仿真结果如下:

C仿真结果

可以看出C仿真通过,算法正确。接着综合工程,得到综合结果如下:

C综合报告

可以看出代码时钟符合要求,但是Latency(延迟)和Interval(吞吐量倒数)较大。此时吞吐量较小,64个时钟输出一个计算结果,并没有发挥FPGA的并行优势,所以需要添加Directives对工程综合进行约束。

2.Directives添加

由于Cordic算法中旋转公式部分为循环,所以将循环展开并加入流水线可以大大减小延时以及增加吞吐量。同时也对计算函数加入流水线以提高吞吐量。建立一个新的solution:Add_Directives,其Directive添加结果如下:

Directive添加结果

此时再对算法进行综合,得到综合报告对比如下:

综合报告对比

可以看出添加Directives后,吞吐量大大提高,已经达到最大值,即每个时钟都输出一个计算结果。算法延时也从63个clk减小到4个clk,此时RTL代码已经较为理想。

3.C/RTL联合仿真

由上,代码设计部分与约束添加已经全部完成,下面进行联合仿真,对RTL代码进行验证。验证报告如下:

混合仿真报告

可以看出RTL仿真与C仿真均通过,说明设计正确。利用Vivado simulator打开RTL仿真波形,如下:

RTL仿真波形

可以看出RTL波形中明显体现出4 clk的Latency和1 clk的Interval,并且利用计算器进行验算,证明计算结果正确,所以RTL代码综合成功。

四. IP打包

直接利用HLS进行IP打包即可生成IP核。在相应工程中引入IP核路径(在对应solution内的impl文件夹内)即可调用HLS生成的IP核。本IP核接口如下:

Cordic IP

那么根据上节仿真波形进行接口输入的描述就可以使用该IP。至此,整个HLS设计过程结束。

五. 总结

整个HLS设计过程还是比较清晰的,重点在于了解HLS的支持范围以编写符合规范的高层次代码,其次是对硬件有一定认识以引入合适的directives。HLS的确在很大程度上加快了设计进度,使用也非常方便,所以我以后决定还是从RTL层面进行设计,因为那样觉得自己更NB一点。

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

    关注

    1

    文章

    377

    浏览量

    59076
  • HLS
    HLS
    +关注

    关注

    1

    文章

    126

    浏览量

    23685

原文标题:利用Xilinx HLS将C++代码快速部署于FPGA(Cordic算法)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Vivado HLS视频库加速Zynq-7000 All Programmable SoC OpenCV应用

    SoC器件上快速地加速和集成您的计算机视觉应用。本次研讨会将通过对一个具体案例的流程进行“逐层拆解(Step-by-Step)一个设计案列”的方式,向您介绍如何利用Vivado HLS
    发表于 12-30 16:09

    熟悉Vivado HLS基本功能要多少时间?

    您好Xilinx的用户和员工,我们正在考虑购买Zynq 7000用于机器视觉任务。我们没有编程FPGA的经验,并希望使用Vivado HLS来指导和加速我们的工作。关于这种方法的一些问题:您对
    发表于 03-25 09:04

    【正点原子FPGA连载】第一章HLS简介-领航者ZYNQ之HLS 开发指南

    主要可以从“设计的重用”和“抽象层级的提升”这两个方面来考虑。Xilinx推出的Vivado HLS工具可以直接使用C、C++或System C来对Xilinx系列的FPGA进行编程,
    发表于 10-10 16:44

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

    Xilinx可编程逻辑器件进行开发,可加速算法开发的进程,缩短产品上市时间。本次案例用到的是创龙科技的TLZ7x-EasyEVM-S开发板,它是一款基于Xilinx Zynq-700
    发表于 11-11 09:38

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

    (High-Level Synthesis,高层次综合) 工具支持将 C 、C++等语言转化成硬件描述语言,同时支持基于 OpenCL 等框架对 Xilinx 可编程逻辑器件进行开发,可加速算法开发的进程,缩短
    发表于 01-01 23:46

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

    综合) 工具支持将 C 、C++等语言转化成硬件描述语言,同时支持基于 OpenCL 等框架对 Xilinx 可编程逻辑器件进行开发,可加速算法开发的进程,缩短产品上市时间。测试板卡是基于创龙科技
    发表于 01-01 23:50

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

    ,高层次综合) 工具支持将 C 、C++等语言转化成硬件描述语言,同时支持基于 OpenCL 等框架对 Xilinx 可编程逻辑器件进行开发,可加速算法开发的进程,缩短产品上市时间。 测试板卡是基于创
    发表于 08-24 14:52

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

    (High-Level Synthesis,高层次综合) 工具支持将 C 、C++等语言转化成硬件描述语言,同时支持基于 OpenCL 等框架对 Xilinx 可编程逻辑器件进行开发,可加速算法开发的进程,缩短
    发表于 08-24 14:54

    【KV260视觉入门套件试用体验】硬件加速之—使用PL加速矩阵乘法运算(Vitis HLS

    四、硬件加速之—使用PL加速矩阵乘法运算(Vitis HLS) 前四期测评计划: 一、开箱报告,KV260通过网线共享PC网络 二、Zynq超强辅助-PYNQ配置,并使用XVC(Xilinx
    发表于 10-13 20:11

    关于ZYNQ HLS图像处理加速总结的分享

    HLS工具 以个人的理解,xilinxHLS(高层次综合)定位于更方便的将复杂算法转化为硬件语言,通过添加某些配置条件HLS工具可以把可并行化的C/C++的代码转化为vhdl或ver
    发表于 10-12 17:34 2039次阅读
    关于ZYNQ <b class='flag-5'>HLS</b>图像处理<b class='flag-5'>加速</b>总结的分享

    利用Vivado HLS加速运行慢的软件

    大,我是否能够利用Vivado HLS完成这项要求较高的运算呢? 我开始从软件方面考虑这个转换,我开始关注软件界面。毕竟,HLS创建专用于处理硬件接口的硬件。幸好Vivado HLS
    发表于 02-09 02:15 326次阅读

    重点介绍hls软件的使用方法和优化方法

    本系列教程演示如何使用xilinxHLS工具进行算法的硬件加速
    的头像 发表于 06-17 10:20 5727次阅读
    重点介绍<b class='flag-5'>hls</b>软件的使用方法和优化方法

    基于Vitis HLS加速图像处理

    Vitis Vision库是OpenCV和Vision功能的加速库,可在Vitis环境中使用,这些库的L1目录是示例设计。为了适应各种用户环境,从2020.1版本开始,Xilinx不再
    的头像 发表于 02-16 16:21 2067次阅读
    基于Vitis <b class='flag-5'>HLS</b>的<b class='flag-5'>加速</b>图像处理

    如何使用xilinxHLS工具进行算法的硬件加速

    在整个流程中,用户先创建一个设计 C、C++ 或 SystemC 源代码,以及一个C的测试平台。通过 Vivado HLS Synthesis 运行设计,生成 RTL 设计,代码可以是 Verilog,也可以是 VHDL。
    的头像 发表于 06-02 09:48 6227次阅读

    如何使用HLS加速FPGA上的FIR滤波器

    电子发烧友网站提供《如何使用HLS加速FPGA上的FIR滤波器.zip》资料免费下载
    发表于 06-14 15:28 1次下载
    如何使用<b class='flag-5'>HLS</b><b class='flag-5'>加速</b>FPGA上的FIR滤波器