張笛, 雷海
(西南交通大學(xué) 電氣工程學(xué)院,四川 成都 610031)
目前,隨著中國(guó)高速鐵路與城市軌道交通的快速發(fā)展,對(duì)旅客乘車(chē)舒適度的要求也越來(lái)越高,這就對(duì)高速鐵路動(dòng)車(chē)組與城市軌道交通車(chē)輛的核心部件——大功率變流器提出了更高的要求。因此大功率變流器的控制器逐漸采用現(xiàn)場(chǎng)可編程門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)作為控制器硬件平臺(tái),采用高級(jí)硬件描述語(yǔ)言Verilog或VHDL來(lái)設(shè)計(jì)控制器。與傳統(tǒng)的DSP控制器相比,基于FPGA的控制器內(nèi)部是直接硬件電路運(yùn)算,采用的是并行運(yùn)行機(jī)制,能夠在較低頻率的系統(tǒng)時(shí)鐘下實(shí)現(xiàn)控制器的快速響應(yīng)[1-2]。
在大功率變流器的控制器設(shè)計(jì)中,經(jīng)常會(huì)使用到正余弦運(yùn)算,目前通常采用“查找表”的方法解決控制器中的正余弦運(yùn)算問(wèn)題,但是這種方法導(dǎo)致的一個(gè)致命缺陷是占用FPGA芯片的大量存儲(chǔ)資源, 而FPGA的基本邏輯單元非常豐富,但是存儲(chǔ)資源卻非常有限[3]。文獻(xiàn)[4~6]介紹了CORDIC算法在正余弦運(yùn)算中的應(yīng)用,但是仍然占用較多芯片資源。針對(duì)這一問(wèn)題,本文提出一種改進(jìn)的基于CORDIC算法的正余弦運(yùn)算?;诟倪M(jìn)型CORDIC算法的正余弦運(yùn)算不占用FPGA芯片的存儲(chǔ)資源,只占用FPGA少量的基本邏輯單元,而且內(nèi)部運(yùn)算多為移位與加法運(yùn)算,非常適合在FPGA芯片中實(shí)現(xiàn)。
CORDIC算法可以在圓旋轉(zhuǎn)坐標(biāo)系、線(xiàn)性坐標(biāo)系和雙曲線(xiàn)坐標(biāo)系下實(shí)現(xiàn)。通過(guò)圓旋轉(zhuǎn)坐標(biāo)系,可被計(jì)算的函數(shù)的數(shù)目受到了限制。通過(guò)線(xiàn)性坐標(biāo)系和雙曲線(xiàn)坐標(biāo)系,可以直接計(jì)算更多的函數(shù),如乘法和除法,進(jìn)而間接計(jì)算更多的其他函數(shù),但是系統(tǒng)將變得更加復(fù)雜。下面僅介紹算法在圓旋轉(zhuǎn)坐標(biāo)系下的原理。
圖1 向量旋轉(zhuǎn)
在平面直角坐標(biāo)系下,一個(gè)向量Ai=(xi,yi)旋轉(zhuǎn)角度θ后變?yōu)锳j=(xj,yj),如圖1所示。
順時(shí)針與逆時(shí)針旋轉(zhuǎn)的旋轉(zhuǎn)矩陣分別為T(mén)rs與Ts,如式(1)所示。
(1)
為了便于分析,定義旋轉(zhuǎn)方向函數(shù)S為:
(2)
由此可得:旋轉(zhuǎn)矩陣T為:
(3)
向量Ai=(xi,yi)旋轉(zhuǎn)到Aj=(xj,yj)可以表示為:
(4)
這樣通過(guò)一次旋轉(zhuǎn)就從向量Ai=(xi,yi)旋轉(zhuǎn)到向量Aj=(xj,yj),如果通過(guò)多次旋轉(zhuǎn),每次旋轉(zhuǎn)一個(gè)小角度,最后也能從向量Ai=(xi,yi)旋轉(zhuǎn)到向量Aj=(xj,yj)。第n次旋轉(zhuǎn)一個(gè)小角度θn可以表示為:
(5)
將式(5)重新表示為:
(6)
(7)
將式(7)經(jīng)過(guò)n次迭代可得:
(8)
由式(8)可得:
(9)
式中:(x0,y0)即(xi,yi)。設(shè):
(10)
當(dāng)N趨于無(wú)窮大時(shí),K≈0.607 253。因此由式(9)可知:每次旋轉(zhuǎn)的一個(gè)小角度,可以通過(guò)簡(jiǎn)單的移位和相加來(lái)實(shí)現(xiàn),這非常適合于用FPGA來(lái)實(shí)現(xiàn)。通過(guò)反復(fù)迭代,即可實(shí)現(xiàn)向量Ai=(xi,yi)旋轉(zhuǎn)到向量Aj=(xj,yj)。
當(dāng)設(shè)(xi,yi)為(1,0)時(shí),結(jié)合式(4)與式(9)可得:
(11)
由式(11)可知:通過(guò)設(shè)定初始旋轉(zhuǎn)向量為(1,0),通過(guò)多次小角度旋轉(zhuǎn),最后得到目標(biāo)向量的橫、縱坐標(biāo)即為相應(yīng)的余弦值與正弦值。
CORDIC算法中輸出向量的誤差主要由近似誤差和舍入誤差構(gòu)成。把由實(shí)際旋轉(zhuǎn)角度與理想旋轉(zhuǎn)角度的誤差值引起的輸出誤差定義為近似誤差,該誤差是由于旋轉(zhuǎn)級(jí)數(shù)有限和用來(lái)表述角度的進(jìn)制位數(shù)有限引起的。把在每級(jí)計(jì)算中有限的計(jì)算精度引起的誤差定義為舍入誤差,該誤差是由有限的操作數(shù)寬度引起的。
令向量vi=(xi,yi),設(shè)向量vi經(jīng)過(guò)n次迭代后得到向量vn=(xn,yn),實(shí)際的旋轉(zhuǎn)角度為zn。則角度誤差為:δ=θ-zn。通過(guò)迭代,角度誤差不會(huì)超過(guò)最小的基本旋轉(zhuǎn)角度,即:
δ≤arctan2-n+1
(12)
令理想的旋轉(zhuǎn)結(jié)果為:
(13)
由此可得絕對(duì)誤差為:
(14)
相對(duì)誤差為:
(15)
當(dāng)n足夠大時(shí),arctan2-n+1≈2-n+1,因此最大近似誤差gapprox為:
gapprox=2-n+1vn
(16)
由此可見(jiàn),近似誤差主要是由迭代次數(shù)來(lái)決定的,迭代次數(shù)越多,近似誤差越小。
vn+1=P(n)vn
(17)
其中
(18)
(19)
Q[vn]=vn+en
(20)
(21)
由于e(0)=0,所以式(21)可改寫(xiě)為:
(22)
則最大舍入誤差為:
(23)
由此可見(jiàn),最大舍入誤差由操作數(shù)的數(shù)據(jù)寬度b和迭代次數(shù)n來(lái)決定。數(shù)據(jù)寬度越寬、迭代次數(shù)越少,舍入誤差就越小。
為了驗(yàn)證改進(jìn)型CORDIC算法實(shí)現(xiàn)正余弦計(jì)算的正確性,在MATLAB/Simulink平臺(tái)上建立仿真模型進(jìn)行驗(yàn)證,仿真模型如圖2所示。
圖2 改進(jìn)型CORDIC算法仿真模型
圖3給出了改進(jìn)型CORDIC算法的正余弦計(jì)算仿真結(jié)果。圖中:sin*與cos*為正余弦信號(hào)的原始波形;sin與cos為利用CORDIC算法進(jìn)行正余弦運(yùn)算的波形;第三行與第六行為重疊顯示的波形。從圖3可以看出:基于CORDIC算法進(jìn)行正余弦運(yùn)算得出的波形與原始正余弦信號(hào)波形完全重合,驗(yàn)證了基于CORDIC算法進(jìn)行余弦計(jì)算的有效性,同時(shí)具有較高的精度。
表1給出各級(jí)迭代情況下的相位誤差仿真結(jié)果,可知在10迭代情況下,相位誤差僅為0.000 587,可粗略估算出相位誤差在0.093%以下,由此可以驗(yàn)證改進(jìn)型CORDIC算法在進(jìn)行正余弦計(jì)算時(shí)具有很高的精度,足以滿(mǎn)足大功率變換器控制器運(yùn)算的要求。
表1 改進(jìn)型CORDIC算法10級(jí)迭代相位誤差
在本文設(shè)計(jì)中,進(jìn)行正余弦計(jì)算的改進(jìn)型CORDIC算法采用10級(jí)流水線(xiàn)設(shè)計(jì)來(lái)進(jìn)行10次迭代,主數(shù)據(jù)流寬度為12位,具體設(shè)計(jì)思路如下。
相位信號(hào)與主數(shù)據(jù)流寬度一致,為12位,將高兩位處理為相位信號(hào)的象限標(biāo)識(shí),第十位作為相位信號(hào)的角度大小,該角度大小在0~90°,通過(guò)“象限標(biāo)識(shí)”與“角度大小”可以標(biāo)識(shí)任意相位信號(hào)。通過(guò)正余弦信號(hào)恒等變換構(gòu)建原始相位信號(hào)的輸出結(jié)果。這樣將CORDIC算法的旋轉(zhuǎn)角度范圍由傳統(tǒng)的0~360°縮小到0~90°,大大降低了迭代級(jí)數(shù),只需定義每一級(jí)的旋轉(zhuǎn)角度參數(shù)(共僅需定義10個(gè))。取消了傳統(tǒng)算法中的反正切查找表與對(duì)其的訪(fǎng)問(wèn),從而在取消占用芯片存儲(chǔ)器資源的同時(shí),也加快了算法的運(yùn)算速度。通過(guò)“移位”與“加減法”運(yùn)算設(shè)計(jì)每一級(jí)的迭代運(yùn)算。每一級(jí)迭代首先判斷剩余相位信號(hào)的正負(fù),然后決定是順時(shí)針旋轉(zhuǎn)還是逆時(shí)針旋轉(zhuǎn),最終目標(biāo)是使剩余相位向“零”靠攏。
針對(duì)迭代過(guò)程中移位相加可能出現(xiàn)的溢出情況,本文提出一種新的解決方案:對(duì)迭代過(guò)程中數(shù)據(jù)寬度根據(jù)符號(hào)位擴(kuò)展1位,取消了傳統(tǒng)實(shí)現(xiàn)方案中每一步運(yùn)算中對(duì)移位相加的溢出保護(hù)電路,進(jìn)一步降低對(duì)芯片邏輯資源的占用。
本文基于FPGA芯片,分別采用查找表方式、傳統(tǒng)CORDIC算法、改進(jìn)型CORDIC算法實(shí)現(xiàn)了相位信號(hào)的正余弦信號(hào)計(jì)算電路模塊,表2給出了采用相同數(shù)據(jù)寬度情況下,采用三種算法實(shí)現(xiàn)相位信號(hào)正余弦計(jì)算的芯片資源占用情況,從表2可以看出,改進(jìn)型CORDIC算法不占用存儲(chǔ)空間,僅僅占用少量邏輯資源就可實(shí)現(xiàn)較高精度的正余弦信號(hào)計(jì)算。
表2 資源占用情況
圖4是改進(jìn)型CORDIC算法在FPGA中運(yùn)行的試驗(yàn)結(jié)果,其中:第一行顯示為相位信號(hào),采用12位數(shù)據(jù)寬度,故其值在-2 048~2 047之間,對(duì)應(yīng)實(shí)際的相位-2π~2π;第二行與第三行為正余弦計(jì)算值,采用12位數(shù)據(jù)寬度,故其值也在-2 048~2 047之間,對(duì)應(yīng)實(shí)際值的-1~1;第四行為CORDIC算法計(jì)算的相位誤差信號(hào),采用12位數(shù)據(jù)寬度,試驗(yàn)運(yùn)行中其實(shí)際范圍在-1~2之間,由此可以粗略估算出相位誤差在0.098%以下。
圖4 改進(jìn)型CORDIC算法正余弦計(jì)算試驗(yàn)結(jié)果
本文針對(duì)大功率電力變換器的控制器中使用頻率較高的正余弦計(jì)算問(wèn)題,提出一種改進(jìn)型CORDIC算法。通過(guò)仿真驗(yàn)證該算法能夠進(jìn)行正余弦計(jì)算,并且具有較高的精度。通過(guò)FPGA試驗(yàn)驗(yàn)證,該算法可以在使用較少的邏輯資源的情況下,實(shí)現(xiàn)較高精度的正余弦計(jì)算,解決了傳統(tǒng)方法過(guò)度占用控制芯片存儲(chǔ)資源的問(wèn)題,具有較高的應(yīng)用價(jià)值。