本發(fā)明屬于信號與信息處理
技術(shù)領(lǐng)域:
,具體的說是涉及一種用于fpga的三角脈動(dòng)陣列結(jié)構(gòu)qr分解裝置。
背景技術(shù):
:矩陣的三角化是當(dāng)矩陣為方陣時(shí)求解一般線性系統(tǒng)的所有直接方法的主要步驟,也是計(jì)算基于qr分解的最小二乘法和特征值求解中至關(guān)重要的一步,然而,矩陣三角化的計(jì)算代價(jià)很大,n×n矩陣三角化的計(jì)算復(fù)雜度為ο(n3),因此三角化已經(jīng)成為一些實(shí)時(shí)應(yīng)用的瓶頸。qr分解廣泛應(yīng)用于許多工程領(lǐng)域,旨在解決最小二乘問題,線性系統(tǒng)方程等實(shí)際應(yīng)用。近年來,三角脈動(dòng)陣列結(jié)構(gòu)普遍被運(yùn)用于三角矩陣r的求解的問題,這種陣列結(jié)構(gòu)尤其適用于基于givens正交旋轉(zhuǎn)法的矩陣三角化算法,但旋轉(zhuǎn)因子的計(jì)算涉及到除法和平方根等復(fù)雜運(yùn)算符,而這對fpga設(shè)計(jì)來說無疑是巨大的挑戰(zhàn)。目前比較流行的處理方法都是基于cordic算法的流水結(jié)構(gòu),這種實(shí)現(xiàn)方法硬件實(shí)現(xiàn)較為簡單,但處理周期長,流水級數(shù)普遍較深,在一定程度上限制了吞吐量。技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的在于,針對上述問題,提出一種規(guī)避了cordic算法實(shí)現(xiàn)過程中高處理周期的問題的qr分解裝置,主要通過降低平方根倒數(shù)模塊的處理周期,有效提升了包含該模塊的三角陣列在進(jìn)行矩陣qr分解時(shí)的吞吐量。本發(fā)明的技術(shù)方案為:一種用于fpga的三角脈動(dòng)陣列結(jié)構(gòu)qr分解裝置,用于對n×n的矩陣r進(jìn)行分解,其特征在于,包括邊界計(jì)算模塊和內(nèi)部計(jì)算模塊,所述邊界計(jì)算模塊位于三角陣列對角線上,內(nèi)部計(jì)算模塊位于三角陣列內(nèi)部;其中,在n時(shí)刻,第一個(gè)邊界計(jì)算模塊從外部接收到矩陣r的第一列的第一個(gè)向量x11(n),第一個(gè)邊界計(jì)算模塊根據(jù)自身存儲(chǔ)的數(shù)據(jù)r11(n-1)計(jì)算獲得givens旋轉(zhuǎn)因子c(n)和s(n)以及數(shù)據(jù)r11(n),根據(jù)獲得的數(shù)據(jù)r11(n)更新自身存儲(chǔ)的數(shù)據(jù),并將獲得的旋轉(zhuǎn)因子c(n)和s(n)傳遞到三角陣列中第一行第一個(gè)內(nèi)部計(jì)算模塊;在n+1時(shí)刻,第一行第一個(gè)內(nèi)部計(jì)算模塊從外部接收到矩陣r的第二列的第一個(gè)向量x12(n),并根據(jù)接收到的givens旋轉(zhuǎn)因子c(n)和s(n)以及自身存儲(chǔ)的上一時(shí)刻自身輸出值r12(n-1),計(jì)算獲得當(dāng)前時(shí)刻自身輸出值r12(n)和經(jīng)過線性變換后的x′12(n),根據(jù)獲得的r12(n)更新自身存儲(chǔ)的數(shù)據(jù),并將givens旋轉(zhuǎn)因子c(n)和s(n)傳遞到第一行第二個(gè)內(nèi)部計(jì)算模塊,同時(shí)將x′12(n)傳遞到與第一個(gè)內(nèi)部計(jì)算模塊相同列的第二個(gè)邊界計(jì)算模塊;與此同時(shí),第一個(gè)邊界計(jì)算模塊從外部接收到矩陣r的第一列的第二個(gè)向量x21(n),第一個(gè)邊界計(jì)算模塊根據(jù)自身存儲(chǔ)的數(shù)據(jù)r11(n)計(jì)算獲得givens旋轉(zhuǎn)因子c(n+1)和s(n+1)以及數(shù)據(jù)r11(n+1),根據(jù)獲得的數(shù)據(jù)r11(n+1)更新自身存儲(chǔ)的數(shù)據(jù),并將獲得的旋轉(zhuǎn)因子c(n+1)和s(n+1)傳遞到三角陣列中第一行第一個(gè)內(nèi)部計(jì)算模塊;在n+2時(shí)刻,第一行第二個(gè)內(nèi)部計(jì)算模塊從外部接收到矩陣r的第三列的第一個(gè)向量x13(n),并根據(jù)接收到的givens旋轉(zhuǎn)因子c和s以及自身存儲(chǔ)的上一時(shí)刻自身輸出值r13(n-1),計(jì)算獲得當(dāng)前時(shí)刻自身輸出值r13(n)和經(jīng)過線性變換后的x′13(n),根據(jù)獲得的r13(n)更新自身存儲(chǔ)的數(shù)據(jù),并將givens旋轉(zhuǎn)因子c和s傳遞到第一行第三個(gè)內(nèi)部計(jì)算模塊,同時(shí)將x′13(n)傳遞到與自身相同列的第二行第一個(gè)內(nèi)部計(jì)算模塊;與此同時(shí),第一行第一個(gè)內(nèi)部計(jì)算模塊從外部接收到矩陣r的第二列的第二個(gè)向量x22(n),并根據(jù)接收到的givens旋轉(zhuǎn)因子c(n+1)和s(n+1)以及自身存儲(chǔ)的上一時(shí)刻自身輸出值r12(n+1),計(jì)算獲得當(dāng)前時(shí)刻自身輸出值r12(n+2)和經(jīng)過線性變換后的x1′2(n+2),根據(jù)獲得的r12(n+2)更新自身存儲(chǔ)的數(shù)據(jù),并將givens旋轉(zhuǎn)因子c(n+1)和s(n+1)傳遞到第一行第二個(gè)內(nèi)部計(jì)算模塊,同時(shí)將x′12(n+2)傳遞到與第一個(gè)內(nèi)部計(jì)算模塊相同列的第二個(gè)邊界計(jì)算模塊;與此同時(shí),第一個(gè)邊界計(jì)算模塊從外部接收到矩陣r的第一列的第三個(gè)向量x31(n),第一個(gè)邊界計(jì)算模塊根據(jù)自身存儲(chǔ)的數(shù)據(jù)r11(n+1)計(jì)算獲得givens旋轉(zhuǎn)因子c(n+2)和s(n+2)以及數(shù)據(jù)r11(n+2),根據(jù)獲得的數(shù)據(jù)r11(n+2)更新自身存儲(chǔ)的數(shù)據(jù),并將獲得的旋轉(zhuǎn)因子c(n+2)和s(n+2)傳遞到三角陣列中第一行第一個(gè)內(nèi)部計(jì)算模塊;以此類推,在每一個(gè)時(shí)刻,第一個(gè)邊界計(jì)算模塊獲取一個(gè)矩陣r第一列中的一個(gè)數(shù)據(jù),根據(jù)自身存儲(chǔ)的上一個(gè)自身輸出的數(shù)據(jù)計(jì)算獲得givens旋轉(zhuǎn)因子c和s以及新的自身輸出數(shù)據(jù),更新自身存儲(chǔ)的數(shù)據(jù),并將givens旋轉(zhuǎn)因子c和s傳遞到相鄰的內(nèi)部計(jì)算模塊;第一行的內(nèi)部計(jì)算模塊根據(jù)獲得的givens旋轉(zhuǎn)因子c和s、矩陣r中的一個(gè)數(shù)據(jù)以及自身存儲(chǔ)的上一次輸出數(shù)據(jù),計(jì)算獲得新的自身輸出數(shù)據(jù)和將自身接收的數(shù)據(jù)線性變換,并將givens旋轉(zhuǎn)因子c和s傳遞到相鄰的同一行的內(nèi)部計(jì)算模塊,將線性變換后的自身接收的數(shù)據(jù)輸入到相鄰的同一列的內(nèi)部計(jì)算模塊或邊界計(jì)算模塊,設(shè)定每一個(gè)計(jì)算單元計(jì)算過程消耗一個(gè)時(shí)鐘周期,并設(shè)定各計(jì)算單元的內(nèi)部存儲(chǔ)的初始值為0,則qr分解裝置經(jīng)過n+n個(gè)時(shí)刻后完成對矩陣qr的分解,邊界單元和內(nèi)部單元內(nèi)所儲(chǔ)存的值即為所求的r矩陣中相對應(yīng)的非零值。值得注意的是,之前的描述假設(shè)邊界單元和內(nèi)部單元的處理的流水級數(shù)都為1,然而本發(fā)明中每個(gè)邊界單元和內(nèi)部單元都需要9個(gè)時(shí)鐘周期處理數(shù)據(jù)。所以x12需要延遲9個(gè)周期送入,x13需要延遲2×9個(gè)周期送入,以此類推,直到填滿流水線,矩陣數(shù)據(jù)就可以源源不斷的送入了。因此,在實(shí)際qr裝置中,經(jīng)過9(2n-1)+n個(gè)時(shí)鐘周期后,裝置完成對矩陣的qr分解,此時(shí)邊界單元rii和內(nèi)部單元rik的值即為所求的r上三角矩陣中對角線上和非對角線上的非零值。進(jìn)一步地,所述邊界計(jì)算模塊根據(jù)輸入數(shù)據(jù)計(jì)算獲得givens旋轉(zhuǎn)因子c(n)和s(n)以及輸出數(shù)據(jù)的具體方法為:采用如下公式1-3計(jì)算邊界計(jì)算模塊的輸出值rii(n)、旋轉(zhuǎn)因子c(n)和s(n):其中,rii(n-1)為邊界計(jì)算模塊中存儲(chǔ)的上次輸出數(shù)據(jù),xii(n)為邊界計(jì)算模塊接收的外部輸入數(shù)據(jù),下標(biāo)ii為qr分解裝置為中邊界計(jì)算模塊的行列編號,因邊界計(jì)算模塊位于三角陣列對角線上,其行列編號是相同的。進(jìn)一步的,所述內(nèi)部計(jì)算模塊根據(jù)輸入數(shù)據(jù)、givens旋轉(zhuǎn)因子c(n)和s(n)以及自身存儲(chǔ)數(shù)據(jù)計(jì)算輸出數(shù)據(jù)和線性化輸入數(shù)據(jù)的具體方法為:采用如下公式4計(jì)算輸出數(shù)據(jù):rik(n)=c(n)rik(n-1)+s*xik(n)(公式4)采用如下公式5線性化輸入數(shù)據(jù):x′ik(n)=-s(n)rik(n-1)+c(n)xik(n)(公式5)其中,rik(n-1)為內(nèi)部計(jì)算模塊自身存儲(chǔ)的數(shù)據(jù),xik為輸入內(nèi)部計(jì)算模塊的數(shù)據(jù),下標(biāo)ik為qr分解裝置為中內(nèi)部計(jì)算模塊的行列編號,因內(nèi)部計(jì)算模塊位于三角陣列內(nèi)部,同一行中具有k個(gè)不同的內(nèi)部計(jì)算模塊,每一行只有一個(gè)邊界計(jì)算模塊。進(jìn)一步的,所述邊界計(jì)算模塊由第一乘法器、第二乘法器、第三乘法器、第四乘法器、第五乘法器、第六乘法器、第一加法器、第二加法器、平方根倒數(shù)單元和存儲(chǔ)單元;其中,第一乘法器的兩個(gè)輸入端分別輸入輸入數(shù)據(jù)的實(shí)數(shù)部分,第二乘法器的兩個(gè)輸入端分別輸入輸入數(shù)據(jù)的虛數(shù)部分;第一加法器的兩個(gè)輸入端分別接第一乘法器的輸出端和第二乘法器的輸出端;第二加法器的一個(gè)輸入端接第一加法器的輸出端,第二加法器的另一個(gè)輸入端接其自身輸出端;平方根倒數(shù)單元的輸入端接第二加法器的輸出端,所述平方根倒數(shù)單元用于獲取輸入數(shù)據(jù)的平方根倒數(shù);第三乘法器的一個(gè)輸入端接平方根倒數(shù)單元的輸出端,第三乘法器的另一個(gè)輸入端接第二加法器的輸出端,第三乘法器輸出邊界計(jì)算模塊輸出數(shù)據(jù);第四乘法器的一個(gè)輸入端接平方根倒數(shù)單元的輸出端,第四乘法器的另一個(gè)輸入端接第三乘法器的輸出端,第四乘法器輸出旋轉(zhuǎn)因子c;第五乘法器的一個(gè)輸入端接平方根倒數(shù)單元的輸出端,第五乘法器的另一個(gè)輸入端輸入輸入數(shù)據(jù)的實(shí)數(shù)部分,第五乘法器輸出旋轉(zhuǎn)因子s的實(shí)數(shù)部分;第六乘法器的一個(gè)輸入端接平方根倒數(shù)單元的輸出端,第六乘法器的另一個(gè)輸入端輸入輸入數(shù)據(jù)的虛數(shù)部分,第六乘法器輸出旋轉(zhuǎn)因子s的虛數(shù)部分;第五乘法器和第六乘法器輸出的數(shù)據(jù)存入存儲(chǔ)單元。進(jìn)一步的,所述內(nèi)部計(jì)算單元包括輸出數(shù)據(jù)實(shí)數(shù)計(jì)算部分、輸出數(shù)據(jù)虛數(shù)計(jì)算部分和存儲(chǔ)單元;所述輸出數(shù)據(jù)實(shí)數(shù)計(jì)算部分包括第七乘法器、第八乘法器、第九乘法器、第三加法器和第四加法器;其中,第七乘法器的一個(gè)輸入端輸入旋轉(zhuǎn)因子c,另一個(gè)輸入端接第四加法器的輸出端;第八乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的實(shí)數(shù)部分,另一個(gè)輸入端接輸入數(shù)據(jù)的實(shí)數(shù)部分;第九乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的虛數(shù)部分,另一個(gè)輸入端接輸入數(shù)據(jù)的虛數(shù)部分;第三加法器的一個(gè)輸入端接第八乘法器的輸出端,第三加法器的另一個(gè)輸入端接第九乘法器的輸出端;第四加法器的一個(gè)輸入端接第三加法器的輸出端,第四加法器的另一個(gè)輸入端接第七乘法器的輸出端,第四加法器的輸出端輸出輸出數(shù)據(jù)的實(shí)數(shù)部分;所述輸出數(shù)據(jù)虛數(shù)計(jì)算部分包括第十乘法器、第十一乘法器、第十二乘法器、第五加法器和第六加法器;其中,第十乘法器的一個(gè)輸入端輸入旋轉(zhuǎn)因子c,另一個(gè)輸入端接第六加法器的輸出端;第十一乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的實(shí)數(shù)部分,另一個(gè)輸入端接輸入數(shù)據(jù)的虛數(shù)部分;第十二乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的虛數(shù)部分,另一個(gè)輸入端接輸入數(shù)據(jù)的實(shí)數(shù)部分;第五加法器的一個(gè)輸入端接第十一乘法器的輸出端,第五加法器的另一個(gè)輸入端接第十二乘法器的輸出端;第六加法器的一個(gè)輸入端接第五加法器的輸出端,第六加法器的另一個(gè)輸入端接第十乘法器的輸出端,第六加法器的輸出端輸出輸出數(shù)據(jù)的虛數(shù)部分;第四加法器和第六加法器的輸出數(shù)據(jù)存入存儲(chǔ)單元;所述內(nèi)部計(jì)算單元還包括線性化輸入數(shù)據(jù)實(shí)數(shù)計(jì)算部分和線性化輸入數(shù)據(jù)虛數(shù)計(jì)算部分;所述線性化輸入數(shù)據(jù)實(shí)數(shù)計(jì)算部分包括第十三乘法器、第十四乘法器、第十五乘法器、第七加法器和第八加法器;其中,第十三乘法器的一個(gè)輸入端輸入旋轉(zhuǎn)因子c,另一個(gè)輸入端接輸入數(shù)據(jù)的實(shí)數(shù)部分;第十四乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的實(shí)數(shù)部分,另一個(gè)輸入端接自身存儲(chǔ)數(shù)據(jù)的實(shí)數(shù)部分;第十五乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的虛數(shù)部分,另一個(gè)輸入端接自身存儲(chǔ)數(shù)據(jù)的虛數(shù)部分;第七加法器的一個(gè)輸入端接第十四乘法器的輸出端,第七加法器的另一個(gè)輸入端接第十五乘法器的輸出端;第八加法器的一個(gè)輸入端接第七加法器的輸出端,第八加法器的另一個(gè)輸入端接第十三乘法器的輸出端,第八加法器的輸出端輸出線性化輸入數(shù)據(jù)的實(shí)數(shù)部分;所述線性化輸入數(shù)據(jù)虛數(shù)計(jì)算部分包括第十六乘法器、第十七乘法器、第十八乘法器、第九加法器和第十加法器;其中,第十六乘法器的一個(gè)輸入端輸入旋轉(zhuǎn)因子c,另一個(gè)輸入端接輸入數(shù)據(jù)的虛數(shù)部分;第十七乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的實(shí)數(shù)部分,另一個(gè)輸入端接自身存儲(chǔ)數(shù)據(jù)的虛數(shù)部分;第十八乘法器的一個(gè)輸入端接旋轉(zhuǎn)因子s的虛數(shù)部分,另一個(gè)輸入端接自身存儲(chǔ)數(shù)據(jù)的實(shí)數(shù)部分;第九加法器的一個(gè)輸入端接第十七乘法器的輸出端,第九加法器的另一個(gè)輸入端接第十八乘法器的輸出端;第十加法器的一個(gè)輸入端接第九加法器的輸出端,第十加法器的另一個(gè)輸入端接第十六乘法器的輸出端,第十加法器的輸出端輸出線性化輸入數(shù)據(jù)的虛數(shù)部分。本發(fā)明的有益效果為,規(guī)避了cordic算法實(shí)現(xiàn)過程中高處理周期的問題,通過降低平方根倒數(shù)模塊的處理周期,有效提升了包含該模塊的三角陣列在進(jìn)行矩陣qr分解時(shí)的吞吐量。附圖說明圖1為4×4三角脈動(dòng)陣列結(jié)構(gòu)示意圖;圖2為邊界單元和內(nèi)部單元的運(yùn)算邏輯示意圖;圖3為邊界單元的邏輯結(jié)構(gòu)示意圖;圖4為平方根倒數(shù)單元的輸入數(shù)據(jù)格式示意圖;圖5為歸一化后的平方根倒數(shù)單元的輸入數(shù)據(jù)格式示意圖;圖6為平方根倒數(shù)單元的內(nèi)部結(jié)構(gòu)示意圖;圖7為內(nèi)部計(jì)算模塊中輸出數(shù)據(jù)計(jì)算部分邏輯結(jié)構(gòu)示意圖,(a)為輸出數(shù)據(jù)實(shí)數(shù)部分計(jì)算單元,(b)為輸出數(shù)據(jù)虛數(shù)部分計(jì)算單元;圖8為內(nèi)部計(jì)算模塊中線性化輸入數(shù)據(jù)計(jì)算部分邏輯結(jié)構(gòu)示意圖,(a)為線性化輸入數(shù)據(jù)實(shí)數(shù)部分計(jì)算單元,(b)為線性化輸入數(shù)據(jù)虛數(shù)部分計(jì)算單元。具體實(shí)施方式下面結(jié)合附圖和實(shí)例,詳細(xì)描述本發(fā)明的技術(shù)方案:如圖1所示,為一個(gè)4×4的三角陣列結(jié)構(gòu),以及矩陣元素的輸入順序。首先,假設(shè)每個(gè)計(jì)算單元消耗一個(gè)時(shí)鐘周期的時(shí)間,這意味著計(jì)算結(jié)果相對于輸入要延遲一個(gè)時(shí)鐘周期。輸入矩陣的行被當(dāng)作脈動(dòng)陣列的輸入從陣列的頂部輸入。當(dāng)在t1時(shí)刻邊界單元n11接收到數(shù)據(jù)x11后,n11便開始計(jì)算,它會(huì)根據(jù)x11和上一時(shí)刻的值r11(0)計(jì)算出c、s和r11(1),同時(shí),在t2時(shí)刻將c和s的值輸出到內(nèi)部單元n12。在t2時(shí)刻,n12節(jié)點(diǎn)接收到c、s和x12,它將計(jì)算出r12(2)和x′12,并在t3時(shí)刻分別將c、s和x′12輸出到內(nèi)部單元n13和邊界單元n12。在t3時(shí)刻,內(nèi)部單元n13接收到數(shù)據(jù)c、s和矩陣元素x13,經(jīng)過相同的內(nèi)部單元計(jì)算流程后n13節(jié)點(diǎn)將會(huì)計(jì)算得到r13(3)和x′13,并在t4時(shí)刻分別將c、s和x′13輸出到內(nèi)部單元n14和同列的內(nèi)部單元n23。在t4時(shí)刻,n14節(jié)點(diǎn)接收到來自同一行的c、s和矩陣同一列的x14,經(jīng)過一個(gè)時(shí)鐘周期的運(yùn)算,n14節(jié)點(diǎn)將會(huì)計(jì)算得到r14(4)和x′14。至此,從t1到t4時(shí)刻矩陣的第一行相關(guān)的計(jì)算完成。由于三角陣列是按照流水線的方式在工作,當(dāng)陣列第一行到第二行的第一個(gè)輸出數(shù)據(jù)x′12在t3時(shí)刻到達(dá)邊界單元n22時(shí),陣列第二行節(jié)點(diǎn)的計(jì)算工作正式開始。n22節(jié)點(diǎn)以n11節(jié)點(diǎn)同樣的方式計(jì)算得到旋轉(zhuǎn)因子c2和s2,并在t4時(shí)刻將其輸出到內(nèi)部單元n23。在t4時(shí)刻,n23接單接收到c2、s2和來自于n13節(jié)點(diǎn)的輸出x′13,計(jì)算得到r23(4)和x″13,并在t5時(shí)刻分別將c2、s2和x″13輸出到內(nèi)部單元n24和邊界單元n33。在t5時(shí)刻,n24節(jié)點(diǎn)接收到c2、s2和x′14,計(jì)算得到r24(5)和x″14,并在t6時(shí)刻將x″14傳遞到內(nèi)部單元n34。與第二行一樣,第三行從首次接收到來自第二行的x″13時(shí)的t5時(shí)刻開始正式的計(jì)算工作,n33節(jié)點(diǎn)在t6時(shí)刻輸出c3和s3到內(nèi)部單元n34,n34節(jié)點(diǎn)在t6時(shí)刻接收到c3、s3和n24節(jié)點(diǎn)的輸出x″14,計(jì)算得到r34(6)和x″′14,并在t7時(shí)刻將x″′14輸出到邊界單元n44。同樣地,在t7時(shí)刻,邊界單元n44第一次接收到來自n34節(jié)點(diǎn)的輸出有效值x″′14,并在t8時(shí)刻輸出計(jì)算得到的r44(7)。如圖2所示,是陣列結(jié)構(gòu)中邊界計(jì)算模塊和內(nèi)部計(jì)算模塊的簡單示意圖。圖中給出了不同計(jì)算單元的輸入和輸出,分別以rii(n-1)和rik(n-1)表示計(jì)算單元的原有值,并且圖中也給出了各計(jì)算單元的輸出公式。如圖3所示,邊界單元電路里除了包含有加法、乘法等基本運(yùn)算外,還包含有除法和平方根等復(fù)雜計(jì)算,而fpga本身并不適用于復(fù)雜運(yùn)算符的計(jì)算,在進(jìn)行加法和乘法運(yùn)算的時(shí)候相對于除法和平方根要容易得多。cordic算法硬件簡單,可以實(shí)現(xiàn)除法和平方根運(yùn)算,但cordic算法延時(shí)大,且精度不高。所以本發(fā)明提供的邊界計(jì)算模塊,只涉及到加法和乘法兩種基本運(yùn)算,而不用關(guān)心式中除法和平方根的計(jì)算問題,這種設(shè)計(jì)可以在一定程度上提高模塊的運(yùn)算性能。從定義的數(shù)據(jù)格式看,輸入數(shù)據(jù)x的實(shí)部和虛部均為32位寬度的有符號定點(diǎn)數(shù),最高位代表符號位,若是負(fù)數(shù)符號位為1,若是正數(shù),則符號位為0。中間9位代表整數(shù)部分,低22位代表小數(shù)部分,因此該32位定點(diǎn)數(shù)最大可以表示的十進(jìn)制數(shù)約為511.999999,可以表示的最小十進(jìn)制數(shù)為-512。取乘法器m1和m2輸出結(jié)果的20位整數(shù)和12位小數(shù)作為加法器a1的輸入,同時(shí)加法器a1和a2的輸出均取20位整數(shù)和12位小數(shù)。將r2輸入到下一個(gè)平方根倒數(shù)模塊inverse_sqrt,結(jié)果為1/r,顯然該值是為正,所以它的數(shù)據(jù)格式可以沒有符號位,它的小數(shù)位寬直接影響到了整個(gè)設(shè)計(jì)的精度,綜合考慮用23位無符號定點(diǎn)數(shù)表示,其中1位整數(shù)位,22位小數(shù)位。旋轉(zhuǎn)因子c和s的絕對值都小于1,c一定是正數(shù),s則正負(fù)數(shù)都有可能。c和s均用22位定點(diǎn)數(shù)表示,區(qū)別在于表示c的22位數(shù)全為小數(shù)位,表示s的22位數(shù)的最高位為符號位,剩下的21位為小數(shù)位,表1顯示了邊界單元內(nèi)部各計(jì)算模塊的功能和處理的字長:表1邊界單元內(nèi)部各計(jì)算模塊的功能和處理的字長模塊名功能處理字長乘法器m1x虛部的平方運(yùn)算32×32乘法器m2x的實(shí)部平方運(yùn)算32×32加法器a1x實(shí)部、虛部平方相加得到x的模的平方32加法器a2x模的平方與上一時(shí)刻的r2相加得到新的r232平方根倒數(shù)輸入r2,輸出1/r32乘法器m3根據(jù)r2和1/r計(jì)算r的值32×23乘法器m4根據(jù)r(n-1)和1/r計(jì)算c32×23乘法器m5根據(jù)1/r和x實(shí)部計(jì)算s的實(shí)部32×23乘法器m6根據(jù)1/r和x的虛部計(jì)算s的虛部32×23對于平方根倒數(shù)單元,若求傳統(tǒng)查找表的方法是將數(shù)據(jù)記錄在rom內(nèi),根據(jù)離散的地址值x查找到相應(yīng)的函數(shù)y值,但如果x的等分間距沒有足夠小,不同x值極有可能會(huì)落在同一等分范圍內(nèi),因此會(huì)查詢得到相同的y值,這對于單調(diào)遞減函數(shù)來說是不可能的,如若要使出現(xiàn)這種錯(cuò)誤的概率減小就要不斷縮小x的等分間距,但這樣會(huì)增加斜率截距對的個(gè)數(shù),從而使內(nèi)存的使用量會(huì)大幅度增加,因此在有限硬件資源的情況下這種方式不可取。查找近似法則恰恰解決了這個(gè)問題,這種方法將x劃分成等距區(qū)間,相鄰的兩個(gè)x對應(yīng)的函數(shù)值生成近似直線,儲(chǔ)存截距與斜率,這樣,即使數(shù)值很接近的x處于劃分范圍的同一區(qū)間,并且會(huì)查詢到相同的斜率截距對,但在帶入到直線解析式后,由于x的不同,得到的y值一定不相同。雖然查找近似法可以使近似值無限逼近真實(shí)值,且相對于直接查找法有明顯的優(yōu)勢,但在保證一定的精度前提下,還存在x點(diǎn)數(shù)劃分過多的問題,因此就需要更大的內(nèi)存來存儲(chǔ)斜率k和截距b,由此帶來巨大的存儲(chǔ)資源消耗。因此,需要研究在不影響精度的前提下,用更少的x點(diǎn)數(shù)(同樣代表近似線段的斜率和截距也會(huì)更少)實(shí)現(xiàn)查找近似法。若x的取值范圍相同,則采樣的距離越小,則精度越高,但同時(shí)采樣的點(diǎn)數(shù)也越多。若既要采樣的距離小,又要采樣的點(diǎn)數(shù)少,則只有縮小x的取值范圍。因此,查找近似法的改進(jìn)方向是對x的取值范圍進(jìn)行變換,使其處于一個(gè)較小的區(qū)間,但又不影響最后的結(jié)果輸出。下面介紹在查找近似法的基礎(chǔ)上對輸入的x進(jìn)行歸一化處理,歸一化處理過后的x的范圍將固定在[1,2),然后在[1,2)的范圍內(nèi)等間距地劃分,這樣即可以在一個(gè)較小的區(qū)間對x采樣,而需要的采樣點(diǎn)數(shù)又不會(huì)過大,這樣便可以較少的存儲(chǔ)資源來實(shí)現(xiàn)較高的精度。下面將從數(shù)學(xué)公式推導(dǎo)上證明該區(qū)間轉(zhuǎn)換能夠?qū)崿F(xiàn)既定目標(biāo)。將x乘以2-n,再乘以2n得到下式,該式與相同,其中n為正整數(shù),令x乘以2-n的結(jié)果為xnormalized,且在區(qū)間[1,2)上,化簡后為將上式中的乘數(shù)因子去掉,得到歸一化處理后的ynormalized,對x進(jìn)行歸一化處理后的值xnormalized的范圍已經(jīng)處于一個(gè)較小的區(qū)間,然后在[1,2)區(qū)間上進(jìn)行查找近似法需要的采樣點(diǎn)數(shù)明顯要比沒有改進(jìn)的查找近似法要少。反歸一化的計(jì)算則回歸到之前介紹的步驟,當(dāng)求出ynormalized的值后再乘以反歸一化因子2-n/2,即可得到y(tǒng)的實(shí)際值。硬件實(shí)現(xiàn)方法如下:歸一化和反歸一化處理時(shí)都需要參數(shù)n的值,數(shù)學(xué)方法上可以讓x不斷除以2,直到x處于區(qū)間[1,2)為止,2的個(gè)數(shù)即為n值。該方法在fpga上可以利用循環(huán)移位來實(shí)現(xiàn)。平方根倒數(shù)模塊的輸入r_sq為32位無符號定點(diǎn)數(shù),并且不可能為負(fù),圖4顯示了r_sq的數(shù)據(jù)格式。如圖4所示,r_sq數(shù)據(jù)格式中的msb(mostsignificantbit)為1,msb左邊均為0,r_sq的低12位為小數(shù)部分。歸一化即是將上圖中的小數(shù)點(diǎn)移動(dòng)到msb的右邊,移動(dòng)的位數(shù)記為n,記歸一化后的r_sq為rsq_normalized,則rsq_normalized的小數(shù)位寬為(12+n),整數(shù)部分的值為1。根據(jù)定點(diǎn)數(shù)到十進(jìn)制轉(zhuǎn)換規(guī)則,rsq_normalized的范圍為[1,2),當(dāng)且僅當(dāng)小數(shù)部分全為0時(shí)取1。在計(jì)算n的時(shí)候,將r_sq設(shè)定為有符號型變量signed_rsq,設(shè)置中間變量k的初始值為0,然后用while語句進(jìn)行循環(huán)判斷,判斷條件是signed_rsq>0,每循環(huán)一次,k的值加1,并將signed_rsq循環(huán)左移1位。循環(huán)結(jié)束后,msb位于最高位,如圖5所示,k表示循環(huán)移位的次數(shù),則n=19-k。查找近似法需要根據(jù)輸入的的值查找到對應(yīng)的斜率k和截距b,因此該查詢地址必然要根據(jù)x(即r_sq)求解。綜合考慮到x的范圍和對精度的要求,取圖3-8所示r_sq的數(shù)據(jù)格式中msb后12位作為查詢地址,該12位二進(jìn)制數(shù)據(jù)最大可以表示4096個(gè)地址,因此該地址可以查詢得到4096個(gè)斜率截距對,即可以把區(qū)間[1,2)等間距地劃分成4096個(gè)小區(qū)間,每個(gè)小區(qū)間對應(yīng)一個(gè)斜率截距對。r_sq歸一化處理后的rsq_normalized落在等分的哪一個(gè)小區(qū)間則查詢到該小區(qū)間對應(yīng)的斜率和截距,然后依據(jù)查詢到的斜率和截距計(jì)算rsq_normalized對應(yīng)的近似函數(shù)值,查詢地址取msb后12位。需要說明的是,如果輸入的兩個(gè)x的msb后12位相同,但從第13位開始不同,那么兩個(gè)不同的x具有相同的地址,因此查詢到的對應(yīng)斜率截距也相同,但因?yàn)閤值不同,所以經(jīng)過帶入直線解析式求得的曲線近似值也不相同。如圖6所示,為平方根倒數(shù)單元的內(nèi)部結(jié)構(gòu),normalization模塊實(shí)現(xiàn)了對輸入r_sq的歸一化處理,輸出distance和查詢地址。memory_k、memory_b、乘法器m_kx和加法器a1、a2實(shí)現(xiàn)了在區(qū)間[1,2)上的查找近似法,斜率k和截距b均為1位整數(shù),21位小數(shù)的有符號定點(diǎn)數(shù)。加法器a1和a2的輸入相同,輸出kx_b1和kx_b2也相同,在這里使用兩個(gè)相同的加法器是為了讓其中一個(gè)輸出到乘法器m_const與常數(shù)相乘,以實(shí)現(xiàn)反歸一化中的步驟。最后,select_and_shift模塊則根據(jù)輸入distance的奇偶性選擇輸出移位過后的port1或者port2,即res為1位整數(shù),22位小數(shù)。注意到輸入到乘法器m_kx中的r_sq并不是從normalization模塊輸出的r_sq_normalized,而是r_sq本身,這是因?yàn)樵谧龀朔ǖ臅r(shí)候,我們把r_sq當(dāng)作是已經(jīng)歸一化處理過的值,只需將r_sq的msb當(dāng)作整數(shù)位,msb的低位全當(dāng)作小數(shù)位即可。另外,truncate53to23模塊的作用是將乘法器m_kx的輸出截取成1位整數(shù)、22位小數(shù)的23位定點(diǎn)數(shù)kx_23,才能在與b相加時(shí)格式對齊。該結(jié)構(gòu)根據(jù)各模塊的特性,在各個(gè)模塊之間添加適當(dāng)?shù)难舆t單元,使整個(gè)數(shù)據(jù)流具有合理的流程,并通過適當(dāng)?shù)臄?shù)據(jù)截取使得數(shù)據(jù)流在各個(gè)模塊內(nèi)具有正確的格式,并且由圖6可知,平方根倒數(shù)模塊的處理時(shí)長為6個(gè)時(shí)鐘周期,在對整體頻率影響不大的前提下,盡量減小流水級數(shù)可以提升系統(tǒng)吞吐量。將式內(nèi)部單元rik計(jì)算公式按實(shí)部和虛部分開看,有rik的實(shí)部計(jì)算公式為:rik(n)_real=c·rik(n-1)_real+s_real·x_real+s_im·x_imrik的虛部計(jì)算公式為:rik(n)_im=c·rik(n-1)_im+(s_real·x_im-s_im·x_real)圖7顯示了rik實(shí)部虛部的實(shí)現(xiàn)結(jié)構(gòu)。將式傳遞值x′ik計(jì)算公式按實(shí)部和虛部分開看,有x′ik的實(shí)部計(jì)算公式x′ik(n)_real=c·xik(n)_real-s_real·rik(n-1)_real+s_im·rik(n-1)_imx′ik虛部計(jì)算公式為x′ik(n)_im=c·xik(n)_im-s_real·rik(n-1)_im-s_im·rik(n-1)_real圖8顯示了x′ik實(shí)部虛部的實(shí)現(xiàn)結(jié)構(gòu)。應(yīng)當(dāng)注意的是,rik的計(jì)算結(jié)果需要進(jìn)行一級寄存輸入到x′ik模塊的對應(yīng)輸入,因?yàn)閞ik所得到的結(jié)果為“當(dāng)前值”,而從x′ik的計(jì)算公式不難看出,送入乘法器的值應(yīng)當(dāng)是rik上一個(gè)時(shí)刻的值。當(dāng)前第1頁12