官术网_书友最值得收藏!

3.2 加法運算

加法運算可以說是數字信號處理中最基本的運算,減法、乘法運算都可以通過加法運算實現。加法運算也可以說是數字信號處理中最簡單的運算,算法規則、單一。在目前的FPGA中,可采用分布式邏輯實現加法,也可采用嵌入式資源實現加法,各有優勢。本節以最基本的一位全加器為“源”,引出多位加法器的原理與實現方法,在此基礎上,對加法樹(Adder Tree)與加法鏈(Adder Chain)的硬件結構進行分析與比較。

3.2.1 一位全加器

一位全加器是實現多位加法器的基礎。它的輸入端是被加數A、加數B及較低位的進位CIN,輸出端是本位和S及向較高位的進位COUT。根據二進制加法運算規則可知其真值表如表3.5所示。由真值表利用卡諾圖化簡可得輸出與輸入的邏輯關系表達式,如式(3.3)和式(3.4)所示。

表3.5 一位全加器真值表

式中,“⊕”表示異或(XOR)。

根據邏輯關系表達式,可進一步得出一位全加器的硬件電路圖,如圖3.5所示,圖中均采用國際通用邏輯符合。

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

綜上所述,加法運算的3個要素是被加數、加數和低位的進位,它們共同決定了輸出和與高位的進位。

3.2.2 加法原理與多位加法器

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

在硬件設計時,為防止溢出而導致計算結果錯誤,就要預先采取一定的措施。為便于闡述,這里以兩個4-bit二進制數相加為例,它們均以二進制補碼表示。根據前文論述可知,4-bit二進制補碼所能表示的數的范圍是[-24-1,24-1 -1]即[-8,7]。分以下幾種情況進行分析。

1. 正數+正數

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

當結果為后者時,如3+6 =9,二進制計算如圖3.7所示。圖3.7(b)是對被加數與加數進行符號位擴展之后相加。

圖3.6 正數+正數未溢出情形

圖3.7 正數+正數溢出情形

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

2. 正數+負數

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

3. 負數+負數

分溢出與未溢出兩種情形。對于未溢出情形,以(-2)+(-3)為例說明,二進制計算如圖3.9所示。

圖3.8 正數+負數的情形

圖3.9 負數+負數未溢出情形

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

對于溢出情形,以(-3)+(-6)為例說明,二進制計算如圖3.10所示。

對于圖3.10(a),如果只取低4 位(0111),那么顯然結果是錯誤的。對于圖3.10(b),取低5 位結果是正確的,前提是對兩個加數進行了符合位擴展。符號位擴展并不改變數值大小,即1011 與11011 都是 -3 的補碼。

圖3.10 負數+負數溢出情形

對于其他情況,正數-負數可歸結為正數+正數,負數-負數可歸結為正數+負數。

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

根據多位加法器原理可知,對于兩個N-bit二進制補碼數相加,可利用N個一位全加器搭建而成。圖3.1 1所示為兩個4-bit二進制補碼數相加(A+B)的硬件電路圖。其中,被加數、加數、和的最高位分別為A3B3S4,它們是符號位。末級進位端最終形成了和的符號位。

由于減去一個數等效于與這個數的補碼相加,這樣減法操作就變成了加法操作。根據圖3.2所示的求補過程,對圖3.1 1稍作改動即可形成如圖3.12所示的兩個4-bit二進制數相減(A-B)的硬件電路圖,圖中首先對減數B通過反相器逐位求反。

圖3.1 1 兩個4-bit二進制補碼數相加的硬件電路圖

圖3.12 兩個4-bit二進制數相減的硬件電路圖

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

圖3.13 加法、減法可切換的硬件電路圖

在采用VHDL或Verilog語言描述多位加法器或多位減法器時,并不需要先構造一個全加器,再按照上述電路圖搭建(上述電路圖只是為了闡述其實現原理),只需要對數據先進行符號位擴展,然后對擴展后的數據直接相加或直接相減即可。

3.2.3 復數加法

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

根據上述原理可得如圖3.14所示的復數加法的硬件結構。

圖3.14 復數加法的硬件結構

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

3.2.4 加法樹與加法鏈

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

此時,可采用加法樹,也可采用加法鏈。加法樹結構如圖3.15所示。為了提高系統速度,采用了流水線技術。在圖3.15中,D表示D觸發器,在本書后續章節中均采用此方式表示D觸發器。

圖3.15 加法樹結構

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

對于式(3.6),可采用加法鏈結構,如圖3.16所示。為了正確相加,a3 相比于a2a1 推遲一個時鐘周期進入加法器,a4相比于a3 推遲一個時鐘周期進入加法器,后續各加數進入時刻以此類推。因此,從輸入到輸出需要7個時鐘周期。顯然,相對于加法樹,此結構時序稍顯復雜,但結構中每個加法器的等級是一致的。

圖3.16 加法鏈結構

主站蜘蛛池模板: 孝感市| 晋中市| 梅州市| 田林县| 如皋市| 紫金县| 陇西县| 富锦市| 萍乡市| 华容县| 衡阳县| 梁平县| 恩施市| 鄱阳县| 青阳县| 县级市| 崇仁县| 宜城市| 随州市| 正阳县| 民权县| 辽源市| 双鸭山市| 吴川市| 孙吴县| 巴塘县| 婺源县| 富宁县| 怀宁县| 斗六市| 渑池县| 罗定市| 长岭县| 衡阳县| 溧阳市| 志丹县| 调兵山市| 洪江市| 阿拉尔市| 安多县| 顺平县|