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