姓名:劉保闊
學(xué)號(hào):19021210887
【嵌牛導(dǎo)讀】
? ? ? FFT(快速傅里葉變換)作為數(shù)字信號(hào)處理的核心算法具有重要的研究?jī)r(jià)值糟袁,可應(yīng)用于傅里葉變換所能涉及的任何領(lǐng)域蔗怠,如圖像處理跌造、音頻編碼摩泪、頻譜分析吼鱼、雷達(dá)信號(hào)脈沖壓縮等數(shù)字信號(hào)處理領(lǐng)域。FFT的鮮明特征之一是計(jì)算離散傅里葉變換(DFT)的高效算法谆奥,把計(jì)算N點(diǎn)DFT的乘法運(yùn)算量從N2次降低到N/2*log2N次眼坏。而采用FPGA實(shí)現(xiàn)FFT的緣由在于:FPGA具有并行處理、流水線處理酸些、易編程宰译、片上資源豐富等方面特點(diǎn)檐蚜,用于實(shí)現(xiàn)高速、大點(diǎn)數(shù)的FFT優(yōu)勢(shì)明顯沿侈。
【嵌牛正文】
? ? 本設(shè)計(jì)使用的軟件編程環(huán)境是Xilinx公司的Vivado 2018.3闯第,筆者將從FFT IP核的創(chuàng)建,模塊文件的編寫缀拭,波形仿真等方面來具體講述FFT算法在Xilinx FPGA上的實(shí)現(xiàn)乡括。
【更新日志】
? ? 1.修正了IP核創(chuàng)建時(shí)設(shè)置和下面verilog模塊文件不對(duì)應(yīng)的問題,本例程為128點(diǎn)FFT智厌。
??? 2.FFT.interface.v模塊有bug,現(xiàn)做了相應(yīng)的修改盲赊。
??? 3.這個(gè)例程寫的較早铣鹏,有些地方可能過于復(fù)雜了,可參考我在CSDN上的文章https://blog.csdn.net/qq_43622265/article/details/105905927哀蘑。
? ? 1.FFT IP核的創(chuàng)建诚卸。
? ? 在Vivado軟件主界面,打開IP Catalog绘迁,在搜索框內(nèi)輸入FFT合溺,然后找到Digital Signal Processing->Transforms->FFTs目錄下的Fast Fourier Transform,雙擊進(jìn)入配置界面缀台。
? ? 進(jìn)入到配置界面棠赛,左邊是IP核的接口圖、實(shí)現(xiàn)的一些細(xì)節(jié)信息和FFT的延遲膛腐,右邊是Configuration睛约、Implementation和Detailed Implementation三個(gè)標(biāo)簽卡。
? ? Vivado的FFT IP核支持多通道輸入(Number of Channels)和實(shí)時(shí)更改FFT的點(diǎn)數(shù)(Run Time Configurable Transform Length)哲身。Configuration標(biāo)簽下可設(shè)置FFT的點(diǎn)數(shù)(Transform Length)和工作時(shí)鐘(Target Clock Frequency)辩涝,以及選擇一種FFT結(jié)構(gòu)。FFT的結(jié)構(gòu)包括流水線Streaming勘天、基4 Burst怔揩、基2 Burst和輕量級(jí)基2 Burst,它們的計(jì)算速度和消耗的資源依次減少脯丝,可根據(jù)工程實(shí)際進(jìn)行選擇商膊。
? Implementation標(biāo)簽卡下可設(shè)置FFT的數(shù)據(jù)格式為定點(diǎn)Fixed Point或浮點(diǎn)Float Point;輸出截位方式選擇:不截位(Unscaled)宠进,截位(Scaled)翘狱,塊浮點(diǎn)(Block Floating Point);設(shè)置輸入數(shù)據(jù)的位寬和相位因子位寬砰苍。還有一些可選的附加信號(hào)潦匈,如時(shí)鐘使能(ACLKEN)阱高,復(fù)位信號(hào)(ARESETn,低有效)等茬缩〕嗑“Output Ordering”用以選擇FFT計(jì)算結(jié)果以自然順序(Nature Order)或位倒序(Bit/Digit Reversed Order)輸出。
? ? Detailed Implementation里可設(shè)置優(yōu)化方式凰锡、存儲(chǔ)的類型未舟。存儲(chǔ)類型分為兩種:Block RAM(塊RAM)和Distributed RAM(分布式RAM);優(yōu)化方式可選擇資源最優(yōu)或者速度最優(yōu)。
配置完成后掂为,可在Latency下看到計(jì)算fft所需的時(shí)間裕膀,可以以此衡量設(shè)計(jì)是否滿足實(shí)時(shí)處理的要求。如不滿足勇哗,可選擇性能更好的FFT結(jié)構(gòu)或選擇可以提高運(yùn)算速度的優(yōu)化選項(xiàng)
? ? ? 2.模塊文件的編寫昼扛。
? ? IP核工作必須要滿足一定的時(shí)序要求,所以需要編寫一個(gè)fft核的接口模塊(FFT_interface)欲诺,用于產(chǎn)生該IP核的時(shí)序控制信號(hào)并將輸入的實(shí)部抄谐、虛部數(shù)據(jù)根據(jù)需要拼接成一個(gè)數(shù)據(jù)。和該IP核交互是用AXI-Stream接口扰法,關(guān)于AXI-Stream接口的時(shí)序可自行查一些相關(guān)資料蛹含,這里不做詳細(xì)介紹。
? ? 接口模塊編寫完成后就可在頂層模塊(FFT_TOP)進(jìn)行調(diào)用塞颁,并將其輸出端口連接到FFT IP核上浦箱,以實(shí)現(xiàn)對(duì)IP核的時(shí)序控制。
? ? 此工程的RTL視圖:該視圖下祠锣,可清楚直觀的顯示各模塊間的連線關(guān)系以及輸入輸出端口信息憎茂。
? ? 3.功能仿真。
? ? 模塊編寫完成后锤岸,需要通過功能仿真來驗(yàn)證我們?cè)O(shè)計(jì)邏輯的正確性竖幔。進(jìn)行仿真之前,我們需要編寫仿真測(cè)試文件(testbench)是偷。
? ? testbench中輸入的時(shí)域波形數(shù)據(jù)是我們通過matlab生成的拳氢,在matlab中我們仿真的是采樣率為2kHz情況下,頻率分別為50Hz和200Hz的兩正弦波疊加后的信號(hào)蛋铆。
? ? 進(jìn)行功能仿真時(shí)我們將仿真時(shí)長(zhǎng)設(shè)置為11us馋评。為了直觀驗(yàn)證fft是否正確,可將輸入的時(shí)域數(shù)據(jù)和做完fft后信號(hào)功率值的數(shù)據(jù)格式均設(shè)置為anolog(模擬)刺啦,如下圖留特,可以看到fft后的功率譜為兩根獨(dú)立的譜線,分別代表50Hz和200Hz兩個(gè)頻率點(diǎn),和matlab仿真結(jié)果一致蜕青。
? ? ?? 程序設(shè)計(jì)到此就告一段落苟蹈,對(duì)于該IP核更復(fù)雜的應(yīng)用,大家可以閱讀Xilinx官方提供的文檔右核,根據(jù)自己的實(shí)際需要進(jìn)行設(shè)計(jì)慧脱。限于筆者水平有限,文章內(nèi)難免會(huì)有錯(cuò)誤出現(xiàn)贺喝,希望大家批評(píng)指正菱鸥。