在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

XIlinx利用HLS進(jìn)行加速設(shè)計(jì)進(jìn)度

FPGA之家 ? 來源:陳年麗 ? 2019-07-31 09:45 ? 次閱讀

據(jù)觀察,HLS的發(fā)展呈現(xiàn)愈演愈烈的趨勢,隨著Xilinx Vivado HLS的推出,intel也快馬加鞭的推出了其HLS工具。HLS可以在一定程度上降低FPGA的入門門檻(不用編寫RTL代碼),也可以在某些場合加速設(shè)計(jì)與驗(yàn)證(例如在FPGA上實(shí)現(xiàn)OpenCV函數(shù)),但個(gè)人還是喜歡直接從RTL入手,這樣可以更好的把握硬件結(jié)構(gòu)。Xilinx官方文檔表示利用HLS進(jìn)行設(shè)計(jì)可以大大加速設(shè)計(jì)進(jìn)度:

XIlinx官方文檔片段

所以為了緊隨時(shí)代潮流,所以也抽空玩了一下Xilinx的HLS工具,下面把整個(gè)過程分享給大家。我這里選擇Cordic算法作為我的實(shí)現(xiàn)目標(biāo)。Cordic算法原理很簡單,所以這里不再贅述。首先介紹一下Vivado HLS設(shè)計(jì)流程:

Vivado HLS設(shè)計(jì)流程

可以看出我們需要做的是完成C/C++設(shè)計(jì)、Testbench編寫以及Constraints/directives的添加。其中Constraints/directives是指利用約束/指令使HLS綜合出的RTL代碼更符合要求。接著,我們就可以利用HLS進(jìn)行C層仿真與驗(yàn)證、C/RTL混合仿真與驗(yàn)證以及RTL代碼的生成與打包。綜上,HLS設(shè)計(jì)的主要工作內(nèi)容包括三點(diǎn):C/C++設(shè)計(jì)、Testbench設(shè)計(jì)以及約束的添加。下面就從這三點(diǎn)開始介紹。

一. Cordic算法的C++實(shí)現(xiàn)

算法頭文件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);

頭文件的重點(diǎn)是聲明數(shù)據(jù)類型。這里采用HLS中特有的定點(diǎn)數(shù)形式,包含ap_fixed.h與ap_int.h即可。由于輸入為有符號弧度制(-3.1415~+3.1415),輸出為-1~+1,所以定義兩種數(shù)據(jù)精度:

di_t :17bits = 1bit符號位 + 2bit整數(shù) + 14bit小數(shù)

do_t:16bits = 1bit符號位 + 1bit整數(shù) + 14bit小數(shù)

接著聲明了函數(shù)與兩個(gè)算法所需參數(shù)。

算法文件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);}

算法主要有三個(gè)函數(shù)組成:

1.pre_cir_cordic:將輸入角度從-π~+π映射到 -π/2~+π/2中。

2.cir_cordic_calculate:利用旋轉(zhuǎn)公式進(jìn)行Cordic算法計(jì)算,這里設(shè)置旋轉(zhuǎn)次數(shù)為15次,精度較高。

3.post_cir_cordic:根據(jù)輸入角度矯正輸出值正負(fù)。

最后,通過cir_cordic函數(shù)實(shí)現(xiàn)上述三個(gè)函數(shù)的整合。至此,Cordic算法的C++設(shè)計(jì)結(jié)束。

二. Testbench設(shè)計(jì)

為了驗(yàn)證設(shè)計(jì)的正確性,需要編寫Testbench對C++代碼以及綜合后的RTL進(jìn)行測試。本文的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"<

本測試平臺利用隨機(jī)數(shù)生成-π~+π的測試向量對程序進(jìn)行測試。以math.h中的三角函數(shù)作為評判標(biāo)準(zhǔn)。為了縮短時(shí)間,選擇100組測試向量進(jìn)行測試,若算法誤差大于給定值,則報(bào)錯;若算法誤差均小于給定值,則輸出驗(yàn)證通過信息。C驗(yàn)證平臺設(shè)計(jì)完成。

三. 驗(yàn)證與directives的添加

1.初步算法的C仿真與綜合

根據(jù)上述代碼,可以對工程進(jìn)行C仿真,仿真結(jié)果如下:

C仿真結(jié)果

可以看出C仿真通過,算法正確。接著綜合工程,得到綜合結(jié)果如下:

C綜合報(bào)告

可以看出代碼時(shí)鐘符合要求,但是Latency(延遲)和Interval(吞吐量倒數(shù))較大。此時(shí)吞吐量較小,64個(gè)時(shí)鐘輸出一個(gè)計(jì)算結(jié)果,并沒有發(fā)揮FPGA的并行優(yōu)勢,所以需要添加Directives對工程綜合進(jìn)行約束。

2.Directives添加

由于Cordic算法中旋轉(zhuǎn)公式部分為循環(huán),所以將循環(huán)展開并加入流水線可以大大減小延時(shí)以及增加吞吐量。同時(shí)也對計(jì)算函數(shù)加入流水線以提高吞吐量。建立一個(gè)新的solution:Add_Directives,其Directive添加結(jié)果如下:

Directive添加結(jié)果

此時(shí)再對算法進(jìn)行綜合,得到綜合報(bào)告對比如下:

綜合報(bào)告對比

可以看出添加Directives后,吞吐量大大提高,已經(jīng)達(dá)到最大值,即每個(gè)時(shí)鐘都輸出一個(gè)計(jì)算結(jié)果。算法延時(shí)也從63個(gè)clk減小到4個(gè)clk,此時(shí)RTL代碼已經(jīng)較為理想。

3.C/RTL聯(lián)合仿真

由上,代碼設(shè)計(jì)部分與約束添加已經(jīng)全部完成,下面進(jìn)行聯(lián)合仿真,對RTL代碼進(jìn)行驗(yàn)證。驗(yàn)證報(bào)告如下:

混合仿真報(bào)告

可以看出RTL仿真與C仿真均通過,說明設(shè)計(jì)正確。利用Vivado simulator打開RTL仿真波形,如下:

RTL仿真波形

可以看出RTL波形中明顯體現(xiàn)出4 clk的Latency和1 clk的Interval,并且利用計(jì)算器進(jìn)行驗(yàn)算,證明計(jì)算結(jié)果正確,所以RTL代碼綜合成功。

四. IP打包

直接利用HLS進(jìn)行IP打包即可生成IP核。在相應(yīng)工程中引入IP核路徑(在對應(yīng)solution內(nèi)的impl文件夾內(nèi))即可調(diào)用HLS生成的IP核。本IP核接口如下:

Cordic IP

那么根據(jù)上節(jié)仿真波形進(jìn)行接口輸入的描述就可以使用該IP。至此,整個(gè)HLS設(shè)計(jì)過程結(jié)束。

五. 總結(jié)

整個(gè)HLS設(shè)計(jì)過程還是比較清晰的,重點(diǎn)在于了解HLS的支持范圍以編寫符合規(guī)范的高層次代碼,其次是對硬件有一定認(rèn)識以引入合適的directives。HLS的確在很大程度上加快了設(shè)計(jì)進(jìn)度,使用也非常方便,所以我以后決定還是從RTL層面進(jìn)行設(shè)計(jì),因?yàn)槟菢佑X得自己更NB一點(diǎn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    387

    瀏覽量

    60426
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    130

    瀏覽量

    24512

原文標(biāo)題:利用Xilinx HLS將C++代碼快速部署于FPGA(Cordic算法)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Vivado HLS視頻庫加速Zynq-7000 All Programmable SoC OpenCV應(yīng)用

    SoC器件上快速地加速和集成您的計(jì)算機(jī)視覺應(yīng)用。本次研討會將通過對一個(gè)具體案例的流程進(jìn)行“逐層拆解(Step-by-Step)一個(gè)設(shè)計(jì)案列”的方式,向您介紹如何利用Vivado HLS
    發(fā)表于 12-30 16:09

    熟悉Vivado HLS基本功能要多少時(shí)間?

    您好Xilinx的用戶和員工,我們正在考慮購買Zynq 7000用于機(jī)器視覺任務(wù)。我們沒有編程FPGA的經(jīng)驗(yàn),并希望使用Vivado HLS來指導(dǎo)和加速我們的工作。關(guān)于這種方法的一些問題:您對
    發(fā)表于 03-25 09:04

    嵌入式硬件開發(fā)學(xué)習(xí)教程——Xilinx Vivado HLS案例 (流程說明)

    Xilinx可編程邏輯器件進(jìn)行開發(fā),可加速算法開發(fā)的進(jìn)程,縮短產(chǎn)品上市時(shí)間。本次案例用到的是創(chuàng)龍科技的TLZ7x-EasyEVM-S開發(fā)板,它是一款基于Xilinx Zynq-700
    發(fā)表于 11-11 09:38

    嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(4)

    (High-Level Synthesis,高層次綜合) 工具支持將 C 、C++等語言轉(zhuǎn)化成硬件描述語言,同時(shí)支持基于 OpenCL 等框架對 Xilinx 可編程邏輯器件進(jìn)行開發(fā),可加速算法開發(fā)的進(jìn)程,縮短
    發(fā)表于 01-01 23:46

    嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(3)

    綜合) 工具支持將 C 、C++等語言轉(zhuǎn)化成硬件描述語言,同時(shí)支持基于 OpenCL 等框架對 Xilinx 可編程邏輯器件進(jìn)行開發(fā),可加速算法開發(fā)的進(jìn)程,縮短產(chǎn)品上市時(shí)間。測試板卡是基于創(chuàng)龍科技
    發(fā)表于 01-01 23:50

    嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(3)

    ,高層次綜合) 工具支持將 C 、C++等語言轉(zhuǎn)化成硬件描述語言,同時(shí)支持基于 OpenCL 等框架對 Xilinx 可編程邏輯器件進(jìn)行開發(fā),可加速算法開發(fā)的進(jìn)程,縮短產(chǎn)品上市時(shí)間。 測試板卡是基于創(chuàng)
    發(fā)表于 08-24 14:52

    嵌入式HLS 案例開發(fā)步驟分享——基于Zynq-7010/20工業(yè)開發(fā)板(4)

    (High-Level Synthesis,高層次綜合) 工具支持將 C 、C++等語言轉(zhuǎn)化成硬件描述語言,同時(shí)支持基于 OpenCL 等框架對 Xilinx 可編程邏輯器件進(jìn)行開發(fā),可加速算法開發(fā)的進(jìn)程,縮短
    發(fā)表于 08-24 14:54

    【KV260視覺入門套件試用體驗(yàn)】硬件加速之—使用PL加速矩陣乘法運(yùn)算(Vitis HLS

    四、硬件加速之—使用PL加速矩陣乘法運(yùn)算(Vitis HLS) 前四期測評計(jì)劃: 一、開箱報(bào)告,KV260通過網(wǎng)線共享PC網(wǎng)絡(luò) 二、Zynq超強(qiáng)輔助-PYNQ配置,并使用XVC(Xilinx
    發(fā)表于 10-13 20:11

    關(guān)于ZYNQ HLS圖像處理加速總結(jié)的分享

    HLS工具 以個(gè)人的理解,xilinxHLS(高層次綜合)定位于更方便的將復(fù)雜算法轉(zhuǎn)化為硬件語言,通過添加某些配置條件HLS工具可以把可并行化的C/C++的代碼轉(zhuǎn)化為vhdl或ver
    發(fā)表于 10-12 17:34 ?2579次閱讀
    關(guān)于ZYNQ <b class='flag-5'>HLS</b>圖像處理<b class='flag-5'>加速</b>總結(jié)的分享

    利用Vivado HLS加速運(yùn)行慢的軟件

    是否能夠利用Vivado HLS完成這項(xiàng)要求較高的運(yùn)算呢? 我開始從軟件方面考慮這個(gè)轉(zhuǎn)換,我開始關(guān)注軟件界面。畢竟,HLS創(chuàng)建專用于處理硬件接口的硬件。幸好Vivado HLS支持創(chuàng)建
    發(fā)表于 02-09 02:15 ?420次閱讀

    利用Vitis HLS tcl shell一鍵跑通視覺加速例程

    ? 本文給想直接使用Vitis HLS 工具在 Standalone 模式下調(diào)用 Xilinx Vision Library L1 API 的小伙伴提供了一個(gè)非常容易上手的腳本文件。 在論壇上遇到在
    的頭像 發(fā)表于 12-29 11:12 ?3640次閱讀
    <b class='flag-5'>利用</b>Vitis <b class='flag-5'>HLS</b> tcl shell一鍵跑通視覺<b class='flag-5'>加速</b>例程

    重點(diǎn)介紹hls軟件的使用方法和優(yōu)化方法

    本系列教程演示如何使用xilinxHLS工具進(jìn)行算法的硬件加速
    的頭像 發(fā)表于 06-17 10:20 ?9384次閱讀
    重點(diǎn)介紹<b class='flag-5'>hls</b>軟件的使用方法和優(yōu)化方法

    基于Vitis HLS加速圖像處理

    Vitis Vision庫是OpenCV和Vision功能的加速庫,可在Vitis環(huán)境中使用,這些庫的L1目錄是示例設(shè)計(jì)。為了適應(yīng)各種用戶環(huán)境,從2020.1版本開始,Xilinx不再
    的頭像 發(fā)表于 02-16 16:21 ?2626次閱讀
    基于Vitis <b class='flag-5'>HLS</b>的<b class='flag-5'>加速</b>圖像處理

    如何使用xilinxHLS工具進(jìn)行算法的硬件加速

    在整個(gè)流程中,用戶先創(chuàng)建一個(gè)設(shè)計(jì) C、C++ 或 SystemC 源代碼,以及一個(gè)C的測試平臺。通過 Vivado HLS Synthesis 運(yùn)行設(shè)計(jì),生成 RTL 設(shè)計(jì),代碼可以是 Verilog,也可以是 VHDL。
    的頭像 發(fā)表于 06-02 09:48 ?7699次閱讀

    關(guān)于HLS IP無法編譯解決方案

    Xilinx平臺的Vivado HLS 和 Vitis HLS 使用的 export_ip 命令會無法導(dǎo)出 IP
    的頭像 發(fā)表于 07-07 14:14 ?1012次閱讀
    關(guān)于<b class='flag-5'>HLS</b> IP無法編譯解決方案
    主站蜘蛛池模板: 亚洲xx站| 欧美日本视频一区 | 五月激情五月婷婷 | 欧美日韩无 | 色老头成人免费综合视频 | 欧美人与zoxxxx另类 | 视频一区在线观看 | 亚洲第一视频在线播放 | 午夜看片| 欧美国产日本高清不卡 | 亚洲香蕉影院 | 色婷婷一区二区三区四区成人 | 手机看片国产免费 | 国内精品久久久久久久久蜜桃 | 欧美人与动欧交视频 | 夜夜综合网| ass日本69| 男人和女人做免费做爽爽视频 | 九色视频网站 | 中文字幕一区二区三 | 亚洲一区二区免费视频 | 国产精品久久在线 | 快乐你懂的在线视频免费观看 | 夜天干天干啦天干天天爽 | 特级无码毛片免费视频尤物 | 国产精品久久婷婷六月丁香 | 性感美女逼 | 亚洲第一页国产 | 亚洲理论片 | 都市激情 亚洲 | 国产区精品高清在线观看 | 综合色视频| 韩国xxxxx视频在线 | 色综合天天综合网亚洲影院 | 五月天婷婷视频在线观看 | 美女扒开尿口让男人桶 | 高清性色生活片久久久 | 69日本人xxxx16-18| 欧美色视频超清在线观看 | 日本三级香港三级人妇99 | 中文字幕一二三四区 |