一種CORDIC協(xié)處理器核的設(shè)計(jì)與實(shí)現(xiàn)
隨著航天技術(shù)的發(fā)展,航天任務(wù)對于導(dǎo)航計(jì)算機(jī)的性能要求越來越高。導(dǎo)航計(jì)算機(jī)除了要對傳感器數(shù)據(jù)進(jìn)行采集,與控制系統(tǒng)進(jìn)行實(shí)時(shí)通訊,還要能進(jìn)行實(shí)時(shí)的計(jì)算。盡管目前航天任務(wù)中使用的處理器芯片性能越來越強(qiáng),但大多數(shù)CPU并沒有處理常用超越函數(shù)(sin,cos,arctan,exp,sqrt,ln等)的專用指令。而通過純軟件循環(huán)迭代求解超越函數(shù)往往需要CPU數(shù)十甚至上百個(gè)周期,這極大降低了導(dǎo)航計(jì)算機(jī)的實(shí)時(shí)性。本文提出了一種高實(shí)時(shí)性、低復(fù)雜度的CORDIC協(xié)處理器核,提供了高吞吐率的超越函數(shù)運(yùn)算能力,從而提高了導(dǎo)航計(jì)算機(jī)的并行運(yùn)算能力。此IP核使用verilog編寫,由于其資源占用率低,可以非常容易地被集成入各種航天用FPGA中。
本文引用地址:http://www.ex-cimer.com/article/201609/303786.htm1 CORDIC算法
1.1 CORDIC旋轉(zhuǎn)
CORDIC算法最早由Volder提出,用于求解一般三角函數(shù),之后由Walther改進(jìn),使得CORDIC可以用于計(jì)算雙曲函數(shù)和進(jìn)行乘除運(yùn)算。由于幾乎所有的通用CPU都具有硬件乘法除法功能,因此對數(shù)坐標(biāo)模式所提供的乘除功能很少被實(shí)際使用,故CORDIC算法的主要應(yīng)用是三角函數(shù)和雙曲函數(shù)的運(yùn)算。CORDIC的基本思想是通過一系列預(yù)定大小角度的旋轉(zhuǎn),使得輸入向量被旋轉(zhuǎn)到所期望的位置,從而求解出一系列函數(shù)。CORDIC的旋轉(zhuǎn)方程可以表示為
其中m為1時(shí)CORIDC工作在圓坐標(biāo)系下,m為-1時(shí)工作在雙曲坐標(biāo)系下。dn為1時(shí)向量按順時(shí)針方向旋轉(zhuǎn),當(dāng)dn為-1時(shí)按逆時(shí)針方向旋轉(zhuǎn)。
雖然每一步迭代只需要進(jìn)行加減操作和固定位的移位操作,但由(1)可知,CORIDC每一次旋轉(zhuǎn)都會(huì)改變向量的模。所以為了得到正確的向量分量x和y,需要補(bǔ)償旋轉(zhuǎn)后的向量,而由于向量模的變化與旋轉(zhuǎn)的方向無關(guān),這可以通過一個(gè)常數(shù)乘法器實(shí)現(xiàn)。補(bǔ)償常數(shù)為:
CORDIC每次旋轉(zhuǎn)的方向由工作模式?jīng)Q定。在旋轉(zhuǎn)模式下,CORDIC試圖讓向量與x軸之間的夾角z趨近于0。在向量模式下,CORDIC試圖讓向量的y分量趨近于0。故每次旋轉(zhuǎn)的方向由運(yùn)行模式和向量的yz分量符號決定:
綜上,各個(gè)模式下CORDIC的迭代結(jié)果以及可實(shí)現(xiàn)的函數(shù)如表1所示。
1.2 收斂性
Cordic能輸出正確結(jié)果的前提是旋轉(zhuǎn)結(jié)束時(shí)向量能夠被旋轉(zhuǎn)到預(yù)期的位置(在誤差范圍內(nèi)),即旋轉(zhuǎn)收斂??梢酝ㄟ^遞歸證明的是,對于圓坐標(biāo)模式,對于任意n總有
2 系統(tǒng)實(shí)現(xiàn)
為了保證協(xié)處理器能夠提供足夠的計(jì)算吞吐量并使協(xié)處理器的計(jì)算延遲可預(yù)測,本文使用流水線實(shí)現(xiàn)整個(gè)CORDIC核。協(xié)處理器的流水線結(jié)構(gòu)如圖1所示。
2.1 系統(tǒng)輸入
協(xié)處理器核從輸入FIF0獲得初始輸入數(shù)據(jù),包括3個(gè)坐標(biāo)分量以及1個(gè)控制命令字。輸入?yún)?shù)的格式為1位符號位,2位整數(shù)位,小數(shù)位的位數(shù)作為IP核的參數(shù)可以在例化時(shí)調(diào)整。這樣的輸入格式使得此IP核可以容易地被應(yīng)用于使用定點(diǎn)運(yùn)算的許多DSP處理器。對于浮點(diǎn)數(shù)運(yùn)算,實(shí)際上CPU可以通過簡單的移位縮放操作使得輸入范圍外的xyz分量落到協(xié)處理器可接受的范圍內(nèi),這是由于規(guī)格化浮點(diǎn)數(shù)的尾數(shù)本來就在區(qū)間[1,2)內(nèi)。相對的,已有的很多CORDIC協(xié)處理器實(shí)現(xiàn)使用了浮點(diǎn)數(shù)進(jìn)行中間運(yùn)算,然而這不僅顯著地增加了資源的使用,而且使得每一個(gè)CORDIC旋轉(zhuǎn)需要通過多級流水線完成,增大了每個(gè)運(yùn)算的延遲。
此外,為了降低CPU和協(xié)處理器之間交互次數(shù),本IP核允許CPU在計(jì)算某些函數(shù)時(shí)不對所有的輸入寄存器進(jìn)行寫入。對于輸入?yún)?shù)少于3個(gè)的函數(shù),協(xié)處理器自動(dòng)生成其他分量的輸入。比如對于cos(x),CPU只需要對協(xié)處理器的a0寄存器和控制字寄存器寫入即可觸發(fā)cos(x)的運(yùn)算,CORDIC協(xié)處理器會(huì)自動(dòng)把x分量初始化成2.0,y分量初始化成0,z分量初始化成a0。對于有效位數(shù)較小的配置如18位,可以進(jìn)一步將控制命令字和a0放到同一個(gè)32位寄存器中,則對于單輸入函數(shù),CPU只需向一個(gè)地址寫入數(shù)據(jù)即可完成操作。18位數(shù)據(jù)精度時(shí)的輸入寄存器格式如圖2所示。
2.2 預(yù)處理單元
如表1所示,CORDIC的運(yùn)算結(jié)果并不直接對應(yīng)所要求的函數(shù),故需要對與輸入?yún)?shù)進(jìn)行處理。例如對于ln(a)和sqrt(a)運(yùn)算,需要令x=a+1,y=a-1,對于cos(x),sin(x)等運(yùn)算,需要生成相應(yīng)的其他分量輸入。此外,由于雙曲坐標(biāo)的性質(zhì),arctanh1并不存在,故雙曲坐標(biāo)模式只能從i=1開始迭代,而圓坐標(biāo)系可以從i=0開始迭代,這導(dǎo)致了兩種模式的旋轉(zhuǎn)過程不同。為了能用同一個(gè)流水線實(shí)現(xiàn)2種模式的操作,本文令所有模式都從i=1開始迭代。但這樣會(huì)導(dǎo)致在圓坐標(biāo)模式下的收斂域過小,只有。解決的辦法是在預(yù)處理單元加入象限折疊,即通過三角函數(shù)關(guān)系,將[-π,π]上的向量折疊到[0,π/4]上,再在后處理單元對結(jié)果進(jìn)行修正。
2.3 旋轉(zhuǎn)單元
旋轉(zhuǎn)單元是CORDIC協(xié)處理器的核心,實(shí)現(xiàn)(1)所描述的向量旋轉(zhuǎn)操作。其結(jié)構(gòu)如圖3所示。
評論