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