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