原碼乘法,原碼乘法原理詳解
1.人工算法與機器算法的同異性
在定點計算機中,兩個原碼表示的數相乘的運算規則是:乘積的符號位由兩數的符號位按異或運算得到,而乘積的數值部分則是兩個正數相乘之積。
設n位被乘數和乘數用定點小數表示(定點整數也同樣適用)
被乘數 [x]原=xf .xn-1…x1x0
乘數 ? [y]原=yf .yn-1…y1y0
則乘積
[z]原=(xf⊕yf)+(0.xn-1…x1x0)(0.yn-1…y1y0)??? (2.26)
式中,xf為被乘數符號,yf為乘數符號。
乘積符號的運算法則是:同號相乘為正,異號相乘為負。由于被乘數和乘數和符號組合只有四種情況(xfyf=00,01,10,11),因此積的符號可按“異或”(按位加)運算得到。
數值部分的運算方法與普通的十進制小數乘法類似,不過對于用二進制表達式的數來說,其乘法規則更為簡單一些。
設x=0.1101,y=0.1011.讓我們先用習慣方法求其乘積,其過程如下:
運算的過程與十進制乘法相似:從乘數y的最低位開始,若這一位為“1”,則將被乘數x寫下;若這一位為“0”,則寫下全0。然后在對乘數y的最高為進行乘法運算,其規則同上,不過這一位乘數的權與最低位乘數的權不一樣,因此被乘數x要左移一位。以此類推,直到乘數個位乘完為止,最后將它們統統加起來,變得到最后乘積z。
如果被乘數和乘數用定點整數表示,我們也會得到同樣的結果。
人們習慣的算法對機器并不完全適用。原因之一,機器通常只有n位長,兩個n位數相乘,乘積可能為2n位。原因之二,只有兩個操作數相加的加法器難以勝任將各n位積一次相加起來的運算。早期計算機中為了簡化硬件結構,采用串行的1位乘法方案,即多次執行“加法—移位”操作來實現。這種方法并不需要很多器件。然而串行方法畢竟太慢,自從大規模集成電路問世以來,出現了各種形式的流水式陣列乘法器,它們屬于并行乘法器。
圖2.4 m×n位不帶符號的陣列乘法器邏輯圖
2.不帶符號的陣列乘法器
設有兩個不帶符號的二進制整數:
A=am-1…a1a0
B=bn-1…b1b0
它們的數值分別為a和b,即
???
在二進制乘法中,被乘數A與乘數B相乘,產生m+n位乘積P:
P=pm+n-1…p1p0
乘積P 的數值為
???
實現這個乘法過程所需要的操作和人們的習慣方法非常類似:
上述過程說明了在m位乘n位不帶符號整數的陣列乘法中,“加法—移位”操作的被加數矩陣。每一個部分乘積項(位積)aibj叫做一個被加數。
這m×n個被加數{aibj|0≤i≤m-1和0≤j≤n-1}
可以用m×n個“與”門并行地產生。顯然,設計高速并行乘法器的基本問題,就在于縮短被加數矩陣中每列所包含的1的加法時間。
這種乘法器要實現n位×n位時,需要n(n-1)個全加器和n2個“與”門。該乘法器的總的乘法時間可以估算如下:
令Ta為“與門”的傳輸延遲時間,Tf為全加器(FA)的進位傳輸延遲時間,假定用2級“與非”邏輯來實現FA的進位鏈功能,那么我們就有:
Ta = Tf = 2T
從演示中可知,最壞情況下延遲途徑,即是沿著矩陣P4垂直線和最下面的一行。因而得n位×n位不帶符號的陣列乘法器總的乘法時間為:
tm=Ta+(n-1)×6T+(n-1)×Tf
=2T+(n-1)×6T+(n-1)×2T=(8n-6)T (2.27)
[例16] 已知兩個不帶符號的二進制整數A=11011,B=10101,求每一部分乘積項aibj的值與p9p8……p0的值。
[解:]
???
a4b0=1 a3b0=1 a2b0=0 a1b0=1 a0b0=1
a4b1=0 a3b1=0 a2b1=0 a1b1=0 a0b1=0
a4b2=1 a3b2=1 a2b2=0 a1b2=1 a0b2=0
a4b3=0 a3b3=0 a2b3=0 a1b3=0 a0b3=0
a4b4=1 a3b4=1 a2b4=0 a1b4=1 a0b4=1
P=p9p8p7p6p5p4p3p2p1p0=1000110111(56710)
3.帶符號的陣列乘法器
(1) 對2求補器電路
我們先來看看算術運算部件設計中經常用到的求補電路。一個具有使能控制的二進制對2求補器電路圖,其邏輯表達式如下:
C-1=0, Ci=ai+Ci-1
ai*=ai⊕ECi-1, 0≤i≤n
在對2求補時,要采用按位掃描技術來執行所需要的求補操作。令A=an…a1a0是給定的(n+1)為帶符號的數,要求確定它的補碼形式。進行求補的方法就是從數的最右端a0開始,,由右向左,直到找出第一個“1”,例如ai=1, 0≤i≤n。這樣,ai以左的每一個輸入位都求反,即1變0,0變1。最右端的起始鏈式輸入C-1必須永遠置成“0”。當控制信號線E為“1”時,啟動對2求補的操作。當控制信號線E為“0”時,輸出將和輸入相等。顯然,我們可以利用符號位來作為控制信號。
例如,在一個4位的對2求補器中,,如果輸入數為1010,那么輸出數應是0110,其中從右算起的第2位,就是所遇到的第一個“1”的位置。用這種對2求補器來轉換一個(n+1)為帶符號的數,所需的總時間延遲為
tTC=n·2T+5T=(2n+5)T (2.28)
其中每個掃描級需2T延遲,而5T則是由于“與”門和“異或”門引起的。
(2) 帶符號的陣列乘法器
(n+1)×(n+1)位帶求補器的陣列乘法器邏輯方框圖
通常,把包括這些求補級的乘法器又稱為符號求補的陣列乘法器。在這種邏輯結構中,共使用三個求補器。其中兩個算前求補器的作用是:將兩個操作數A和B在被不帶符號的乘法陣列(核心部件)相乘以前,先變成正整數。而算后求補器的作用則是:當兩個輸入操作數的符號不一致時,把運算結果變成帶符號的數。
設A=anan-1…a1a0和B=bnbn-1…b1b0均為用定點表示的(n+1)位帶符號整數。在必要的求補操作以后,A和B的碼值輸送給n×n位不帶符號的陣列乘法器,并由此產生2n位真值乘積:
A·B=P=p2n-1…p1p0
p2n=an⊕bn
其中P2n為符號位。
上面所示的帶求補級的陣列乘法器既適用于原碼乘法,也適用于間接的補碼乘法。不過在原碼乘法中,算前求補和算后求補都不需要,因為輸入數據都是立即可用的。而間接的補碼陣列乘法所需要增加的硬件較多。為了完成所必需的乘法操作,時間大約比原碼陣列乘法增加1倍。
[例17] 設x=+15,y=-13,用帶求補器的原碼陣列乘法器求出乘積x·y=?
[解:]
設最高位為符號位,則輸入數據為
[x]原=01111 [y]原=11101
符號位單獨考慮,算前求補級后 |x|=1111,|y|=1101
算后經求補級輸出并加上乘積符號位1,則原碼乘積值為111000011。
換算成二進制數真值是
x·y=( -11000011)2=(-195)10
十進制數驗證:x×y = 15× (-13) = -195相等。
[例18] 設x=+15,y=-13,用帶求補器的補碼陣列乘法器求出乘積x·y=?
[解:]
設最高位為符號位,則輸入數據用補碼表示為
[x]補=01111 [y]補=10011
符號位單獨運算,x0⊕y0=0+1=1
尾數部分算前求補器輸出為: |x|=1111,|y|=1101
算后求補器輸出為00111101,加符號位1,得
[x·y]補=100111101
補碼二進制數真值是
x·y=-1×28+1×25+1×24+1×23+1×22+1×20=(-195)10
十進制數驗證:???? x×y=(+15)×(-13)=-195相等。
非常好我支持^.^
(83) 31%
不好我反對
(185) 69%
相關閱讀:
( 發表人:admin )