加法器的硬件實現


1. 加法運算

加法運算可以說是數字信號處理中最基本的運算,減法、乘法運算都可以通過加法運算實現。加法運算也可以說是數字信號處理中最簡單的運算。目前的FPGA中,可采用分布式邏輯資源實現加法,也可采用嵌入式資源實現加法。

1.1 一位全加器

一位加法器是實現多位加法器的基礎。它的輸入端是被加數A、加數B以及較低位的進位\(C_{in}\);輸出端是本位和\(S\)以及向較高位的進位\(C_{out}\)。根據二進制加法運算規則可知其真值表如表1.1所示。由真值表利用卡諾圖化簡可得輸出與輸入的邏輯關系式,如式\((1),(2)\)所示。

A B \(C_{in}\) S \(C_{out}\)
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

表1.1 一位全加器真值表

\[S = A\oplus B \oplus C_{in} \tag{1} \]

\[S = AB + BC_{in} + AC_{in} \tag{2} \]

式中\(\oplus\)表示異或(XOR)。

根據邏輯關系表達式,可進一步得出一位全加器的硬件電路圖,如圖1.1所示。加法運算的三個要素是被加數、加數和低位的進位,它們共同決定了輸出和與高位的進位。

圖1.1 一位全加器的硬件電路圖

1.2 二進制加法原理

加法運算最有可能出現的問題就是溢出,即運算結果超出了給定位寬所能表示的數的范圍。例如,兩個一位十進制數相加\(9+8\),其結果為17,顯然是無法用一位十進制數表示的。

在硬件設計時,為了防止溢出而導致計算結果錯誤,就要預先采取一定的措施。這里以兩個4bits二進制數相加為例。它們均以二進制補碼表示。4bits二進制補碼所能表示的數的范圍是\([-2^{4-1},2^{4-1}-1]\)即[-8,7]。分以下三種情況進行分析:
(1)正數 + 正數; (2)正數 + 負數;(3)負數 + 負數。

1. 正數 + 正數

兩個4bits二進制數相加,其結果可能是4bits二進制數(未溢出),也可能是5bits二進制數(溢出)。當結果為前者時較好理解,如1+3=4,二進制計算如圖1.2所示。圖1.2(b)是對被加數與加數進行符號位擴展之后相加。這也進一步明確符號位擴展是不影響數值大小的。當結果為后者時,如3+6=9,二進制計算如圖1.3所示。圖1.3(b)是對被加數與加數進行符號位擴展之后相加。

圖1.2 兩個4位二進制正數相加未溢出情形

圖1.3 兩個4位二進制正數相加溢出情形

對於圖1.3(a),如果為無符號數結果是正確的,如果是有符號數,那么(1001)是-7的補碼,顯然結果是錯誤的。錯誤的原因在於數值9已經超出了4bits二進制數所能表示的數的范圍,即溢出。而結果又始終是以補碼形式看待的。這正是執行加法運算時非常關鍵的一個問題。對於圖1.3(b),無論是從有符號數還是無符號數的角度看,結果都是正確的。

2. 正數 + 負數

正數 + 負數也就是減法,減法實質上仍是加法,因為減去一個數等效於加上這個數的補碼。顯然,這種情況下不會溢出。以2+(-3)為例,二進制計算如圖1.4所示。其中(-3)的4bits二進制補碼為(1101),5bits二進制補碼為(11101)。計算結果(1111)是(-1)的4bits二進制補碼,(11111)是(-1)的5bits補碼。可見結果是正確的。

3. 負數 + 負數

分溢出與未溢出兩種情況。對於未溢出,以(-2)+(-3)為例說明,二進制補碼計算如圖1.5所示。

對於結果(11011),其低4bits(1011)是(-5)的4bits二進制補碼,(11011)是(-5)的5bits二進制補碼,(111011)是(-5)的6bits二進制補碼,顯然結果是正確的。

對於溢出,以(-3)+(-6)為例說明,二進制補碼計算如圖1.6所示。對於圖1.6(a),如果只取低4bits(0111),顯然結果是錯誤的。對於圖1.6(b)取低5bits結果是正確的,前提是對兩個數進行了符號位擴展。符號位擴展並不改變數值大小。

圖1.5 兩個4位二進制負數相加未溢出情形

圖1.6 兩個4位二進制負數相加溢出情形

對於其他情況,正數減去負數可歸結為正數加正數,負數減負數可歸結為正數加負數。通過以上分析,可得出如下結論:兩個N位二進制補碼相加,為防止溢出時導致計算結果錯誤,可將這兩個數先進行符號位擴展,變成N+1位二進制數,然后相加,結果亦取N+1位,可保證運算正確。

根據多位加法器原理可知,對於兩個Nbits二進制補碼數相加,可利用N個一位全加器搭建而成。如圖1.7所示即為兩個4bits二進制補碼數相加A+B的硬件電路圖。其中被加數、加數、和的最高位分別為\(A_{3},B_{3},S_{4}\)。末尾級進位端最終形成了和的符號位。

由於減去一個數等效於與這個數的補碼相加,這樣減法操作就變成了加法操作。根據“取反加一”的求補碼方法,對圖1.7稍作改動即可形成圖1.8所示的4bits二進制數相減A-B的硬件電路圖。圖中首先對減數通過反相器逐位取反,並將最低的進位端設置為1。

對比圖1.7和圖1.8可以發現,兩者的結構是相同的,很多邏輯資源是可以共享的。為此,將兩者合二為一,引入控制端control,通過它來切換加法操作與減法操作。這樣形成了圖1.9所示的硬件電路圖。圖中,當control為0,執行A+B,當control為1時,執行A-B。

采用HDL描述多位加法器或多位減法器時,並不需要先構建一個全加器,再按照上述電路圖搭建(上述電路圖只是為了闡述其實現原理),而是符號位擴展之后直接用"+"或"-"即可。通常情況下,用Vivado綜合,加法器會用查找表、進位鏈等資源實現,但可通過設置綜合屬性USE_DSP48使得加法器用DSP48實現。

對於可切換的加法、減法電路,可采用圖1.10所示方式搭建,利用HDL描述非常方便。圖中D表示D觸發器,本書后續章節中均采用此方式表示D觸發器。

1.3 復數加法

在某些應用場合需要執行復數加法運算。復數加法的原理很簡單,實部和實部相加得到和的實部,虛部和虛部相加得到和的虛部,如式(1.3)所示。式中,a,b,c,d,e,f均為實數,j為虛數單位。可見,復數加法最終被分解為實數加法。一次復數加法由兩次實數加法構成。

\[\begin{aligned} (a+bj)+(c+dj) &= (a+c)+(b+d)j \\ &=e+jf\end{aligned} \tag{3} \]

根據上述原理可得如圖1.11所示的硬件電路結構。

圖1.11(a)采用了兩個加法器,並執行實部和虛部的加法。圖1.11(b)則采用了一個加法器,通過分時復用,分別求和。顯然,前者在速度上有優勢,后者在資源上有優勢。

1.4 加法樹與加法鏈

在很多應用場合都會涉及多個數相加求和,如式(4)所示

\[s = a_{1} + a_{2} + a_{3} + a_{4} + a_{5} + a_{6} + a_{7} + a_{8} \tag{4} \]

此時,可采用加法樹,也可采用加法鏈。加法樹結構如圖1.12所示。為了提高系統速度,采用了流水線技術。

圖1.12中是一個三級加法樹,每級加法器的位寬依次遞增,防止溢出導致計算錯誤。全流水,從輸入到輸出需要3個時鍾周期。顯然,將此結構推廣,如果要求N個數的和,則需要\(\text{ceil}(\text{log}_{2}(N))\)級加法樹。該結構非常清晰,可高速運行。但整個設計性能的瓶頸在於末級的加法樹,如圖1.12的陰影所示,它們將消耗較大的功耗。

對於式(4)若采用加法鏈結構,如圖1.13所示。為了正確相加,\(a_{3}\)相比\(a_{2}\)\(a_{1}\)推遲一個時鍾周期進入加法器,\(a_{4}\)相比於\(a_{3}\)推遲一個時鍾進入加法器,后續各加數進入時刻以此類推。從而,從輸入到輸出需要7個時鍾周期(Latency=7)。顯然,相對於加法樹,此結構時許稍顯復雜,但結構中每個加法器的“等級”是一致的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM