基于FPGA的FFT和IFFT IP核應(yīng)用實(shí)例 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw 提取碼:qr0t ![]() 關(guān)于傅里葉變換,這么一個(gè)神奇的變換,其基本原理和應(yīng)用在教科書、網(wǎng)絡(luò)上漫天飛舞,這里就不贅述了,以免有湊字?jǐn)?shù)的嫌疑。下面我們就Matlab和FPGA兩個(gè)工具雙管齊下,比對Vivado的FFT IP核生成的數(shù)據(jù)。 使用at7_img_ex05\matlab文件夾下的Matlab源碼fft_1line.m,運(yùn)行產(chǎn)生1組cos波形的1000個(gè)采樣點(diǎn)數(shù)據(jù),存儲為time_domain_cos.txt文件,該文件中每個(gè)數(shù)據(jù)位寬16bit,定點(diǎn)signed(1.15),即最高位符號位,15位小數(shù)。同時(shí),繪制出matlab中cos時(shí)域和頻域的波形如下。
![]() Vivado中,打開IP Catalog,搜索FFT或者找到分類Core à Digital Signal Processing àTransform à FFTs,即可找到免費(fèi)的IP核Fast Fourier Transform。雙擊這個(gè)IP。
![]() 第一個(gè)Configuration頁面如圖,可以設(shè)定IP通道數(shù)(Number of Channels)、FFT轉(zhuǎn)換長度(Transform Length)、目標(biāo)時(shí)鐘頻率(Target Clock Frequency)和FFT實(shí)現(xiàn)架構(gòu)(Architecture Choice)等。
![]() 如圖所示,第二個(gè)Implementation頁面,可以配置數(shù)據(jù)格式(Data Format)、縮放模式(Scaling Options)、數(shù)據(jù)末尾處理方式(Rounding Modes)、輸入數(shù)據(jù)和相位的位寬(Input Data Width)和數(shù)據(jù)輸出順序(Output Ordering)等。
![]() 第三個(gè)Detailed Implement頁面中,可以對FPGA存儲器或乘法器相關(guān)的資源進(jìn)行選擇配置。
![]() 在配置頁面左側(cè),可以查看IP接口(IP Symbol)、實(shí)現(xiàn)信號位寬細(xì)節(jié)(Implementation Details)和輸出時(shí)延(Latency)等信息。 ![]() 使用Vivado 16.2打開at7_img_ex05下的工程,在Sources面板中,展開Simulation Sources à sim_1,確認(rèn)at7_fft_sim文件為top module(粗體顯示文件名),若不是top module,可以右鍵單擊該文件,點(diǎn)擊Set as Top菜單項(xiàng)。如圖,若Set as Top菜單項(xiàng)為灰暗不可點(diǎn)擊狀態(tài),表示當(dāng)前該模塊已經(jīng)是top module。at7_fft_sim文件中用測試腳本的形式,將matlab生成的1000個(gè)點(diǎn)cos數(shù)據(jù)time_domain_cos.txt文本導(dǎo)入,送給FFT IP核進(jìn)行運(yùn)算,輸出FFT結(jié)果的實(shí)部和虛部分別存儲在fft_result_real.txt和fft_result_image.txt文本中(仿真測試結(jié)果位于at7_img_ex05\at7.sim\sim_1\behav文件夾下)。 在Flow Navigator面板中,展開Simulation,點(diǎn)擊Run Simulation,彈出菜單中點(diǎn)擊Run Behavioral Simulation進(jìn)行仿真。 彈出仿真界面后,如圖所示點(diǎn)擊Run All圖標(biāo)運(yùn)行仿真。
![]() 仿真運(yùn)行完畢,可以看到FFT的輸入數(shù)據(jù)波形和結(jié)果輸出波形如圖所示。
![]() 可以打開at7_img_ex05\at7.sim\sim_1\behav文件夾下fft_result_real.txt和fft_result_image.txt文本,分別存儲FFT結(jié)果的實(shí)部和虛部。這里需要注意定點(diǎn)的小數(shù)位問題。在IP核頁面左側(cè),點(diǎn)擊Implementation Details可以看到定點(diǎn)的小數(shù)位標(biāo)定。所有1024個(gè)輸入點(diǎn)的位寬定義是一樣的,所以如圖所示,只需要查看第0點(diǎn)的定點(diǎn)標(biāo)定信息。
![]() 詳細(xì)的FFT IP核配置說明,可以參考Xilinx官方文檔pg109-xfft.pdf。 對于仿真產(chǎn)生的fft_result_real.txt和fft_result_image.txt文本,可以使用Matlab腳本draw_wave_from_txt.m(at7_img_ex05\matlab文件夾下)進(jìn)行加載并繪制波形。FPGA實(shí)現(xiàn)的FFT運(yùn)算結(jié)果,繪制波形如下?梢员葘Matlab的波形,幾乎是一致的。當(dāng)然了,因?yàn)?font face="Calibri">FPGA輸入數(shù)據(jù)的精度有限(從浮點(diǎn)到定點(diǎn)的精度損失),不可能完全一致。
![]() 在Sources面板中,展開Simulation Sources à sim_1,將at7_ifft_sim.v文件設(shè)置為top module。at7_ifft_sim文件中用測試腳本的形式,在at7_fft_sim.v測試腳本產(chǎn)生的FFT結(jié)果的基礎(chǔ)上,繼續(xù)將此結(jié)果進(jìn)入IFFT IP核進(jìn)行IFFT運(yùn)算,最終上傳IFFT的結(jié)果。輸出IFFT結(jié)果的實(shí)部存儲在ifft_result.txt文本中(仿真測試結(jié)果位于at7_img_ex05\zstar.sim\sim_1\behav文件夾下)。可以比對這個(gè)文本和time_domain_cos.txt文本的數(shù)據(jù),幾乎是一致的。
![]() xfft_0輸出的FFT結(jié)果是定點(diǎn)signed(12.15),要獲得最終的FFT結(jié)果,需要將IP核輸出的結(jié)果再除以FFT數(shù)據(jù)個(gè)數(shù)(即1024),所以我們可以認(rèn)為實(shí)際的FFT結(jié)果是定點(diǎn)signed(2.25)。 而進(jìn)入xfft_1做IFFT的輸入接口是定點(diǎn)signed(1.26),二者并不匹配,則我們認(rèn)為輸入數(shù)據(jù)做了1位的右移,在IFFT輸出結(jié)果時(shí)要對應(yīng)的左移1位。IFFT的輸出是signed(12.26),那么左移1位后,就是signed(13.25)。
![]() AT7_Xilinx開發(fā)板(USB3.0+LVDS)資料共享 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw 提取碼:qr0t |