湯文亮
(華東交通大學 軟件學院,南昌 330013)
直接數字頻率合成(DDS)是一種信號頻率合成技術,它具有頻率分辨率高、轉換速度快、相位連續等許多優點,并朝著高頻率、多功能、多通道、低功耗等方向發展。DDS系統主要由相位累加器、相位幅度轉換電路和數模轉換電路等部分組成。它通過相位累加器將相位按頻率調節控制字指定的步長進行累加,再由相位-幅度轉換電路將瞬時相位轉換為其對應的正弦值或余弦值序列輸出,最后經由數模轉換電路和低通濾波,即可得到模擬正弦波或余弦波信號。
DDS傳統采用查找表方法實現, 但其存放相位到幅度轉換的查找表ROM的大小和相位精度的位數成指數關系。當精度要求很高的時候需要大容量ROM,使系統的處理速度降低。因此,采用查表法方法無法設計高速、高精度的DDS。采用CORDIC算法來實現超函數時[1,2],則無需使用乘法器,它只需要一個最小的查找表(LUT),利用簡單的移位和相加運算,即可產生高精度的正余弦波形,尤其適合于FPGA的實現。采用CORDIC算法能實現高速高精度的DDS。本文先介紹CORDIC算法原理,再詳細講述基于CORDIC 算法的DDS實現。
CORDIC算法[4]是Volder于1959年在美國航空控制系統的設計中提出來的,它是一種用于計算運算函數的循環迭代算法。從廣義上講它是一個數值計算逼近的方法。這些固定的角度與計算基數有關,運算只有移位和加減。傳統上計算三角函數和其他一些硬件不易實現的函數, 一般使用查表法、多項式展開或近似的方法[3]。這些方法不能兼顧速度、精度、簡單性等方面的要求。CORDIC算法正是為解決這種問題而產生的。它從算法本身入手,將復雜的算法分解成一些在硬件中容易實現的基本算法,如加法、移位等, 從而使得這些算法在硬件上可以得到較好的實現。
如圖1所示,假設直角坐標系內有一個向量a(Xa,Xa),逆時針旋轉θ角度后得到另一個向量b(Xa,Xa)。

圖1 向量單次旋轉

圖2 向量多次旋轉
這個過程可以用矩陣形式表示如下:

如果向量a(Xa,Xa)經過n次旋轉才到達向量b(Xa,Xa),如圖2所示。其中第 次旋轉的角度為θt,那么第i次旋轉的表達式為:

到此為止沒有任何簡化, 為了便于硬件實現限制tanθi=±2-i,即θi=±arctan2-i,θ的值可以存放在一個小的查找表中。通過一系列連續的小角度旋轉,可以得到任意小的旋轉角度。旋轉角度總和為當檔si=-1;時表示向量是逆時針旋轉,當 時表示向量是順時針旋轉。這時式(3)變為:

式中k是一個常數增益, 暫時不考慮這個增益因子,式(4)可以寫成:

式(7)就是CORDIC的迭代式,它只需要通過移位和相加就可以完成矢量旋轉。
設z0是a,b兩向量的夾角,要使a旋轉到b,則Si的符號由第i次旋轉時的角度,它們的關系如下:zi<0時, Si=-1;zi≥0時, Si=+1(特殊情況下, z0<0時,Si=-1;zi≥0時,Si=+1 )。
向量a向量b 逼迫的精度由迭代的次數決定,迭代的次數越多,逼迫的精度就越高。迭代n次(n→∞)得到的最終結果為:

得到的結果為:

從式(8)、(9)和(10)可以看出,給適當初值,通過本算法可以計算出cosine和sine,這就是CORDIC算法的旋轉模式。
CORDIC旋轉的移位相加流水結構,每一級流水線單元只需3個加減法器、2個移位寄存器和1個系數存儲器,非常節省資源,如需提高精度,只需簡單地增加流水單元即可,擴展性很好。這種流水線結構在正常工作時只需一個時鐘周期就可輸出一個數據,可實現高速實時處理,非常適合于在FPGA 中實現。圖3是DDS頂層電路設計圖,頻率控制字寄存器將頻率控制字送入相位累加器,相位累加器對系統時鐘進行計數,每到達輸入頻率控制字的值,即對相位進行累加,隨后將累加值的高16位送入相位相加器,與相位控制字寄存器接收到的初始相位進行相加,得到當前的相位值。然后把當前相位值的最高位用作象限判定,并把低15位擴展1位符號位用于基于CORDIC的函數發生器。

圖3 DDS頂層電路設計圖
針對迭代結構的缺點,我們設計中可以采用進位鏈和流水線技術相結合的方法,采用該方法實現的相位累加器既能保證具有較高的資源利用率,又能大幅提高系統的性能和速度。CORDIC算法采用流水線型設計。該設計有兩個優點:第一,它的移位寄存器進行迭代法比可變移位寄存器簡單的多。第二,它沒有在角計算中存儲常量的ROM,可以用硬件直接來實現。因此在實際設計中,采用流水線型設計的CORDIC運算單元正常工作時只需一個時鐘周期就能輸出一個數據,為數據實現高速實時處理提供了前提。
在Quartus II開發環境中,使用基于查找表和基于CORDIC算法實現DDS的方法設計實現一個相同指標要求的DDS系統,并進行性能指標分析。本設計的DDS的相位累加器位數為30位,正弦值量化位數為8位。使用該兩種方法實現的DDS,其正弦值輸出精度很相近,基于CORDIC算法實現的DDS比基于查找表實現的DDS運行速度快4倍多,其最高工作時鐘頻率如表1所示。

表1 運行速度性能對比
當本設計的DDS系統使用系統時鐘為100M,輸出信號頻率的頻率分辨率為0.096Hz。輸出頻率 時,M=20C4A8;輸出頻率 時,M=106254。當頻率控制字為20C4A8時,輸出正弦波的周期為500ns,即正弦波的頻率為2MHz;當頻率控制字為106254時,輸出正弦波的周期為1000ns,即正弦波的頻率為1MHz,仿真正確。本設計的所有模塊用HDL語言編寫,在Quartus II下進行了功能仿真,仿真結果圖如圖4所示。

圖4 DSS輸出正弦信號仿真圖
本論文分析了CORDIC算法實現DDS中相位到幅度轉換的原理,詳細講述了一種優化的基于CORDIC算法實現高速高精度DDS的方法。最后在FPGA上實現了一個產生正弦/余弦信號高速高精度DDS,該DDS非常適用于在軟件無線電中進行高速高精度的數字調制解調。
[1] 李滔,韓月秋.基于流水線CORDIC算法的三角函數發生器[J].系統工程與電子技術,2000,2(4):85-87.
[2] 周柱,張煒.基于CORDIC的優化的直接數字頻率合成器[J].電子工程師,2005,31(10):34-37.
[3] Vankka J,Halonen K.Direct digital synthesizers:theory,design and applications[M].Norwell:Kluwer Academic,2001:3372402.
[4] Volder J E.The CORDIC Trigonometric Computing Technique[J].IRE Transactions on Electronics Computers,1959,8(3):330-333.