Booth乘法器设计
生活随笔
收集整理的這篇文章主要介紹了
Booth乘法器设计
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 乘法器原理
在計(jì)算兩個(gè)補(bǔ)碼相乘時(shí),可以通過Booth算法來實(shí)現(xiàn)定點(diǎn)補(bǔ)碼一位乘的功能。布斯(Booth)算法采用相加和相減的操作計(jì)算補(bǔ)碼數(shù)據(jù)的乘積,Booth算法對乘數(shù)從低位開始判斷,根據(jù)后兩個(gè)數(shù)據(jù)位的情況決定進(jìn)行加法、減法還是僅僅進(jìn)行移位操作。討論當(dāng)相乘的兩個(gè)數(shù)中有一個(gè)或二個(gè)為負(fù)數(shù)的情況,在討論補(bǔ)碼乘法運(yùn)算時(shí),對被乘數(shù)或部分積的處理上與原碼乘法有某些類似,差別僅表現(xiàn)在被乘數(shù)和部分積的符號(hào)位要和數(shù)值一起參加運(yùn)算。
Booth乘法規(guī)則如下:
假設(shè)X、Y都是用補(bǔ)碼形式表示的機(jī)器數(shù),[X]補(bǔ)和[Y]補(bǔ)=Ys.Y1Y2…Yn,都是任意符號(hào)表示的數(shù)。比較法求新的部分積,取決于兩個(gè)比較位的數(shù)位,即Yi+1Yi的狀態(tài)。
首先設(shè)置附加位Yn+1=0,部分積初值[Z0]補(bǔ)=0。
當(dāng)n≠0時(shí),判斷YnYn+1,
若YnYn+1=00或11,即相鄰位相同時(shí),上次部分積右移一位,直接得部分積。
若YnYn+1=01,上次部分積加[X]補(bǔ),然后右移一位得新部分積。
若YnYn+1=10,上次部分積加[-X]補(bǔ),然后右移一位得新部分積。
當(dāng)n=0時(shí),判YnYn+1(對應(yīng)于Y0Y1),運(yùn)算規(guī)則同(1)只是不移位。即在運(yùn)算的最
后一步,乘積不再右移。
2. 設(shè)計(jì)思想
程序首先進(jìn)行判0操作,如果乘數(shù)中有一個(gè)或兩個(gè)為0,則直接輸出結(jié)果0,否則進(jìn)入程序主體。程序主體分成三個(gè)判斷模塊進(jìn)行,當(dāng)乘數(shù)最低位與次低位值相等時(shí),先將乘數(shù)右移一位,再將原部分累加和右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為1,0時(shí),將原部分累加和加上被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為0,1時(shí),將原部分累加和減去被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1。每次比較一次乘數(shù)的最末兩位,進(jìn)行相應(yīng)運(yùn)算后,共循環(huán)4次。循環(huán)結(jié)束后,再進(jìn)行一次判斷,如果乘數(shù)最低位與次低位分別為1、0,將原部分累加和加上被乘數(shù)X補(bǔ)。如果乘數(shù)最低位與次低位分別為0、1,將原部分累加和減去被乘數(shù)X補(bǔ)。此時(shí),最終累加和就是乘積的高位結(jié)果,取乘數(shù)的高四位作為低位結(jié)果,拼接即為最終乘法結(jié)果。
3. 程序設(shè)計(jì)
module Multiplication(Mx,My,Mout);//補(bǔ)碼一位乘法模塊input [5:0]Mx,My;//定義六位數(shù)輸入,其中前兩位為符號(hào)位 output reg [9:0]Mout;//定義九位數(shù)輸出,其中前兩位為符號(hào)位 reg [5:0] a;//a寄存器存放部分積累加和 reg [5:0] b,c;//b寄存器存放補(bǔ)碼表示的被乘數(shù),c寄存器存放補(bǔ)碼表示的乘數(shù) reg [3:0] n;//n作為臨時(shí)變量,用來存放循環(huán)次數(shù) reg p,q;//p用于負(fù)數(shù)移位補(bǔ)1操作,q用于存放添加的附加位Cn+1,初始化為0always @ (Mx,My) beginif((Mx==0)||(My==0))Mout=0;elsebegina=6'b000000;n=4'b1111;p=1'b1;q=1'b0;b=Mx;c=My;c={c[4:0],q};while(n)beginn=n>>1;if(((c[0]==0)&&(c[1]==0))||((c[0]==1)&&(c[1]==1)))//如果Cn+1和Cn同為0或1,則只進(jìn)行移位beginc=c/2;//除2表示右移一位c[5]=a[0];//高位由部分累加和的低位補(bǔ)充a=a/2;if(a[4]==1)a={p,a[4:0]};//累加和的最高位保持不變(此時(shí)補(bǔ)1)elsea=a;//不進(jìn)行任何操作,默認(rèn)高位補(bǔ)0endelse if((c[0]==1)&&(c[1]==0))//如果Cn=0,Cn+1=1,則先加上被乘數(shù)的補(bǔ)碼,再移位begina=a+b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endelse if((c[0]==0)&&(c[1]==1))//如果Cn=1,Cn+1=0,則先減去被乘數(shù)的補(bǔ)碼,再移位begina=a-b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endend//四次循環(huán)后,進(jìn)行最后一步,此步不移位,用來處理符號(hào)位if((c[0]==1)&&(c[1]==0))begina=a+b;endelse if((c[0]==0)&&(c[1]==1))begina=a-b;endMout={a,c[5:2]};end end endmodule 4. 設(shè)計(jì)驗(yàn)證
例:已知X=0.1010,Y=-0.1101,求X*Y:
1. 兩數(shù)用補(bǔ)碼表示 X補(bǔ)=00.1010 Y補(bǔ)=11.0011 -X補(bǔ)=11.0110
2. 設(shè)置輸入為001010和110011
在計(jì)算兩個(gè)補(bǔ)碼相乘時(shí),可以通過Booth算法來實(shí)現(xiàn)定點(diǎn)補(bǔ)碼一位乘的功能。布斯(Booth)算法采用相加和相減的操作計(jì)算補(bǔ)碼數(shù)據(jù)的乘積,Booth算法對乘數(shù)從低位開始判斷,根據(jù)后兩個(gè)數(shù)據(jù)位的情況決定進(jìn)行加法、減法還是僅僅進(jìn)行移位操作。討論當(dāng)相乘的兩個(gè)數(shù)中有一個(gè)或二個(gè)為負(fù)數(shù)的情況,在討論補(bǔ)碼乘法運(yùn)算時(shí),對被乘數(shù)或部分積的處理上與原碼乘法有某些類似,差別僅表現(xiàn)在被乘數(shù)和部分積的符號(hào)位要和數(shù)值一起參加運(yùn)算。
Booth乘法規(guī)則如下:
假設(shè)X、Y都是用補(bǔ)碼形式表示的機(jī)器數(shù),[X]補(bǔ)和[Y]補(bǔ)=Ys.Y1Y2…Yn,都是任意符號(hào)表示的數(shù)。比較法求新的部分積,取決于兩個(gè)比較位的數(shù)位,即Yi+1Yi的狀態(tài)。
首先設(shè)置附加位Yn+1=0,部分積初值[Z0]補(bǔ)=0。
當(dāng)n≠0時(shí),判斷YnYn+1,
若YnYn+1=00或11,即相鄰位相同時(shí),上次部分積右移一位,直接得部分積。
若YnYn+1=01,上次部分積加[X]補(bǔ),然后右移一位得新部分積。
若YnYn+1=10,上次部分積加[-X]補(bǔ),然后右移一位得新部分積。
當(dāng)n=0時(shí),判YnYn+1(對應(yīng)于Y0Y1),運(yùn)算規(guī)則同(1)只是不移位。即在運(yùn)算的最
后一步,乘積不再右移。
2. 設(shè)計(jì)思想
程序首先進(jìn)行判0操作,如果乘數(shù)中有一個(gè)或兩個(gè)為0,則直接輸出結(jié)果0,否則進(jìn)入程序主體。程序主體分成三個(gè)判斷模塊進(jìn)行,當(dāng)乘數(shù)最低位與次低位值相等時(shí),先將乘數(shù)右移一位,再將原部分累加和右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為1,0時(shí),將原部分累加和加上被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為0,1時(shí),將原部分累加和減去被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1。每次比較一次乘數(shù)的最末兩位,進(jìn)行相應(yīng)運(yùn)算后,共循環(huán)4次。循環(huán)結(jié)束后,再進(jìn)行一次判斷,如果乘數(shù)最低位與次低位分別為1、0,將原部分累加和加上被乘數(shù)X補(bǔ)。如果乘數(shù)最低位與次低位分別為0、1,將原部分累加和減去被乘數(shù)X補(bǔ)。此時(shí),最終累加和就是乘積的高位結(jié)果,取乘數(shù)的高四位作為低位結(jié)果,拼接即為最終乘法結(jié)果。
3. 程序設(shè)計(jì)
module Multiplication(Mx,My,Mout);//補(bǔ)碼一位乘法模塊input [5:0]Mx,My;//定義六位數(shù)輸入,其中前兩位為符號(hào)位 output reg [9:0]Mout;//定義九位數(shù)輸出,其中前兩位為符號(hào)位 reg [5:0] a;//a寄存器存放部分積累加和 reg [5:0] b,c;//b寄存器存放補(bǔ)碼表示的被乘數(shù),c寄存器存放補(bǔ)碼表示的乘數(shù) reg [3:0] n;//n作為臨時(shí)變量,用來存放循環(huán)次數(shù) reg p,q;//p用于負(fù)數(shù)移位補(bǔ)1操作,q用于存放添加的附加位Cn+1,初始化為0always @ (Mx,My) beginif((Mx==0)||(My==0))Mout=0;elsebegina=6'b000000;n=4'b1111;p=1'b1;q=1'b0;b=Mx;c=My;c={c[4:0],q};while(n)beginn=n>>1;if(((c[0]==0)&&(c[1]==0))||((c[0]==1)&&(c[1]==1)))//如果Cn+1和Cn同為0或1,則只進(jìn)行移位beginc=c/2;//除2表示右移一位c[5]=a[0];//高位由部分累加和的低位補(bǔ)充a=a/2;if(a[4]==1)a={p,a[4:0]};//累加和的最高位保持不變(此時(shí)補(bǔ)1)elsea=a;//不進(jìn)行任何操作,默認(rèn)高位補(bǔ)0endelse if((c[0]==1)&&(c[1]==0))//如果Cn=0,Cn+1=1,則先加上被乘數(shù)的補(bǔ)碼,再移位begina=a+b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endelse if((c[0]==0)&&(c[1]==1))//如果Cn=1,Cn+1=0,則先減去被乘數(shù)的補(bǔ)碼,再移位begina=a-b;c=c/2;c[5]=a[0];a=a/2;if(a[4]==1)a={p,a[4:0]};elsea=a;endend//四次循環(huán)后,進(jìn)行最后一步,此步不移位,用來處理符號(hào)位if((c[0]==1)&&(c[1]==0))begina=a+b;endelse if((c[0]==0)&&(c[1]==1))begina=a-b;endMout={a,c[5:2]};end end endmodule 4. 設(shè)計(jì)驗(yàn)證
例:已知X=0.1010,Y=-0.1101,求X*Y:
1. 兩數(shù)用補(bǔ)碼表示 X補(bǔ)=00.1010 Y補(bǔ)=11.0011 -X補(bǔ)=11.0110
2. 設(shè)置輸入為001010和110011
3. 仿真得結(jié)果為1101111110,即 X*Y補(bǔ)=1101111110,即為-0.0111111
總結(jié)
以上是生活随笔為你收集整理的Booth乘法器设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家一级学会创办的期刊
- 下一篇: 测距仪控制c语言程序,激光测距仪系统设计