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