李正平,高 楊
(安徽大學(xué) 電子信息工程學(xué)院,安徽 合肥 230601)
電子通信技術(shù)的迅速發(fā)展使得人們對數(shù)字系統(tǒng)實時性和準(zhǔn)確性提出了更高的要求,人們需要精度更高,頻率更快的系統(tǒng)來處理數(shù)字信號。然而,基于軟件處理數(shù)字信號會消耗大量的時鐘周期,無法滿足實時性要求;使用硬件加速器雖然能夠減少時鐘周期,但是加速器缺乏靈活性且硬件資源消耗得比較多,在通用的處理器上針對特定的應(yīng)用領(lǐng)域擴展指令集已經(jīng)成為了兩者折中的方式[1-2]。本文提出了基于MIPS商用處理器架構(gòu),CORDIC算法指令集擴展的設(shè)計與實現(xiàn)。
CORDIC算法的主要思想是在坐標(biāo)系中不斷旋轉(zhuǎn)特定的角度,使得旋轉(zhuǎn)角度的累加值不斷逼近待計算的角度[3]。該算法的最大優(yōu)勢在于可以通過簡單移位運算替代復(fù)雜的數(shù)學(xué)運算,便于硬件實現(xiàn)[4]。文獻[5]對CORDIC算法進行統(tǒng)一的整理,給出求解初等函數(shù)的統(tǒng)一公式,即
xi=K{xi-1cos(αm1/2)+yi-1m1/2sin(αm1/2)},
yi=K{yi-1cos(αm1/2)-xi-1m-1/2sin(αm1/2)},
zi=zi-1+α
(1)
αi=tan-1(2-i)
(2)
(3)
其中:α為每次逼近時需要旋轉(zhuǎn)的角度;i≥0為迭代的次數(shù);K為初值常數(shù),和迭代的次數(shù)相關(guān);x0、y0為旋轉(zhuǎn)起始點的坐標(biāo);z0為旋轉(zhuǎn)起始點與x軸的夾角;zn為迭代n次角度的累加值。
處理器的內(nèi)部結(jié)構(gòu)如圖1所示,和經(jīng)典的五級流水[6]不同的是,該處理器采用了四級流水,將五級流水的譯碼和執(zhí)行2個步驟合并成一步完成,可以同時處理4條指令的4個不同階段。處理器內(nèi)部含有多個功能部件,比如乘法部件、除法部件以及本文新增加的三角運算部件。三角運算部件能夠支持六種函數(shù)運算。
圖1 處理器內(nèi)部結(jié)構(gòu)
工程中的處理器采用32位的指令系統(tǒng),為了使擴展指令能夠很好地融入到處理器中,將擴展的指令定義成32位。每部分的具體功能見表1所列。
表1 指令定義格式
31~26 bit用于指示三角函數(shù)運算類型,25~21 bit指定源操作數(shù)的起始地址,20~16 bit指示本次需要計算操作數(shù)的個數(shù),15~11 bit指定運算結(jié)果的起始地址,10~0 bit表示功能碼。指令中指定源操作數(shù)的個數(shù)可以有效地降低處理器的取指譯碼環(huán)節(jié)的工作量,可以有效地提高處理器的工作效率。
擴展指令的名稱、功能以及對應(yīng)的操作碼見表2所列。
表2 指令功能描述
當(dāng)MIPS32處理器譯碼得到的指令在表2中,就會啟動功能部件計算三角函數(shù)值,若干拍之后,功能部件將運算的結(jié)果寫入到目的寄存器并且通知處理器。功能部件在運算期間,處理器可以處理其他的任務(wù)。
當(dāng)MIPS32處理器譯碼得到的是其他指令,則功能部件不進行運算,功能部件中的所有寄存器將維持之前的值。
擴展指令不能直接對外部存儲器進行訪問,僅支持寄存器尋址方式。待計算的角度值存儲在外部存儲器中,首先通過MIPS32處理器現(xiàn)有的訪存指令將待計算的值存在內(nèi)部通用寄存器中,然后使用擴展指令,功能部件運算的結(jié)果存儲在目的寄存器中。
數(shù)據(jù)運算部件讀取源寄存器中待測的角度值,并根據(jù)處理器傳輸過來的控制信號進行運算,計算完成后,將數(shù)據(jù)寫到目的寄存器中,供處理器讀取。
具體運算過程如圖2所示。
圖2中,輸入緩存單元用來存儲待計算的角度值,為數(shù)據(jù)運算部件提供數(shù)據(jù)輸入。因為CORDIC算法對待測的角度有范圍限制,只能計算第一象限和第四象限的值,所以需要對待計算的角度值進行預(yù)處理,如果待計算的角度不在第一象限或者第四象限,通過三角函數(shù)誘導(dǎo)公式,將該角度映射到第一象限進行計算,角度映射單元完成的是映射功能。配置寄存器的數(shù)據(jù)主要是用來控制迭代計算的次數(shù),由用戶輸入,用戶可以根據(jù)不同的需求設(shè)置不同的數(shù)據(jù),達到電路可定制化的需求。
圖2 功能部件運算流程
輸出緩存單元,用來將計算的結(jié)果暫存。計算結(jié)果暫存之前,需要根據(jù)誘導(dǎo)公式進行換算。具體操作如下:
則
(4)
z=z0-π,
則
(5)
數(shù)據(jù)運算部件最核心的地方在于迭代計算單元,迭代計算主要根據(jù)(1)式進行運算。具體的電路實現(xiàn)如圖3所示。
由(1)式可知,一次迭代需要計算3次加法。為了提升速度,圖3中硬件電路使用3個加法器同時工作,cmp單元是比較器,用以判斷當(dāng)前迭代的次數(shù)是否達到配置寄存器中的值。電路中還包含3個寄存器、2個移位寄存器以及1個只讀存儲器(ROM)。使用寄存器存儲每次迭代的結(jié)果,移位寄存器根據(jù)(1)式從寄存器中選擇特定的位數(shù)據(jù),將數(shù)據(jù)傳入到加法器中進行下一次的迭代計算。只讀存儲器ROM預(yù)先存儲每次迭代的角度值。
圖3 迭代運算單元的電路實現(xiàn)圖
運算部件工作的具體步驟如下:
(1) 處理器從存儲器中取出指令,譯碼得到擴展指令,從寄存器中取源操作數(shù)并傳輸給輸入緩存單元。同時,處理器發(fā)出控制信號,啟動運算部件。
(2) 源操作數(shù)進入Z寄存器,同時X寄存器和y寄存器賦值初始值。
(3) 迭代運算,X寄存器和Y寄存器的特定位進行加法運算,Y寄存器和X寄存器的特定位進行加法運算,Z寄存器與只讀存儲器ROM中的第1個數(shù)據(jù)進行加法運算。
(4) 將3個加法器運算的結(jié)果送回到對應(yīng)的寄存器。
(5) 當(dāng)?shù)螖?shù)不足時,轉(zhuǎn)步驟(3),否則,將運算結(jié)果寫入目的寄存器。
(6) 功能部件發(fā)出信號,通知處理器取數(shù)據(jù)。
為了驗證功能部件計算結(jié)果的準(zhǔn)確性,以正弦函數(shù)為例,在區(qū)間[0,2π]之間以0.000 3 rad為步長,取20 930個測試點,利用VCS2016工具進行仿真,將仿真的結(jié)果導(dǎo)出與Matlab軟件運算得到的標(biāo)準(zhǔn)值進行比較,統(tǒng)計的相對誤差如圖4所示。
從圖4可以看出,使用專用指令計算三角函數(shù)得到的結(jié)果,誤差的最大值不超過10-7,并且大部分?jǐn)?shù)據(jù)的誤差維持在10-8以下。為了更直觀地說明本文設(shè)計結(jié)構(gòu)的優(yōu)越性,本文將三角函數(shù)的運算結(jié)果與文獻[7]進行對比,可以看出本文設(shè)計計算的結(jié)果更加準(zhǔn)確,見表3所列。
圖4 正弦函數(shù)值相對誤差統(tǒng)計值
表3 本文結(jié)果與文獻[7]結(jié)果對比
運算單元的物理性能評估結(jié)果見表4所列。
表4 性能評估結(jié)果對比
從表4可以看出,文獻[8]中的設(shè)計最大工作頻率僅只有282 MHz,本文的系統(tǒng)頻率可達1 GHz約是文獻[8]的4倍,三角函數(shù)運算部件可以匹配頻率更高的處理器。本文設(shè)計需要462個寄存器,文獻[8]則需要1 993個寄存器,相比之下,寄存器個數(shù)節(jié)省了將近76%。本文設(shè)計的電路在不使用M9K的前提下消耗的查找表是文獻[8]使用1個M9K消耗查找表的2.5倍,總體而言,本文設(shè)計在資源節(jié)約方面具有很大的優(yōu)勢。
本文基于40 nm工藝MIPS32商用處理器架構(gòu),設(shè)計了三角函數(shù)功能部件,通過指令擴展的形式,使得處理器和功能部件很好地結(jié)合起來。功能部件的時鐘頻率高達1 GHz,能夠適配高頻率處理器。為了驗證部件運算結(jié)果的準(zhǔn)確性,將本文結(jié)果與Matlab軟件運算的結(jié)果進行對比,發(fā)現(xiàn)計算結(jié)果的精度不低于10-7。和已有的電路結(jié)構(gòu)進行比較,本文的設(shè)計具有頻率高、結(jié)果準(zhǔn)確、寄存器資源消耗少等優(yōu)勢。在數(shù)字信號的處理中,會涉及到大量的數(shù)學(xué)運算,進一步豐富本系統(tǒng)的指令集來滿足更多的數(shù)學(xué)運算將是以后的研究方向。