本發(fā)明涉及處理器技術(shù)領(lǐng)域,尤其涉及一種定點(diǎn)乘累加器。
背景技術(shù):
乘法操作被用于大部分算法中,特別是在信號(hào)處理算法中,乘累加操作是核心操作之一,這使得每秒可執(zhí)行乘累加操作數(shù)(MAC/S)成為簡(jiǎn)單衡量一個(gè)數(shù)字信號(hào)處理器計(jì)算能力的指標(biāo)之一。不僅是在數(shù)字信號(hào)處理器中,通用處理器為了中也集成了乘法器,某些通用處理器為了加速圖像處理或其他科學(xué)計(jì)算,也使用了乘累加器。
在現(xiàn)有技術(shù)中,一個(gè)乘累加器的結(jié)構(gòu)通常是使用Booth編碼和壓縮樹(shù)進(jìn)行乘法的基本操作,而累加器的值一般參與壓縮樹(shù)的最后壓縮,在得到兩個(gè)壓縮結(jié)果之后,使用超前進(jìn)位加法器將兩者相加,得到最終的乘累加結(jié)果。一般情況下,乘法器所在通路是所有計(jì)算單元的關(guān)鍵通路所在。
在處理器的設(shè)計(jì)中,需要使用定點(diǎn)乘累加器完成多種形式的操作:
(1)有符號(hào)乘法、無(wú)符號(hào)乘法,甚至有符號(hào)數(shù)與無(wú)符號(hào)數(shù)相乘;
(2)定點(diǎn)整數(shù)乘法和定點(diǎn)小數(shù)乘法;
(3)乘累加和乘累減;
(4)乘法結(jié)果飽和操作。
第(1)種操作已經(jīng)有非常成熟的實(shí)現(xiàn)方法,在兩位Booth編碼中,有無(wú)符號(hào)數(shù)參與的計(jì)算會(huì)增加一個(gè)部分積。
第(2)種操作中,定點(diǎn)整數(shù)與定點(diǎn)小數(shù)的計(jì)算區(qū)別僅在于,小數(shù)乘法結(jié)果需要左移一位。在現(xiàn)在的技術(shù)中,一般是在乘法壓縮結(jié)果得出之后,根據(jù)操作類(lèi)型決定是否對(duì)結(jié)果進(jìn)行移位操作。而該移位操作將增加乘累加器關(guān)鍵通路的長(zhǎng)度。
第(3)種操作在FFT以及類(lèi)蝶形運(yùn)算中出現(xiàn)的較多,乘法結(jié)果與累加器之間做加法或減法操作都是算法中較為常用的。在現(xiàn)有的技術(shù)中,往往是在乘法結(jié)果給出之后,根據(jù)操作類(lèi)型,選擇乘法壓縮結(jié)果的反或者原值,然后與累加器的進(jìn)行加法操作。其中,僅僅對(duì)結(jié)果進(jìn)行取反是不夠的,對(duì)每一個(gè)取反的數(shù)仍需要加1,一般情況下壓縮結(jié)果的進(jìn)位最低位與加法器的初始進(jìn)位可以解決該問(wèn)題。這種方法的缺點(diǎn)同樣是在關(guān)鍵通路中增加選擇,從而加長(zhǎng)累加器的路徑長(zhǎng)度。
第(4)種操作也較為常見(jiàn)。為了與浮點(diǎn)格式相匹配,一般在處理器中只處理Q(n-1)格式的定點(diǎn)小數(shù)(n是數(shù)據(jù)位寬),即最高位是符號(hào)位,其余均是小數(shù)的尾數(shù)部分,其表示范圍是-1~(1-2-(n-1)),精度是2-(n-1)。所以當(dāng)兩個(gè)-1相乘時(shí),從表示范圍即可看出該操作超出了表示范圍。實(shí)際上在不做處理的情況下,兩個(gè)-1相乘得到的仍然是-1,這與實(shí)際結(jié)果相差太多,所以一般這時(shí)候需要在累加前進(jìn)行飽和處理,將其飽和至最接近1的正數(shù)(1-2-(n-1))。在現(xiàn)有的技術(shù)中,同樣是在乘法結(jié)果得出之后進(jìn)行飽和選擇處理,其缺點(diǎn)依然是增加了關(guān)鍵路徑的長(zhǎng)度。
綜上,如果一個(gè)乘累加器需要完成上述操作,需要增加多級(jí)選擇器才可實(shí)現(xiàn),而乘法器作為所有計(jì)算單元的關(guān)鍵通路,增加任何一點(diǎn)延時(shí)都將導(dǎo)致性能的降低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供了一種定點(diǎn)乘累加器,在不增加延時(shí)的情況下,既可實(shí)現(xiàn)定點(diǎn)整數(shù)乘法又可實(shí)現(xiàn)定點(diǎn)小數(shù)乘法。
為解決上述技術(shù)問(wèn)題,本發(fā)明采用下述技術(shù)方案予以實(shí)現(xiàn):
本發(fā)明提出了一種定點(diǎn)乘累加器,包括:Booth編碼單元,用于對(duì)乘數(shù)進(jìn)行Booth編碼;左移邏輯單元,用于當(dāng)被乘數(shù)為小數(shù)時(shí),將被乘數(shù)左移一位、低位補(bǔ)零;Booth譯碼/部分積產(chǎn)生單元,用于產(chǎn)生部分積;壓縮樹(shù),用于壓縮部分積,輸出兩個(gè)壓縮數(shù)據(jù);壓縮器,用于壓縮累加器和壓縮樹(shù)提供的數(shù)據(jù);加法器,用于對(duì)壓縮器輸出的數(shù)據(jù)進(jìn)行加法操作,輸出結(jié)果。
進(jìn)一步的,當(dāng)進(jìn)行乘累減操作時(shí),所述Booth編碼單元還用于對(duì)乘數(shù)進(jìn)行Booth編碼后將編碼值neg取反。
又進(jìn)一步的,當(dāng)進(jìn)行無(wú)符號(hào)數(shù)的乘累減操作時(shí),所述定點(diǎn)乘累加器還包括:操作數(shù)預(yù)處理單元,用于將左移邏輯單元輸出數(shù)據(jù)的低m位取反加1;所述Booth譯碼/部分積產(chǎn)生單元包括最后部分積低位產(chǎn)生單元和其余部分積產(chǎn)生單元;所述最后部分積低位產(chǎn)生單元用于根據(jù)操作數(shù)預(yù)處理單元的輸出數(shù)據(jù)和乘數(shù)的最高位產(chǎn)生最后部分積的低m+1位;所述其余部分積產(chǎn)生單元,用于根據(jù)Booth編碼單元產(chǎn)生的編碼和左移邏輯單元輸出的數(shù)據(jù)產(chǎn)生最后部分積的其他位以及其他的部分積;最后部分積的其他位和最后部分積的低m+1位合并成最后部分積。
更進(jìn)一步的,所述定點(diǎn)乘累加器還包括溢出判斷單元,用于判斷在進(jìn)行小數(shù)乘數(shù)時(shí)的乘數(shù)和被乘數(shù)是否均為-1,若是,則輸出溢出信號(hào)至壓縮樹(shù),修改壓縮樹(shù)。
再進(jìn)一步的,所述壓縮樹(shù)還用于:在乘累加操作且接收到溢出信號(hào)時(shí),將部分積中權(quán)重最低的1出現(xiàn)的位清零,然后將低于該權(quán)重的每一位加1。
優(yōu)選的,所述將低于該權(quán)重的每一位加1,具體包括:在具有相同的權(quán)重的部分積位中選取一位,使用溢出信號(hào)將低于該權(quán)重的所有選取位置成1。
又進(jìn)一步的,所述將低于該權(quán)重的每一位加1,具體包括:如果在低于該權(quán)重的壓縮樹(shù)中,存在半加器,則將溢出信號(hào)參與壓縮,并將半加器改為全加器。
更進(jìn)一步的,所述將低于該權(quán)重的每一位加1,具體包括:在具有相同的權(quán)重的部分積位中選取已經(jīng)得到壓縮結(jié)果的一位,使用溢出信號(hào)將低于該權(quán)重的所有選取位置成1。
再進(jìn)一步的,所述壓縮樹(shù)還用于:在乘累減操作且接收到溢出信號(hào)時(shí),將部分積中權(quán)重為0的其中一位修改為1。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)和積極效果是:本發(fā)明的定點(diǎn)乘累加器,既可實(shí)現(xiàn)定點(diǎn)整數(shù)乘法又可實(shí)現(xiàn)定點(diǎn)小數(shù)乘法,且不增加乘累加器的延時(shí),保證了處理器的性能;同時(shí)還可實(shí)現(xiàn)乘累加/減功能、溢出判斷功能。
結(jié)合附圖閱讀本發(fā)明的具體實(shí)施方式后,本發(fā)明的其他特點(diǎn)和優(yōu)點(diǎn)將變得更加清楚。
附圖說(shuō)明
圖1是本發(fā)明提出的定點(diǎn)乘累加器的一個(gè)實(shí)施例的結(jié)構(gòu)框圖;
圖2是圖1中Booth編碼單元的一個(gè)實(shí)施例的門(mén)級(jí)電路結(jié)構(gòu)圖;
圖3是圖1中左移邏輯單元的結(jié)構(gòu)示意圖;
圖4是圖1中Booth譯碼/部分積產(chǎn)生單元產(chǎn)生的16位乘法所有部分積及其權(quán)重示意圖;
圖5是圖1中壓縮樹(shù)的16位乘法壓縮示意圖;
圖6是本發(fā)明提出的定點(diǎn)乘累加器的另一個(gè)實(shí)施例的結(jié)構(gòu)框圖;
圖7是圖6中Booth編碼單元的一個(gè)實(shí)施例的門(mén)級(jí)結(jié)構(gòu)圖;
圖8是圖6中操作數(shù)預(yù)處理單元、最后部分積低位產(chǎn)生單元的門(mén)極結(jié)構(gòu)圖;
圖9是本發(fā)明提出的定點(diǎn)乘累加器的又一個(gè)實(shí)施例的結(jié)構(gòu)框圖;
圖10是本發(fā)明提出的定點(diǎn)乘累加器的再一個(gè)實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下將結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
本發(fā)明的定點(diǎn)乘累加器,充分利用了乘累加器設(shè)計(jì)中的非關(guān)鍵通路,在不增加乘累加器延時(shí)的情況下,使得乘累加器在可重構(gòu)的實(shí)現(xiàn)有符號(hào)數(shù)乘法和無(wú)符號(hào)數(shù)乘法的基礎(chǔ)上,可選擇的實(shí)現(xiàn)定點(diǎn)整數(shù)乘法和定點(diǎn)小數(shù)乘法、乘累加和乘累減、乘法結(jié)果飽和功能。
為了敘述方便,本發(fā)明做以下約定:部分積編號(hào)按照Booth編碼的權(quán)重從低至高編號(hào),從0開(kāi)始計(jì)數(shù),例如第0個(gè)部分積;Booth編碼中要求將部分積取負(fù)的編碼值稱(chēng)為neg;而在neg控制下,取負(fù)操作要求進(jìn)行“取反加1”,我們稱(chēng)其中需要加1的位為“加1”(每個(gè)“加1”的數(shù)值與neg相同);將只在無(wú)符號(hào)乘法中才會(huì)產(chǎn)生的部分積稱(chēng)為“最后一個(gè)部分積”;壓縮樹(shù)中,信號(hào)經(jīng)過(guò)一個(gè)全加器或半加器稱(chēng)為經(jīng)過(guò)一級(jí)壓縮,壓縮級(jí)數(shù)從1開(kāi)始計(jì)數(shù),例如第3級(jí)壓縮表示信號(hào)已經(jīng)經(jīng)過(guò)兩個(gè)全加器或半加器后,使用第三個(gè)全加器或半加器進(jìn)行壓縮的操作。
實(shí)施例一、定點(diǎn)整數(shù)/小數(shù)乘法功能:
本實(shí)施例提出了一種乘累加器,主要包括Booth編碼單元、左移邏輯單元、Booth譯碼/部分積產(chǎn)生單元、壓縮樹(shù)、壓縮器、累加器、加法器等,參見(jiàn)圖1所示,既可實(shí)現(xiàn)定點(diǎn)整數(shù)乘法又可實(shí)現(xiàn)定點(diǎn)小數(shù)乘法,且不增加乘累加器的延時(shí)。
所述Booth編碼單元,用于對(duì)乘數(shù)進(jìn)行Booth編碼。
Booth編碼用于減少部分積的個(gè)數(shù),使用基4的Booth編碼可以使部分積個(gè)數(shù)減少一半。下表是基4Booth編碼的編碼表:
其中X表示被乘數(shù),xi表示被乘數(shù)權(quán)重為i的位,Y表示乘數(shù),y2t-1表示乘數(shù)中權(quán)重為2i-1的位,PPi表示第i個(gè)部分積,B1/B2/neg是Booth編碼值。表中表示使用乘數(shù)中的每相鄰三位可以確定一個(gè)部分積,而實(shí)際運(yùn)算時(shí)會(huì)根據(jù)乘數(shù)的每相鄰三位生成更具操作性的Booth編碼值,然后再產(chǎn)生部分積。
Booth編碼單元、Booth譯碼/部分積產(chǎn)生單元的門(mén)級(jí)電路結(jié)構(gòu)如圖2所示。圖中Booth譯碼/部分積產(chǎn)生電路只給出了第i部分積中j位的產(chǎn)生電路,其他位的譯碼方式與圖中所示相同,使用同一組Booth譯碼結(jié)果,產(chǎn)生完整的第i部分積(PPi)。
在基4的Booth編碼中,對(duì)于無(wú)符號(hào)數(shù)乘法的最后一個(gè)部分積只由乘數(shù)最高位決定,當(dāng)乘數(shù)最高位是0時(shí),其部分積是0,乘數(shù)最高位是1時(shí),其部分積是被乘數(shù)本身。
左移邏輯單元的具體結(jié)構(gòu)參見(jiàn)圖3,DecimalEn為高電平,表示進(jìn)行小數(shù)操作;Sign為高電平,表示當(dāng)前進(jìn)行的是有符號(hào)操作。當(dāng)被乘數(shù)為小數(shù)時(shí),DecinalEn為高電平,選擇器選通,被乘數(shù)左移一位、低位補(bǔ)零;當(dāng)被乘數(shù)為整數(shù)時(shí),DecinalEn為低電平,被乘數(shù)不移位,被乘數(shù)有符號(hào)時(shí)高位符號(hào)擴(kuò)展一位(0或1,根據(jù)符號(hào)而定),否則補(bǔ)零。被乘數(shù)被拓寬了一位,于是部分積全部拓寬了一位,后續(xù)壓縮樹(shù)同樣需要處理拓寬一位的部分積,但位寬增加只是增加少量的并行邏輯,并不對(duì)關(guān)鍵路徑產(chǎn)生影響。
Booth譯碼/部分積產(chǎn)生單元,用于產(chǎn)生部分積。
在一個(gè)16位乘法的實(shí)施例中,其所有部分積如圖4所示。圖中黑點(diǎn)表示部分積本身,E表示該部分積的符號(hào)擴(kuò)展,表示該部分積符號(hào)的反,P表示該部分積需要取負(fù)(neg有效時(shí))時(shí)的“加1”。
壓縮樹(shù),用于壓縮所有的部分積,輸出兩個(gè)壓縮數(shù)據(jù)。
壓縮器,用于壓縮累加器和壓縮樹(shù)提供的數(shù)據(jù)。
加法器,用于對(duì)壓縮器輸出的數(shù)據(jù)進(jìn)行加法操作,輸出結(jié)果。
壓縮樹(shù)也稱(chēng)華萊士壓縮樹(shù),使用壓縮器將多個(gè)需要相加的數(shù)壓縮成兩個(gè)數(shù),主要原理是將多個(gè)低權(quán)重的數(shù)使用少量具有高權(quán)重的數(shù)表示。壓縮樹(shù)由多個(gè)壓縮器組成,壓縮器有多種形式,但是最基本的壓縮器是全加器。全加器是一個(gè)三輸入二輸出的器件,將三個(gè)低權(quán)重的數(shù)使用一個(gè)高權(quán)重的數(shù)和一個(gè)低權(quán)重的數(shù)進(jìn)行表示,這就是3-2壓縮器。使用兩級(jí)3-2壓縮器可以搭建一個(gè)4-2壓縮器。
圖5所示是一個(gè)16位乘法示例中常見(jiàn)的壓縮示意圖,其中,在同一個(gè)權(quán)重位上,連續(xù)三個(gè)具有相同底紋的數(shù)值輸入一個(gè)全加器中,連續(xù)兩個(gè)具有相同底紋的數(shù)值輸入一個(gè)半加器中。
在高性能處理器中,出于高速主頻的要求,通常需要多個(gè)周期完成整個(gè)乘累加操作。具體如何劃分一個(gè)乘累加器的流水級(jí)則根據(jù)實(shí)際主頻需求與算法實(shí)際需求而定。但根據(jù)乘累加的特性,常常需要進(jìn)行連續(xù)的乘累加,此處累加器中的值需要在每一次累加操作時(shí)使用,所以多條乘累加指令之間必因累加器產(chǎn)生相關(guān)。無(wú)論處理器使用何種方式處理該相關(guān),基本的一點(diǎn)是,累加器的值越靠后使用,對(duì)于數(shù)據(jù)相關(guān)的處理越容易,對(duì)性能的影響越小。如圖1中所示,將在部分積壓縮為兩個(gè)數(shù)之后,才使用累加器進(jìn)行壓縮。該結(jié)構(gòu)的乘累加器適合在壓縮樹(shù)給出兩個(gè)壓縮結(jié)果之后作為一個(gè)周期的結(jié)束,在第二個(gè)周期再使用累加器的值,如此多個(gè)乘累加指令之間就不會(huì)因?yàn)閿?shù)據(jù)相關(guān)而造成流水線(xiàn)的阻塞。
本實(shí)施例的定點(diǎn)乘累加器,當(dāng)被乘數(shù)為小數(shù)時(shí),將被乘數(shù)左移一位、低位補(bǔ)零;當(dāng)被乘數(shù)為整數(shù)時(shí),則不移位,被乘數(shù)有符號(hào)時(shí)高位符號(hào)擴(kuò)展一位,否則補(bǔ)零;由于被乘數(shù)被拓寬了一位,于是部分積全部拓寬了一位,后續(xù)壓縮樹(shù)同樣需要處理拓寬一位的部分積,但位寬增加只是增加少量的并行邏輯,并不對(duì)關(guān)鍵路徑產(chǎn)生影響,不增加乘累加器的延時(shí),既可實(shí)現(xiàn)定點(diǎn)整數(shù)乘法又可實(shí)現(xiàn)定點(diǎn)小數(shù)乘法,又保證了處理器的性能。
實(shí)施例二、乘累加/減功能:
本實(shí)施例提出了一種乘累加器,主要包括Booth編碼單元、Booth譯碼/部分積產(chǎn)生單元、壓縮樹(shù)、壓縮器、累加器、加法器等,參見(jiàn)圖6所示,既可實(shí)現(xiàn)乘累加功能,又可實(shí)現(xiàn)乘累減功能,且不增加乘累加器的延時(shí)。
本實(shí)施例的Booth編碼單元與實(shí)施例一的區(qū)別在于,當(dāng)進(jìn)行乘累減操作時(shí),Booth編碼單元對(duì)乘數(shù)進(jìn)行Booth編碼后將編碼值neg取反,得到新的Booth編碼值neg_new;然后使用neg_new產(chǎn)生部分積,參見(jiàn)圖7所示。
因?yàn)锽ooth編解碼的關(guān)鍵路徑是編碼值b1/b2所在路徑,產(chǎn)生Neg_new并不影響關(guān)鍵路徑的長(zhǎng)度。值得一提的是,每個(gè)部分積的“加1”的數(shù)值同樣使用對(duì)應(yīng)的neg_new;只有當(dāng)neg_new=1時(shí),對(duì)應(yīng)的部分積“取反加1”。
在乘累減操作中,無(wú)符號(hào)數(shù)乘法使用的“最后一個(gè)部分積”也可能需要取負(fù),如此就也需要在該部分積最低位所在權(quán)重上“加1”。以圖4為例,若需要在該最后部分積上“加1”,就需要在權(quán)重16上增加一個(gè)數(shù)值,但是從圖中可以看出,該權(quán)重上所有部分積都有數(shù)值,而該權(quán)重在壓縮樹(shù)中的壓縮通路也正好是關(guān)鍵路徑之一,如果再添加一個(gè)數(shù)值,勢(shì)必增加關(guān)鍵路徑的長(zhǎng)度。
為了解決這個(gè)問(wèn)題,本實(shí)施例的乘累加器還包括操作數(shù)預(yù)處理單元,用于將被乘數(shù)的低m位取反加1;Booth譯碼/部分積產(chǎn)生單元包括最后部分積低位產(chǎn)生單元和其余部分積產(chǎn)生單元,參見(jiàn)圖6所示。
最后部分積低位產(chǎn)生單元,用于根據(jù)操作數(shù)預(yù)處理單元的輸出數(shù)據(jù)和乘數(shù)的最高位產(chǎn)生最后部分積的低m+1位;其余部分積產(chǎn)生單元,用于根據(jù)Booth編碼單元產(chǎn)生的編碼和被乘數(shù)產(chǎn)生最后部分積的其他位以及其他的部分積;最后部分積的其他位和最后部分積的低m+1位合并成最后部分積。
被乘數(shù)低m位進(jìn)行取反加1后的結(jié)果是m+1位,其中結(jié)果的低m位是加1操作的和,最高位是加1操作的進(jìn)位,結(jié)果的最高位是一位進(jìn)位,我們稱(chēng)該進(jìn)位是“被移位的加1”。
例如,從圖4中可以看出,當(dāng)m等于4時(shí),被乘數(shù)低m位進(jìn)行取反加1后的進(jìn)位是位于權(quán)重20,而權(quán)重20中部分積0沒(méi)有數(shù)值,所以當(dāng)該權(quán)重上增加一個(gè)進(jìn)位,不會(huì)影響關(guān)鍵路徑的長(zhǎng)度。
在該實(shí)施例中,部分積低4位pp8[3:0]以及“被移位的加1”pp8p的具體邏輯如圖8所示。從圖中部分積產(chǎn)生的邏輯長(zhǎng)度與Booth編解碼產(chǎn)生部分積的邏輯長(zhǎng)度相比(即:圖中產(chǎn)生最后部分積低4位和一位進(jìn)位的邏輯長(zhǎng)度,與其他部分積產(chǎn)生的邏輯長(zhǎng)度相比),前者在較短的路徑下,將最低4位完成取反加1,該操作的進(jìn)位作為“被移動(dòng)的加1”位于權(quán)重20位,該位上,部分積0沒(méi)有數(shù)值,所以該“被移動(dòng)的加1”不會(huì)影響壓縮樹(shù)的邏輯長(zhǎng)度。
當(dāng)sub=1時(shí),被乘數(shù)低m位取反加1;當(dāng)Unsign=1(無(wú)符號(hào)數(shù))時(shí),乘數(shù)的最高位與被乘數(shù)低m位取反加1的結(jié)果產(chǎn)生最后部分積的低m+1位。
本實(shí)施例的壓縮樹(shù)、壓縮器、累加器、加法器的結(jié)構(gòu)與實(shí)施例一相同,可參照實(shí)施例一的描述,此處不再贅述。
本實(shí)施例的定點(diǎn)乘累加器,當(dāng)進(jìn)行乘累減操作時(shí),Booth編碼單元對(duì)乘數(shù)進(jìn)行Booth編碼后將編碼值neg取反,得到新的Booth編碼值neg_new;然后使用neg_new產(chǎn)生部分積,因?yàn)锽ooth編解碼的關(guān)鍵路徑是編碼值b1/b2所在路徑,產(chǎn)生Neg_new并不影響關(guān)鍵路徑的長(zhǎng)度;乘累減操作中進(jìn)行無(wú)符號(hào)數(shù)乘法時(shí),通過(guò)操作數(shù)預(yù)處理單元將被乘數(shù)的低m位取反加1,結(jié)果是m+1位,然后與乘數(shù)的最高位產(chǎn)生最后部分積的低m+1位,其余部分積產(chǎn)生單元產(chǎn)生最后部分積的其他位以及其他的部分積,最后部分積的其他位與最后部分積的低m+1位合并成最后部分積;由于取反加1操作不影響關(guān)鍵路徑的長(zhǎng)度,不會(huì)影響壓縮樹(shù)的邏輯長(zhǎng)度。因此本實(shí)施例的定點(diǎn)乘累加器,既可實(shí)現(xiàn)乘累加功能,又可實(shí)現(xiàn)乘累減功能,且不增加乘累加器的延時(shí)。
如果既需要實(shí)現(xiàn)乘累加/減功能,又需要實(shí)現(xiàn)定點(diǎn)整數(shù)/小數(shù)乘法功能,則可在本實(shí)施例中設(shè)置左移邏輯單元,左移邏輯單元將被乘數(shù)處理后,輸出數(shù)據(jù)至操作數(shù)預(yù)處理單元、Booth譯碼/部分積產(chǎn)生單元,產(chǎn)生部分積。左移邏輯單元的詳細(xì)說(shuō)明可參照實(shí)施例一。
實(shí)施例三、溢出判斷功能:
在現(xiàn)有技術(shù)的小數(shù)乘法中,當(dāng)兩個(gè)-1相乘時(shí),在乘法結(jié)果得出之后進(jìn)行飽和選擇處理(溢出處理),其缺點(diǎn)是增加了關(guān)鍵路徑的長(zhǎng)度。
針對(duì)上述問(wèn)題,若乘累加器需要在累加前對(duì)乘法結(jié)果自動(dòng)飽和,則添加操作數(shù)判斷邏輯,當(dāng)兩個(gè)操作數(shù)均是-1的情況下才會(huì)溢出,因此,本實(shí)施例提出了一種乘累加器,主要包括Booth編碼單元、Booth譯碼/部分積產(chǎn)生單元、溢出判斷單元1001、壓縮樹(shù)、壓縮器、累加器、加法器等,參見(jiàn)圖9所示,在不增加關(guān)鍵路徑長(zhǎng)度的基礎(chǔ)上實(shí)現(xiàn)乘累加功能和溢出判斷功能。
溢出判斷單元1001用于判斷在進(jìn)行小數(shù)乘法時(shí)的乘數(shù)和被乘數(shù)是否均為-1,若乘數(shù)和被乘數(shù)均為1,則輸出溢出信號(hào)overflow至壓縮樹(shù),修改壓縮樹(shù)。
在乘累加操作且接收到溢出信號(hào)時(shí),壓縮樹(shù)將部分積中權(quán)重最低的1出現(xiàn)的位清零,然后將低于該權(quán)重的每一位加1。
也就是說(shuō),在部分積中,找出權(quán)重最低的1出現(xiàn)的位置(假設(shè)位于權(quán)重w),將該位清零,該位直接參與第二級(jí)壓縮,并將低于權(quán)重w的每一位加1。若權(quán)重最低的1出現(xiàn)的位涉及有多個(gè)部分積,則將其中一個(gè)部分積的該位清零;將所有部分積中低于該權(quán)重w的每一位加1。
將低于權(quán)重w的每一位加1的實(shí)現(xiàn)方法有多種。
方法一:使用溢出信號(hào)將某一位置成1。
在具有相同的權(quán)重的部分積位中選取一位,使用溢出信號(hào)將低于該權(quán)重w的所有選取位置成1。
方法二:如果在低于權(quán)重w的壓縮樹(shù)中,存在半加器,則將溢出信號(hào)參與壓縮,并將半加器改為全加器。
方法三:如果低于權(quán)重w的某一權(quán)重的部分積壓縮結(jié)果早于關(guān)鍵路徑得出,則可以直接使用溢出信號(hào)置位壓縮結(jié)果為1。即在具有相同的權(quán)重的部分積位中選取已經(jīng)得到壓縮結(jié)果的一位,使用溢出信號(hào)將低于該權(quán)重w的所有選取位置成1。
方法一中的選取位進(jìn)行置位之后仍然需要參與壓縮樹(shù)中的某一級(jí)的壓縮,方法三中的選取位進(jìn)行置位后,直接進(jìn)入后面的壓縮器與累加器進(jìn)行操作。
前兩種方法適用于權(quán)重較高的位,后一種方法適用于權(quán)重較低的位。上述壓縮樹(shù)的修改均是在非關(guān)鍵路徑上修改,不增加關(guān)鍵通路的長(zhǎng)度。在使用修改后的壓縮樹(shù)壓縮完成之后,若判定為飽和,則可得到飽和值。
例如,在16位乘法中,如圖5所述,當(dāng)0x8000與0x8000相乘時(shí),部分積中權(quán)重最低的“1”位于部分積7的最低位或其對(duì)應(yīng)的“加1”位(權(quán)重14)。所以壓縮樹(shù)修改主要針對(duì)權(quán)重14至權(quán)重0:
使用溢出信號(hào)將權(quán)重14的“加1”位清零,清零結(jié)果參與第二級(jí)的壓縮。
使用溢出信號(hào)將權(quán)重13中某一位不參與第一級(jí)壓縮的值置位成1(采用方法一)。
在權(quán)重12中,使用溢出信號(hào)參與第二級(jí)壓縮,所以權(quán)重12中第二級(jí)壓縮器中某個(gè)半加器使用全加器代替(采用方法二)。
在權(quán)重11至權(quán)重0中,無(wú)需全部的壓縮級(jí)即可得到壓縮結(jié)果,使用溢出信號(hào)將壓縮結(jié)果的某一位置位(采用方法三)。
按上述方法,即可得到,壓縮樹(shù)得到的兩個(gè)壓縮結(jié)果的和即是飽和值0x7FFF_FFFF。
上述壓縮樹(shù)的修改并沒(méi)有修改和影響關(guān)鍵路徑上的壓縮邏輯,所以不會(huì)增加壓縮樹(shù)的延時(shí)。
本實(shí)施例的Booth編碼單元、Booth譯碼/部分積產(chǎn)生單元、壓縮器、累加器、加法器的結(jié)構(gòu)與實(shí)施例一相同,可參照實(shí)施例一的描述,此處不再贅述。
本實(shí)施例的乘累加器,通過(guò)溢出判斷單元判斷乘數(shù)和被乘數(shù)是否均為-1,在乘數(shù)和被乘數(shù)均為1時(shí)輸出溢出信號(hào)overflow至壓縮樹(shù);在乘累加操作且接收到溢出信號(hào)時(shí),壓縮樹(shù)將部分積中權(quán)重最低的1出現(xiàn)的位清零,然后將低于該權(quán)重的每一位加1;由于壓縮樹(shù)的修改并沒(méi)有影響關(guān)鍵路徑上的壓縮邏輯,不增加關(guān)鍵路徑長(zhǎng)度,所以不會(huì)增加壓縮樹(shù)的延時(shí),從而在不增加乘累加器延時(shí)的基礎(chǔ)上實(shí)現(xiàn)乘累加功能和溢出判斷功能。
如果既需要實(shí)現(xiàn)乘累加/減功能,又需要實(shí)現(xiàn)自動(dòng)飽和功能(溢出判斷功能),則對(duì)上述方案再進(jìn)行改進(jìn):在判斷是否溢出的同時(shí)確定溢出加或溢出減;若是溢出且當(dāng)前是加操作,則按照上述方案對(duì)壓縮樹(shù)進(jìn)行修改,若是溢出且當(dāng)前是減操作,則不對(duì)上述方案中除了權(quán)重0之外的權(quán)重位進(jìn)行修改,只保留最低位的修改即可。也就是說(shuō),在乘累減操作且接收到溢出信號(hào)時(shí),壓縮樹(shù)將部分積中權(quán)重為0的其中一位修改為1;且乘累減的功能實(shí)現(xiàn)參照實(shí)施例二中的描述,此處不再贅述。
如果既需要實(shí)現(xiàn)自動(dòng)飽和功能(溢出判斷功能),又需要實(shí)現(xiàn)定點(diǎn)整數(shù)/小數(shù)乘法功能,則可在本實(shí)施例中設(shè)置左移邏輯單元,左移邏輯單元將被乘數(shù)處理后,輸出數(shù)據(jù)至Booth譯碼/部分積產(chǎn)生單元,產(chǎn)生部分積。左移邏輯單元的詳細(xì)說(shuō)明可參照實(shí)施例一。
實(shí)施例四、定點(diǎn)整數(shù)/小數(shù)乘法功能、乘累加/減功能、溢出判斷功能:
為了既實(shí)現(xiàn)定點(diǎn)整數(shù)/小數(shù)乘法功能,又實(shí)現(xiàn)乘累加/減功能,同時(shí)實(shí)現(xiàn)溢出判斷功能,且不增加乘累加器延時(shí),本實(shí)施例提出了一種乘累加器,主要包括溢出判斷單元1001、Booth編碼單元、左移邏輯單元、操作數(shù)預(yù)處理單元、Booth譯碼/部分積產(chǎn)生單元、壓縮樹(shù)、壓縮器、累加器、加法器等,參見(jiàn)圖10所示。
左移邏輯單元,用于當(dāng)被乘數(shù)為小數(shù)時(shí),被乘數(shù)左移一位、低位補(bǔ)零;當(dāng)被乘數(shù)為整數(shù)時(shí),被乘數(shù)不移位,被乘數(shù)有符號(hào)時(shí)高位符號(hào)擴(kuò)展一位(0或1,根據(jù)符號(hào)而定),否則補(bǔ)零。具體可參照實(shí)施例一的說(shuō)明。
Booth編碼單元,用于對(duì)乘數(shù)進(jìn)行Booth編碼;當(dāng)進(jìn)行乘累減操作時(shí),Booth編碼單元對(duì)乘數(shù)進(jìn)行Booth編碼后將編碼值neg取反,得到新的Booth編碼值neg_new;然后使用neg_new產(chǎn)生部分積。具體可參照實(shí)施例二的說(shuō)明。
操作數(shù)預(yù)處理單元,當(dāng)進(jìn)行乘累減操作時(shí),用于將左移邏輯單元輸出數(shù)據(jù)的低m位取反加1。具體可參照實(shí)施例二的說(shuō)明。
Booth譯碼/部分積產(chǎn)生單元,包括最后部分積低位產(chǎn)生單元和其余部分積產(chǎn)生單元;最后部分積低位產(chǎn)生單元,用于根據(jù)操作數(shù)預(yù)處理單元的輸出數(shù)據(jù)和乘數(shù)的最高位產(chǎn)生最后部分積的低m+1位;其余部分積產(chǎn)生單元,用于根據(jù)Booth編碼單元產(chǎn)生的編碼和左移邏輯單元輸出的數(shù)據(jù)產(chǎn)生最后部分積的其他位以及其他的部分積;最后部分積的其他位和最后部分積的低m+1位合并成最后部分積。具體可參照實(shí)施例二的說(shuō)明。
溢出判斷單元1001用于判斷在進(jìn)行小數(shù)乘法時(shí)的乘數(shù)和被乘數(shù)是否均為-1,若乘數(shù)和被乘數(shù)均為1,則輸出溢出信號(hào)overflow至壓縮樹(shù),修改壓縮樹(shù)。
在乘累加操作且接收到溢出信號(hào)時(shí),壓縮樹(shù)將部分積中權(quán)重最低的1出現(xiàn)的位清零,然后將低于該權(quán)重的每一位加1;在乘累減操作且接收到溢出信號(hào)時(shí),壓縮樹(shù)將部分積中權(quán)重為0的位修改為1。具體可參照實(shí)施例三的說(shuō)明。
壓縮器、累加器、加法器的結(jié)構(gòu)和原理參照實(shí)施例一的描述,此處不再贅述。
本實(shí)施例的定點(diǎn)乘累加器,既實(shí)現(xiàn)定點(diǎn)整數(shù)/小數(shù)乘法功能,又實(shí)現(xiàn)乘累加/減功能,同時(shí)實(shí)現(xiàn)溢出判斷功能,且不增加乘累加器延時(shí)。
以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其進(jìn)行限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明所要求保護(hù)的技術(shù)方案的精神和范圍。