在HLS中用C語(yǔ)言實(shí)現(xiàn)8192點(diǎn)FFT,經(jīng)過(guò)測(cè)試,實(shí)驗(yàn)結(jié)果正確,但是時(shí)序約束不到100M的時(shí)鐘,應(yīng)該是設(shè)計(jì)上的延時(shí)之類(lèi)的比較大,暫時(shí)放棄這個(gè)方案,調(diào)用HLS中自帶的FFT庫(kù)(hls:fft)hls_fft.h。實(shí)際上,在HLS中調(diào)用該庫(kù)實(shí)現(xiàn)FFT,其實(shí)是Vivado中的那個(gè)FFT核實(shí)現(xiàn)的,但是HLS中的配置和給定輸入輸出數(shù)據(jù)比較方便,并且對(duì)其外部封裝其他類(lèi)型的總線(xiàn)接口非常容易。
1.hls_fft.h初探
在HLS中打開(kāi)示例例程 fft_single ,注意以下幾點(diǎn):
(1)默認(rèn)設(shè)定
【1】輸入數(shù)據(jù)和輸出數(shù)據(jù)的格式固定,必須采用16位定點(diǎn)復(fù)數(shù)數(shù)據(jù),其中1bit表示整數(shù),其他的表示小數(shù)部分,即輸入數(shù)據(jù)范圍 —1 ~ 1,輸出也是 —1 ~ 1;
【2】結(jié)構(gòu)類(lèi)型為流水線(xiàn)型;
【3】默認(rèn)點(diǎn)數(shù)1024點(diǎn),當(dāng)不是這個(gè)點(diǎn)數(shù)時(shí),除了修改頭文件的點(diǎn)數(shù),還需要修改config里的參數(shù)才能重新配置IP核;
【4】默認(rèn)輸入輸出16位定點(diǎn),相位因子16位,如果需要改成浮點(diǎn)數(shù)輸入輸出,需要更改相位因子為24或25位,并且在config里面更改IP核的配置;
【5】HLS中的FFT的IP庫(kù)只處理復(fù)數(shù)類(lèi)型complex的FFT數(shù)據(jù)。
【6】Xilinx FFT IP塊只對(duì)復(fù)數(shù)類(lèi)型數(shù)據(jù)進(jìn)行操作。盡管可以對(duì)把所有虛部都設(shè)為0的復(fù)數(shù)進(jìn)行FFT,但是通過(guò)預(yù)處理數(shù)據(jù)可以更有效地執(zhí)行FFT。
【7】HLS需要bit-reverse命令數(shù)據(jù)塊后端,所說(shuō)的自然順序和一個(gè)O (N)轉(zhuǎn)換適用于FFT輸出提取的頻譜數(shù)據(jù)N-point真實(shí)數(shù)據(jù)集。注意,第一個(gè)輸出兩包第0個(gè)和512(純粹的)分別輸出頻譜數(shù)據(jù)的實(shí)部和虛部。
【8】設(shè)計(jì)是完全流水線(xiàn),流設(shè)計(jì)高吞吐量;用于數(shù)據(jù)的連續(xù)處理,但具有節(jié)流功能(如果輸入停止,則停止)。
【9】AXI4-Stream接口用于連接IP Integrator (IPI)中的所有塊。
(2)在testbench中自己給輸入信號(hào)進(jìn)行測(cè)試,先給定一個(gè)正弦信號(hào),注意下面的賦值,在2016.2版本是可以直接給復(fù)數(shù)的實(shí)部和虛部賦值的,但是2018.2這種方式會(huì)報(bào)錯(cuò),需要采用下面的賦值函數(shù)來(lái)給一個(gè)復(fù)數(shù)賦值
(3)scale放縮因子的設(shè)定
如果不設(shè)置放縮因子,輸入上述 —1 ~ 1的正弦信號(hào)后,輸出結(jié)果應(yīng)該為
可以看到,最大值在x[100]處,虛部已經(jīng)到-503級(jí)別,不符合輸出數(shù)據(jù)的要求,在此過(guò)程中,需要對(duì)數(shù)據(jù)按照FFT的級(jí)數(shù)縮放,如下圖所示,示例中設(shè)置1024點(diǎn)的FFT的放縮因子為0X2AB,即 10 10 10 10 11,按照每2bit合在一起,即為 2 2 2 2 3,依次相加為(2+2+2+2+3)=11,放縮倍數(shù)為2^11=2048。
具體scale的設(shè)置詳見(jiàn)PG109,翻譯過(guò)來(lái)就是:
對(duì)于突發(fā)I/O架構(gòu),每個(gè)階段的擴(kuò)展調(diào)度由最低位的兩個(gè)LSBs指定,第一個(gè)階段的擴(kuò)展調(diào)度由兩個(gè)最低位LSBs指定??s放可以指定為3、2、1或0,表示要移位的數(shù)目。例如:
【1】對(duì)于N =1024, Radix-4突發(fā)I/O是[1 0 2 3 2](從最后一級(jí)開(kāi)始排序)
【2】對(duì)于N =128, x-2突發(fā)I/O或Radix-2 Lite Burst I/O,一種可能的擴(kuò)展計(jì)劃是[1 1 1 1 1 0 1 2] (從最后階段到第一階段排序)。
對(duì)于流水線(xiàn)并行I/O架構(gòu)(示例默認(rèn)使用流水線(xiàn)型),每個(gè)Radix-2階段(從兩個(gè)LSBs開(kāi)始)都使用兩位指定伸縮因子。例如:
【4】N = 256的縮放調(diào)度可以是[2 2 2 3]。當(dāng)N不是4的冪時(shí),最后階段的最大位增長(zhǎng)為1位。例如,[0 2 2 2]或[1 2 2 2 2]對(duì)于N = 512是有效的擴(kuò)展調(diào)度,但是[2 2 2 2 2]是無(wú)效的。對(duì)于這個(gè)轉(zhuǎn)換長(zhǎng)度,SCALE_SCH的最高位的兩個(gè)MSB只能是00或01。此字段僅適用于按比例縮放的算術(shù)(不包括未縮放unscaled、塊浮點(diǎn)或單精度f(wàn)loat)。
2.更改配置
(1)改成8192點(diǎn)FFT(2^13)
【1】更改最大支持點(diǎn)數(shù)FFT_NFFT_MAX=13,這時(shí)候FFT_LENGTH也隨之改變,效果為該FFT支持最大8192點(diǎn)(當(dāng)設(shè)置為最大支持8192點(diǎn)時(shí),4096/256等比8192小的點(diǎn)數(shù)也是支持的),并且本次運(yùn)行點(diǎn)數(shù)時(shí)8192點(diǎn)。
【2】修改config配置信息,將修改的點(diǎn)數(shù)寫(xiě)進(jìn)fft的配置,如果沒(méi)有110行的修改,那么實(shí)際上還是執(zhí)行的1024點(diǎn)的FFT。
【3】修改放縮因子為0XAAB(8192點(diǎn)FFT,縮小8192倍,一般多少點(diǎn)設(shè)置多少倍,然后看overflow信號(hào)是否指示數(shù)據(jù)溢出,若溢出,則繼續(xù)增大縮放因子)
此后點(diǎn)擊運(yùn)行,得到的結(jié)構(gòu)范圍在 —1 ~ 1之間,將所有數(shù)據(jù)*8192,得到正常的數(shù)據(jù),但是,因?yàn)榍懊娴姆趴s實(shí)在每一級(jí)上的累計(jì)放縮,所以存在較大的誤差累積,通過(guò)和C語(yǔ)言double型正常未放縮執(zhí)行的代碼對(duì)比,發(fā)現(xiàn)在輸出數(shù)據(jù)較小的地方誤差非常大,基本可以看成是錯(cuò)的,在數(shù)據(jù)較大的地方,比如本例的100Hz的sin信號(hào),在輸出xk_output[100] 處與實(shí)際結(jié)果誤差很小。
3.更改輸入輸出為float型,提高精度
對(duì)于單精度浮點(diǎn)型輸入,輸入數(shù)據(jù)時(shí)N維復(fù)數(shù)向量(雙32位浮點(diǎn)數(shù)),相位因子必須是24或者25位的定點(diǎn)數(shù)(PG109文檔)。
4.結(jié)果
???
審核編輯:劉清
-
FFT
+關(guān)注
關(guān)注
15文章
434瀏覽量
59384 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136839 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66539 -
HLS
+關(guān)注
關(guān)注
1文章
129瀏覽量
24118
原文標(biāo)題:FPGA實(shí)現(xiàn)OFDM通信——FFT與IFFT(2)——調(diào)用HLS的FFT庫(kù)實(shí)現(xiàn)N點(diǎn)FFT(hls:fft)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論