亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的方法及系統(tǒng)與流程

文檔序號(hào):12464492閱讀:725來源:國(guó)知局
一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的方法及系統(tǒng)與流程

本發(fā)明涉及FFT(Fast Fourier Transformation,快速傅氏變換)運(yùn)算方法,尤其涉及一種通過矢量處理器實(shí)現(xiàn)FFT運(yùn)算的方法。



背景技術(shù):

FFT運(yùn)算是通信系統(tǒng)中最基本的運(yùn)算。在有些處理器或DSP系統(tǒng)中,F(xiàn)FT運(yùn)算通過專用的硬件加速單元實(shí)現(xiàn),雖然這樣效率較高,但是由于增加了一個(gè)獨(dú)立的硬件加速單元,所以在芯片面積上并不占優(yōu)。由于矢量處理器具有多個(gè)標(biāo)量運(yùn)算單元,可以通過改進(jìn)實(shí)現(xiàn)矢量運(yùn)算,而FFT運(yùn)算也具有矢量運(yùn)算的特點(diǎn),所以通過矢量處理器也能夠進(jìn)行FFT運(yùn)算。那么通過矢量處理器如何高效的進(jìn)行FFT運(yùn)算就非常重要。

目前,通過矢量處理器實(shí)現(xiàn)FFT運(yùn)算的困難在于處理器或DSP架構(gòu),尤其是數(shù)字信號(hào)處理芯片中FFT蝶形運(yùn)算指令的設(shè)計(jì)。

本發(fā)明所公開的通過矢量處理器實(shí)現(xiàn)FFT的運(yùn)算方法,針對(duì)矢量處理器的特點(diǎn),自行定義了新的FFT蝶形運(yùn)算指令(DIT),通過將矢量處理器中的各個(gè)標(biāo)量乘累加運(yùn)算單元進(jìn)行新穎的互聯(lián),以實(shí)現(xiàn)FFT蝶形運(yùn)算。同時(shí),本發(fā)明還通過采用高效新穎的存儲(chǔ)器地址指針的更新模式,能夠快速的計(jì)算出FFT運(yùn)算的輸入和輸出數(shù)據(jù)地址。通過各個(gè)標(biāo)量乘累加單元運(yùn)算結(jié)果以及地址指針之間的相互配合,實(shí)現(xiàn)了高效的FFT運(yùn)算。本發(fā)明實(shí)現(xiàn)簡(jiǎn)單,可以廣泛應(yīng)用于各種通信類芯片中的可編程矢量處理器設(shè)計(jì)中。



技術(shù)實(shí)現(xiàn)要素:

為了解決現(xiàn)有技術(shù)存在的不足,本發(fā)明的目的在于提供一種通過矢量處理器實(shí)現(xiàn)FFT運(yùn)算的方法及系統(tǒng)。

首先,為實(shí)現(xiàn)上述目的,提出一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的系統(tǒng),包括順序串聯(lián)的指令存儲(chǔ)器、取址單元、譯碼單元和執(zhí)行單元,其特征在于,所述執(zhí)行單元包括矢量寄存器單元、數(shù)據(jù)交換網(wǎng)絡(luò)、矢量運(yùn)算單元、數(shù)據(jù)存儲(chǔ)單元、地址產(chǎn)生單元和數(shù)據(jù)存儲(chǔ)器,所述的矢量寄存器單元、數(shù)據(jù)交換網(wǎng)絡(luò)和矢量運(yùn)算單元依次串聯(lián)形成環(huán)形結(jié)構(gòu),所述矢量寄存器單元的輸出端同時(shí)連接數(shù)據(jù)交換網(wǎng)絡(luò)的輸入端與數(shù)據(jù)存儲(chǔ)單元的輸入端,矢量寄存器單元的第一輸入端連接矢量運(yùn)算單元的輸出端,矢量寄存器單元的第二輸入端連接數(shù)據(jù)存儲(chǔ)單元第一輸出端,數(shù)據(jù)存儲(chǔ)單元的第二輸出端與數(shù)據(jù)存儲(chǔ)器的輸入端雙向交互連接,數(shù)據(jù)存儲(chǔ)器的另一輸入端連接地址產(chǎn)生單元;

所述順序串聯(lián)的指令存儲(chǔ)器、取址單元和譯碼單元用以產(chǎn)生指令譯碼控制信號(hào),控制執(zhí)行單元;

所述矢量寄存器單元用以暫存數(shù)據(jù)存儲(chǔ)單元讀取的即將進(jìn)行FFT蝶形運(yùn)算的數(shù)據(jù),以及矢量運(yùn)算單元輸出的由FFT蝶形運(yùn)算產(chǎn)生的數(shù)據(jù);

所述數(shù)據(jù)交換網(wǎng)絡(luò)用以對(duì)即將進(jìn)行FFT蝶形運(yùn)算的旋轉(zhuǎn)因子以及蝶形運(yùn)算的兩個(gè)數(shù)據(jù)的實(shí)部與虛部按照矢量運(yùn)算單元的要求進(jìn)行交換,并將交換得到3個(gè)矢量數(shù)據(jù)輸出至矢量運(yùn)算單元的對(duì)應(yīng)接口;

所述矢量運(yùn)算單元中設(shè)有4個(gè)并行的乘累加單元,用于完成FFT運(yùn)算中的各級(jí)蝶形運(yùn)算;

所述地址產(chǎn)生單元用以產(chǎn)生每一級(jí)FFT蝶形運(yùn)算中輸入數(shù)據(jù)、輸出數(shù)據(jù)以及旋轉(zhuǎn)因子的地址;

所述數(shù)據(jù)存儲(chǔ)單元用以根據(jù)地址產(chǎn)生單元產(chǎn)生的地址,將數(shù)據(jù)存儲(chǔ)器內(nèi)的數(shù)據(jù)讀取至矢量寄存器單元,或根據(jù)地址產(chǎn)生單元產(chǎn)生的地址,將矢量寄存器單元輸出的數(shù)據(jù)寫入數(shù)據(jù)存儲(chǔ)器;

所述數(shù)據(jù)存儲(chǔ)器用以存儲(chǔ)需要進(jìn)行FFT蝶形運(yùn)算的數(shù)據(jù),以及FFT蝶形運(yùn)算產(chǎn)生的數(shù)據(jù)。

進(jìn)一步的,本發(fā)明系統(tǒng)中,所述的矢量運(yùn)算單元中包括4個(gè)并行的乘累加單元,每個(gè)乘累加單元由順序串聯(lián)的乘法器、取反器和加法器構(gòu)成;第一乘累加單元中的乘法器輸出端通過取反器后連接至第三乘累加單元中的加法器輸入端,第二乘累加單元中的乘法器輸出端通過取反器后連接至第四乘累加單元中的加法器輸入端,第三乘累加單元中的乘法器輸出端通過取反器后連接至第一乘累加單元中的加法器輸入端,第四乘累加單元中的乘法器輸出端連接第二乘累加單元中的加法器輸入端。

進(jìn)一步的,本發(fā)明系統(tǒng)中,所述的數(shù)據(jù)交換網(wǎng)絡(luò)用以對(duì)即將進(jìn)行FFT蝶形運(yùn)算的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)}的實(shí)部與虛部按照矢量運(yùn)算單元的要求進(jìn)行交換,得到3個(gè)矢量數(shù)據(jù):加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}、第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}和第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)},所述三個(gè)矢量數(shù)據(jù)的結(jié)構(gòu)為{元素3, 元素2, 元素1,元素0},交換網(wǎng)絡(luò)(101)的輸出端用以將加法矢量數(shù)據(jù)的元素0至元素3依次送至第一至第四乘累加單元的加法器數(shù)據(jù)接口,將第一乘法矢量數(shù)據(jù)的元素0至元素3依次送至第一至第四乘累加單元的乘法器的第一數(shù)據(jù)接口,將第二乘法矢量數(shù)據(jù)的元素0至元素3依次送至第一至第四乘累加單元的乘法器的第二數(shù)據(jù)接口。

進(jìn)一步的,本發(fā)明系統(tǒng)中,所述的矢量寄存器單元由8個(gè)一級(jí)矢量寄存器組成,每個(gè)一級(jí)矢量寄存器分別由2個(gè)二級(jí)寄存器組成,每個(gè)二級(jí)寄存器分別由2個(gè)三級(jí)寄存器組成。針對(duì)32位FFT運(yùn)算,所述的三級(jí)寄存器為16bit,所述的二級(jí)寄存器為32bit,所述的一級(jí)矢量寄存器為64bit。

其次,為實(shí)現(xiàn)上述目的,還提出一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的數(shù)據(jù)交換方法,其特征在于,數(shù)據(jù)交換步驟如下:

第1步,根據(jù)數(shù)據(jù)讀取指令讀入存儲(chǔ)器地址指針?biāo)鶎?duì)應(yīng)的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}和蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)};

第2步,通過數(shù)據(jù)交換網(wǎng)絡(luò)將讀入的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)}按照加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}、第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}和第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)}的形式進(jìn)行矢量數(shù)據(jù)交換;其中,每個(gè)矢量數(shù)據(jù)均依次由{元素3, 元素2, 元素1,元素0}四個(gè)元素組成;

第3步,向矢量運(yùn)算單元的四個(gè)加法數(shù)據(jù)接口依次輸出加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}中的四個(gè)元素,向矢量運(yùn)算單元的四個(gè)第一數(shù)據(jù)接口依次輸出第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}中的四個(gè)元素,向矢量運(yùn)算單元的四個(gè)第二數(shù)據(jù)接口依次輸出第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)}中的四個(gè)元素。

同時(shí),為實(shí)現(xiàn)上述目的,經(jīng)過上述方法完成數(shù)據(jù)交換后的數(shù)據(jù)需要按照如下的矢量運(yùn)算單元實(shí)現(xiàn)蝶形運(yùn)算的方法完成蝶形運(yùn)算,其具體步驟為:

第一步,在矢量運(yùn)算單元的四個(gè)乘累加單元中分別將第一乘法矢量數(shù)據(jù)中的第一至第四個(gè)元素和第二乘法矢量數(shù)據(jù)中的第一至第四個(gè)元素分別進(jìn)行乘法運(yùn)算,分別得到第一乘法器結(jié)果R(x2)*R(w),第二乘法器結(jié)果R(x2)*I(w),第三乘法器結(jié)果I(x2)*I(w)和第四乘法器結(jié)果I(x2)*R(w);

第二步,將加法矢量數(shù)據(jù)中的第一至第四個(gè)元素按順序分別輸入4個(gè)加法器,與第一至第四乘法器結(jié)果進(jìn)行加法運(yùn)算,分別得到第一乘累加運(yùn)算結(jié)果R(x1+x2×w)= R(x1)+R(x2)*R(w)- I(x2)*I(w);第二乘累加運(yùn)算結(jié)果I(x1+x2×w)= I(x1)+R(x2)*I(w)+ I(x2)*R(w);第三乘累加運(yùn)算結(jié)果R(x1-x2×w)= R(x1)+I(x2)*I(w)- R(x2)*R(w);以及第四乘累加運(yùn)算結(jié)果I(x1-x2×w)= I(x1)+I(x2)*R(w)- R(x2)*I(w);

第三步,輸出四個(gè)乘累加運(yùn)算結(jié)果。

為完成整個(gè)FFT運(yùn)算一共需要進(jìn)行的FFT蝶形運(yùn)算的次數(shù)按照如下公式:

。

根據(jù)公式計(jì)算出需要進(jìn)行多少次上述的蝶形運(yùn)算,并通過軟件編程控制循環(huán)次數(shù)實(shí)現(xiàn)。全部蝶形運(yùn)算完成之后,表示整個(gè)FFT運(yùn)算完成。每一次數(shù)據(jù)交換,完成FFT蝶形運(yùn)算后還需要配合存儲(chǔ)器地址指針的更新,使存儲(chǔ)器地址指針分別指向下一個(gè)蝶形運(yùn)算的三個(gè)數(shù)據(jù)的地址:旋轉(zhuǎn)因子{I’(w),R’(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I’(x1),R’(x1)}和蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I’(x2),R’(x2)}的地址,然后按照上述步驟繼續(xù)進(jìn)行下一個(gè)蝶形運(yùn)算,直至完成整個(gè)FFT運(yùn)算。

同時(shí),為了配合上述數(shù)據(jù)交換與蝶形運(yùn)算的方法,本發(fā)明同時(shí)提供一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的地址生成方法,所述地址生成方法包括并行的輸入數(shù)據(jù)地址生成步驟、輸出數(shù)據(jù)地址生成步驟和旋轉(zhuǎn)因子地址生成步驟。在每完成一次蝶形運(yùn)算后,同時(shí)對(duì)輸入數(shù)據(jù)地址、輸出數(shù)據(jù)地址和旋轉(zhuǎn)因子地址進(jìn)行更新,蛇女成新的地址。其中,輸入數(shù)據(jù)地址和輸出數(shù)據(jù)地址根據(jù)所處FFT蝶形運(yùn)算的級(jí)數(shù)不同按照如下方式生成:

在第一級(jí)FFT蝶形運(yùn)算中,輸入數(shù)據(jù)的地址從0開始,按照reverse模式進(jìn)行更新,即由高位向低位每次進(jìn)1的方式進(jìn)行自增;reverse模式下地址更新方式為(dpx.addr & (0xfffe<<fft_stage)) | (reverse(dpx.addr[0:15]+(0x8000>>fft_stage)) & ~(0xfffe<<fft_stage));其中,0xfffe為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算,“reverse”為按位顛倒運(yùn)算,0x8000為常數(shù),“>>”為右移運(yùn)算,“+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算;在第一級(jí)FFT蝶形運(yùn)算中,輸出數(shù)據(jù)的地址按照從0到7的順序產(chǎn)生;

在第二級(jí)以及以后各級(jí)的FFT蝶形運(yùn)算中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址均從0開始,按照一次keep模式、一次nbf模式交替的方式產(chǎn)生;keep模式下地址保持不變,nbf模式下地址更新的方式為((dpx.addr+dpx.offset) +1)&(~dpx.offset),其中,dpx.offset為地址指針偏移,dpx.addr為地址指針,“~”為按位取反運(yùn)算,“+”為加法運(yùn)算,“&”為按位與運(yùn)算;第二級(jí)蝶形運(yùn)算開始dpx.offset的初值設(shè)置為2,之后每完成一級(jí)蝶形運(yùn)算,dpx.offset的取值都需要乘以2后再進(jìn)行下一級(jí)FFT蝶形運(yùn)算;

所述旋轉(zhuǎn)因子地址按照如下方式生成:

每一級(jí)FFT蝶形運(yùn)算中,旋轉(zhuǎn)因子的讀取地址按照twf模式進(jìn)行更新,twf模式下地址變換方式為(dpx.addr& (0xffff<<fft_stage)) | ((dpx.addr+dpx.offset) & ~(0xffff<<fft_stage)));其中,0xffff為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算,“+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算;第一級(jí)FFT運(yùn)算中旋轉(zhuǎn)因子對(duì)應(yīng)的存儲(chǔ)器地址指針的偏移值為,其中,fft_stage為FFT運(yùn)算的級(jí)數(shù),在每次進(jìn)入下一級(jí)運(yùn)算前,偏移值需要除以2;

每進(jìn)行一級(jí)FFT運(yùn)算蝶形運(yùn)算后,地址產(chǎn)生單元(103)均按照上述方法分別產(chǎn)生新一級(jí)FFT運(yùn)算蝶形運(yùn)算的輸入數(shù)據(jù)地址、輸出數(shù)據(jù)地址和旋轉(zhuǎn)因子地址,并輸出。

FFT運(yùn)算由多級(jí)蝶形運(yùn)算構(gòu)成,前一級(jí)蝶形運(yùn)算的結(jié)果作為下一級(jí)運(yùn)算的輸入,而每一級(jí)運(yùn)算中又分別存在若干相互獨(dú)立的蝶形運(yùn)算。每個(gè)蝶形運(yùn)算中,輸入數(shù)據(jù)依次為蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}和蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)};輸出數(shù)據(jù)依次為蝶形運(yùn)算的第一個(gè)結(jié)果{I(x1-x2×w),R(x1-x2×w)}和蝶形運(yùn)算的第二個(gè)結(jié)果{I(x1+x2×w),R(x1+x2×w)}。

有益效果

本發(fā)明針對(duì)矢量處理器,通過改進(jìn)芯片架構(gòu),對(duì)現(xiàn)有矢量處理器中并行的4個(gè)乘累加單元進(jìn)行交叉互聯(lián)。同時(shí)配合重新設(shè)計(jì)的FFT蝶形運(yùn)算指令,以及根據(jù)FFT各級(jí)蝶形運(yùn)算數(shù)據(jù)而重新設(shè)計(jì)的存儲(chǔ)器地址指針的更新方法,利用現(xiàn)有的矢量處理器實(shí)現(xiàn)FFT運(yùn)算。通過矢量處理器實(shí)現(xiàn)FFT運(yùn)算,可以在保證運(yùn)算準(zhǔn)確性與效率的同時(shí),節(jié)省芯片面積,可以適用于各類通信類芯片中的可編程矢量處理器。

進(jìn)一步的,為了增加本發(fā)明描述的方法和系統(tǒng)在處理蝶形運(yùn)算時(shí)的正確率以及效率,本發(fā)明中同時(shí)設(shè)置了多個(gè)存儲(chǔ)器地址指針,并為每個(gè)存儲(chǔ)器地址指針設(shè)置了獨(dú)立的模式寄存器,通過配置對(duì)應(yīng)的存儲(chǔ)器地址指針模式寄存器,可對(duì)FFT運(yùn)算過程中輸入和輸出數(shù)據(jù)的地址變換進(jìn)行設(shè)定。在每次存儲(chǔ)器讀取指令(ld32)和存儲(chǔ)器存儲(chǔ)指令(st32)執(zhí)行之后,對(duì)應(yīng)的地址指針變會(huì)根據(jù)所設(shè)定的模式進(jìn)行變換,直接查找到下一個(gè)蝶形運(yùn)算所需要的輸入數(shù)據(jù),并確定下一個(gè)蝶形運(yùn)算輸出數(shù)據(jù)的存儲(chǔ)位置。由于這些指針的更新方式都是針對(duì)FFT蝶形運(yùn)算而特別設(shè)計(jì)的,可以直接查找到相應(yīng)的數(shù)據(jù),從而大大提高了系統(tǒng)的運(yùn)算能力。

本方案設(shè)定了特殊指令完成了最基本的蝶形運(yùn)算,以及每一級(jí)FFT運(yùn)算中需要的地址變換。根據(jù)本發(fā)明所述的方法,通過軟件編程的方式設(shè)定地址變換模式并調(diào)用蝶形運(yùn)算指令,在對(duì)應(yīng)地增加標(biāo)量乘累加單元,并配合根據(jù)FFT點(diǎn)數(shù)而設(shè)計(jì)的矢量寄存器單元后,即可以實(shí)現(xiàn)更高點(diǎn)數(shù)的FFT運(yùn)算。

本發(fā)明的其它特征和優(yōu)點(diǎn)將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實(shí)施本發(fā)明而了解。

附圖說明

附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說明書的一部分,并與本發(fā)明的實(shí)施例一起,用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:

圖1為本發(fā)明所述矢量處理器實(shí)現(xiàn)FFT運(yùn)算的系統(tǒng)架構(gòu)框圖;

圖2為本發(fā)明中矢量寄存器單元的結(jié)構(gòu)框圖;

圖3為本發(fā)明中矢量寄存器單元中復(fù)數(shù)數(shù)據(jù)存放方式的示意圖;

圖4為蝶形運(yùn)算示意圖;

圖5為本發(fā)明中矢量運(yùn)算單元的結(jié)構(gòu)框圖;

圖6為8點(diǎn)FFT運(yùn)算流程圖;

圖7為8點(diǎn)FFT運(yùn)算中第一級(jí)輸入數(shù)據(jù)地址更新方式的示意圖;

圖8為8點(diǎn)FFT運(yùn)算中第二級(jí)輸入數(shù)據(jù)地址更新方式的示意圖;

圖9為8點(diǎn)FFT運(yùn)算中第三級(jí)輸入數(shù)據(jù)地址更新方式的示意圖;

圖10為8點(diǎn)FFT運(yùn)算中旋轉(zhuǎn)因子地址更新方式的示意圖。

具體實(shí)施方式

以下結(jié)合附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實(shí)施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。

實(shí)施例1

本實(shí)施例為本發(fā)明所述矢量處理器實(shí)現(xiàn)FFT運(yùn)算的系統(tǒng)的具體實(shí)現(xiàn)方式。

圖1為本實(shí)施例所述的矢量處理器實(shí)現(xiàn)FFT運(yùn)算的系統(tǒng)架構(gòu)圖。該系統(tǒng)包括順序串聯(lián)的指令存儲(chǔ)器106、取址單元107、譯碼單元108和執(zhí)行單元109,其特征在于,執(zhí)行單元109包括矢量寄存器單元100、數(shù)據(jù)交換網(wǎng)絡(luò)101、矢量運(yùn)算單元102、數(shù)據(jù)存儲(chǔ)單元104、地址產(chǎn)生單元103和數(shù)據(jù)存儲(chǔ)器105,所述的矢量寄存器單元100、數(shù)據(jù)交換網(wǎng)絡(luò)101和矢量運(yùn)算單元102順序串聯(lián)形成環(huán)形結(jié)構(gòu),所述矢量寄存器單元100的輸出端同時(shí)連接數(shù)據(jù)交換網(wǎng)絡(luò)101的輸入端與數(shù)據(jù)存儲(chǔ)單元104的輸入端,矢量寄存器單元100的第一輸入端連接矢量運(yùn)算單元102的輸出端,矢量寄存器單元100的第二輸入端連接數(shù)據(jù)存儲(chǔ)單元104第一輸出端,數(shù)據(jù)存儲(chǔ)單元104的第二輸出端與數(shù)據(jù)存儲(chǔ)器105的輸入端雙向交互連接,數(shù)據(jù)存儲(chǔ)器105的另一輸入端連接地址產(chǎn)生單元103;

所述順序串聯(lián)的指令存儲(chǔ)器106、取址單元107和譯碼單元108用以產(chǎn)生指令譯碼控制信號(hào),控制執(zhí)行單元109。

首先,系統(tǒng)通過數(shù)據(jù)讀取指令(ld32)將FFT蝶形運(yùn)算的輸入數(shù)據(jù)從數(shù)據(jù)存儲(chǔ)器105中,通過數(shù)據(jù)存儲(chǔ)單元104,讀入至矢量寄存器單元100中,之后利用自定義的蝶形運(yùn)算指令(DIT)在矢量運(yùn)算單元102中完成FFT蝶形運(yùn)算,并將運(yùn)算結(jié)果存放至矢量寄存器單元100中,最后通過數(shù)據(jù)存儲(chǔ)指令(st32)將蝶形運(yùn)算的結(jié)果存放至數(shù)據(jù)存儲(chǔ)器105中。在進(jìn)行FFT數(shù)據(jù)讀取和存儲(chǔ)的時(shí)候,地址產(chǎn)生單元103則用于產(chǎn)生下一個(gè)FFT蝶形運(yùn)算的輸入和輸出數(shù)據(jù)以及旋轉(zhuǎn)因子的地址。

具體到每個(gè)模塊的分工如下:

所述順序串聯(lián)的指令存儲(chǔ)器106、取址單元107和譯碼單元108用以產(chǎn)生指令譯碼控制信號(hào),控制執(zhí)行單元109;

所述矢量寄存器單元100用以暫存數(shù)據(jù)存儲(chǔ)單元104讀取的即將進(jìn)行FFT蝶形運(yùn)算的數(shù)據(jù),以及矢量運(yùn)算單元102輸出的由FFT蝶形運(yùn)算產(chǎn)生的數(shù)據(jù);

所述數(shù)據(jù)交換網(wǎng)絡(luò)101用以對(duì)即將進(jìn)行FFT蝶形運(yùn)算的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)}的實(shí)部與虛部按照矢量運(yùn)算單元(102)的要求進(jìn)行交換,交換得到3個(gè)矢量數(shù)據(jù):加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}、第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}和第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)},所述三個(gè)矢量數(shù)據(jù)的結(jié)構(gòu)為{元素3, 元素2, 元素1,元素0};

數(shù)據(jù)交換網(wǎng)絡(luò)101還將所有矢量數(shù)據(jù)內(nèi)的各個(gè)元素輸出至矢量運(yùn)算單元102的對(duì)應(yīng)接口。

所述矢量運(yùn)算單元102中包括4個(gè)并行的乘累加單元,每個(gè)乘累加單元由順序串聯(lián)的乘法器、取反器和加法器構(gòu)成;第一乘累加單元中的乘法器輸出端通過取反器后連接至第三乘累加單元中的加法器輸入端,第二乘累加單元中的乘法器輸出端通過取反器后連接至第四乘累加單元中的加法器輸入端,第三乘累加單元中的乘法器輸出端通過取反器后連接至第一乘累加單元中的加法器輸入端,第四乘累加單元中的乘法器輸出端連接第二乘累加單元中的加法器輸入端;

所述地址產(chǎn)生單元103用以產(chǎn)生每一級(jí)FFT蝶形運(yùn)算中輸入數(shù)據(jù)、輸出數(shù)據(jù)以及旋轉(zhuǎn)因子的地址;

所述數(shù)據(jù)存儲(chǔ)單元104用以根據(jù)地址產(chǎn)生單元103產(chǎn)生的地址,將數(shù)據(jù)存儲(chǔ)器105內(nèi)的數(shù)據(jù)讀取至矢量寄存器單元100,或根據(jù)地址產(chǎn)生單元103產(chǎn)生的地址,將矢量寄存器單元100輸出的數(shù)據(jù)寫入數(shù)據(jù)存儲(chǔ)器105;

所述數(shù)據(jù)存儲(chǔ)器105用以存儲(chǔ)需要進(jìn)行FFT蝶形運(yùn)算的數(shù)據(jù),以及FFT蝶形運(yùn)算產(chǎn)生的數(shù)據(jù)。

在本系統(tǒng)中,針對(duì)矢量處理器,提出了一種新穎的自定義的FFT蝶形運(yùn)算指令(DIT),通過將矢量處理器中的各個(gè)標(biāo)量乘累加運(yùn)算單元進(jìn)行新穎的互聯(lián)(具體連接關(guān)系參照?qǐng)D5),從而實(shí)現(xiàn)FFT蝶形運(yùn)算。這種方式下,每次能夠完成的蝶形運(yùn)算的個(gè)數(shù)取決于矢量處理器中的標(biāo)量乘累加運(yùn)算單元的個(gè)數(shù)。

所述的矢量處理器需要配合數(shù)據(jù)交換網(wǎng)絡(luò)101對(duì)即將進(jìn)行FFT蝶形運(yùn)算的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)}的實(shí)部與虛部進(jìn)行交換,才能正確地對(duì)數(shù)據(jù)進(jìn)行蝶形運(yùn)算。交換后,按照{(diào)元素3, 元素2, 元素1,元素0}的順序得到3個(gè)矢量數(shù)據(jù):加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}、第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}和第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)},并將加法矢量數(shù)據(jù)的元素0至元素3依次被送至第一至第四乘累加單元的加法器數(shù)據(jù)接口,將將第一乘法矢量數(shù)據(jù)的元素0至元素3依次被送至第一至第四乘累加單元的乘法器的第一數(shù)據(jù)接口,第二乘法矢量數(shù)據(jù)的元素0至元素3依次被送至第一至第四乘累加單元的乘法器的第二數(shù)據(jù)接口。

進(jìn)一步的,為了增加本發(fā)明描述的方法和系統(tǒng)在處理蝶形運(yùn)算時(shí)的正確率以及效率,本發(fā)明中同時(shí)設(shè)置了多個(gè)存儲(chǔ)器地址指針,并為每個(gè)存儲(chǔ)器地址指針設(shè)置了新穎的獨(dú)立模式寄存器,通過配置對(duì)應(yīng)的存儲(chǔ)器地址指針模式寄存器,可對(duì)FFT運(yùn)算過程中輸入和輸出數(shù)據(jù)的地址以及旋轉(zhuǎn)因子的地址進(jìn)行設(shè)定。存儲(chǔ)器的地址指針變換模式設(shè)定好之后,每次存儲(chǔ)器讀取指令(ld32)和存儲(chǔ)器存儲(chǔ)指令(st32)執(zhí)行之后,對(duì)應(yīng)的地址指針變會(huì)根據(jù)所設(shè)定的模式進(jìn)行變換。

具體而言,本發(fā)明系統(tǒng)中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址根據(jù)所處FFT蝶形運(yùn)算的級(jí)數(shù)按照以下方式產(chǎn)生:所述的地址產(chǎn)生單元103在第一級(jí)FFT蝶形運(yùn)算中,輸入數(shù)據(jù)的地址從0開始,按照reverse模式進(jìn)行更新,即由高位向低位每次進(jìn)1的方式進(jìn)行自增;reverse模式下地址更新方式為(dpx.addr & (0xfffe<<fft_stage)) | (reverse(dpx.addr[0:15]+(0x8000>>fft_stage)) & ~(0xfffe<<fft_stage));其中,0xfffe為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算,“reverse”為按位顛倒運(yùn)算,0x8000為常數(shù),“>>”為右移運(yùn)算,“+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算;在第一級(jí)FFT蝶形運(yùn)算中,輸出數(shù)據(jù)的地址按照從0到7的順序產(chǎn)生;

在第二級(jí)以及以后各級(jí)的FFT蝶形運(yùn)算中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址均從0開始,按照一次keep模式、一次nbf模式交替的方式產(chǎn)生;keep模式下地址保持不變;nbf模式下地址更新的方式為((dpx.addr+dpx.offset) +1)&(~dpx.offset);其中,dpx.offset為地址指針偏移,dpx.addr為地址指針,“~”為按位取反運(yùn)算,“+”為加法運(yùn)算,“&”為按位與運(yùn)算;第二級(jí)蝶形運(yùn)算開始dpx.offset的初值設(shè)置為2,之后每完成一級(jí)蝶形運(yùn)算,dpx.offset的取值都需要乘以2后再進(jìn)行下一級(jí)FFT蝶形運(yùn)算。具體到本實(shí)施例中的8點(diǎn)FFT運(yùn)算中,第二級(jí)旋轉(zhuǎn)因子的地址從0開始按照每次偏移2產(chǎn)生,第三級(jí)旋轉(zhuǎn)因子的地址從0開始按照每次偏移1產(chǎn)生。

與輸入輸出數(shù)據(jù)地址變換相對(duì)應(yīng)的,在每一級(jí)FFT蝶形運(yùn)算中,旋轉(zhuǎn)因子的讀取地址也同時(shí)根據(jù)twf模式進(jìn)行更新,twf模式下地址變換方式為(dpx.addr& (0xffff<<fft_stage)) | ((dpx.addr+dpx.offset) & ~(0xffff<<fft_stage)));其中,0xffff為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算,“+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算;第一級(jí)FFT運(yùn)算中旋轉(zhuǎn)因子對(duì)應(yīng)的存儲(chǔ)器地址指針的偏移值為2^(fft_stage-1) ,其中,fft_stage為FFT運(yùn)算的級(jí)數(shù)。即在本實(shí)施例中的8點(diǎn)FFT運(yùn)算中,第一級(jí)FFT運(yùn)算需要設(shè)置旋轉(zhuǎn)因子對(duì)應(yīng)的存儲(chǔ)器地址指針的偏移值為4,在每次進(jìn)入下一級(jí)運(yùn)算前,偏移值需要除以2;

每進(jìn)行一級(jí)FFT運(yùn)算蝶形運(yùn)算后,地址產(chǎn)生單元(103)均按照上述方法分別產(chǎn)生新一級(jí)FFT運(yùn)算蝶形運(yùn)算的輸入數(shù)據(jù)地址、輸出數(shù)據(jù)地址和旋轉(zhuǎn)因子地址,并輸出。

這里針對(duì)FFT運(yùn)算設(shè)置了四種新穎的指針變換模式:reverse自增模式、nbf模式、twf模式、keep模式。reverse自增模式下,地址指針會(huì)進(jìn)行反向自增,也就是說,地址指針的自增加法運(yùn)算不是從低位向高位進(jìn)位,而是高位向低位進(jìn)位。這種模式用于FFT第一級(jí)蝶形運(yùn)算的輸入及輸出數(shù)據(jù)的地址變換。nbf模式下,在讀取或存儲(chǔ)完一個(gè)蝶形運(yùn)算的第二個(gè)數(shù)據(jù)之后,地址指針會(huì)變換為下一個(gè)蝶形運(yùn)算的第一個(gè)數(shù)據(jù)的地址。該模式用于FFT運(yùn)算中,從第二級(jí)蝶形運(yùn)算開始,每個(gè)蝶形運(yùn)算的第一個(gè)數(shù)據(jù)地址的計(jì)算。twf則模式用于每一級(jí)FFT運(yùn)算中,旋轉(zhuǎn)因子地址的計(jì)算,其偏移量根據(jù)蝶形運(yùn)算的級(jí)數(shù)而確定。keep模式下,地址指針不發(fā)生變化。

進(jìn)一步的,針對(duì)32位FFT運(yùn)算,本發(fā)明系統(tǒng)中,所述的矢量寄存器單元100由8個(gè)64bit的一級(jí)矢量寄存器v組成,每個(gè)一級(jí)矢量寄存器v分別由2個(gè)32bit的二級(jí)寄存器d組成,每個(gè)二級(jí)寄存器d分別由2個(gè)16bit的三級(jí)寄存器s組成。也就是說,該矢量寄存器單元100由8個(gè)64bit的一級(jí)矢量寄存器(v0~v7)或者16個(gè)32bit的二級(jí)寄存器(d0~d15)或者32個(gè)16bit的三級(jí)寄存器(s0~s31)組成。每個(gè)一級(jí)寄存器v由兩個(gè)二級(jí)寄存器d組成,每個(gè)二級(jí)寄存器d由兩個(gè)三級(jí)寄存器s組成,每個(gè)三級(jí)寄存器s都叫做矢量的一個(gè)元素。例如:v0是一個(gè)64bit的一級(jí)矢量寄存器,它的低32bit為二級(jí)寄存器d0,高32bit為二級(jí)寄存器d1。二級(jí)寄存器d0的低16bit為三級(jí)寄存器s0,高16bit為三級(jí)寄存器s1。二級(jí)寄存器d1的低16bit為三級(jí)寄存器s2,高16bit為三級(jí)寄存器s3。s0~s3分別對(duì)應(yīng)一級(jí)寄存器v0的四個(gè)元素(e0~e3)。該一級(jí)矢量寄存器包含4個(gè)bank,每個(gè)一級(jí)寄存器v的元素e0構(gòu)成bank0,元素e1構(gòu)成bank1,元素e2構(gòu)成bank2,元素e3構(gòu)成bank3。矢量運(yùn)算單元102具有4個(gè)并行的乘累加單元,可對(duì)矢量寄存器單元100中的矢量數(shù)據(jù)進(jìn)行并行計(jì)算。矢量運(yùn)算單元102和數(shù)據(jù)存取單元104可對(duì)矢量寄存器單元100進(jìn)行讀寫操作,每次讀寫操作可針對(duì)一級(jí)寄存器v(ld64或st64)、二級(jí)寄存器d(ld32或st32)或三級(jí)寄存器s(ld16或st16)。

FFT運(yùn)算的輸入和輸出數(shù)據(jù)都是復(fù)數(shù),復(fù)數(shù)在矢量寄存器單元100中存放示意圖如圖3所示。每個(gè)矢量寄存器中可以存放兩個(gè)復(fù)數(shù),其中元素e0和元素e2存放復(fù)數(shù)的實(shí)部,元素e1和元素e3存放復(fù)數(shù)的虛部。

實(shí)施例2

為實(shí)現(xiàn)上述目的,在實(shí)施例2中還提出一種矢量處理器實(shí)現(xiàn)FFT運(yùn)算的數(shù)據(jù)交換方法。這種方法針對(duì)矢量運(yùn)算單元而設(shè)計(jì),通過數(shù)據(jù)交換網(wǎng)絡(luò)與矢量運(yùn)算單元的配合實(shí)現(xiàn)FFT運(yùn)算中的蝶形運(yùn)算。值得注意的是,這里的數(shù)據(jù)交換方法實(shí)際上還需要依托圖5所示的矢量運(yùn)算單元中的獨(dú)特的硬件連接關(guān)系才能夠完全實(shí)現(xiàn)蝶形運(yùn)算。交換的具體計(jì)算步驟如下:

第1步,根據(jù)數(shù)據(jù)讀取指令讀入存儲(chǔ)器地址指針?biāo)鶎?duì)應(yīng)的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)};

第2步,通過數(shù)據(jù)交換網(wǎng)絡(luò)101將讀入的旋轉(zhuǎn)因子{I(w),R(w)}、蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}、蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)}按照加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}、第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}和第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)}的形式進(jìn)行矢量數(shù)據(jù)交換;

第3步,向矢量運(yùn)算單元102的四個(gè)加法數(shù)據(jù)接口依次輸出加法矢量數(shù)據(jù){I(x1),R(x1), I(x1),R(x1)}中的四個(gè)元素,向矢量運(yùn)算單元的四個(gè)第一數(shù)據(jù)接口依次輸出第一乘法矢量數(shù)據(jù){I(x2),I(x2), R(x2),R(x2)}中的四個(gè)元素,向矢量運(yùn)算單元的四個(gè)第二數(shù)據(jù)接口依次輸出第二乘法矢量數(shù)據(jù){R(w),I(w), I(w),R(w)}中的四個(gè)元素。

結(jié)合上述的數(shù)據(jù)交換方法,還需要如下的一種利用矢量運(yùn)算單元實(shí)現(xiàn)蝶形運(yùn)算的方法。具體步驟為:

第一步,在矢量運(yùn)算單元的四個(gè)乘累加單元中分別將第一乘法矢量數(shù)據(jù)中的第一至第四個(gè)元素和第二乘法矢量數(shù)據(jù)中的第一至第四個(gè)元素進(jìn)行乘法運(yùn)算,分別得到第一乘法器結(jié)果R(x2)*R(w),第二乘法器結(jié)果R(x2)*I(w),第三乘法器結(jié)果I(x2)*I(w)和第四乘法器結(jié)果I(x2)*R(w);

第二步,將加法矢量數(shù)據(jù)中的第一至第四個(gè)元素按順序分別輸入4個(gè)加法器,依次與第一至第四乘累加運(yùn)算的結(jié)果進(jìn)行加法運(yùn)算,最終分別完成第一乘累加運(yùn)算結(jié)果R(x1+x2×w)= R(x1)+R(x2)*R(w)- I(x2)*I(w);第二乘累加運(yùn)算結(jié)果I(x1+x2×w)= I(x1)+R(x2)*I(w)+ I(x2)*R(w);第三乘累加運(yùn)算結(jié)果R(x1-x2×w)= R(x1)+I(x2)*I(w)- R(x2)*R(w);以及第四乘累加運(yùn)算結(jié)果I(x1-x2×w)= I(x1)+I(x2)*R(w)- R(x2)*I(w);

第三步,輸出四個(gè)乘累加運(yùn)算結(jié)果。

為了完成FFT運(yùn)算中的全部蝶形運(yùn)算,每次按照上述步驟完成一次蝶形運(yùn)算還需要配合更新存儲(chǔ)器地址指針,使存儲(chǔ)器地址指針分別指向下一個(gè)蝶形運(yùn)算的旋轉(zhuǎn)因子{I’(w),R’(w)}、下一個(gè)蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I’(x1),R’(x1)}和下一個(gè)蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I’(x2),R’(x2)}的地址。根據(jù)這些地址讀取相應(yīng)的數(shù)據(jù)或者將運(yùn)算結(jié)果存儲(chǔ)至相應(yīng)的存儲(chǔ)單元內(nèi),再回到第一步進(jìn)行下一個(gè)蝶形運(yùn)算,直至完成。

本實(shí)施例所針對(duì)的是8點(diǎn)FFT運(yùn)算。8點(diǎn)FFT運(yùn)算分為三級(jí),前一級(jí)運(yùn)算的結(jié)果作為后一級(jí)運(yùn)算的輸入,其中每一級(jí)運(yùn)算都需要獨(dú)立地進(jìn)行4個(gè)蝶形運(yùn)算。所述的蝶形運(yùn)算的示意圖如圖4所示,圖中x1和x2為蝶形運(yùn)算的輸入數(shù)據(jù),w為蝶形運(yùn)算的旋轉(zhuǎn)因子, x1+x2*w 和x1-x2*w為蝶形運(yùn)算的兩個(gè)輸出結(jié)果。圖5為實(shí)施例的矢量運(yùn)算單元102結(jié)構(gòu)框圖。該矢量運(yùn)算單元102包括4個(gè)乘累加單元,將這4個(gè)乘累加單元經(jīng)過適當(dāng)?shù)幕ヂ?lián),便可輕松實(shí)現(xiàn)圖4所描述的FFT的蝶形運(yùn)算。蝶形運(yùn)算指令(DIT)得到的運(yùn)算結(jié)果x1+x2*w的實(shí)部和虛部位于矢量元素e0和元素e1,運(yùn)算結(jié)果x1-x2*w的實(shí)部和虛部位于矢量元素e2和元素e3。

蝶形運(yùn)算指令(DIT)需要配合存儲(chǔ)器地址指針的靈活變化,才能將FFT運(yùn)算高效的完成。在該實(shí)施例的系統(tǒng)中,設(shè)置了多個(gè)存儲(chǔ)器地址指針,并為每個(gè)存儲(chǔ)器地址指針設(shè)置了獨(dú)立的模式寄存器,通過配置對(duì)應(yīng)的存儲(chǔ)器地址指針模式寄存器,可對(duì)FFT運(yùn)算過程中輸入和輸出數(shù)據(jù)的地址變換進(jìn)行設(shè)定。存儲(chǔ)器的地址指針變換模式設(shè)定好之后,每次存儲(chǔ)器讀取指令(ld32)和存儲(chǔ)器存儲(chǔ)指令(st32)執(zhí)行之后,對(duì)應(yīng)的地址指針就會(huì)根據(jù)所設(shè)定的模式進(jìn)行變換。

也就是說,針對(duì)8點(diǎn)FFT運(yùn)算,本發(fā)明通過矢量處理器實(shí)現(xiàn)FFT運(yùn)算時(shí)除了需要依照上述數(shù)據(jù)交換方法實(shí)現(xiàn)基礎(chǔ)的蝶形運(yùn)算,還需要配合下面的地址生成方法,在每一次蝶形運(yùn)算后,按照下面的方式更新存儲(chǔ)器地址指針。

值得注意的是,這里所述的地址生成方法包括FFT蝶形運(yùn)算中輸入數(shù)據(jù)、輸出數(shù)據(jù)和旋轉(zhuǎn)因子三者的地址生成方法。在每一級(jí)蝶形運(yùn)算后,并行的生成輸入數(shù)據(jù)地址、輸出數(shù)據(jù)地址和旋轉(zhuǎn)因子地址,所述輸入數(shù)據(jù)地址和輸出數(shù)據(jù)地址根據(jù)所處FFT蝶形運(yùn)算的級(jí)數(shù)不同按照如下方式生成。其中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址根據(jù)所處FFT蝶形運(yùn)算的級(jí)數(shù)不同按照如下方式生成:

在第一級(jí)FFT蝶形運(yùn)算中,輸入數(shù)據(jù)的地址從0開始,按照reverse模式進(jìn)行更新,即由高位向低位每次進(jìn)1的方式進(jìn)行自增;第一級(jí)旋轉(zhuǎn)因子的地址從0開始按照每次偏移4產(chǎn)生;輸出數(shù)據(jù)的地址按照從0到7的順序產(chǎn)生;

在第二級(jí)FFT蝶形運(yùn)算中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址均從0開始,按照一次keep模式、一次nbf模式交替的方式產(chǎn)生;keep模式下地址保持不變,nbf模式下地址更新的方式為((dpx.addr+dpx.offset) +1)&(~dpx.offset),其中,dpx.offset為地址指針偏移,dpx.addr為地址指針,“~”為按位取反運(yùn)算,“+”為加法運(yùn)算,“&”為按位與運(yùn)算;第二級(jí)旋轉(zhuǎn)因子的地址從0開始按照每次偏移2產(chǎn)生;

在第三級(jí)FFT蝶形運(yùn)算中,輸入數(shù)據(jù)和輸出數(shù)據(jù)的地址均從0開始,按照一次keep模式、一次nbf模式交替的方式產(chǎn)生,第三級(jí)FFT蝶形運(yùn)算中地址指針偏移dpx.offset的值為第二級(jí)FFT蝶形運(yùn)算中的一半;第三級(jí)旋轉(zhuǎn)因子的地址從0開始按照每次偏移1產(chǎn)生;

其中,輸入數(shù)據(jù)依次為蝶形運(yùn)算的第一個(gè)數(shù)據(jù){I(x1),R(x1)}和蝶形運(yùn)算的第二個(gè)數(shù)據(jù){ I(x2),R(x2)};輸出數(shù)據(jù)依次為蝶形運(yùn)算的第一個(gè)結(jié)果{I(x1-x2×w),R(x1-x2×w)}和蝶形運(yùn)算的第二個(gè)結(jié)果{I(x1+x2×w),R(x1+x2×w)}。

具體而言,本發(fā)明方法中,所述reverse模式下地址更新的方式為(dpx.addr & (0xfffe<<fft_stage)) | (reverse(dpx.addr[0:15])+(0x8000>>fft_stage)) & ~(0xfffe<<fft_stage)),其中,0xfffe為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算,“reverse”為按位顛倒運(yùn)算,0x8000為常數(shù),“>>”為右移運(yùn)算,“+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算。

具體而言,本發(fā)明方法中,所述旋轉(zhuǎn)因子的地址按照twf模式進(jìn)行更新,twf模式下地址更新的方式為(dpx.addr&(0xffff<<fft_stage))|((dpx.addr+dpx.offset)&~(0xffff<<fft_stage))),其中,0xffff為常數(shù),“<<”為邏輯左移,fft_stage為FFT運(yùn)算的級(jí)數(shù),dpx.addr為地址指針,“&”為按位與運(yùn)算, “+”為相加運(yùn)算,“~”為按位取反運(yùn)算,“|”為按位或運(yùn)算。

具體,在實(shí)現(xiàn)圖6所示的8點(diǎn)FFT運(yùn)算中,8點(diǎn)FFT運(yùn)算共3級(jí),在進(jìn)行每級(jí)FFT運(yùn)算前,需要設(shè)置選用的存儲(chǔ)器地址指針(dpx)的指針變換模式(dpx.mode)、地址指針的初始地址(dpx.addr)以及地址的指針偏移值(dpx.offset)。之后在每次存儲(chǔ)器讀取指令(ld32)和存儲(chǔ)器存儲(chǔ)指令(st32)執(zhí)行之后,對(duì)應(yīng)的地址指針會(huì)根據(jù)所設(shè)定的模式進(jìn)行變換。

圖7為FFT運(yùn)算第一級(jí)輸入數(shù)據(jù)地址變換示意圖。ld32 [dpx.addr]為FFT運(yùn)算輸入數(shù)據(jù)讀取指令,該指令將存儲(chǔ)器中位于地址dpx.addr的復(fù)數(shù)讀入矢量寄存器單元中。在數(shù)據(jù)讀取前,需要將存儲(chǔ)器的地址指針變換模式設(shè)置為reverse自增模式,并且將地址指針的初始地址設(shè)置為0。第一級(jí)FFT輸入數(shù)據(jù)的地址則會(huì)按照以下模式變換:0x0,0x4,0x2,0x6,0x1,0x5,0x3,0x7。這種地址變換模式相當(dāng)于輸入數(shù)據(jù)的地址每次增值是bit2加1,并且bit2向bit1進(jìn)位,bit1向bit0進(jìn)位。另外,F(xiàn)FT第一級(jí)數(shù)據(jù)的輸出地址需要按照順序變換,此處不做說明。假設(shè)存儲(chǔ)器地址指針的位寬為16位,那么在reverse自增模式下,地址更新方式為:

(dpx.addr & (0xfffe<<fft_stage)) | (reverse(dpx.addr[0:15]+(0x8000>>fft_stage)) & ~(0xfffe<<fft_stage))。

reverse自增模式下,地址更新的步驟如下:

1)將常數(shù)0xfffe邏輯左移fft_stage位。fft_stage是FFT運(yùn)算的級(jí)數(shù)。例如8點(diǎn)FFT運(yùn)算時(shí),fft_stage為3。

2)將地址指針dpx.addr與第一步的結(jié)果進(jìn)行按位與操作

3)將地址指針dpx.addr按位顛倒,并與0x8000右移fft_stage的結(jié)果進(jìn)行相加操作,并將相加的結(jié)果再進(jìn)行按位顛倒。

4)將0xfffe左移fft_stage位,之后將結(jié)果按位取反。

5)將第三步的結(jié)果與第四步的結(jié)果進(jìn)行按位與操作。

6)將第二步的結(jié)果與第五步的結(jié)果進(jìn)行按位或操作,得到最終地址更新值。

圖8為FFT運(yùn)算第二級(jí)輸入數(shù)據(jù)地址變換示意圖。ld32 [dpx.addr]和ld32 [dpx.addr+dpx.offset]為FFT運(yùn)算輸入數(shù)據(jù)讀取指令,分別用于讀取存儲(chǔ)器中位于地址dpx.addr和dpx.addr+dpx.offset的復(fù)數(shù),這兩個(gè)復(fù)數(shù)對(duì)應(yīng)一個(gè)蝶形運(yùn)算的兩個(gè)點(diǎn)。在數(shù)據(jù)讀取前,需要將地址指針的初始地址設(shè)置為0,指針偏移為2,并設(shè)置存儲(chǔ)器的地址指針變換模式。在dpx.addr尋址模式下,地址指針變換模式為keep模式,在dpx.addr+dpx.offset尋址模式下,地址指針變換模式為nbf模式。另外,F(xiàn)FT第二級(jí)數(shù)據(jù)的輸出地址也按照上述規(guī)律變換,此處不做說明。keep模式下,地址指針保持不變。nbf模式下,地址指針變換方式如下:

((dpx.addr+dpx.offset) +1)&(~dpx.offset)。

nbf模式下,地址更新的步驟如下:

1)將地址指針偏移dpx.offset進(jìn)行按位取反

2)將地址指針dpx.addr與地址指針偏移dpx.offset以及常數(shù)1相加

3)將第一步的結(jié)果與第二步的結(jié)果進(jìn)行按位與操作,得到最終的地址更新值

圖9為FFT運(yùn)算第三級(jí)輸入數(shù)據(jù)地址變換示意圖。第三級(jí)FFT運(yùn)算開始前,需要把對(duì)應(yīng)地址指針的偏移乘以2,之后再按照和第二級(jí)FFT運(yùn)算一樣的模式進(jìn)行數(shù)據(jù)的讀取和指針變換。

圖10為8點(diǎn)FFT運(yùn)算旋轉(zhuǎn)因子地址變換示意圖。ld32 [dpx.addr]用于讀取FFT蝶形運(yùn)算的旋轉(zhuǎn)因子。每級(jí)FFT運(yùn)算前,先要設(shè)置旋轉(zhuǎn)因子對(duì)應(yīng)的存儲(chǔ)器地址指針的偏移值。第一級(jí)FFT運(yùn)算需要設(shè)置旋轉(zhuǎn)因子對(duì)應(yīng)的存儲(chǔ)器地址指針的偏移值為4,在每次進(jìn)入下一級(jí)運(yùn)算前,偏移值需要除以2。twf模式下,地址更新方式如下:

(dpx.addr& (0xffff<<fft_stage)) |

((dpx.addr+dpx.offset) &~(0xffff<<fft_stage)))。

twf自增模式下,地址更新的步驟如下:

1)將常數(shù)0xffff邏輯左移fft_stage位。fft_stage是FFT運(yùn)算的級(jí)數(shù)。例如8點(diǎn)FFT運(yùn)算時(shí),fft_stage為3。

2)將地址指針dpx.addr與第一步的結(jié)果進(jìn)行按位與操作

3)將地址指針dpx.addr與地址指針偏移dpx.offset相加。

4)將0xffff左移fft_stage位,之后將結(jié)果按位取反。

5)將第三步的結(jié)果與第四步的結(jié)果進(jìn)行按位與操作。

6)將第二步的結(jié)果與第五步的結(jié)果進(jìn)行按位或操作,得到最終地址更新值。

本發(fā)明利用自定義的FFT蝶形運(yùn)算指令(DIT),并配合高效的存儲(chǔ)器地址指針變換模式,可實(shí)現(xiàn)高效的FFT運(yùn)算。如果可將FFT蝶形運(yùn)算指令(DIT)以及存儲(chǔ)器讀?。╨d32)和存儲(chǔ)(st32)指令并行發(fā)射,將會(huì)得到更高的FFT運(yùn)算效率。

以上實(shí)施例僅僅是是針對(duì)8點(diǎn)FFT而設(shè)計(jì)的。本領(lǐng)域技術(shù)人員可以理解,根據(jù)本實(shí)施例所述的方法,通過軟件編程的方式設(shè)定地址變換模式并調(diào)用蝶形運(yùn)算指令,可以實(shí)現(xiàn)更多點(diǎn)數(shù)FFT的運(yùn)算。

本領(lǐng)域普通技術(shù)人員可以理解:以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,對(duì)于本領(lǐng)域的技術(shù)人員來說,其依然可以對(duì)前述各實(shí)施例記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1