原碼一位乘法的實現演算法(一)
用原碼實現乘法運算是十分方便的。原碼表示的兩個數相乘,其乘積的符號為相乘兩數符號的異或值,數值則為兩數絕對值之積。
假定 [x]原 = xsx1 x2… xn
[y]原 = ysy1y2… yn
則 [x*y]原 = [x]原 * [y]原
= (xs⊕ys) (x1x2 … xn) * (y1 y2 … yn)
結果是把符號位和數值鄰接起來。
為了引出在計算機中實現定點原碼一位乘法的具體方案,先看手工乘法運算的實際執行步驟。
假定: x= 0.1101 y= 0.1011
0. 1 1 0 1
* 0. 1 0 1 1
1 1 0 1 x*y = 0.10001111,符號為正
1 1 0 1
0 0 0 0
1 1 0 1
0. 1 0 0 0 1 1 1 1
在手工計算時,其演算法與執行步驟:
① 依乘數每一位上的取值為1還是為0,決定相加數取被乘數的值還是取零值;
② 各相加數從乘數的最低位求起,逐位變高並將相加數逐個左移一位,最後一步一次求和;
③ 符號位按正乘正、負乘負結果的符號位為正,正乘負、負乘正結果的符號為負的方案求出乘積的符號。
在計算機內實現原碼乘法運算,則不能簡單照搬上述方法,主要表現在以下諸方面。
首先,在運算器內是很難實現多個資料同時相加的,通常只能完成對兩數的求和操作。這一點比較容易解決,可以每求得乙個相加數,就同時完成與上一次部分積相加的操作;
其次是在手工計算時,各相加數逐個左移一位,最終相加數的位數為相乘二數字數的兩倍,而在計算機中,加法器的位數一般與暫存器的位數相同,而不是暫存器位數的兩倍。這實際上也可以用另外的辦法加以解決。手工計算時,各相加數是逐位左移一位,但很容易發現,在計算機內,在每次計算本次部分積之和時,前一次部分積的最低一位是不再參與相加計算的。這就意味著,若採用每求得一次部分積之後使其右移一位,則可以只用n位的加法器就能實現兩個n位的數相乘,並有可能求得雙倍位數的乘積。顯而易見,若前一次部分積已經右移一位,就可以用其高位部分,再用加被乘數或加零的方法求得本次的部分積。
最後一點,手工計算時,乘數每一位的值是0還是1都能直接看見,而在計算機內,若採用放乘數的暫存器的每一位來直接決定本次相加數是被乘數還是零,實現起來是不方便的,若均採用該暫存器的最低一位來執行這種判別就簡便多了。為此,可以在每求一次部分積,使放乘數的暫存器執行一次右移操作即可實現。若移位時,使其最高一位數值位接收加法器最低位的移位輸出,則完成乘法運算後,該暫存器中儲存的將是乘積的低位部分,而原來的乘數在逐位移位過程中已經丟失。
計算機內求乘積的符號,很容易用求相乘二數符號的半加和(異或值)實現。
有了上述說明,我們就可以得到如圖2.6所示的實現原碼一位乘法的邏輯電路框圖。
圖2.6 實現原碼一位乘法運算的邏輯線路框圖
乘法開始時,a暫存器被清為零,作為初始部分積。被乘數放在b暫存器中,乘數放在c暫存器中。實現部分積和被乘數相加是通過給出a→f命令和b→f命令實現的,部分積右移一位送a暫存器是通過把 f右斜一位的命令f/2→a來控制完成的,用f a命令完成把運算器的輸出直接(不移位)送到a暫存器。
c暫存器是用移位暫存器實現的,本身能在移位命令c/2→c控制下自行移位,其最低位的值可用作b→f的控制命令。請注意,加法器最低一位的值,右移時將移入c暫存器的最高數值位,使相乘之積的低位部分儲存進c暫存器中,原來的乘數在逐位右移過程中丟失了。
圖上還給出了乙個計數器t,用來控制逐位相乘的次數。它的初值經常放乘數字數的補碼值,以後每完成一位乘計算就使其計數一次,待計數到0時,給出結束乘運算的控制訊號。
圖上未畫出求結果的符號的電路,可以通過對相乘兩數的符號執行異或操作完成。
原碼一位乘法的實現演算法(二)
用原碼實現乘法運算是十分方便的。原碼表示的兩個數相乘,其乘積的符號為相乘兩數符號的異或值,數值則為兩數絕對值之積。
下面是恢復餘數除法的乙個例子。
假定 x=0.1011 , y=0.1101, 則有 [x]補 = 00 1011
[y]補 = 00 1101 , [-y]補 = 11 0011
除法計算結束,二數符號異或為0,商是 +0.1101,餘數為0.0111 * 2-4 ,餘數0111是左移4次後得到的結果,所以真正的結果為這個值乘上2-4。若最後一次的餘數為負,正確的餘數應為 +y 恢復後的正餘數乘上2-4 。
這種方法的缺點是明顯的,當某一次 -y的差值為負時,要多一次+y恢復正餘數的操作,降低了執行速度,又使控制線路變得複雜,因此在計算機中很少採用。在計算機中普遍採用的是不恢復餘數的除法方案,它是對恢復餘數除法的一種修正措施,即當某一次減得的差值為負時,不是恢復它為正差值後再繼續運算,而是設法直接用這個負的差值直接求下一位商,其實現原理敘述如下:
在恢復餘數的除法運算中,若第i-1次求商時的餘數為 +ri-1 ,本次上商為1,下一次求商用的辦法是
ri= 2ri-1 - y
當ri < 0時,第i位的商上0,而恢復餘數的操作結果應為ri + y,下一次,即第i+1次求商的減法操作是
ri+1= 2 (ri+ y ) - y = 2 ri + 2y - y = 2ri+ y
上述公式表明,當某一次求商,其減得的差值為負,即r<0時,本次上商為0,繼續求下一位商時,可以不必恢復正餘數,而是直接將負的差值左移一位(得2r)後,再採用加上除數的辦法來完成,即通過判別2r+y運算的結果為正還是為負。由此可得出不恢復餘數的除法運算規則為:
當餘數為正時,商上1,求下一位商的辦法,是正餘數左移一位,用減去除數的辦法得到;
餘數為負時,商上0,求下一位商的辦法,是負餘數左移一位,用加上除數的辦法得到。即在本方案中,在求得本位商值的同時,還要影響到用減去還是用加上除數的操作繼續求下一位商,所以不恢復餘數除法又叫加減交替除法。
下面給出不恢復餘數除法執行除運算過程的乙個例子。用的還是x=0.1011,y=0.1101這兩個值, [x]補 = 00 1011 , [y]補 = 00 1101 , [-y]補 = 11 0011。
運算結果,商的數值位為1101,符號位為相除二數符號的異或值0,結果為+0.1101。
原碼一位除的不恢復餘數的運算過程的詳細控制流程如圖2.9所示。
圖2.9 不恢復餘數除法的運算的控制過程
至此,我們可把定點原碼一位除的實現方案小結如下:
(1) 對定點小數除法,首先要比較除數和被除數的絕對值的大小,需要防止出現數值溢位的錯誤。
(2) 商的符號為相除二數的符號的半加和。
(3) 計算機中用加減交替法實現除法運算時,被除數的位數可以是除數的兩倍,其低位的數值部分,開始時放在用於儲存商的暫存器中。運算過程中,放被除數和商的暫存器同時左移一位。
(4) 在計算機中,求差和移位是在同乙個操作步驟中完成的,而不是像我們書面寫的那種形式用兩個步驟完成。
原碼一位乘法
1.手算乘法 鋪墊 例子 13 11 143 被乘數不動,從乘數最低位開始,每一位乘上被乘數,將所得的結果 部分積 記下,再從比最低位高一位的數字開始如上迴圈,直至乘數的最高位也計算完畢。最終將每一豎列的數值相加即可得出結果。按照我們小學所學的乘法計算公式應該如上圖所示沒有問題,我們教科書裡說的原碼...
原碼一位乘法和補碼一位乘法
原碼乘法遵循的規則如下 比如 a 0.1101,b 0.1011,求a b的積?詳細計算過程如下圖 符號位與符號進行計算.a的符號位為 1,b的符號位為 1.兩個符號進行異或運算最後的符號仍然是 1.數值位乘以數值位.a 0.1101,b 0.1011.我們採用雙符號位來進行計算.a 00.1101...
FPGA 設計乙個原碼一位乘法器
一 運算規則 x y p 引入部分積的概念,每次y的一位和x相乘的結果叫做部分積 每次相乘後需要右移一位,再處理y下一位的數值 1.符號位單獨計算 異或運算 符號組合就4種 00.01.11.10 異或運算即相同為0,不同為1 2.被乘數x 和乘數y 都取絕對值計算 3.一般把被乘數x取雙符號位,並...