本文介紹了Vidado中FFT IP核的使用,具體內(nèi)容為:調(diào)用IP核>>配置界面介紹>>IP核端口介紹>>MATLAB生成測(cè)試數(shù)據(jù)>>測(cè)試verilogHDL>>TestBench仿真>>結(jié)果驗(yàn)證>>FFT運(yùn)算。
1、調(diào)用IP核
該IP核對(duì)應(yīng)手冊(cè)pg109_xfft.pdf,首先按照?qǐng)D片找到IP核:
2、配置界面介紹
本小節(jié)主要介紹Fast Fourier Transform9.1這個(gè)IP核配置界面的一些選項(xiàng):
第1頁:Configuration
圖1
表1 Configuration界面介紹
第2頁:Implementation
圖2
表2 Implementation界面介紹
圖3
表3 Detailed Implementation
3、IP核端口配置
根據(jù)上述配置界面的介紹,下面以64點(diǎn)IFFT為例子,總結(jié)了使用IP核時(shí)所需的端口配置,如表4所示,需要注意的是表4中沒有涉及的部分按照IP核的默認(rèn)配置即可:
表4 64點(diǎn)IFFT運(yùn)算IP核的設(shè)置表匯總
配置完成之后IP核的端口圖如下:
圖4 64點(diǎn)IFFT核端口圖
按照下面圖找到例化原語:
圖5
打開.veo后綴的文件找到例化原語:
圖6
對(duì)例化語句的介紹見表5,其中L表示IFFT/FFT的點(diǎn)數(shù)。
表5 例化原語介紹
需要說明的是,需要配置的端口有,1)aclk;2)aclken;3)s_axis_config_tdata ;4)s_axis_config_tvalid ;5)s_axis_config_tready;6)s_axis_data_tdata;7)s_axis_data_tvalid;8)s_axis_data_tready;9)m_axis_data_tdata;10)m_axis_data_tuser;11)m_axis_data_tready;12)m_axis_data_tlast
4、MATLAB生成測(cè)試數(shù)據(jù)
本次測(cè)試只需要使用TestBench驗(yàn)證即可,需要生成.txt后綴的文件,產(chǎn)生IFFT核的輸入數(shù)據(jù),主要程序?yàn)椋?/p>
%%該.m文件用來生成介紹IFFT核的數(shù)據(jù),具體為64點(diǎn)的IFFT16QAM clear closeall clc rngdefault%產(chǎn)生固定數(shù)值的隨機(jī)數(shù)據(jù) %%基于符號(hào)算法的目標(biāo)距離和速度探測(cè) %%定義基本參數(shù) Ns=1;%符號(hào)數(shù) Nc=64;%子載波數(shù) M=16;%調(diào)制方式 bit_num=log2(M);%一個(gè)碼組中的碼元個(gè)數(shù) bit=randi([01],Nc*Ns*bit_num,1);%產(chǎn)生比特 norm=1/sqrt(10);%16qam歸一化因子 %%16qam bit_convert=(reshape(bit,bit_num,length(bit)/bit_num))';%二進(jìn)制數(shù)據(jù)流按照調(diào)制的方式分成不同碼元 data_2_to_10=bi2de(bit_convert,'left-msb');%將每四位數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制數(shù) maxtix=reshape(data_2_to_10,Nc,Ns); bit_mo=norm*qammod(data_2_to_10,M); a_nm=reshape(bit_mo,Nc,Ns); %%發(fā)送端IFFT調(diào)制 IFFT_OUT=ifft(a_nm,64); %%數(shù)據(jù)保存為.txt文件 echo_real=real(a_nm); echo_imag=imag(a_nm); echo1_real=quantizer([1611]); echo1_imag=quantizer([1611]); fid_echo=fopen('C:Users15865DesktopFFT_IP_core_64pointIFFT_IP_core_64point_exam.txt','wt'); forj=1:Ns echo2_real=num2bin(echo1_real,echo_real(:,j)); echo2_imag=num2bin(echo1_imag,echo_imag(:,j)); fori=1:Nc imag_real_echo=[echo2_imag(i,:),echo2_real(i,:)]; fwrite(fid_echo,imag_real_echo); fprintf(fid_echo,' '); end end fclose(fid_echo);
圖中程序功能是生成了一段包含64個(gè)復(fù)數(shù)數(shù)據(jù)的數(shù)組,并將每個(gè)復(fù)數(shù)數(shù)據(jù)用16表示實(shí)部16位表示虛部共生成32位二進(jìn)制數(shù),最后將這組數(shù)據(jù)保存為.txt后綴文件。
5、測(cè)試verilog HDL
根據(jù)前文的配置編寫一個(gè)簡(jiǎn)單的測(cè)試.v文件測(cè)試64點(diǎn)數(shù)據(jù)的IFFT運(yùn)行結(jié)果,主要程序如下:
`timescale1ns/1ps moduleIFFT_introduction( inputclk, inputrst_n, inputifft_valid, input[31:0]data_in, //inputlast, outputs_config_tready, output[31:0]m_data_tdata, outputs_data_tready, output[7:0]m_data_tuser, outputm_data_tvalid, outputm_data_tlast ); FFT_IP_core_64pointifft_u0( .aclk(clk),//inputwireaclk .aclken(rst_n),//inputwireaclken .s_axis_config_tdata(8'd0),//inputwire[7:0]s_axis_config_tdata .s_axis_config_tvalid(1'b1),//inputwires_axis_config_tvalid .s_axis_config_tready(s_config_tready),//outputwires_axis_config_tready .s_axis_data_tdata(data_in),//inputwire[31:0]s_axis_data_tdata .s_axis_data_tvalid(ifft_valid),//inputwires_axis_data_tvalid .s_axis_data_tready(s_data_tready),//outputwires_axis_data_tready //.s_axis_data_tlast(s_axis_data_tlast),//inputwires_axis_data_tlast .m_axis_data_tdata(m_data_tdata),//outputwire[31:0]m_axis_data_tdata .m_axis_data_tuser(m_data_tuser),//outputwire[7:0]m_axis_data_tuser .m_axis_data_tvalid(m_data_tvalid),//outputwirem_axis_data_tvalid .m_axis_data_tready(1'b1),//inputwirem_axis_data_tready .m_axis_data_tlast(m_data_tlast)//outputwirem_axis_data_tlast ); wire[15:0]ifft_64point_out_RE,ifft_64point_out_IM; //assignRE={{4{m_data_tdata[15]}},m_data_tdata[15:4]};//IFFT歸一化處理,除Nfft //assignIM={{4{m_data_tdata[39]}},m_data_tdata[39:28]}; assignifft_64point_out_IM=m_data_tdata[31:16];//虛部 assignifft_64point_out_RE=m_data_tdata[15:0];//實(shí)部 endmodule
這段程序調(diào)用了FFT IP核的例化原語,并將部分接口作為函數(shù)的輸入和輸出,方便TestBench調(diào)用。
6、TestBench仿真
主要程序如下:
`timescale1ns/1ps moduleifft_tb(); regclk;//系統(tǒng)時(shí)鐘 regrst_n;//復(fù)位信號(hào),低有效 regifft_valid;//數(shù)據(jù)有效位,指示輸入數(shù)據(jù)有效 reg[31:0]data_in;//輸入數(shù)據(jù) wires_config_tready; wire[31:0]m_data_tdata; wires_data_tready; wire[7:0]m_data_tuser; wirem_data_tvalid; wirem_data_tlast; IFFT_introductionu0(//例化.v文件 .clk(clk), .rst_n(rst_n), .ifft_valid(ifft_valid), .data_in(data_in), .s_config_tready(s_config_tready), .m_data_tdata(m_data_tdata), .s_data_tready(s_data_tready), .m_data_tuser(m_data_tuser), .m_data_tvalid(m_data_tvalid), .m_data_tlast(m_data_tlast) ); reg[31:0]mem[63:0]; initialbegin//$readmembVivado內(nèi)置函數(shù)調(diào)用.txt文件 $readmemb("C:/Users/15865/Desktop/FFT_IP_core_64point/IFFT_IP_core_64point_exam.txt",mem); clk=0; rst_n=0; #1000; rst_n=1; #10_000; $stop; end always#10clk<=~clk;????//50MHz reg?[6:0]?count;???????? //計(jì)數(shù) always@(posedge?clk?or?negedge?rst_n)?begin ????if(!rst_n)? ????????count<='d0; ????else?if(count<='d63) ????????count<=count+1'b1; ????else ????????count<='dz; end //?產(chǎn)生信號(hào)和數(shù)據(jù) always@(posedge?clk?or?negedge?rst_n)?begin ????if(!rst_n)?begin ????????ifft_valid<='d0; ????????data_in<='d0; ????end ????else?if(count>='d0&&count<='d63)?begin ????????????ifft_valid<=1; ????????????data_in<=mem[count]; ????end ????else?begin ????????????ifft_valid<=1'b0; ????????????data_in<='d0; ????end end endmodule
7、Modelsim結(jié)果與MATLAB輸出結(jié)果驗(yàn)證
本節(jié)將驗(yàn)證Modelsim和MATLAB輸出結(jié)果的一致性,并簡(jiǎn)單介紹Modelsim輸出結(jié)果向MATLAB數(shù)據(jù)的轉(zhuǎn)換。
Modelsim 輸出結(jié)果如下圖:
圖10
由于數(shù)據(jù)有64個(gè)而這里驗(yàn)證前三個(gè)中間三個(gè)和后三個(gè)的方式驗(yàn)證Modelsim數(shù)據(jù)和MATLAB數(shù)據(jù)正確性:
表6數(shù)據(jù)驗(yàn)證
需要注意的是,Modelsim輸出的結(jié)果并不是小數(shù),而是忽略了小數(shù)點(diǎn)的整數(shù),要想獲得和MATLAB類似的浮點(diǎn)數(shù),需要我們將輸出結(jié)果變換,這里以Modelsim輸出的最后一個(gè)數(shù)為例(即表6中序號(hào)64),可見圖11。
圖11
對(duì)于該結(jié)果需要我們將輸出結(jié)果除以2^(a+ b),a為用以表示小數(shù)的位寬數(shù),本文中為11,b為FFT點(diǎn)數(shù)的2次冪冪值,本文為6,因此對(duì)于每一個(gè)Modelsim的輸出結(jié)果都需要除以2^17,這里實(shí)部-15302/2^17=-0.1167,虛部-23234/2^17=-0.1773。
從表6中數(shù)據(jù)可以看出,IFFT 核執(zhí)行的運(yùn)算和MATLAB的運(yùn)算結(jié)果十分接近,驗(yàn)證成功。
8、FFT運(yùn)算
與IFFT運(yùn)算類似,配置不用更改只需將第5小節(jié)程序中,s_axis_config_tdata端口配置改為8’d1即可,其他無需變動(dòng)。
-
FFT
+關(guān)注
關(guān)注
15文章
434瀏覽量
59366 -
仿真
+關(guān)注
關(guān)注
50文章
4070瀏覽量
133552 -
端口
+關(guān)注
關(guān)注
4文章
963瀏覽量
32051 -
IP核
+關(guān)注
關(guān)注
4文章
327瀏覽量
49485 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66470
原文標(biāo)題:Vivado中的FFT IP核使用
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論