計算機的最大優勢在於它的運算速度。因此,當我們設計計算機當中的乙個功能部件時,在保證其功能正確性的前提下,就得考慮它是否擁有足夠好的效能。那麼在這一節,我們就要一起對這個乘法器進行效能上的分析和優化。
首先,我們來快速回顧一下n位乘法器的工作流程。
當我們做好初始化工作之後,首先檢查乘數暫存器的最低位。如果最低位為1,那麼就將被乘數暫存器和乘積暫存器的內容相加,並將結果放入到乘積暫存器當中。那麼這一步實際上是控制邏輯給出了若干個控制訊號,包括讓加法器完成加法運算,並給了乘積暫存器寫入的控制訊號。因為加法器的輸出是連線到乘積暫存器的輸入端的,所以在下乙個時鐘上公升沿來臨的時候,乘積暫存器就會對加法器的輸出進行取樣並儲存起來,這就完成了這一步所指的工作。
然後控制邏輯會向被乘數暫存器發出左移的控制訊號,在下乙個時鐘上公升沿來臨的時候,被乘數暫存器就會完成左移一位的工作。當然,如果在第一步中檢查的乘數暫存器的最低位是0,那控制邏輯就不會給出讓加法器進行運算,和讓乘積暫存器進行寫入的控制訊號,而會進入到第2步,完成被乘數暫存器左移的工作。再到下乙個時鐘上公升沿,乘數暫存器會發現其右移的控制訊號有效,所以它就完成一次右移的工作。
然後判斷是否已經到了第n次迴圈。如果沒有,說明運算還沒有結束,再回到第1步繼續執行;如果發現已經是第n次迴圈,說明運算已經完成。運算的結果就在當前的乘積暫存器當中。
我們分析這個工作流程,我們可以發現第1a步執行這個加法,我們需要乙個時鐘週期;第2步的左移又需要乙個時鐘週期;第3步的右移還需要乙個時鐘週期。因此,這個乘法器工作時,每執行一輪都需要3個時鐘週期,那如果是乙個32位的乘法器,那就大約需要100個時鐘週期。(執行的輪數看乘數暫存器的位數)
我們來想一想有沒有優化的辦法。
首先,我們很容易想到的優化就是剛才說的這些加法和移位的操作是否能夠並行起來。雖然我們在介紹流程時,這些步驟是一步一步進行的,這樣只是便於我們理解。在實際的實現上,它們並不需要一定有乙個先後的順序。因此,問題就在於我們的實現結構能否支援讓這些加法和移位並行操作。
我們知道,暫存器的內容只會在時鐘上公升沿來臨的時候發生變化,而在其他時候,無論輸入端如何變化,暫存器的內容都不會發生變化。因此,我們就用這個乘法器的當前狀態為例,進行分析。
假設現在時鐘上公升沿還沒有來臨,被乘數暫存器的輸出就是它當前所儲存的內容 0000 1000 這八位訊號會被送到加法器的輸入端,而加法器的另乙個輸入端連線的是乘積暫存器的輸出端,因此,成績暫存器現在的訊號值是全0。而當前乘數暫存器的最低位為1,控制邏輯會據此產生相關的控制訊號,包括讓加法器進行加法運算,這樣加法器就會產生對應的運算結果。與此同時,控制邏輯還會給出寫輸入訊號 但是現在時鐘上公升沿還沒有來,所以乘積暫存器其實什麼也不會做。那我們注意,在這個時候控制邏輯實際上可以同時給出被乘數暫存器的移位訊號,還可以給出乘數暫存器的移位訊號,那現在,控制邏輯就將剛才流程圖當中的第1a步、第2步和第3步所對應的控制訊號都置為有效了,但是因為時鐘上公升沿還沒有來,所以這些暫存器的內容都不會發生變化。
那麼當時鐘上公升沿到來的時候,這些暫存器就會根據輸入改變其內容。乘積暫存器會將輸入端的數儲存起來,被乘數暫存器會向左移動一位,乘數暫存器會向右移動一位。而這些操作都是在同乙個時鐘上公升沿到來的時候完成的。請注意,我們現在假設這個時鐘上公升沿來了。
注意觀察這3個暫存器它們是同時發生變化的,而且根據我們對暫存器的了解,我們已經知道在時鐘上公升沿之後很短的乙個時間,暫存器所改變的內容就會傳送到輸出端。因此,我們可以注意到,被乘數暫存器的內容現在已經改變,因此很快它的輸出也會變成0001 0000,並傳遞到加法器,但是,我們可以放心的是,即使這個訊號經過了加法器,並產生了新的運算結果,這個運算結果也不會改變乘積暫存器的內容。因為等這個訊號傳遞到了乘積暫存器的輸入端時,已經過去了一段時間,這時候乘積暫存器對輸入端的取樣工作已經完成,其輸入端訊號的改變不會影響這個暫存器的內容了。這樣,我們就在同乙個時刻完成了所有的加法和移位的操作。那我們再回到剛才的那個流程圖。
在這個流程圖當中,這3個順序執行的操作就可以進行優化。而我們這32位的乘法,也就不應該再需要100個時鐘週期了。
經過優化以後的工作流程,在最開始的第1步和最後的第4步,還是跟原來一樣。而中間的這3步,我們可以把它併排地放在一起。當第1步檢查乘數暫存器的最低位,如果最低位是1的時候,第1a步、第2步和第3步將同時進行;如果最低位為0,則通過控制訊號的不同,不執行第1a步,而同時執行第2步和第3步,完成之後就直接進入第4步。這樣我們每一次迴圈只需要乙個週期,我們用這個很簡單的優化,就把效能提公升為了之前的3倍。這樣我們就有了乙個速度更快的乘法器。
布魯斯乘法器
布魯斯乘法器演算法 1 字母定義 a,0000 q,乘數 q 1,0 m被乘數 2 乘數的最低位補零 3 從乘數的最低兩位開始迴圈判斷,如果是00或11,則不進行加減運算,但a q需要右移一位 如果是01,則和被乘數進行加法運算,a q右移一位 如果是10,則和被乘數進行減法運算,a q右移一位 4...
fpga中例化乘法器 FPGA乘法器的應用
這是兩個 位ain,bin 結果為位 yout 的例子。module mux 4 clkrst n start ainbin yout done input clk晶元的時鐘訊號。input rst n 低電平復位 清零訊號。定義為 表示晶元復位 定義為 表示復位訊號無效。input start 晶...
Booth乘法器設計
1.乘法器原理 在計算兩個補碼相乘時,可以通過booth演算法來實現定點補碼一位乘的功能。布斯 booth 演算法採用相加和相減的操作計算補碼資料的乘積,booth演算法對乘數從低位開始判斷,根據後兩個資料位的情況決定進行加法 減法還是僅僅進行移位操作。討論當相乘的兩個數中有乙個或二個為負數的情況,...