當前位置:
首頁 > 最新 > 512點的FFT實現(參數化例化基本單元實現)

512點的FFT實現(參數化例化基本單元實現)

對前面的並行蝶形運算基本單元進行改進,實現了每級蝶形運算串列化;同時將小數位改為保留10位,提高定點運算精度。提供完整的testbench。

01

電路介紹

前面兩篇文章實現FFT蝶形運算結構如下(如果不懂先看參考文章):

即其跟蝶形運算的結構一致,其存在的問題就是當FFT的點數上升,其需要蝶形運算單元(arithmetic_unit)將會以2的指數級上升;例如512點則需要1+2+4+8+16+32+64+128+256=511個蝶形運算單元。而每個蝶形運算單元需要4個乘法器,兩個加法器,兩個減法器,這對資源的消耗太大。

因此這裡將其改成了每級只用一個蝶形運算單元(arithmetic_unit),串列的去實現每個蝶形的運算。實現了一個512點的FFT,共9級,只用了9個蝶形運算單元,其整體電路結構如下。

其中input_stage為輸入級(第一級),後面跟著例化了8個one_stage,最後一個模塊(relocation),對最後一級運算得到的數據重新排序,然後輸出。

input_stage: 即第一級,有兩個數據輸入埠(data_in_real,data_in_img),實部,虛部。in_valid信號表示輸入數據有效。裡面還包含有蝶形運算因子存儲模塊(w_coef),輸入級緩存模塊(buffer_input),蝶形運算模塊(arithmetic_unit)。

one_stage: 含有四個數據輸入埠(data_in_1_real,data_in_1_img,data_in_2_real,data_in_2_img),分別接收來自上一級蝶形運算產生的兩個輸出(每個輸出包含一個實部,一個虛部)。in_valid信號表示輸入數據有效,接上一級的o_valid信號。裡面還包含有蝶形運算因子存儲模塊(w_coef),輸入級緩存模塊(buffer),蝶形運算模塊(arithmetic_unit)。

relocation:由於蝶形運算最後一級的輸出與真正的輸出數據之間存在倒序關係(見文章《基2頻率抽取FFT演算法的實現-軟體篇》),因此使用relocation對最後的輸出做一個重定位。其中d_o1_img,d_o1_real,d_o2_img,d_o2_real接最後一級的相應的數據的輸出埠。o_valid信號接最後一級的o_valid信號。o_en表示最後的輸出數據準備好了,此時通過輸入addr(0~511)地址,將相應位置的數據一個個取出來。

02

模擬報告

完整的testbench的書寫說明在下篇文章當中將會講解。這裡是利用將python跑得的結果寫成文本文檔方式,然後與modelsim模擬的結果做一個對比,在小數位保留10位的情況下其誤差不會超過3%。

部分虛部輸出結果對比如下(左邊為python結果,右邊為verolig模擬結果):

部分實部輸出結果對比如下(左邊為python結果,右邊為verolig模擬結果):

歡迎一起交流繼續的可行改進方案。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

2018俄羅斯世界盃E組分析:哥斯大黎加再成黑馬?
一個無私的男人的節日

TAG:全球大搜羅 |