引言
算術運算中的加減乘除,乘法和除法是比較難以實現的。乘法之前已有總結,這次學習的部分是除法器的設計和實現。同樣,MIPS指令忽視了上溢的情況,因此軟件需要檢測商是否過大。另外不同於乘法的一點,對於除法運算軟件還需要檢測是否除以0,以避免產生錯誤的結果。
無符號除法器ver.1
除法運算中的關鍵表達式:被除數 = 除數 × 商 + 余數
首先用筆算的計算來推導硬件的設計思路:
其硬件結構如圖所示:
初始時商置為0,除數每次計算后右移一位以對准被除數,因此初始時位於64位移位寄存器的左端。余數寄存器初始為被除數。
這個版本的除法器ALU,除數移位寄存器和余數寄存器都是64位,只有商是32位。
除法的算法流程如下:
除法的第一步是被除數高位減除數,但是這種除法器架構的特點在於計算機是不知道計算部分被除數是否比除數大的。因此第一個分支體現了計算過程,如果余數大於等於0,則被除數是大於等於除數的,因此商左移一位並且LSB置1;若余數是小於0的,則被除數小於除數,下一步操作是恢復原值,即將除數和余數相加並將和放回余數,商寄存器左移一位且LSB置0。這里判斷余數是否大於0只需要判斷余數的MSB是0還是1即可。
無符號除法器ver.2
因為一些移位占用的資源不會被使用,考慮改進上述結構以加速和節約資源,改進后的結構如下:
改進后被除數和ALU寄存器都是32位,減少了一半空間。余數寄存器和商整合為一體,計算過程共同左移。
這種結構除法器的計算流程如圖,可以看出與版本一的差別。優化版本的除法器第一步先進行余數寄存器的左移,再將余數寄存器左半邊減去除數進行判斷。這樣只需判斷32次,進行32次循環計算。
但是計算初始余數寄存器進行了一次左移操作,因此計算結束時余數寄存器的左半邊也就是余數部分需要右移一位。
有符號除法器
在有符號數計算中,關鍵在於滿足除法運算中的關鍵表達式:被除數 = 除數 × 商 + 余數
因此四種情況可以分別列出,正 ÷ 正,正 ÷ 負,負 ÷ 正,負 ÷ 負。
只要被除數與除數符號不一致,則商為負號。反之若兩操作數符號一致,則商為正號。余數保持與被除數的符號一致。
總結
由乘法器和除法器的學習可以看出,兩種設計都需要ALU和一些移位寄存器,而MIPS型CPU中的Hi和Lo寄存器組合起來,在乘法運算和除法運算中作為64位移位寄存器。
32位的乘法/除法硬件如下所示:可以看出關鍵在於控制邏輯來決定移位寄存器的左移或右移來進行除法或乘法操作。