1樓:匿名使用者
例:[x]補=0.0101,[y]補=1.0101 求: [x· y]補。
解:求解過程如下表所示。其中乘數取兩位符號位即11.0101,[-x]補=1.1011取三符號位為111.1011。
部分積乘數 說 明
000.0000
+ 000.0101
1101010
判斷位為010,加[x]補
000.0101
000.0001
+ 000.0101
0111010
→2位判斷位為010,加[x]補
000.0110
000.0001
+ 111.1011
011001110
→2位判斷位為110,加[-x]補
111.1100
1001
最後一步不移位,得[x· y]補
故[x· y]補=1.11001001
怎麼理解booth演算法
2樓:
布思演算法(booth
algorithm)的簡單理解方法:
由於是第一次接觸,對於其原理卻一無所知,書上的解釋以及網上的文章不知是自己才疏學淺還本來就是泛泛而談,沒有讓我瞭解其本質。經過長時間的思考分析,最終找到了一種比較簡單的理解方法。
舉一個簡單的例子,比如說計算×,在這裡首先將乘數改寫為 -
即-這樣根據乘法分配律得×=×(0100)
類似於booth演算法的重新編碼形式,再將上述算式改寫為
×=×0+1
+ × -1 0
最終再將上式合併到一起,可得由booth演算法改寫後的編碼形式: × 0+10000-10
由此可見,乘數的數段"01"可以重新編碼為「+1」,數段「10」可以重新編碼為「-1」,數段「11」可重新編碼為「0」
根據無符號二進位制數乘法的過程可知,當乘數段為「00」只是對乘數進行了右移操作,故重新編碼為「0」
由於上述推導過程是根據二進位制數加減以及乘法分配律推導而來的,故對於由補碼錶示的負數乘法同樣適用
booth演算法的證明
3樓:匿名使用者
比較好的帶符號數乘法的方法是布斯(booth)演算法。它採用相加和相減的操作計算補碼資料的乘積。booth演算法對乘數從低位開始判斷,根據兩個資料位的情況決定進行加法、減法還是僅僅移位操作。
判斷的兩個資料位為當前位及其右邊的位(初始時需要增加一個輔助位0),移位操作是向右移動。在上例中,第一次判斷被乘數0110中的最低位0以及右邊的位(輔助位0),得00;所以只進行移位操作;第二次判斷0110中的低兩位,得10,所以作減法操作並移位,這個減法操作相當於減去2a的值;第三次判斷被乘數的中間兩位,得11,於是只作移位操作;第四次判斷0110中的最高兩位,得01,於是作加法操作和移位,這個加法相當於加上8a的值,因為a的值已經左移了三次。
一般而言,設y=y0,yly2…yn為被乘數,x為乘數,yi是a中的第i位(當前位)。根據yj與yi+1的值,booth演算法表示如下表所示,其操作流程如下圖所示。在booth演算法中,操作的方式取決於表示式(yi+1-yi)的值,這個表示式的值所代表的操作為:
0 無操作
+1 加x
-1 減x
booth演算法操作表示
yi yi+1 操作 說明
0 0 無 處於0串中,不需要操作
0 1 加x 1串的結尾
1 0 減x 1串的開始
1 1 無 處於1串中,不需要操作
乘法過程中,被乘數相對於乘積的左移操作可表示為乘以2,每次迴圈中的運算可表示為對於x(yi+1-yi)2^31-i項的加法運算(i=3l,30,…,1,0)。這樣,booth演算法所計算的結果 可表示為:
x×(0-y31)×2^0
+x×(y31-y30)×2^1
+x×(y30-y29)×2^2
…[1] +x×(y1-y0)×2^31
=x×(-y0×231 +y1×2^30 +y2×2^29+y31×2^0)
=x×y
例:用booth演算法計算2×(-3)。
解:[2]補=0010, [-3]補=1101,在乘法開始之前,r0和r1中的初始值為0000和1101,r2中的值為0010。
在乘法的第一個迴圈中,判斷r1的最低位和輔助位為10,所以進入步驟1c,將r0的值減去r2的值,結果1110送人r0,然後進入第二步,將r0和rl右移一位,r0和r1的結果為11110110,輔助位為l。
在第二個迴圈中,首先判斷rl的最低位和輔助位為0l,所以進入步驟1b,作加法,r0+r2=1111+0010,結果0001送入r0,這時r0r1的內容為0001 0110,在第二步右移後變為0000 1011,輔助位為0。
在第三次迴圈中,判斷位為10,進入步驟lc,r0減去r2,結果1110送入r0,r1不變;步驟2移位後r0和r1的內容為1111 01011,輔助位為1。
第四次迴圈時,因兩個判斷位為11,所以不作加減運算,向右移位後的結果為1111 1010,這就是運算結果(—6)。
這個乘法的過程描述如下表所示,表中乘積一欄表示的是r0、r1的內容以及一個輔助位p,黑體字表示對兩個判斷位的判斷。
用booth補碼一位乘法計算2 ×(-3)的過程
迴圈步驟
乘積(r0,r1, p)
0初始值
0000 1101 0
第一次迴圈
1c:減0010
1110 1101 0
2:右移1位
1111 0110 1
第二次迴圈
1b:加0010
0001 0110 1
2:右移1位
0000 1011 0
第三次迴圈
1c:減0010
1110 1011 0
2:右移1位
1111 0101 1
第四次迴圈
1a:無操作
1111 0101 1
2:右移1位
1111 1010 1
4.補碼兩位乘
補碼兩位乘運算規則是根據補碼一位乘的規則,把比較yiyi+1的狀態應執行的操作和比較yi-1yi 的狀態應執行的操作合併成一步,便可得出補碼兩位乘的運算方法。
補碼兩位乘法運算規則如下
判斷位yi-1y iyi+1
操作內容
000[zi+1]補=2-2[zi]補
001[zi+1]補=2-2
010[zi+1]補=2-2
011[zi+1]補=2-2
100[zi+1]補=2-2
101[zi+1]補=2-2
110[zi+1]補=2-2補}
111[zi+1]補=2-2[zi]補
由上表可見,操作中出現加2[x]補和加2[-x]補,故除右移兩位的操作外,還有被乘數左移一位的操作;而加2[x]補和加2[-x]補,都可能因溢位而侵佔雙符號位,故部分積和被乘數採用三位符號位。
例:[x]補=0.0101,[y]補=1.0101 求: [x
verilog編寫改進booth演算法的16*16乘法器佔用硬體資源過多
4樓:匿名使用者
你用的什麼綜合器?fpga還是dc?
綜合工具優化的當然會比你設計的要好,這是毋庸置疑的兄弟。
是否冗餘你可以按照最原始的方法(移位加)設計一個乘法器,對比綜合結果。
用booth演算法計算4x3的4位補碼乘法運算,寫出每一步運算過程及運算結果````急。幫幫忙
5樓:大善勿血
以基2-booth演算法來說,它是對本位及相鄰低位的值進行編碼。n位的乘法運算需要n次編碼。2個n位的數補碼相乘,輸出結果位數為2n。
比如,兩個乘數分別是4位補碼錶示, 0111(7), 1101(3) ——其中,代表輸出結果,r1為被乘數,r2為乘數
r0 r1 p
0000 0111 0 初始
0011 0111 1 r0<=r0-r2
0001 1011 1 右移(第一次迴圈)
0000 1101 1 右移(第二次迴圈)
0000 0110 1 右移(第三次迴圈)
1101 0110 1 r0<=r0+r2
1110 1011 1 右移(第四次迴圈)
結果為 (1110 1011)=(-21)
為什麼我的C語言程式沒有輸出?哪錯了
首先指出你寫的一處錯誤,fun函式沒有返回值。你要麼定義為void,既然定義成int,就要返回資料。可能需要優化下.輸入定義成字串,不必用char陣列,然後如果用while就用while,用for就用for,幹嘛都一起用,大致可以這麼寫 自己定義下變數,另外沒必要把變數定義到和main fun一個級...
按陰曆算我是2023年臘月十九的生日,這個是什麼星座的呀
星座是西方人定置的,按陽曆出生日期來劃分的,你農曆日期對應的陽曆日期是1989年1月26日,這是水瓶座 水瓶座1月20日 2月18日 屬性 風象星座象徵 總有著新奇古怪念頭的革新者個性分析 水瓶座是一個富有開拓精神的人。水瓶座的人思維能力高於本能,是個先鋒派人物。感興趣的不是昨天而是明天。陽曆 公元...
我的是不是鼻子特別塌,爸媽鼻子都塌,我這個算是蒜頭鼻嗎?大家覺的是不是特別塌
不塌,主要是短,顯的跟嘴脣的距離很遠,所以看起來怪怪的,上面說的對,你可以試試高光,可以變得沒那麼明顯 不算吶美妞 試試高光 總覺得鼻子變高了不少 沒有很塌,但從側臉看你的鼻子挺高的,正面看就比較像.我的鼻子是不是有點塌,是不是蒜頭鼻我15歲女孩 上看是有一點朝天鼻,鼻翼有點大,鼻樑也比較低的。但是...