xilinx 的FFT IP核的使用手冊及仿真結果,matlab仿真結果對比,適合初學者學習

1、FFT的IP核的信號分析
在這裏插入圖片描述clk:時鐘信號,上升沿有效
start:FFT的啓動信號,高電平有效。當此信號變高時,開始輸入數據,隨後直接進行FFT轉換操作和數據輸出。一個STATRT脈衝,允許對一幀進行FFT轉換。如果每N個時鐘有一個START脈衝或者START始終爲高,則都可以連續進行FFT。如果在最初的START前還沒有fwd_inv_we、scale_sch_we信號,則START變高以後就使用這些信號的默認值。由於此IP核支持非連續的數據流,因此在任何時間輸入的START,即可開始數據的加載。當加載N個數據結束後,就開始FFT轉換運算。在使用過程中最重要的就是注意start,信號要早於輸入信號的4個週期,但實際應用中並不需要4個週期就已經開始加載數據了,可以這樣說:start一直開,認爲第一次加載數據時初始化,即從第二次開始正式工作,從而簡化設計。
xn_re、xn_im:輸入操作數,分別爲實部和虛部,以2的補碼輸入,在使用時應該確定位寬。輸入數據的虛部,在FFT運算時爲0,當爲IFFT運算時爲輸入數據的虛部。
fwd_inv:用以指示IP核爲FFT還是IFFT,值取1時IP核進行FFT運算,否則進行IFFT(快速傅里葉逆變換)運算。採用哪種運算方式時可以逐幀變化的。
fwd_inv_we:fwd_inv端口的使能信號
scale_sch:在IP核設計時,如果選擇在計算過程中進行中間數據的縮減,那麼此信號纔可以起作用。
scale_sch_we:作爲scale_sch的使能信號,高電平有效。
輸出信號:
rfd: 數據有效信號,高有效,在加載數據時爲高電平。
busy: IP核工作狀態的指示信號,在計算FFT轉換時爲高電平。
done: 高有效,在FFT完成後變高,只存在一個時鐘。在done變高後IP核開始輸出計算結果。
edone: 高有效,在done信號變高的前一個時鐘變爲高電平。
dv: 數據有效的指示信號,當輸出端口存在有效數據時變高。
xn_index : 位寬等於log2(point size),輸入數據的下標。
xk_index: 位寬等於log2(point size),輸出數據的下標。
xk_re,xk_im: 輸出數據的總線,以2的補碼輸出。如果選擇scaled結構,則輸出的數據位寬=輸入的數據位寬。;如果選擇unscaled結構輸出位寬=輸入位寬+log2(轉換點數)+1

2、FFT的IP核設置
在這裏插入圖片描述
Channels 下拉列表用於選擇FFT的通路數,範圍爲1~12,這裏選擇爲1。
Transform Length 下拉列表中用於設置FFT的點數,取值範圍爲2的冪次方數值,這裏選擇16。
Implementation Options區域設置實現參數:
Target Clock Frequence 行輸入工作頻率,時鐘頻率越高可以獲得更高的複用倍數,從而節省更多的資源面積,這裏選擇的工作始終爲125MHZ。

Automatically Select選項,只需要輸入數據的吞吐量,ISE就會自動的幫助用戶選擇實現結構。
Pipelined,Streaming I/O 項對應着流水線的連續I/O模式
Transform Length Options 區域的選項,是指在運行過程中可以根據實際情況調整變換的點數,在本項目中點數數固定的,所以不做設置。
NEXT,進行到下一頁:
在這裏插入圖片描述Fixed Point 爲數據的定點格式。
Precision Options區域用於選擇配置輸入數據的位寬和相位因子的位寬,這裏選擇的是16。
Scaling Options區域用於設置縮放因子,對於定點算法,相乘之後需要縮放,否則經過多級乘法器後,數據位寬會加倍遞增,佔用大量的硬件資源。Unscaled和Scaledd分別對應着不選擇和選擇縮放功能。如果選擇Scaledd項,會增加縮放輸入參數SCALE_SCH。
Rounding Modes 區域用於設置截位處理,Truncation項向下取,Convergent Rounding項向上取,本項目中選擇向下取。
Optional Pins 區域用於選擇握手信號,如CE/SCALR、OVFLO,本項目中不添加握手信號。
Optional Ordering 區域用於設置輸出順序,這裏有兩個選項,前者爲反序輸出,後者爲正序輸出。若選擇順序輸出,還可以使能Cyclic Prefix Insertion項插入循環前綴。本項目選擇順序輸出,不加前綴使能。
Input data Timing 爲輸入數據的定時,這裏選擇3clock cycle offect
點擊NEXT:
在這裏插入圖片描述Memory Options區域用於設置存儲空間的實現方式,DATA和Phase爲灰色默認,不做設置。
Number Of Stages Using Block Ram 用於設置塊RAM的使用級數,這裏設置爲0。
Recoder Buffer 選項區域分別用於選擇相位因子和記錄緩存的存儲器類型,有塊Ram和分佈式的Ram兩種,這裏選擇塊Ram。
Optimize Options 區域爲優化選項 這裏選擇3倍乘法器和可配置邏輯快(CLB)邏輯。

3、IP核的測試
Xilinx ISE中調用FFT IP Core的源程序
module fft(
input wire clk, //125M
input wire [15:0] xn_re, //輸入實部
input wir [15:0] xn_im,//輸入虛部
input wire start, //啓動信號
input wire fwd_inv,//FFT
input wire fwd_inv_we,//使能
input wire [3:0] scale_sch,//縮放因子
input wire scale_sch_we,//使能
output wire [15:0] xk_im, //輸出虛部
output wire [3:0] xn_index,//輸入的下標
output wire [3:0] xk_index,//輸出的下標
output wire rfd,//數據高有效
output wire busy,//工作信號
output wire [15:0] xk_re,//輸出實部
output wire dv, //輸出數據標誌
output wire edone,//完成標誌
output wire done//完成標誌
);
fft_ip fft_ip_inst(
.clk (clk),
.start (start),
.fwd_inv (fwd_inv),
.fwd_inv_we (fwd_inv_we),
.scale_sch_we (scale_sch_we),
.scale_sch (scale_sch),
.rfd (rfd),
.busy (busy),
.edone (edone),
.done (done),
.dv (dv),
.xn_re (xn_re), //輸入的數據實部
.xn_im (xn_im),
.xn_index (xn_index),
.xk_index (xk_index),
.xk_re (xk_re),
.xk_im (xk_im)
);

endmodule

在工程中添加HDL測試文件並命名,進行功能測試
module tb_myfft;
// Inputs
reg fwd_inv_we;
reg start;
reg fwd_inv;
reg clk;
reg [15:0] xn_re;
reg [15:0] xn_im;

    // Outputs
    wire rfd;
    wire dv;
    wire done;
    wire busy;
    wire edone;
    wire [15:0] xk_im;
    wire [3:0] xn_index;
    wire [15:0] xk_re;
    wire [3:0] xk_index;

   // Instantiate the Unit Under Test (UUT)
   myfft uut (
   .fwd_inv_we(fwd_inv_we), 
   .rfd(rfd), 
   .start(start), 
   .fwd_inv(fwd_inv), 
   .dv(dv), 
   .done(done), 
   .clk(clk), 
   .busy(busy), 
   .edone(edone), 
   .xn_re(xn_re), 
   .xk_im(xk_im), 
   .xn_index(xn_index), 
   .xk_re(xk_re), 
   .xn_im(xn_im), 
   .xk_index(xk_index));

initial begin
// Initialize Inputs
fwd_inv_we = 0;
start = 0;
fwd_inv = 0;
clk = 0;
xn_re = 0;
xn_im = 0;
scale_sch = 0;
scale_sch_we = 0;

// Wait 100 ns for global reset to finish;
#100;
// Add stimulus here
fwd_inv_we = 1; //設置爲FFT變換
fwd_inv = 1; //使能信號
start = 1; //啓動信號
end

always #10 clk=~clk;
always@(posedge clk) begin
xn_re = xn_re+1 ;
xn_im = xn_im+1 ;
end
endmodule

根據間隔每一幀數據需要三幀才能輸出計算結果,可以推出850ns時刻的輸出,對應着[14:29]+[14:29]*j的輸出結果。在matlab中輸入以下命令:
x= [14:29]+[14:29]*j;
y=round(fft(x));
計算結果如下圖所示,可以看出計算結果和仿真結果是一致的
仿真結果如圖1、圖2、圖3所示
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
5、設計方法(這裏是將AD採集後的信號放到FIFO中)
在這裏插入圖片描述
其中data_rx1[13:0]和data_rx2[13:0]是由AD採集後直接輸入賦值的,前者爲I路數據,作爲fft ip core 的實部數據輸入,後者爲 Q路輸入,作爲作爲fft ip core 的虛部數據輸入,但是在這裏fwd_inv爲1設置的爲FFT變換,所以虛部數據沒有用到。

歡迎老鐵批評指正。因爲代碼比較簡單,非常適合初學者,如果你覺得文檔寫的還行的話請給個贊或者給個留言鼓勵一下,大家一起學習共同進步,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章