如何配置并驗(yàn)證在Vivado使用各種測(cè)試信號(hào)的FFT IP核
掃描二維碼
隨時(shí)隨地手機(jī)看文章
介紹
如何配置,并驗(yàn)證在Vivado使用各種測(cè)試信號(hào)的FFT IP核?
?了解FFT IP核如何處理復(fù)雜數(shù)據(jù)(16位實(shí)數(shù)和16位虛數(shù)組件)
?配置FFT IP核與適當(dāng)?shù)霓D(zhuǎn)換長(zhǎng)度,數(shù)據(jù)寬度和輸出順序
?集成一個(gè)信號(hào)發(fā)生器,產(chǎn)生三種測(cè)試信號(hào):復(fù)單音、Sinc函數(shù)和矩形函數(shù)
?正確處理AXI流信號(hào),包括Tvalid和Tlast,以實(shí)現(xiàn)正確的數(shù)據(jù)包處理
?建立了一個(gè)完整的仿真設(shè)計(jì),包括時(shí)鐘生成、信號(hào)拼接和數(shù)據(jù)提取
?通過(guò)處理實(shí)分量和虛分量來(lái)計(jì)算FFT輸出的幅度
?通過(guò)觀察測(cè)試信號(hào)的預(yù)期變換來(lái)驗(yàn)證FFT實(shí)現(xiàn):
單音→單頻峰值
Sinc函數(shù)→矩形函數(shù)
矩形函數(shù)→Sinc函數(shù)
FFT IP核輸入/輸出數(shù)據(jù)格式
該圖說(shuō)明了使用axis - stream接口的FFT IP核的輸入和輸出數(shù)據(jù)格式。FFT處理復(fù)雜數(shù)據(jù),其中每個(gè)樣本由16位實(shí)部和16位虛部組成。這些組件被連接成一個(gè)32位數(shù)據(jù)字,虛數(shù)部分占據(jù)最高有效位16位,實(shí)數(shù)部分占據(jù)最低有效位16位。
FFT IP使用軸流接口進(jìn)行通信,這意味著我們必須正確處理Tvalid和Tlast信號(hào)。
Tlast信號(hào)表示FFT塊處理的每個(gè)包的結(jié)束。本質(zhì)上,兩個(gè)Tlast脈沖之間的數(shù)據(jù)屬于單個(gè)FFT包。因此,為了確保正確的操作,Tlast信號(hào)應(yīng)該在等于FFT大小(NFFT)的時(shí)鐘周期數(shù)之后斷言。
FFT IP核的輸出也是復(fù)數(shù),每個(gè)采樣由一個(gè)16位實(shí)部和一個(gè)16位虛部組成。我們可以使用切片IP塊來(lái)分割每個(gè)實(shí)部和虛部。
GitHub中提供的信號(hào)發(fā)生器模塊
GitHub存儲(chǔ)庫(kù)中提供的信號(hào)生成器根據(jù)所選擇的模式生成三種類型的信號(hào),該模式在塊中設(shè)置為通用值。根據(jù)模式選擇,模式0產(chǎn)生復(fù)雜的單音信號(hào),模式1產(chǎn)生正弦信號(hào),模式2產(chǎn)生矩形信號(hào)。這允許靈活地測(cè)試和驗(yàn)證FFT處理的不同信號(hào)類型。
除了生成這些信號(hào)外,該模塊還處理FFT IP核所需的必要的軸流格式。它在每個(gè)FFT大小上生成最后一個(gè)脈沖,以指示每個(gè)數(shù)據(jù)包的結(jié)束,確保適當(dāng)?shù)膸瑢?duì)齊。
此外,它還控制tvalid信號(hào),斷言數(shù)據(jù)何時(shí)有效并準(zhǔn)備好進(jìn)行處理。
復(fù)習(xí):不同信號(hào)的FFT變換
該圖提供了應(yīng)用于三種不同類型信號(hào)的FFT變換的快速回顧。我們期望在我們的Vivado模擬中看到相同的結(jié)果。
復(fù)單音的FFT變換是單頻分量。這在FFT變換中表現(xiàn)為單個(gè)峰值。我們將把實(shí)部和虛部都發(fā)送給FIR濾波器,但這里只顯示實(shí)部。
Sinc函數(shù)在時(shí)域的FFT變換在頻域是一個(gè)矩形。
最后,時(shí)域矩形函數(shù)的FFT變換是頻域的Sinc函數(shù)。
FFT IP核Vivado仿真
首先,在您的設(shè)計(jì)中添加FFT IP塊。在configuration選項(xiàng)卡中,選擇您喜歡的任何轉(zhuǎn)換長(zhǎng)度。對(duì)于這個(gè)例子,我將選擇一個(gè)2048點(diǎn)的FFT。
設(shè)置目標(biāo)頻率和目標(biāo)數(shù)據(jù)吞吐量以匹配系統(tǒng)的時(shí)鐘頻率。在這個(gè)模擬中,我將使用100兆赫的時(shí)鐘。
接下來(lái),轉(zhuǎn)到Implementation選項(xiàng)卡并將輸入數(shù)據(jù)寬度設(shè)置為16位。對(duì)于相位因子寬度,您可以將其保留在16位,或者如果您在FFT變換中需要更高的精度,可以選擇更高的值。
由于我們?cè)诖四M中使用整數(shù)值,因此選擇Fixed Point作為數(shù)據(jù)格式。
對(duì)于輸出順序,選擇自然順序以避免使用位反轉(zhuǎn)輸出。
您可以在Implementationtab中找到實(shí)現(xiàn)細(xì)節(jié)。如圖所示,數(shù)據(jù)類型是Fixed Point 16-15,這意味著輸入數(shù)據(jù)類型是一個(gè)16位整數(shù)。
最后,檢查L(zhǎng)atency選項(xiàng)卡以確保FFT塊滿足系統(tǒng)的延遲要求。請(qǐng)記住,更大的FFT大小會(huì)導(dǎo)致更高的延遲。
在您的設(shè)計(jì)中添加一個(gè)模擬時(shí)鐘生成器,并將其時(shí)鐘頻率設(shè)置為與您為FFT IP塊選擇的目標(biāo)頻率匹配。這確保了仿真在正確的時(shí)間運(yùn)行,并與FFT處理要求保持一致。然后我們將使用這個(gè)時(shí)鐘來(lái)運(yùn)行模擬中的所有ip。
從GitHub下載提供的信號(hào)發(fā)生器,并將其作為源代碼添加到您的設(shè)計(jì)中。要集成它,右鍵單擊塊設(shè)計(jì)并選擇“添加模塊”。
信號(hào)發(fā)生器模塊有兩個(gè)可配置參數(shù):
FFT大小參數(shù)-設(shè)置該參數(shù)以匹配FFT IP塊的變換長(zhǎng)度。例如,在本例中,我將選擇2048,與FFT IP塊相同。
函數(shù)類型-這決定了產(chǎn)生的信號(hào)的類型。您可以在0和2之間選擇一個(gè)值,每個(gè)值產(chǎn)生不同的波形。
將信號(hào)發(fā)生器模塊的Tlast和Tvalid信號(hào)連接到FFT IP塊的Tlast和Tvalid輸入端。這確保了適當(dāng)?shù)耐?,并為AXI流協(xié)議提供了必要的控制信號(hào)。
接下來(lái),在您的設(shè)計(jì)中添加Concat IP塊。使用它來(lái)連接實(shí)數(shù)和虛數(shù)輸出,形成一個(gè)32位無(wú)符號(hào)整數(shù)。然后,將連接的輸出連接到FFT IP塊的tdata端口。
不要忘記將FFT IP塊的時(shí)鐘和復(fù)位引腳連接到時(shí)鐘模擬IP。
將Constant IP塊添加到您的設(shè)計(jì)中并將其值設(shè)置為1。然后,將其輸出連接到FFT IP塊輸出端口的trready信號(hào)。這確保FFT模塊總是準(zhǔn)備好傳輸數(shù)據(jù)。
要從FFT IP塊的輸出中分離實(shí)部和虛部,請(qǐng)?jiān)谠O(shè)計(jì)中添加兩個(gè)Slice IP塊:
虛部—添加一個(gè)Slice IP塊,并將其配置為提取31 ~ 16位作為虛輸出。
實(shí)數(shù)部分-添加另一個(gè)Slice IP塊,并將其配置為提取15到0位作為實(shí)數(shù)輸出。
這種設(shè)置確保FFT輸出正確地分為實(shí)部和虛部,以便進(jìn)一步處理。
接下來(lái),我們需要計(jì)算FFT輸出的絕對(duì)值。為此,我們首先計(jì)算實(shí)分量和虛分量的平方(2的冪):
在設(shè)計(jì)中添加一個(gè)Multiply IP塊,并將其輸入寬度設(shè)置為16位。
將這個(gè)乘法器的兩個(gè)輸入端口連接到虛部輸出。這個(gè)計(jì)算虛分量的平方。
通過(guò)添加另一個(gè)Multiply IP塊并將其輸入寬度設(shè)置為16位,重復(fù)該過(guò)程。
將第二個(gè)乘法器的兩個(gè)輸入端口連接到實(shí)部輸出。這是計(jì)算實(shí)分量的平方。
最后,在您的設(shè)計(jì)中添加一個(gè)Adder IP塊。將兩個(gè)Multiply IP塊(包含實(shí)部和虛部的平方值)的輸出連接到加法器的輸入端口。
通常,在設(shè)計(jì)中添加具有清晰且有意義的名稱的輸出端口是一種很好的做法。這使得重復(fù)模擬更容易,并提高了對(duì)設(shè)計(jì)的整體理解。
現(xiàn)在我們已經(jīng)完成了塊設(shè)計(jì),是時(shí)候?yàn)樗鼊?chuàng)建一個(gè)HDL包裝器了。您可以為信號(hào)發(fā)生器模塊選擇三種波類型中的任何一種。對(duì)于第一次嘗試,我將選擇波形類型0,這將產(chǎn)生一個(gè)具有實(shí)分量和虛分量的復(fù)雜單音信號(hào)。一旦完成,我們就可以進(jìn)行行為模擬了。
仿真結(jié)果
以單音信號(hào)作為輸入進(jìn)行測(cè)試
在仿真結(jié)果中,您將觀察到信號(hào)的實(shí)部是正弦波,并且由于單音的FFT變換產(chǎn)生峰值,因此這驗(yàn)證了我們對(duì)第一種模式的設(shè)計(jì)。通過(guò)分析有效信號(hào),我們可以確定由FFT IP塊引入的延遲。經(jīng)過(guò)特定數(shù)量的時(shí)鐘周期后,F(xiàn)FT IP核斷言Tvalid并輸出與傅里葉變換相對(duì)應(yīng)的峰值。每個(gè)FFT大小的時(shí)鐘周期,IP核生成Tlast,表示每個(gè)傅立葉變換包的結(jié)束,這意味著兩個(gè)Tlast信號(hào)之間的數(shù)據(jù)代表一個(gè)完整的傅立葉變換包。此外,信號(hào)發(fā)生器模塊還在每個(gè)FFT大小的時(shí)鐘周期內(nèi)生成Tlast,標(biāo)志著FFT IP核的每個(gè)輸入數(shù)據(jù)包的結(jié)束。
測(cè)試用Sinc函數(shù)作為輸入
現(xiàn)在,讓我們用第二波重復(fù)驗(yàn)證。將模塊中的信號(hào)類型更改為1,這將生成一個(gè)Sinc函數(shù)。
在仿真結(jié)果中,您將觀察到生成的信號(hào)的實(shí)部遵循Sinc函數(shù),其傅里葉變換產(chǎn)生矩形脈沖形狀,再次證實(shí)了我們?cè)O(shè)計(jì)的正確性。
測(cè)試用Sinc函數(shù)作為輸入
接下來(lái),讓我們用第三個(gè)信號(hào)測(cè)試設(shè)計(jì)。將模塊中的信號(hào)類型更改為2,這將為我們的測(cè)試臺(tái)生成矩形波形。
從仿真結(jié)果可以看出,它的傅里葉變換是一個(gè)Sinc函數(shù),正如預(yù)期的那樣。
本文編譯自hackster.io