梁峰, 劉春銳, 李孝聰, 邱廣波, 張繼, 陳振嬌, 李薇敏, 曹琪, 雷紹充
(1.西安交通大學(xué)微電子學(xué)院, 710049, 西安; 2.中國電子科技集團(tuán)公司第五十八研究所, 214035, 江蘇無錫)
具有正弦余弦函數(shù)計(jì)算能力的集成電路已被廣泛應(yīng)用于各個(gè)領(lǐng)域。通用芯片CPU、GPU和DSP中也有專門進(jìn)行正弦余弦函數(shù)運(yùn)算的硬件單元,例如TI的TMX320系列DSP芯片,其上有一個(gè)硬件紋理映射單元(TMU),專門用于實(shí)現(xiàn)超越函數(shù)的快速計(jì)算。
傳統(tǒng)的正弦余弦函數(shù)的硬件實(shí)現(xiàn),主要采用坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算機(jī)(CORDIC)算法[1]。CORDIC算法的優(yōu)勢在于電路面積小,僅用移位寄存器和加法器/減法器就可以實(shí)現(xiàn)計(jì)算。但其缺點(diǎn)在于,它的收斂速度較慢,通常一輪迭代只能增加一個(gè)有效數(shù)字。對(duì)于單精度浮點(diǎn)運(yùn)算,CORDIC算法需要較多的時(shí)鐘周期才能使結(jié)果達(dá)到單精度浮點(diǎn)所要求的精度。基于此,有許多改進(jìn)的CORDIC算法如Para-CORDIC[2-3]、Hybrid CORDIC[4]、Scale-Free CORDIC[5-7]等,或者使用循環(huán)展開的方式在一個(gè)時(shí)鐘周期內(nèi)做多輪迭代[8-11]。這些方法在一定程度上縮短了CORDIC算法的延時(shí),但是仍滿足不了低延時(shí)計(jì)算的需求。
除CORDIC算法外,有些設(shè)計(jì)采用了多項(xiàng)式擬合法[12-13]、泰勒級(jí)數(shù)展開法[14-15]、冪級(jí)數(shù)展開法[16-17]等算法。這些算法收斂速度較快,但是需要大量的乘法運(yùn)算才能得到單精度浮點(diǎn)所需精度。
為了解決正弦余弦函數(shù)計(jì)算延時(shí)較大這一問題,本文提出了一種低延時(shí)的浮點(diǎn)正弦余弦函數(shù)硬件算法。該算法采用分段的思想將單精度浮點(diǎn)數(shù)輸入按照指數(shù)范圍的不同劃分為3個(gè)不同區(qū)域,在這3個(gè)不同區(qū)域內(nèi)分別采用不同的算法來保證計(jì)算的精度。同時(shí),保證整體硬件模塊在4個(gè)周期內(nèi)完成計(jì)算。
本文結(jié)構(gòu)主要分為算法、電路設(shè)計(jì)和實(shí)驗(yàn)結(jié)果3個(gè)部分。算法部分采用了3個(gè)算法,分別是泰勒0階近似法、泰勒1階近似法[18]和直接計(jì)算。由于泰勒0階近似和直接計(jì)算比較簡單,本文重點(diǎn)分析泰勒1階近似算法。相應(yīng)的,電路設(shè)計(jì)部分也將重點(diǎn)放在泰勒1階近似算法的實(shí)現(xiàn)上。在實(shí)驗(yàn)結(jié)果部分,本文使用verilog硬件描述語言實(shí)現(xiàn)了提出的算法和電路結(jié)構(gòu),完成了精度測試,并在聯(lián)電UMC 55nm的工藝和Altera Cyclone IV的平臺(tái)上進(jìn)行了邏輯綜合。結(jié)果表明,該浮點(diǎn)正弦余弦函數(shù)硬件算法的計(jì)算精度與標(biāo)準(zhǔn)C語言math庫單精度正弦余弦函數(shù)的計(jì)算精度相比,最多僅相差1個(gè)誤差單位(ulp),并且能夠在4個(gè)時(shí)鐘周期內(nèi)完成運(yùn)算,具有低延時(shí)的特點(diǎn)。
本節(jié)算法所述的正弦余弦函數(shù)的數(shù)學(xué)形式為sin(2πx)和cos(2πx)。如果要計(jì)算siny和cosy,可做變換y=2πx,將其轉(zhuǎn)換為sin(2πx)和cos(2πx)。在設(shè)計(jì)中使用sin(2πx)和cos(2πx)的形式,是因?yàn)樵谶@種形式下,可以容易地將運(yùn)算定點(diǎn)化,減少計(jì)算量,降低延時(shí)。
IEEE754標(biāo)準(zhǔn)所規(guī)定的一個(gè)規(guī)格化的單精度浮點(diǎn)數(shù)[19]x有32位,其中符號(hào)位為x[31];指數(shù)位有8位,從第31位到第23位,表示為x[30:23],它帶有127的偏階;尾數(shù)位有23位,從第22位到第0位,表示為x[22:0],它省略了一個(gè)隱含的整數(shù)位1。單精度浮點(diǎn)數(shù)x轉(zhuǎn)換為一個(gè)實(shí)數(shù)(-1)x[31](1+x[20:0]2-23)2x[30:23]-127。為了避免歧義,在上下文中用“指數(shù)”這一用語表示x[30:23]減去偏階127;用“尾數(shù)”表示{1′b1,x[22:0]},其中b代表二進(jìn)制,括號(hào)代表將其連接為23位二進(jìn)制數(shù)。
圖1 正弦函數(shù)分段示意圖Fig.1 Sine function segmentation diagram
對(duì)于正弦余弦函數(shù),根據(jù)其數(shù)學(xué)特性,將輸入按區(qū)間進(jìn)行分段計(jì)算,正弦函數(shù)分段如圖1所示。為了硬件容易實(shí)現(xiàn),可按輸入單精度浮點(diǎn)數(shù)的指數(shù)范圍進(jìn)行區(qū)間劃分。一方面,根據(jù)三角函數(shù)的性質(zhì),當(dāng)輸入單精度浮點(diǎn)數(shù)的指數(shù)大于等于22時(shí),該實(shí)數(shù)為(-1)x[31](1+x[22:0]2-23)2e,其中e為指數(shù),e≥22。此時(shí)該實(shí)數(shù)必然是整數(shù)或整數(shù)點(diǎn)五的形式(此時(shí)e=22且x[0]=1)。對(duì)cos(2πx)函數(shù),如果該實(shí)數(shù)為整數(shù),則結(jié)果為1.0;如果該實(shí)數(shù)為整數(shù)點(diǎn)五的形式,則結(jié)果為-1.0。對(duì)sin(2πx)函數(shù),無論該實(shí)數(shù)為哪種形式,結(jié)果均為0.0。由于指數(shù)大于等于22時(shí),計(jì)算非常簡單,因此在指數(shù)為22處進(jìn)行分段。另一方面,分析三角函數(shù)的數(shù)學(xué)性質(zhì)可知,當(dāng)輸入很小的時(shí)候有sin(2πx)≈2πx,cos(2πx)≈1.0,且輸入越小等號(hào)兩邊的值越接近。因此必然存在一個(gè)指數(shù)使得sin(2πx)與2πx的誤差以及cos(2πx)與1.0的誤差小于單精度浮點(diǎn)數(shù)所能表示的最小誤差。經(jīng)過計(jì)算得知,該指數(shù)為-16,因此在指數(shù)為-16處進(jìn)行分段。于是很自然的就將輸入的單精度浮點(diǎn)數(shù)按指數(shù)范圍劃分為[-126,-16]、[-15,21]和[22,126]3個(gè)區(qū)間。
為了節(jié)省電路面積,可以將正弦和余弦函數(shù)合并為一個(gè)函數(shù),此處定義了一個(gè)1位的指示信號(hào)cs,當(dāng)計(jì)算正弦函數(shù)時(shí)cs=0,當(dāng)計(jì)算余弦函數(shù)時(shí)cs=1。分段算法的步驟如偽代碼所示。
當(dāng)輸入的指數(shù)在[-15,21]之間時(shí),本文使用泰勒1階近似法進(jìn)行計(jì)算。在偽代碼中,用函數(shù)Taylor1(x,cs)表示在這個(gè)區(qū)間內(nèi)的計(jì)算方法。
偽代碼:分段算法步驟
輸入:單精度浮點(diǎn)數(shù)x,指示信號(hào)cs
輸出:單精度浮點(diǎn)數(shù)y=sin(2πx)或y=cos(2πx)
1: if (cs==0) then
2: if (x[30:23]≥149) theny=0.0;
3: else if (x[30:23]≤111) theny=2πx;
4: elsey=Taylor1(x,cs);endif
5: else
6: if (x[30:23]≥150) theny=1.0;
7: else if (x[30:23]==149) theny=
(-1.0)x[0];
8: else if (x[30:23]≤111) theny=1.0;
9: elsey=Taylor1(x,cs);endif
10: endif
泰勒1階近似法的主要步驟為:首先從輸入的浮點(diǎn)數(shù)中提取符號(hào)標(biāo)志位sx,誘導(dǎo)公式標(biāo)志位f1、f2,構(gòu)造一個(gè)定點(diǎn)數(shù)f。然后通過誘導(dǎo)公式[20]等一系列變換,將對(duì)浮點(diǎn)數(shù)x的正弦或余弦值的計(jì)算轉(zhuǎn)換為對(duì)定點(diǎn)數(shù)f的正弦值的計(jì)算,得到sin(2πx)或cos(2πx)的定點(diǎn)數(shù)結(jié)果z。最后將該定點(diǎn)數(shù)結(jié)果z轉(zhuǎn)換成浮點(diǎn)數(shù)格式。
將輸入的單精度浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)的一般方法的過程如圖2所示。
圖2 浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)的一般方法 Fig.2 General method of converting floating-point numbers to fixed-point numbers
在指數(shù)為[-15,21]的區(qū)間內(nèi),可將浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)。按一般方法,首先應(yīng)當(dāng)計(jì)算出浮點(diǎn)數(shù)x的指數(shù)e,并補(bǔ)全尾數(shù)w={1′b1,x[22:0]}。如果e>0,則應(yīng)該將尾數(shù)w的小數(shù)點(diǎn)右移e位;如果e<0,則應(yīng)該將尾數(shù)的小數(shù)點(diǎn)向左移|e|位。考慮到sin(2πx)和cos(2πx)的周期均為1,所以移位后的定點(diǎn)數(shù)的整數(shù)部分可以直接置0。
圖3 浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)的統(tǒng)一移位的方法Fig.3 Uniform shift method for converting floating-point numbers to fixed-point numbers
為了保證定點(diǎn)數(shù)的格式固定,考慮到整數(shù)部分必為0,規(guī)定使用1位做整數(shù)部分,小數(shù)點(diǎn)固定在整數(shù)部分的0后面。由于指數(shù)為-15的時(shí)候,小數(shù)部分位數(shù)最長,為23+|e|=38位,因此規(guī)定所有定點(diǎn)數(shù)都將小數(shù)部分?jǐn)U充到38位。該定點(diǎn)數(shù)記為F。
用統(tǒng)一移位的方法得到上述定點(diǎn)數(shù)F。具體操作為:計(jì)算移位數(shù)sr=x[30:23]—112,然后將尾數(shù)按m={16′h0001,x[22:0]}的方式補(bǔ)齊到39位,其中h代表該數(shù)為16進(jìn)制數(shù),最后將m左移sr位。圖3給出了浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)的統(tǒng)一移位的方法。
輸入的指數(shù)為-15時(shí),將x[22:0]前面補(bǔ)上16′h0001,變成m={16′h0001,x[22:0]},正好是所需的定點(diǎn)數(shù)格式。指數(shù)為其他值時(shí),只需計(jì)算它比-15大多少,就左移多少位。因此,統(tǒng)一移位的方法是正確的。下面給出一個(gè)具體的例子。
圖2和圖3所示為浮點(diǎn)數(shù)0x40880000轉(zhuǎn)換為定點(diǎn)數(shù)的過程。圖2所示為一般方法,先補(bǔ)全格式,然后按指數(shù)移位,整數(shù)部分置0,最后擴(kuò)充到39位。圖3所示為統(tǒng)一移位的方法??梢钥吹絻煞N方法所得的定點(diǎn)結(jié)果是一致的。
1.3使用誘導(dǎo)公式將正弦余弦函數(shù)的計(jì)算轉(zhuǎn)換為
[0,π/2)內(nèi)的定點(diǎn)正弦函數(shù)計(jì)算
考慮到正弦和余弦函數(shù)關(guān)于π的誘導(dǎo)式為
(1)
關(guān)于π/2的誘導(dǎo)式為
(2)
根據(jù)1.2節(jié)所述已將浮點(diǎn)數(shù)x轉(zhuǎn)換成了一個(gè)39位的定點(diǎn)數(shù)F。在該定點(diǎn)表示下,F[37]表示0.5所在位,F[36]表示0.25所在位,因此記f1=F[37],用于標(biāo)記該定點(diǎn)數(shù)F的正弦或余弦值的計(jì)算是否可以使用誘導(dǎo)式(1)化簡,同理記f2=F[36],表示是否可以使用誘導(dǎo)式(2)化簡。結(jié)合變量f1、f2、cs以及符號(hào)位s判斷需要使用的誘導(dǎo)式,就可以推導(dǎo)出最終符號(hào)位sy以及是否需要計(jì)算[0,π/2)內(nèi)余弦函數(shù)的指示信號(hào)c,見表1。
表1中sy列為符號(hào)指示位,當(dāng)化簡后出現(xiàn)負(fù)號(hào)時(shí),sy設(shè)置為1;c列為余弦計(jì)算指示位,當(dāng)化簡后需要計(jì)算余弦函數(shù)時(shí),c設(shè)置為1。
使用上述誘導(dǎo)公式之后,對(duì)定點(diǎn)數(shù)F的正弦或余弦函數(shù)值計(jì)算就轉(zhuǎn)換成了對(duì)F[35:0]的正弦或余弦計(jì)算,記f=F[35:0],其中F[35:0]表示定點(diǎn)數(shù)的第35位到第0位??紤]到0≤2π2-38f<π/2,因此sin(2π2-38f)或cos(2π2-38f)是取值在[0,π/2)內(nèi)的正弦或余弦函數(shù)。
再考慮在[0,π/2)內(nèi)的正弦和余弦有如下關(guān)系
cos(2πx)=sin(2π(0.25-x))
(3)
將x=2-38f代入式(3)可得下式
cos(2π2-38f)=sin(2π(0.25-2-38f))=
sin(2π2-38(236-f))
(4)
因此,所有[0,π/2)內(nèi)的余弦函數(shù)的計(jì)算都可以轉(zhuǎn)換為正弦函數(shù)的計(jì)算。236-f實(shí)際上就等于取f的補(bǔ)碼~f+1,其中~表示按位取反。此處有一個(gè)例外情況:如果f=0,那么取反加1后,位寬就會(huì)超出36位,導(dǎo)致后面無法計(jì)算。該例外情況可以單獨(dú)考慮:f=0和c=1時(shí),相當(dāng)于在求cos(0)=1.0,這個(gè)情況下,可直接輸出結(jié)果1.0。
表1 使用誘導(dǎo)公式化簡后的指示信號(hào)
1.4使用泰勒1階近似計(jì)算[0,π/2)內(nèi)的正弦函數(shù)
經(jīng)過1.3節(jié)的變換,需要計(jì)算定點(diǎn)數(shù)f的正弦函數(shù)值sin(2π2-38f)。為了快速計(jì)算該正弦函數(shù)值,這里使用了泰勒1階近似算法。它的核心思想是:將輸入定點(diǎn)數(shù)f按照前m位和后36-m位劃分為主要部分和次要部分[21],分別記作f3和f4,也即f3=f[35:36-m],f4=f[35-m:0],其中f[35:36-m]代表定點(diǎn)數(shù)f的第35位到第36-m位,f[35-m:0]代表定點(diǎn)數(shù)f的第35-m位到第0位。此時(shí)的f3和f4仍然是定點(diǎn)數(shù),f3對(duì)應(yīng)的實(shí)數(shù)為2-(m+2)f3,f4對(duì)應(yīng)的實(shí)數(shù)為2-38f4。
考慮任意函數(shù)g(x)的泰勒級(jí)數(shù)展開式,令它在x0=2-(m+2)f3處展開,表達(dá)式如下
(5)
令x=2-38f=2-(m+2)f3+2-38f4,代入級(jí)數(shù)得到
(6)
將g(x)=sin(2πx)代入式(6),保留n=0和n=1兩項(xiàng)可以得到
sin(2π2-38f)=
sin(2π2-(m+2)f3)+2πcos(2π2-(m+2)f3)2-38f4
(7)
式(7)即為所述泰勒1階近似算法。
為了加快計(jì)算速度,可以使用查找表計(jì)算sin(2π2-(m+2)f3)和2πcos(2π2-(m+2)f3)兩項(xiàng)。在圖4中,LutSin(f3)和LutCos(f3)表示這兩個(gè)查找表。這兩個(gè)查找表的值僅和f3有關(guān),若f3的位寬m取得越寬,則主要部分f3越接近定點(diǎn)數(shù)f的值,最終的結(jié)果也越精確。查找表的輸出形式是類似于浮點(diǎn)數(shù)的形式。以st,se=LutSin(f3)為例,st是一個(gè)k位的定點(diǎn)數(shù),它有1位的整數(shù)位和k-1位的小數(shù)位,se是8位的指數(shù)位。例如:取m=4,k=24,輸入f3=(1101)2=13時(shí),有sin(2π2-6×13)=(1.11101001111101000001011)2×2-1。因此,當(dāng)查找表LutSin(f3)的輸出st為k=24位的二進(jìn)制數(shù)111101001111101000001011時(shí),輸出se為-1。
使用高級(jí)語言按上述方法建模,計(jì)算得出,當(dāng)查找表參數(shù)取m=13和k=32時(shí)可以保證該泰勒1階近似算法的精度與標(biāo)準(zhǔn)C語言math庫單精度正弦余弦函數(shù)的計(jì)算精度相比,最多僅相差1 ulp。因此本算法中參數(shù)m=13和k=32固定不變。如果不需要高精度,可以減小查找表參數(shù)m和k以降低精度,同時(shí)減少查找表的大小。
當(dāng)取查找表參數(shù)m=13和k=32之后,為避免使用浮點(diǎn)乘法和浮點(diǎn)加法,需要將式(7)的計(jì)算轉(zhuǎn)換為整數(shù)運(yùn)算??紤]式(7),中間計(jì)算過程中最小的數(shù)出現(xiàn)在2πcos(2π2-(m+2)f3)2-38f4這一項(xiàng)上,它的最小值出現(xiàn)在f3為全1且f4=1的情況下。在查找表參數(shù)為m=13和k=32的情況下可計(jì)算出這一最小值為2πcos(2π2-15(213-1))2-38×1=(1.0011101111010011110011000111101)2×2-48=(10011101111010011110011000111101)2×2-79。這個(gè)數(shù)是本算法中間過程里可能出現(xiàn)的最小的數(shù),因此規(guī)定中間計(jì)算過程使用如下的80位定點(diǎn)數(shù)格式:整數(shù)部分使用1位來表示,小數(shù)部分使用79位來表示。
式(7)的計(jì)算過程如下:首先根據(jù)f3查表得到st,se=sin(2π2-15f3);ct,ce=2πcos(2π2-15f3)。令t1=st,計(jì)算t2=ctf4。然后計(jì)算移位數(shù)n1=se-31+79=se+48;n2=ce-31-38+79=ce+10。最后將t1和t2分別移位到規(guī)定的80位定點(diǎn)數(shù)格式,相加得到z。得到80位定點(diǎn)數(shù)結(jié)果的過程如圖4所示。
圖4 得到80位定點(diǎn)數(shù)結(jié)果的流程圖Fig.4 Flowchart for getting 80-bit fixed-point numbers
根據(jù)1.4節(jié)所述,z為定點(diǎn)數(shù)f的正弦函數(shù)值,它是一個(gè)80位的定點(diǎn)數(shù)。將z轉(zhuǎn)換為單精度浮點(diǎn)數(shù)的步驟如圖5所示。
圖5 80位定點(diǎn)數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)的流程圖Fig.5 Flowchart for converting 80-bit fixed-point numbers to floating-point numbers
將定點(diǎn)數(shù)z轉(zhuǎn)換為單精度浮點(diǎn)數(shù)最直接的方法是:計(jì)算z的前綴0個(gè)數(shù)(即高位第一個(gè)1前面的0的個(gè)數(shù))作為指數(shù),取高位第一個(gè)1后面的23位作為尾數(shù)。由于計(jì)算前綴0的個(gè)數(shù)與后面的運(yùn)算是串行的,會(huì)導(dǎo)致較大的延時(shí)。為減小這部分延時(shí),本文提出了一個(gè)方法,其核心思想是:對(duì)[0,π/2)內(nèi)的正弦函數(shù),其函數(shù)值和輸入是非常相近的,通常只會(huì)相差至多一個(gè)指數(shù)位,因此可以預(yù)先計(jì)算輸入的指數(shù),然后先行移位一次,再修正移位后的結(jié)果。
具體實(shí)現(xiàn)流程如圖5所示:首先計(jì)算f的前綴0的個(gè)數(shù)n,然后將z左移n位,移位后可以保證最高位是1或者次高位是1。如果最高位是1,則指數(shù)為-n;如果次高位是1,指數(shù)為-(n+1)。尾數(shù)取最高位或次高位的1后面的23位。使用該方法可以提前計(jì)算出移位數(shù)n,從而減小了延時(shí)。
該方法的正確性可以通過如下方程式證明。假設(shè)f的前綴0的個(gè)數(shù)為n,則235-n≤f<236-n,于是有sin(2π2-(n+3))≤sin(2π2-38f) 使用本文提出的方法將定點(diǎn)數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)后,再結(jié)合1.3節(jié)中所述的符號(hào)位sy,將它添加到相應(yīng)的位置上,就得到了Taylor1(x,cs)函數(shù)的計(jì)算結(jié)果。 圖6 浮點(diǎn)正弦余弦函數(shù)計(jì)算電路結(jié)構(gòu)Fig.6 Floating-point sine and cosine function calculation circuit structure 正弦余弦函數(shù)的電路實(shí)現(xiàn)通常有流水線式和迭代式兩種結(jié)構(gòu),本文采用流水線式結(jié)構(gòu)來進(jìn)行電路設(shè)計(jì)。 浮點(diǎn)正弦余弦函數(shù)計(jì)算電路的結(jié)構(gòu)如圖6所示,采用了4級(jí)流水線的方式。第1級(jí)實(shí)現(xiàn)了浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)的邏輯,第2級(jí)和第3級(jí)實(shí)現(xiàn)了[0,π/2)內(nèi)正弦函數(shù)值的計(jì)算,第4級(jí)實(shí)現(xiàn)了定點(diǎn)數(shù)結(jié)果轉(zhuǎn)換成浮點(diǎn)結(jié)果。 圖6僅顯示了硬件實(shí)現(xiàn)主要部分的數(shù)據(jù)通路。輸入指數(shù)范圍在[-126,-16],[22,126]這兩個(gè)區(qū)間時(shí),由于算法較簡單,圖6未給出其數(shù)據(jù)通路。另外,c=1并且f=0這一特殊情況的數(shù)據(jù)通路在圖中也未表示。 流水線第1級(jí)運(yùn)算過程的主要任務(wù)有3個(gè)。一是將輸入的浮點(diǎn)數(shù)x轉(zhuǎn)換為定點(diǎn)數(shù)f,它的實(shí)現(xiàn)方式為先計(jì)算移位數(shù)sr=x[30:23]-112,然后將補(bǔ)位后的尾數(shù)m={16′h0001,x[22:0]}左移sr位。二是產(chǎn)生符號(hào)指示位sy。符號(hào)指示位sy由輸入符號(hào)位sx、指示信號(hào)cs、誘導(dǎo)公式標(biāo)志位f1和f2共同得到。根據(jù)表1,可以得到邏輯表達(dá)式sy=f1?(cs&f2)?(~cs&sx)。三是產(chǎn)生余弦計(jì)算指示位c。根據(jù)表1,可得出其邏輯表達(dá)式為c=cs?f2。電路中使用了一個(gè)多路選擇器,根據(jù)c信號(hào)的取值選擇f或者f的補(bǔ)碼。 流水線第2級(jí)為[0,π/2)內(nèi)的正弦函數(shù)計(jì)算的查找表部分。查找表常用的實(shí)現(xiàn)方式有組合邏輯實(shí)現(xiàn)和RAM/ROM方式實(shí)現(xiàn)。這兩種方式各有優(yōu)缺點(diǎn)。組合邏輯實(shí)現(xiàn)的優(yōu)勢是查找表操作可在1個(gè)時(shí)鐘周期內(nèi)完成,無需特殊工藝,缺點(diǎn)是電路面積較大。RAM/ROM方式實(shí)現(xiàn)的優(yōu)勢為占用芯片面積小,缺點(diǎn)為需要特殊工藝。本設(shè)計(jì)使用了組合邏輯方式實(shí)現(xiàn)查找表。根據(jù)1.4節(jié)所述,查找表參數(shù)固定為m=13和k=32,因此查找表LutSin和LutCos的輸入為一個(gè)13位的整數(shù)f3,輸出是32位的整數(shù)st、ct和8位的指數(shù)se、ce。組合邏輯實(shí)現(xiàn)該查找表會(huì)占用一定的面積,并且延時(shí)較大,因此本設(shè)計(jì)單獨(dú)分配了一個(gè)時(shí)鐘周期用于查表。 流水線第3級(jí)為[0,π/2)內(nèi)正弦函數(shù)的計(jì)算部分,主要運(yùn)算為移位運(yùn)算和乘加運(yùn)算。首先使用查找表的指數(shù)信息se和ce計(jì)算移位數(shù)n1和n2,同時(shí)計(jì)算32b×23b的整數(shù)乘法運(yùn)算ctf4;然后將st和ctf4的結(jié)果分別移n1和n2位并相加,得到一個(gè)80位的定點(diǎn)數(shù)結(jié)果z。同時(shí)在這一個(gè)周期內(nèi)計(jì)算定點(diǎn)數(shù)f的前綴0的個(gè)數(shù)n,用于最后將定點(diǎn)結(jié)果轉(zhuǎn)換成浮點(diǎn)結(jié)果。 流水線第4級(jí)將定點(diǎn)結(jié)果z轉(zhuǎn)換成浮點(diǎn)結(jié)果,使用1.5節(jié)所述方法,首先將z左移n位變成sz,此時(shí)sz最高位為1,或者次高位為1。因此只需用二選一多路選擇器根據(jù)最高位sz[79]選取最高位或次高位的1后面的23位作為尾數(shù)m,并且選擇指數(shù)e為127-n或126-n。將尾數(shù)m、指數(shù)e和符號(hào)位sy按照單精度浮點(diǎn)數(shù)的格式拼在一起,即可得到單精度浮點(diǎn)輸出的結(jié)果。 按照第2節(jié)所述,使用verilog硬件描述語言實(shí)現(xiàn)了本文提出的高精度低延時(shí)浮點(diǎn)正弦余弦函數(shù)硬件算法,并和C語言math庫進(jìn)行了對(duì)比。本次測試的計(jì)算機(jī)平臺(tái)為Intel Core i5-7400 @3.00 GHz(4核)CPU,內(nèi)存24 GB,C編譯器采用gcc4.9.2。仿真平臺(tái)為windows下的Modelsim SE-64 10.4版本。測試方法為對(duì)所有的規(guī)格化浮點(diǎn)數(shù)進(jìn)行遍歷測試,將電路仿真值與C語言math庫結(jié)果進(jìn)行對(duì)比。 表2為正弦函數(shù)遍歷測試結(jié)果,表3為余弦函數(shù)遍歷測試結(jié)果。表中“范圍”一列為輸入指數(shù)范圍的區(qū)間,它與1.1節(jié)所述的劃分方法是一致的;完全一致占比表示仿真值與C語言math庫結(jié)果完全一致的個(gè)數(shù)占在該輸入指數(shù)范圍內(nèi)遍歷總數(shù)的百分比;誤差1 ulp占比表示仿真值與C語言math庫結(jié)果有1 ulp誤差的個(gè)數(shù)占在該輸入指數(shù)范圍內(nèi)遍歷總數(shù)的百分比。 表2 正弦函數(shù)遍歷測試結(jié)果 表3 余弦函數(shù)遍歷測試結(jié)果 遍歷結(jié)果顯示,對(duì)于正弦函數(shù),在輸入的指數(shù)范圍為[-126,-16]時(shí),結(jié)果存在1 ulp的誤差。這是由于在該區(qū)間內(nèi)使用了sin(2πx)=2πx公式,需要對(duì)輸入做乘法,而π是一個(gè)無理數(shù),將π定點(diǎn)化會(huì)產(chǎn)生截?cái)嗾`差,導(dǎo)致某些情況下它與參考結(jié)果相差1 ulp。對(duì)于輸入的指數(shù)范圍為[-15,21]之間時(shí),由于采用泰勒一階近似算法需要查找表,查找表也會(huì)產(chǎn)生截?cái)嗾`差,導(dǎo)致隨機(jī)的1 ulp誤差。在輸入指數(shù)為[22,126]之間時(shí),按數(shù)學(xué)理論結(jié)果為0,沒有進(jìn)行截?cái)?因此不存在誤差。 對(duì)于余弦函數(shù),在輸入的指數(shù)范圍為[-126,-16]和[22,126]之間時(shí),不存在1 ulp的誤差。這是因?yàn)樵谶@些區(qū)間上的余弦函數(shù)值都為1.0或者-1.0,沒有截?cái)嗖僮?因此不存在截?cái)嗾`差。對(duì)于輸入的指數(shù)范圍為[-15,21]時(shí),與正弦函數(shù)同理,由于采用的泰勒1階近似算法需要查找表,會(huì)產(chǎn)生截?cái)嗾`差,導(dǎo)致產(chǎn)生隨機(jī)的1 ulp誤差。 本文首先使用聯(lián)電UMC 55nm CMOS工藝庫,在SS工藝角、1.08 V、150 ℃、RVT條件下,按照250 MHz的時(shí)序約束,對(duì)電路進(jìn)行邏輯綜合。本文還在FPGA平臺(tái)上,使用Altera Cyclone IV的EP4CE115F29C7芯片,在Slow 1 200 mV 85 ℃ Model下進(jìn)行邏輯綜合實(shí)現(xiàn)。兩種平臺(tái)下正弦余弦函數(shù)電路性能如表4所示。 表4 正弦余弦函數(shù)電路性能 查找表(LUT)、邏輯片(Slice)、邏輯單元(LE)均為電路的基本組成單元。 本設(shè)計(jì)在UMC 55nm的SS工藝角下可達(dá)到250 MHz的時(shí)鐘頻率,完成一次正弦余弦函數(shù)運(yùn)算的延時(shí)僅為16ns,具有低延時(shí)的特點(diǎn)。本設(shè)計(jì)由于采用了大查找表和乘法器等單元,電路面積相對(duì)較大,為247 329 μm2。在Cyclone IV平臺(tái)上,本設(shè)計(jì)在最差工藝角下可達(dá)到64.02 MHz的時(shí)鐘頻率,完成一次浮點(diǎn)正弦余弦函數(shù)運(yùn)算延時(shí)為62.5 ns,占用了42 734個(gè)LUT。由于本設(shè)計(jì)采用組合邏輯實(shí)現(xiàn)大查找表,因此占用了大量LUT資源。 表5給出了本文設(shè)計(jì)與其他文獻(xiàn)中正弦余弦函數(shù)電路的性能對(duì)比。表中列出的正弦余弦函數(shù)電路的最大誤差均不超過1 ulp。在ASIC設(shè)計(jì)中,文獻(xiàn)[14]中采用TCORDIC算法實(shí)現(xiàn)了雙精度正弦余弦函數(shù),在40 nm CMOS的TT工藝角下,需要64個(gè)周期才能完成運(yùn)算,總延時(shí)38.4 ns。文獻(xiàn)[8]使用循環(huán)展開CORDIC算法實(shí)現(xiàn)了雙精度正弦余弦函數(shù),在TSMC65nm工藝下,需要15個(gè)周期完成運(yùn)算,總延時(shí)75 ns。文獻(xiàn)[20]中采用基于查找表的泰勒展開算法實(shí)現(xiàn)了單精度正弦余弦函數(shù),在VirtexII平臺(tái)下,總延時(shí)為85 ns。文獻(xiàn)[18]中采用基于查找表的泰勒展開算法實(shí)現(xiàn)了16位定點(diǎn)正弦余弦函數(shù),在StratixII平臺(tái)下,需要3個(gè)周期完成運(yùn)算,總延時(shí)31.3 ns。 表5 不同方案時(shí)電路延時(shí)、面積性能對(duì)比 本文提出了一種高精度低延時(shí)的浮點(diǎn)正弦余弦函數(shù)硬件實(shí)現(xiàn)算法。它將輸入按照指數(shù)劃分為3個(gè)不同的區(qū)域,在這3個(gè)區(qū)域內(nèi)分別采用了不同的算法,達(dá)到了單精度浮點(diǎn)運(yùn)算所要求的精度。本文著重說明了輸入指數(shù)在[-15,21]之間所用的泰勒1階近似算法,該算法通過一系列誘導(dǎo)公式,將原計(jì)算轉(zhuǎn)換為[0,π/2)內(nèi)的正弦函數(shù)計(jì)算,然后,將其進(jìn)一步轉(zhuǎn)換為硬件友好的查找表運(yùn)算和乘加運(yùn)算,從而實(shí)現(xiàn)了低延時(shí)。 在電路設(shè)計(jì)部分,本設(shè)計(jì)使用了四級(jí)流水線結(jié)構(gòu)。實(shí)驗(yàn)結(jié)果表明,該硬件電路的計(jì)算結(jié)果與C語言math庫的結(jié)果至多只相差1 ulp。在聯(lián)電UMC55nm的SS工藝角下,該電路能夠達(dá)到250 MHz的時(shí)鐘頻率,延時(shí)僅16 ns。在某些需要低延時(shí)的應(yīng)用場景中,本文提出的高精度低延時(shí)正弦余弦函數(shù)硬件算法具有重要使用價(jià)值。2 電路設(shè)計(jì)
2.1 總體電路結(jié)構(gòu)
2.2 各流水級(jí)的具體實(shí)現(xiàn)
3 實(shí)驗(yàn)結(jié)果
3.1 精度測試
3.2 電路性能
4 結(jié) 論