3具體模塊的設計
3.1控制與地址產生模塊
由於兩路數據同時輸入,為了防止發生兩路數據間的串擾,對數據的控制顯得極其關鍵。從上面的算法結構分析中知道,由於後級的DFT運算點數是前一級的一半,所以後一級的開關轉換周期也是前一級的一半,基於這種關係,可以使用一個8位計數器的每一位狀態來對各級開關進行控制。最高位控制第一級,同時由於上一級數據進入下一級需要一個時鐘,所以下一級的開關轉換時刻要比上一級延遲一個時鐘周期。
對於移位寄存器,在實現時,各級的前級移位寄存器深度為N/2-1,從本質而言,是使運算開始的時鐘上升沿到來時,數據已經出現在碟算模塊輸入線上,而不需要下一個時鐘的驅動來移出寄存器,比如第二級移位寄存器的級數為63。這樣,運算周期正好是2的倍數,從而方便使用計數器的各位直接對開關進行控制。
同時,計數器還可以用來產生所需旋轉因子的RAM地址。根據各級蝶形運算所需旋轉因子的規律,可以利用計數器的高位補零來產生查找表的地址。比如,對於第一級,因為需要在最低位第一次出現1時提供,第二次出現1時提供,…,以此類推,周期為128,所以可以使用計數器的低七位作為地址。對於第二級,由於所需要的地址為偶數,可以由計數器的[6:1]和最低位置O產生。表l為8點時使用三位計數器輸出旋轉因子的地址情況。
控制和地址產生模塊的仿真結果如圖5所示,其中sel代表開關控制,addr代表產生的地址。
3.2蝶形運算模塊
蝶算模塊由一個複數加法器,一個複數減法器和一個旋轉因子的複數乘法器構成,如圖6所示。
旋轉因子乘法器通常由4次實數乘法和2次加/減法運算實現,但因為cos和sin的值可以預先存儲,通過下面的算法可以簡化複數乘法器:
(1)存儲如下三個係數:C,C+S,C-S
(2)計算:E=X-Y和Z=C*E=C*(X-Y)
(3)用R=(C-S)*Y+Z,I=(C+S)*X-Z,
得到需要的結果。
這種算法使用了3次乘法,1次加法和2次減法,但是需要使用存儲3個表的ROM資源。
設計中數據的輸入為16位複數,所以將旋轉因子cos(2kπ/N),sin(2kπ/N)量化成帶符號數的16位二進位數後,存儲到ROM中,由於值域不同,需要注意C+S和C-S的表要比C表多1位精度。
運算後的結果需要除以量化時乘以的倍數16b011111llllllllll。具體實現時由於除法運算在FPGA器件需要消耗較多的資源,設計中採用二進位數移位的方法來實現除法運算。為了防止數據溢出,設計對輸出結果除以2。圖7為蝶形運算模塊的RTL級結構圖。
3.3倒序輸出模塊
由頻域抽取的基-2算法可知,運算結果需要倒序輸出。可以先將結果存儲到RAM中,然後使用O~255的二進位數倒序產生RAM讀取地址,依次將結果讀出,其中實現一個8位二進位數倒序的算法如下:
(1)將8位數字的相鄰兩位交換位置;
(2)將相鄰的兩位看作1組,相鄰兩組交換位置;
(3)將相鄰的4位看作1組,相鄰兩組交換位置。
經過這樣的交換位置後,輸出即為原來8位二進位數的倒序。
舉例對於8位二進位數10110110來說,第一次交換位置的結果是01111001,第二次交換位置的結果是11010110,最後交換位置的結果是01101101。可見正好是原來數字的倒序。
另外,由於設計的是兩路數據同時寫入,一路數據讀出,所以讀取的頻率是寫入頻率的2倍,使用PLL實現原始時鐘的二倍頻,用來讀取RAM。倒序模塊仿真結果如圖8所示。
最終生成的FFT處理器模塊圖如圖9所示。
4仿真結果
各級間數據時序情況如圖10所示,設計的FFT處理器仿真結果如圖1l所示。採用一路階梯遞增信號和另一路:XXXX信號進行仿真,通過與Matlab計算結果進行對比,結果基本一致,可以滿足系統要求。系統總的延時由延時最大的第一級決定,為第一級運算的延時加上倒序輸出的延時,總共是(256+128)×clk,相對於一般流水線結構(256×讀入周期+7×128×蝶算周期+128×讀入周期),系統延時大為減少。
通過仿真可知,系統最大頻率由蝶形運算模塊的最大工作頻率決定。使用QuartusⅡ軟體時序仿真後,得到處理器的工作頻率為72MHz。
5結語
通過採用移位寄存器流水線結構,可以有效地提高FFT處理器中蝶形運算單元的效率,減少寄存器的使用數量,並且簡化了地址控制,提高處理器的工作頻率,具有良好的可擴展性,同時可以實現兩路數據的同時輸入,從而增大了一倍的數據吞吐量。對於工作頻率要求較高,數據吞吐量較大,尤其對於需要兩路數據輸入的場合,比如兩天線的MIMO-OFDM系統,具有很大的實用價值。