乘法的運算過程
人們日常習慣的乘法是十進制,但計算機實現起來不方便。首先,需要記錄9x9乘法表,每次相乘去表中找結果;其次,將豎式相加也不方便。
但二進制卻十分方便,馮·諾伊曼在《關於ENDVAC的報告草案》中說“二進制可以極大簡化乘法和除法運算。尤其是對於乘法,不再需要十進制乘法表,也不需要兩輪的加法”。
二進制乘法運算過程

觀察這個式子,可以發現我們並不需要乘法表,如果乘數位為0,就在中間過程中全補零,如果乘數位為1,就在中間過程補被乘數。
運算過程的進一步調整
按照上面那種計算的話,需要大量的空間來存儲中間結果,還要用一個空間存儲積。其實,不難發現,每個中間結果最后都加在乘積上,我們可以將中間結果保存在乘積中,每次用中間結果更新乘積,運算結束時,乘積里面放的就是正確的乘積。
上面說直接對乘積加上被乘數是不准確的,為了滿足對齊要求,只需將被乘數左移。

這樣,我們得到了一個適合硬件實現的乘法運算過程。
乘法的實現
實現結構
以4-bit數為例,(1000)2 + (1001)2 = (1001000)2

具體流程
- 初始化,將Multiplier = 1001,將Multiplicand的低4為設為1000,高4位補零,Product = 0.
- 檢查乘數寄存器的最低位,如果為1,將被乘數寄存器加到乘積寄存器中,此時控制信號會給加法器一個信號,給乘積寄存器寫信號,等到下一個上升沿到來時,會將運算的結果存到乘積寄存器中。如果為0,不管。同時給被乘數寄存器左移信號,給乘數寄存器右移信號,也是在下一個時鍾上升沿起作用。
- 檢測是否經歷4次循環
最終的結果如下:

4位的過程對N位同樣有效。
N位的流程圖

乘法的優化1
觀察上面N位乘法器的流程圖,由於每次信號要等到一個時鍾上升沿才起作用,所以1a、2、3過程各用一個周期。其實這三個過程可以並列執行,就降為一個周期了。

乘法的優化2(面積優化)
面積優化就是指減少不必要的硬件資源。對於CPU這樣的集成電路來說,它的價格的一個重要因素就是集體管的數量,或者說芯片的面積。因此,在設計各個功能部件的時候,如何減少芯片的面積也是一個重要的方向。

觀察上面這個圖,我們可以發現如下可以優化的地方:
- “被乘數寄存器”有8位寬,但其中有效位始終只有4位
- “乘數寄存器”是4位寬,但其中有效數字每周期減少1位
- “乘積寄存器”是8位寬,但初始時有效位只有4位且每周期增加1位
- “加法器”是8位寬,但參與運算的實際有效位置只有4位
我們只需逐一改進這些地方,注意,每個部件某個功能去掉,在另一個部件應加上該功能。比如”被乘數寄存器“取消了左移功能,”乘積寄存器“就相應的添加了右移功能。
- “被乘數寄存器”縮減為4位,且取消左移功能
- 取消“乘數寄存器”,乘數初始置於”乘積寄存器“低4位
- ”乘積寄存器“增加右移功能,乘積初始置於其中高4位,隨着運算過程不斷右移(最高位補0)
- ”加法器“縮減為4位,”乘積寄存器“只有高4位參與運算
優化后的圖如下:

注:乘法寄存器實際應該是9位,以保存加法器的進位,但這里保持8位,以突出使用優化后的演變。
N位乘法器優化同理

參考鏈接:https://www.coursera.org/learn/jisuanji-zucheng/lecture/JioZX/404-cheng-fa-qi-de-you-hua-2
