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:全球大搜羅 |