除法的運算過程
與乘法相比,除法的實現較為復雜,運算過程如下:
過程:
- 被除數和余數:將余數和被除數視為一個,共享一個寄存器,初始值為被除數
- 除數:可視為不斷右移,並和被除數相減
- 商:每個bit依次生成,可視為不斷左移
除法器的工作流程
要注意的是,與手算相比,電路實現總是將余數減除數,所以如果出現差小於0,要執行回退操作。
怎么會退呢?其實沒有真正回退地方法,由於前面執行的是減法,回退只需加回來就可以了。
除法器的電路實現
工作過程:
- 初始化:將8-bit被除數放到“余數寄存器”,4-bit除數放到“除數寄存器”的高4位,將4-bit商寄存器置零
- 執行減法運算:余數-除數,將結果放到“余數寄存器”
- 檢查余數寄存器的最高位(判斷正負)。如果值小於0,回退,商左移,新的最右位設為0;如果值大於或等於0,商左移,新的最右位設為1.
- 除數寄存器右移一位
- 檢查是否為最后一輪(本例為第5輪)
32-bit除法器同理可得
除法器的面積優化
對上面32-bit除法器從面積分析:
- “除數寄存器”實際只使用了一半
- “商寄存器”初始是空的,從左到右依次填滿
- “余數寄存器”初始是滿的,有實際意義的位每過一個周期從左到右依次減少
對應的,我們可以得到針對上述問題的方案:
- “除數寄存器”縮減為32-bit的,無需支持移位
- 取消“商寄存器”,商從右端逐位移入“余數寄存器”
- 64-bit ALU縮小為32-bit
- “余數寄存器”只有高32位參與加減法運算
- “余數寄存器”需要支持左移和右移
- 運算結束時,商占據“余數寄存器”的低32位
其中有兩點需要注意:
- 對優化的除法器右移,優化后的除法器的運算步驟是先相減再左移,比如0000,0111 / 0010, 每次做左移、減法,倒數第二步得到00110001,最后一次循環,減法再左移得到:00100011,因為真正的商是:0011, 而余數是0001。最終結果應該是先取低四位商,再右移取高四位余數。
- 和乘法器一樣,余數寄存器實際應該是65位而保證加法器的進位不會丟失。
參考鏈接:
1、https://www.coursera.org/learn/jisuanji-zucheng/discussions/weeks/5/threads/PdDS8dpvEeeC6xLrkeqqDg
2、https://www.coursera.org/learn/jisuanji-zucheng/lecture/z6vMq/407-chu-fa-qi-de-you-hua