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