目錄
- IP 核配置
- IP 核接口
- s_axis_config_tdata 配置
- 輸入輸出端口描述
- 仿真
參考:FFT IP核 詳細介紹
參考:官方文檔介紹
IP 核配置
在 IP Catalog 中搜索:Fast Fourier Transform
按照上圖所示進行配置,下文對配置內容進行詳述。
- Configuration
- Number of Channels:FFT 通道數,多通道即代表多幀數據同時進行 FFT 計算
- Transform Length:FFT 長度
- 當 Architecture Choise 選擇 Automatically Select 時,Target Clock Frequency(期望的時鐘頻率)和 Target Data Throughput(期望的數據吞吐量)這兩個參數用于確定使用的 FFT 架構
- 四種 FFT 架構
- Pipelined Streaming I/O:支持連續的數據流處理,具有最高的處理速度,但資源占用也最多。適用于對實時性要求高的應用
- Radix-4 Burst I/O:資源占用比上級少,處理速度比上級慢
- Radix-2 Burst I/O:資源占用比上級少,處理速度比上級慢
- Radix-2 Lite Burst I/O:資源占用最少,但處理速度最慢。適用于對性能要求不高且資源非常有限的場景。
- Run Time Configurable Transform Length:勾選后,可通過設置 s_axis_config_tdata 中 NFFT 字段的長度來改變 FFT 長度(需小于 Transform Length)
- Implementation
- Data Format:可選定點或浮點
- Scaling Options:在 Radix-4 架構下,每經過一級蝶形運算,值會出現 3bit 的增長;Radix-2 則會出現 2bit 的增長,為避免溢出或資源浪費,需設置縮放模式
- Scaled(縮放):可通過配置縮放因子控制每一級的縮放情況
- Unscaled(未縮放):不對數據進行縮放,輸出數據位寬會在計算過程中增長
- Block Floating Point(塊浮點縮放):在每個計算階段動態調整縮放因子,相比于 Scaled 模式,塊浮點模式會增加資源使用
- Rounding Modes:Truncation(截斷)、Convergent Rounding(收斂舍入,精度高但資源消耗大)
- ACLKEN(使能信號)
- ARESETn(復位信號)
- Output ordering:
- Natural Ordering:輸出按順序排列,已處理過
- Bit/Digit Reversed Order:對于 8 點 FFT,輸出順序為 0、4、2、6、1、5、3、7,需自行后續處理
- XK_INDEX:頻譜索引
- OVFLO:溢出指示信號
- Throttle Scheme(節流方案):可選擇 Non Real Time(非實時)或者 Real Time(實時)
IP 核接口
s_axis_config_tdata 配置
字段 | 觸發條件 | 定義 |
---|---|---|
NFFT | 勾選 Run Time Configurable Transform Length | 位寬 5 bit,數值為 log2(FFT點數) |
CP_LEN | 勾選 Cyclic Prefix Insertion | 循環前綴長度 |
FWD/INV | 必選 | 1 為 FFT,0 為 IFFT,每個 bit 對應一個 FFT 通道,第一通道放在最低位 |
SCALE_SCH | Scaling Options 選擇 scaled 時 | 配置縮放因子,具體方法見下文 |
PAD | 自動觸發 | 用于 8bit 對齊,當比特數不足 8 時,用零補齊 |
SCALE_SCH 配置方法:
- 基于 Radix-2 架構,蝶形運算的階數為 log?(N),基于 Radix-4 和 Pipelined Streaming I/O 架構,蝶形運算的階數為 log?(N)
- 對于 Radix-2 和 Radix-4 架構,為每一階配置一個縮放因子,因子可選 3/2/1/0,每個因子占 2bit
- 因子 3 對應縮放 1/8;因子 2 對應縮放 1/4;因子 1 對應縮放 1/2,一般而言,總放縮系數為 1/N
- 例如,對應 Radix-4 架構的 128 FFT點數,位寬為 2 * ceil( log?(N) ) = 8,縮放因子可以設置為 [1,2,2,2],高階放在高位
輸入輸出端口描述
端口 | 方向 | 定義 |
---|---|---|
s_axis_config_tdata | IN | 配置數據 |
s_axis_config_tready | OUT | 表示已準備好接收配置數據 |
s_axis_config_tvalid | IN | 表示配置數據輸入有效 |
s_axis_data_tdata | IN | 輸入數據,[31:16]為虛部,[15:0]為實部 |
s_axis_data_tlast | IN | 表示輸入結束,當 N 點數據輸入完后置高 |
s_axis_data_tready | OUT | 為高時表示 FFT 模塊可以接收數據 |
s_axis_data_tvalid | IN | 表示數據輸入有效 |
m_axis_data_tdata | OUT | 輸出頻譜數據,[31:16]為虛部,[15:0]為實部 |
m_axis_data_tlast | OUT | 表示輸出結束,當 N 點數據輸出完后置高 |
m_axis_data_tready | IN | 表示從設備已準備好數據接收 |
m_axis_data_tvalid | OUT | 表示數據輸出有效 |
仿真
- s_axis_config_tdata = 16’b10101001_1_0000000; 高八位是縮放因子,低八位是 FWD/INV 和用于補齊的零,如果不使用縮放因子的話,將其配置為 8’b0000_0001
- s_axis_data_tdata [31:16]為虛部,[15:0]為實部,均為有符號數
- 輸入信號是頻點為 2MHz的單載波,采樣率是 64MHz
- s_axis_data_tvalid 要與第一個信號輸入的同時拉高,在最后一個信號輸出后拉低
- s_axis_data_tlast 是在最后一個信號的所在時鐘周期拉高
- m_axis_data_tuser 是頻譜索引,m_axis_data_tuser * fs / N 為真實的頻點,即 4 * 64M / 128 = 2MHz,與輸入設置的相符