天天看點

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

目錄

  • 前言
  • 乘法器
  • 優化乘法器
  • 除法器
  • 優化除法器
  • 浮點加法器(重要⚠)
    • 對階階段
    • 加法階段
    • 規格化階段
    • 舍入階段
    • 浮點加法小結

前言

zsbd Orz

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

乘法器

普通乘法器模拟豎式乘法的計算過程。

每一行豎式都有如下操作:取 乘數(multiplier) 最低位,和 被乘數(multiplicand) 相乘。

不斷将被乘數左移,乘數右移,每一行的的豎式乘法結果進行累加:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

注:

其思想是二進制拆分,比如計算:

6 ∗ 5 = 30 6*5=30 6∗5=30

那麼 6 可以被二進制分解為 4 + 2,即

30 = 4 ∗ 5 + 2 ∗ 5 = 2 2 ∗ 5 + 2 1 ∗ 5 30 = 4*5+2*5=2^2*5+2^1*5 30=4∗5+2∗5=22∗5+21∗5

是以最終的 結果(product) 可以表示為 被乘數(multiplicand) 的移位的累加和。

乘法器的硬體結構如下。因為 被乘數(multiplicand) 不斷被移位,32 bit 的乘法器需要 64 bit 的 ALU 進行加法運算。

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

普通乘法器工作流程直接模拟豎式乘法即可:

  1. 判斷 multiplier 末位是否為 1
  2. product += multiplicand 或者不操作(對應 1,0)
  3. multiplier 右移
  4. multiplicand 左移
  5. 重複 1 直到 multiplier 移完為止

該乘法器的工作原理如下:以 3 bit 乘法器 6 x 5 為例:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

接上圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

因為 被乘數(multiplicand) 不斷右移,其有效位逐漸變多。32 bit 的乘法,需要 64 bit 的存儲器來存儲被乘數。

而 乘數(multiplier) 不斷左移,有效位減少,故不需要額外的 bit 進行存儲。

優化乘法器

普通的 32 bit 乘法器需要 64 bit 的 ALU 和 64 bit 的存儲器來存被乘數,這是比較浪費的。優化乘法器利用一些特性,對普通乘法進行優化。

注意到普通乘法中,有兩個移位:

  1. 被乘數(multiplicand)不斷右移,每次移位,導緻結果(product)有效位多 1 bit
  2. 乘數(multiplier)不斷左移,每次移位,有效位少 1 bit

這意味着兩者的有效位 此消彼長 🐸。

可以通過一個 64 bit 的存儲器,同時存儲 結果(product) 和 乘數(multiplier),這就是優化乘法器的思路。下面給出優化乘法器的結構:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

優化乘法器的工作流程如下:

  1. 判斷最低位是否為 1
  2. 累加 / 不做處理(對應 1,0)
  3. 存儲器整體右移
  4. 轉 1,直到重複 n 次(n bit 的乘法就重複 n 次)

下面的圖表示 3 bit 乘法器 6 x 5 的工作流程:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

接上圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

注意每次累加都是累加在存儲器的高 32 bit 上(就是存儲器的左半邊)

此外,隻需要使用一個 32 bit 的 ALU 和一個 64 bit 的存儲器(存儲 product 和 multiplier),節約資源。

除法器

除法和乘法互為逆運算,這裡我們不用豎式除法進行模拟。

回想起二進制拆分的思想, 被除數(dividend) 一定可以被 除數(divisor) 的二進制組合表達,比如:

d i v i d e n d = 30 d i v i s o r = 5 30 = 2 2 ∗ 5 + 2 1 ∗ 5 \begin{array}{c} dividend=30 \\ divisor=5 \\ 30 =2^2*5+2^1*5 \end{array} dividend=30divisor=530=22∗5+21∗5​

于是我們直接枚舉 除數(divisor) 的二進制表達,即:

2 0 ∗ d i v i s o r 2 1 ∗ d i v i s o r 2 2 ∗ d i v i s o r . . . 2 n ∗ d i v i s o r \begin{array}{c} 2^0*divisor\\ 2^1*divisor\\ 2^2*divisor\\ ... \\ 2^n * divisor \end{array} 20∗divisor21∗divisor22∗divisor...2n∗divisor​

注:

在硬體中通過将 除數(divisor) 置于存儲器的左半部分,然後不斷右移實作枚舉。

然後判斷 被除數(dividend) 是否大于 除數(divisor),如果大于,那麼減去除數,同時 商(quotient) 的末位添加 1,一直重複。

下面給出除法器的硬體結構:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

那麼除法器工作流程就很清晰了:

  1. 判斷目前 被除數(dividend) 是否大于 除數(divisor)
  2. 商末位置 1 / 不操作(對應 1 中 true / false)
  3. 被除數減去除數 / 不操作(對應 1 中 true / false)
  4. 除數右移
  5. 商左移
  6. 轉 1,直到重複 n 次(除數是 n bit 的除法就重複 n 次)

最後被除數剩下的就是餘數。

以 4bit 除以 2 bit 的 11 ÷ 2 為例:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

因為 divisor 是 從高 32 bit 逐漸移到低 32 bit,而且 dividend (可以)是 64 bit 的,是以需要 64 bit 的 ALU。

優化除法器

優化後的除法器真正地模拟了國小數學的豎式除法。

通過不斷将 被除數(dividend) 的低位補齊,然後反複判斷當其是否大于 除數(divisor),來決定商的對應位為 1 或 0。

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

以 32 bit 的除法為例,通過一個 64 bit 的存儲器,一開始将 被除數(dividend) 存于其低 32 bit,即右邊,然後逐漸将這個存儲器左移,我們取該存儲器的高 32 bit 即可得到 被除數(dividend) 的二進制枚舉:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

可以看到因為左移産生的無效位(最右邊)逐漸增多,我們可以利用這些無效位,我們存儲 商(quotient)

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

那麼優化除法器的原理也很清晰了。首先我們将 被除數(dividend) 存于低 32 bit,然後将整個存儲器左移一位,然後開始!

  1. 取存儲器高 32 bit,記作 x,與 除數(divisor) 比大小
  2. 存儲器高 32 bit 減去除數 / 不操作(對應 1 中的 大于 / 小于)
  3. 存儲器整體左移
  4. 存儲器最低位置 1 / 不操作(對應 1 中的 大于 / 小于)
  5. 轉 1,直到循環 32 次,跳出時對左半部分(高 32 bit 進行一次右移)

以 4 bit 的除法 11 ÷ 2 為例(注意這裡大家都是 4 bit 了):

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

接上圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

注意最後一次其實是有左移的。事實上最後 跳出循環之後,要對左半部分用一次右移,抵消最後的左移,以擷取正确的餘數。

優點是隻用 32 bit 的 ALU 即可。

注:

這裡交換上文步驟 3,4 的順序,最後可以免去特殊處理

但是 mips 這麼做肯定有其原因,是以我們還是得蛋疼地記下來

此外,最吊的一點是,優化後的乘法器除法器,硬體可以用同一套!!!

隻能死記硬背(?)順序是:減法,左移,最低位置 1

浮點加法器(重要⚠)

浮點加法分為如下幾個步驟:

  1. 對階:即将科學計數法的階數對齊,把小階調整到大階
  2. 尾數相加:将調整後的尾數直接相加
  3. 規格化:包括将尾數調整為 1.xxx 的 IEEE 表示,溢出檢查等操作
  4. 舍入

下面是富點加法的四個步驟的例子:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

有了思路, 易得 硬體結構:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

是的,你可能會說:“O你🐎!這麼複雜學個疾疤學?”

接下來一步一步進行分析。

對階階段

對階階段分幾個部分。

首先從兩個輸入擷取 階碼(exponent) 部分并且進行比較,将比較結果傳遞給 控制單元(control),如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

然後根據控制單元給出的信号(下圖黃色箭頭),對需要對齊的階碼進行調整(SHift right),随後将階碼傳入 ALU,準備進行相加。注意我們根據控制信号,選擇紅藍兩個輸入,如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

加法階段

該階段将上一階段傳入的階碼進行相加,同時根據階碼比較的控制信号(下圖橙色箭頭),選擇大的階碼作為結果數的階碼。如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

規格化階段

因為 IEEE 規則規定,尾數是這麼表示的:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

規格化的浮點數,尾數範圍在 1.0-2.0 之間,但是尾數相加的結果極有可能不在這個範圍内,這時候我們就需要根據尾數,進行階碼的調整。

首先,我們将 ALU 計算出來的尾數,傳入控制單元:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

然後控制單元根據我們傳入的尾數,計算轉換為規格化的尾數,需要移位的位數,并且給出控制信号(下圖黃色箭頭),控制指數的加減和尾數的移位。如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

舍入階段

舍入階段直接被安排為一個 “Rounding Hardware” 子產品了,好耶!

值得注意的是,舍入之後的結果,會和原本的規格化後的階碼,一起傳入控制單元,以此判斷舍入之後是否需要重新規格化。如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

控制單元判斷是否需要再次對舍入之後的結果進行規格化,同時給出控制信号(如下圖黃色箭頭),再次規格化舍入後的結果。如下圖:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

浮點加法小結

牢記五步走:

  1. 對階
  2. 加法
  3. 規格化
  4. 舍入
  5. 再次規格化

hhh 說是 4 步,其實最後規格化了兩次。

emmmm 我猜你肯定會想:“舍入後規格化,再舍入。好似是一個遞歸操作,如果死循環不就寄了?”。處理器的設計者這麼厲害,我們想得到他會想不到?總之硬體肯定有辦法判斷這種情況的

好吧不說批話了。。。這可能是全網最詳細的浮點加法解析了。。。如果你看書,那麼,唔。。。書上更加簡單 Orz 這裡貼一個書上的原文:

計組複習(一):乘法器,除法器與浮點加法器前言乘法器優化乘法器除法器優化除法器浮點加法器(重要⚠)

繼續閱讀