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