摘要:從CORDIC算法的基本原理出發,討論其工作過程以及旋轉角的覆蓋范圍,在此基礎上,給出了具有流水線結構的FPGA實現結構以及增益因子的大小與流水線級數的確定關系,給出了VHDL實現算法,經程序設計與Quartus6.0調試與仿真,結果表明采用FPGA實現的CORDIC算法具有較好的運算精度。
關鍵詞:CORDIC;VHDL;實現;流水線
中圖分類號:TP391文獻標識碼:A文章編號:1009-3044(2008)30-0716-02
The Implementation of Pipeline CORDIC Algorithm Based on VHDL
ZHAO Lin-jun
(Shanxi University of Technology, Hanzhong 723003, China)
Abstract: From the basal principle of CORDIC algorithm, this paper discusses the algorithmic course of work and its coverage range of revolution angle. Based on this, the article gives a pipelined structure which realized by FPGA and a VHDL program. Compiled and simulated by QuartusⅡ6.0, its operational results has a higher precision. Finally, the essential way to improve the CORDIC performance has been pointed out.
Key words: CORDIC; VHDL; Implementation; Pipeline
1 引言
CORDIC(Coordinate Rotation Digital Computer)算法是J.Vocder[1]于1959年在美國航空控制系統的設計中提出來的一種用于計算平面直角坐標系和極坐標系下函數值的循環迭代算法,J.S Walther[2]將其推廣了CORDIC算法,將圓周旋轉、線性旋轉與雙曲線旋轉均包括到了同一個CORDIC迭代方程之中,由于該算法僅涉及移位與加減運算,便于軟硬件實現,因而受到了人們的廣泛關注。目前該算法已經應用到FFT、DCT、DWT、DDFS以及極化調制等諸多領域。本文從CORDIC算法的基本原理出發,論述了其流水線結構的FPGA實現的具體方法及其產生正余弦信號的VHDL實現,文中的代碼經Quartus6.0編譯通過,仿真結果表明文中的設計方法是可行的,且運算結果具有較高的精度。
2 CORDIC算法的基本原理
CORDIC算法的基本原理是如圖1所示。設初始向量V1(x1,y1),順時針旋轉θ,得向量V2(x2,y2),這一過程數學上可表示為:
補碼表示時,有限字長的數據左移最終結果為零,因此CORDIC算法的迭代次數是受現與參與運算數據的字長的。當字長選擇16bits時通過增加兩級i=0旋轉,使其旋轉角度在-π~+π,此時的增益因子大小應為:
由于VHDL只能對定點整數進行綜合,因此要對理數據需要進行取整處理,本文研究的系統采用實際數據×2n-1后取整來處理(n為字長),其MSB為符號位。
3 CORDIC算法的FPGA實現[4,6,8]
一個字長16位的18級流水線結構的CORDIC算法如圖2所示。其VHDL程序設計的關鍵語句采用if語句實現。在同一個process中,多條if語句是順序執行的,因此可以用來實現流水線工作方式。一個完整的if語句為:
if (theta(i)>0) then
x(i+1)<=x(i)-(SRL(y(i), i));
y(i+1)<=y(i)+ (SRL(x(i), i));
theta (i+1)<= theta (i)-θi;
else
x(i+1)<=x(i)+( SRL (y(i), i));
y(i+1)<=y(i)-( SRL (x(i), i));
theta (i+1)<= theta (i)+θi;
end if;
其中:SRL(m,k)實現數據m右移k位,并返回值為移位后的結果。
4 仿真結果
采用上節的if語句,按照圖2編寫了可產生正余弦信號的CORDIC運算程序,圖3給出的是QuartsⅡ 6.0環境下調試的仿真結果,其中y_o輸出的是輸入角度的cosine值,x_o輸出是輸入角度sine值。為了便于理解,表3給了圖3中有關數據的具體含義。
5結束語
由表1可以看出,cordic運算結果相當精確。由圖3(b)可以看出流水線時鐘的轉換初期,計算輸出存在毛刺,經分析其主要是由if語句中的條件判斷與移位函數的延遲引起的,讀者可參閱文獻[6,7]中的改善方法對本文中的代碼進行修訂,以進一步提升其性能。
參考文獻:
[1] Volder J E. The CORDIC Trigonometric Computing Technique[J].IRE Transactions on Electronics Computers,1959,8(3):330-333.
[2] Walther J S. A Unified algorithm for elementary functions[C].Spring Joint Computers Conference,1971:379-385.
[3] 趙鑫.VHDL與數字電路設計[M].北京:機械工業出版社,2005.
[4] 劉凌.數字信號處理的FPGA實現[M].北京:清華大學出版社,2006.
[5] 李濤,韓秋月.基于流水線CORDIC算法的三角函數發生器[J].電子技術應用,1999,(6):52-53.
[6] 張欣,擴頻通信數字基帶信號處理算法及其VLSI實現[M].北京:科學出版社,2004.
[7] Hu Y H. The Quantization Effect of the CORDIC Algorithm[J].IEEE Trans on SignalProcessing,1992,40(4):834-844
[8] Dhananjay S P. Double step branching CORDIC: A New Algorithm for Fast Sine and Cosin Generation[J].IEEE transaction on computers,1998,47(5):587-602.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文