在vivado里用rtl描述_如何利用Vivado HLS处理许多位准确或任意精度数据类型
我們?cè)谠O(shè)計(jì)硬件時(shí),它往往是要求更精確的位寬。例如,一個(gè)filter的輸入是12位和一個(gè)累加器的結(jié)果只需要一個(gè)最大范圍為27位。然而對(duì)于硬件設(shè)計(jì)來說,使用標(biāo)準(zhǔn)的C數(shù)據(jù)類型會(huì)造成硬件成本的浪費(fèi)。這就會(huì)造成我們要使用更多的LUT和寄存器,延遲甚至可能超過時(shí)鐘周期和需要更多的周期來計(jì)算結(jié)果。這往往不是我們需要的結(jié)果。因此下面我將介紹如何利用Vivado HLS處理許多位準(zhǔn)確或任意精度數(shù)據(jù)類型,以及允許使用任何(任意)寬度的模型變量。
C-base 數(shù)據(jù)類型
我們從硬件的角度來看數(shù)據(jù)類型,采用C/C++的數(shù)據(jù)類型都是以8bit為邊界,即:
? char (8-bit)
? short (16-bit)
? int (32-bit)
? long long (64-bit)
? float (32-bit)
? double (64-bit)
? 確切的寬度的整數(shù)類型如int16_t (16-bit) 和 int32_t (32-bit)
注意:char16_t和char32_t在Vivado Hls 中是不支持的
從上面發(fā)現(xiàn),C的數(shù)據(jù)位寬是比較死板的,然而描述RTL里面的位寬是任意的。
例如,采用C語言去描述一個(gè)18*18 bits的乘法器,那么就需要將輸入數(shù)據(jù)都聲明為32 bits(int),結(jié)果聲明為64 bits(long long),這將會(huì)在FPGA中消耗4個(gè)DSP48E1,顯然這是很浪費(fèi)資源的。
任意精度數(shù)據(jù)類型 Language Integer Data Type Required Header
C ? [u]int< W>(1024 bits) ? .#include< ap_cint.h>
C++ ? ap_[u]int< W>(1024 bits) ? .#include< ap_int.h>
C++ ? ap_[u]fixed< W,I,Q,O,N> ? .#include< ap_fixed.h>
其優(yōu)點(diǎn)有:1.更高的時(shí)鐘頻率 2.更好的數(shù)據(jù)吞吐率 3.消耗資源更少
因此,使用任意精度數(shù)據(jù)類型能以更少的資源,獲得相同的精度,同時(shí)可以運(yùn)行在更高的時(shí)鐘頻率下。
注意:在聲明任意數(shù)據(jù)類型的時(shí)候,我們往往在頭文件里面聲明,這會(huì)使得我們?cè)谧鰀ebug的時(shí)候會(huì)非常有用。
C-base 數(shù)據(jù)類型project
Step1 創(chuàng)建和打開project
I.打開Vivado HLS Command Prompt,按照下圖輸入命令
II.輸入vivado_hls -p window_fn_prj
Step2 Review Test Bench 和run C SimulaTIon
I.在Source打開window_fn_top.cpp
II.找到window_fn_top.h,按住Control鍵,并右擊,打開window_fn_top.h(頭文件)
在這里,我們可以看到,本設(shè)計(jì)所有數(shù)據(jù)類型的操作都是標(biāo)準(zhǔn)C/C++的浮點(diǎn)型。
III點(diǎn)擊Run C SimulaTIon
Step3 Run C SimulaTIon 和 Review Results
I.點(diǎn)擊Run C Synthesis
圖中我們發(fā)現(xiàn),頂層中的instances占用了大部分資源。
II.打開Interface Summary
III.點(diǎn)擊Analysis,打開winfn_loop
這是浮點(diǎn)型乘法器(fmul),圖中可以看出,第一個(gè)狀態(tài)是讀取內(nèi)存操作(兩個(gè)周期),然后是fmul操作(五個(gè)周期),最后的操作狀態(tài)是一個(gè)寫內(nèi)存操作(一個(gè)周期)
III.退出Vivado Hls,并返回到command prompt
任意數(shù)據(jù)類型project
Step1 創(chuàng)建和仿真project
I.打開Vivado HLS Command Prompt,按照下圖輸入命令
II.輸入vivado_hls -p window_fn_prj
III.在Source打開window_fn_top.cpp
IV.找到window_fn_top.h,按住Control鍵,并右擊,打開window_fn_top.h(頭文件)
這里的數(shù)據(jù)類型的操作是ap_fixed點(diǎn)類型,它類似于float和double(因?yàn)樗鼈冎С终麛?shù)和分?jǐn)?shù)位表示的類型),window_fn_top.h是唯一不同于上一個(gè)project的頭文件。這些數(shù)據(jù)類型是在頭文件中定義的ap_fixed。
注意:你可以通過修改C代碼,將任意精度類型代替標(biāo)準(zhǔn)C類型,在這里必須做的更改是減少數(shù)據(jù)類型的大小。在這例子中,我們使用8位,24位,和18位,而不是32位浮點(diǎn)類型。通過較少的操作,減少面積,和更少的時(shí)鐘周期就可以完成project。我們也可以改變更常見的C類型(如int,short,和char),例如,更改數(shù)據(jù)類型(18位int(32位))可以確保只要一個(gè)dsp48就可以執(zhí)行任何乘法,但是你必須確認(rèn)設(shè)計(jì)仍然執(zhí)行正確的操作和它這樣做所需的精度。由VIvado Hls提供的任意精度類型的好處是,可以仿真更新的C代碼來確認(rèn)其功能和準(zhǔn)確性。
V.點(diǎn)擊Run C SimulaTIon
控制臺(tái)面板顯示了C仿真的結(jié)果。隨著數(shù)據(jù)類型的更新,結(jié)果不再跟預(yù)期結(jié)果相同,然而他們是在誤差范圍內(nèi)。
Step2 Run C Synthesize和 Review Results
I.點(diǎn)擊Run C Synthesis
注意:通過使用任意精度類型,已經(jīng)減少了延遲和面積(50%和80%),并簡化了RTL硬件的操作。由于memory中的總位小于1024 bit,所以現(xiàn)在是自動(dòng)執(zhí)行LUTs和FFS而不是模塊RAM。
II.打開Interface Summary
注意:現(xiàn)在的數(shù)據(jù)端口是8 bits和24 bits
III.點(diǎn)擊Analysis,打開winfn_loop
總結(jié)
本文介紹任意精度數(shù)據(jù)類型的處理方法。通過Vivado HLs中兩個(gè)project的比較,得到結(jié)論,跟C-base 數(shù)據(jù)類型相比,使用任意精度數(shù)據(jù)類型能以更少的資源,獲得相同的精度,同時(shí)可以運(yùn)行在更高的時(shí)鐘頻率下。
總結(jié)
以上是生活随笔為你收集整理的在vivado里用rtl描述_如何利用Vivado HLS处理许多位准确或任意精度数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人脸表情识别
- 下一篇: eclipse启动tomcat内存溢出解