天天看點

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

所使用EDA軟體:VIVADO2019.1.3

FPGA型号:xc7a35tcsg325-2

看完這篇文章你将收獲以下内容:

  • 了解什麼是加法器,内容包括半加器,全加器,多位加法器。
  • 聯系多位加法器來了解XILINX FPGA進位鍊的結構以及功能。

在講加法器之前,我們先來看個有關二進制加法的例子

我們先關注兩個1位二進制數進行相加的情況,它最後隻有4中結果(圖1)。0+0=0,0+1=1,1+0=0,1+1=10

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖1:1位二進制數進行相加

我們可以觀察得到以下3點:

  1. 兩個加數都為0,相加的結果為0。
  2. 兩個加數1個為0,另一個為1時,它們相加的結果為1。
  3. 兩個加數都為1時,目前位的結果會為0,但它會給下一位進1,是以最後結果為10。

求目前輸出位的結果,我們會用到數電中的

異或

邏輯,邏輯符号為

求目前進位的結果,我們會用到數電中的

邏輯,邏輯符号位

·

假設兩個加數分别為A,B 。相加後,目前位的結果為S,是否産生進位用C來描述。

那麼我們可以得出:

  • S=A⊕B
  • C=A · B

對兩個輸入資料位(A、B)相加,輸出一個結果位(S)和進位(C),沒有進位輸入的加法器電路我們将它稱為半加器(圖2)。上面的例子就是為了半加器中A,B,S,C是啥,以及他們之間的關系。千萬别被半加器這個高大上的名字吓到,其實它就是拿來實作一個最最簡單的二進制加法功能。

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖2:半加器符号

接下來我們看一個2位二進制加法的例子(圖3)

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖3:2位二進制加法

對于第1位(從右往左)的1+1,由上面半加器的内容可知它相加後結果位(S1)為0,産生進位(COUT1)1。但是對于第2位的1+1來說(圖3紅框部分),它還需要接收由低位産生進位,才能計算目前位的結果位。多位二進制加法與十進制加法的規律是相似的,我們隻需要将目前位相加,再加上低位的進位即為結果位,即1+1+1=1⊕1⊕1=1(從左往右計算,先算1⊕1=0,再算0⊕1=1)。如果目前的兩個加數與進位裡一共有

兩個或兩個以上的1,那麼它也會産生進位

在第2位中我們用A2,B2,CIN2,S2,C2來分别表達兩個加數,來自低位的進位,目前位的結果,目前位的進位,那麼我們将得出:

  • S2=A2⊕B2⊕CIN2=1⊕1⊕1=1
  • C2=A2·B2+A2·CIN2+B2·CIN2+A2·B2·CIN2=A2·B2+A2·CIN2+B2·CIN2=1+1+1=1 (注意這裡的“+”指的是或操作)
  • 同時C2也可以這樣描述, C2=A2·B2+CIN2·(A2⊕B2) ,其實就是為了保證A2,B2,CIN2中有兩個或兩個以上的1。

在第3位中,兩個加數A3=0,B3=0,來自低位的進位CIN3=1,用S3表示目前位的相加後的結果,C3表示目前位的進位我們可以得到

  • S3=A3⊕B3⊕CIN3=0⊕0⊕1=1
  • C3=A3·B3+A3·CIN3+B3·CIN3=0+0+0=0(注意這裡的“+”代表着或)

由于最終沒産生進位,第4位也沒有相應的加數,最終的結果為{S3,S2,S1}=110

在數電中,我們用

全加器

(圖4)來實作類似第2,3位這種加法操作。

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖4:全加器符号

到這裡可能有人會問,是不是每次做多位加法計算時,我的最低位都要用上個半加器。其實不然,事實上,全加器隻不過是比半加器多了個來自低位進位的功能而已,我們隻需要将CIN置0就可以了,就可以忽視它這一功能,即将全加器當作半加器來用,再與全加器級聯即可做成多位加法器(圖5),A1~A4是一個加數的1到4位,B1~B4是另一個加數的1到4位,S4是結果的1到4位。(1是最低位,4是最高位)

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖5:用全加器級聯成4位加法器

那當我們将最第1個全加器的CIN置1,那麼它與其他3個全加器級聯将成為4位減法器(圖6),A1~A4是被減數的1到4位,B1~B4是減數反碼的1到4位,S4是結果的1到4位。(1是最低位,4是最高位)

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖6:用全加器級聯成4位減法器

此時的減法指的的

補碼形式

的“減法”。

不是指被減數 - 減數

而是指被減數的補碼+減數負數形式的補碼

(即減數的反碼+1)。是以圖6中A[4:1]指的是被減數,B[4:1]指的是減數的反碼,CIN1置1的目的就是為了減數的反碼+1變成減數負數形式的補碼。

特别注意這裡的A[4]、B[4]指的是符号位!!!

拿0101-0010=0011(這裡最高位(第4位)的0指的是符号位,0101的補碼為0101,-0010的補碼為1110,0011的補碼為0011)作為個例子(圖7)。最後的結果為0011(結果應為4位,忽略第5位,第5位“1”的作用就是為了告訴高位它要繼續減,相當于第一位的CIN)。

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖7:4位減法器的例子

好的,哔哔了那麼多,下面我開開始講我們今天的主角

進位鍊

。首先我們看一下XILINX 7系中進位鍊的結構(圖8)。

32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖8:XINLINX 7系中進位鍊的結構

紅框框住的部分為它的1個基本單元(本質上是1個全加器)。

  • CIN=進位輸入 (當它在最低位時,置0做加法,置1做減法)
  • S0=A0⊕B0 (這裡和全加器中的S有些差別),它來自LUTA的O6
  • O0=S0 ⊕CIN=A0⊕B0 ⊕CIN (這裡的O才是全加器的S),它來自LUTA的O5或外面外部輸入AX
  • DI0 = A0 或者 B0 (這裡指的是兩個加數中的一個,它的作用要配合S0)
  • AX 是預置數,這裡我們不過多關注

我們知道産生進位的條件在A B以及 CIN中有兩個或兩個以上的1。

  • 當S0=0時,有兩種情況,即兩個加數都為0和兩個加數都為1。此時,MUXCY選擇DI0作為資料輸入,CO0的結果由DI0決定。因為S0=0時,DI0為0等價于A0,B0,COUT0都為0。DI0為1等價于A0,B0,COUT0都為1。
  • 當S0=1時,即A0與B0中有1個為1。此時,MUXCY選擇CIN0作為資料輸入,CO0的結果由CIN0決定。因為S0=1時,A0與B0中隻有1個1,還缺1個1才能進位,進位所需的那個1就看CIN1肯不肯施舍了。

然後我們看一下1個8位加法的例子(例1),綜合後的結果如圖9所示。

//以下是例1
           
32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖9:例1綜合後的原理圖

圖9我們可以看到

  1. 進位鍊1的CO[3]連到進位鍊2的CI,兩者級聯産生更大位寬的進位鍊。
  2. 兩個加數的低四位異或後連入進位鍊1的S[3:0],兩個加數的高四位異或後連入進位鍊2的S[3:0]。
  3. 其中一個加數低四位(a[3:0])連入進位鍊1的DIN[3:0],a[6:4]連到了進位鍊2的DIN[2:0]。此時進位鍊2的DIN[3]直接置0,因為我們輸出位隻有8位是以無需關注最高位進位(進位鍊2的CO3),将DIN[3]置0來一來可以減小輸入的翻轉來降低功耗,二來可以減小輸入資料的延遲不一緻産生毛刺的機率。
  4. 進位鍊1 O[3:0]連到輸出的低4位,進位鍊2的O[3:0]連到輸出的高4位。

有關進位鍊的内容就大概說到這裡,再補充兩點。

  • 進位鍊級聯數有限制,它取決于目前列SLICE的個數,而且不能跨邏輯區域。如圖10所示,兩個邏輯區域間是有條“楚河漢界”的,邏輯區域裡進位鍊最大級數等于綠框中的SLICE的高度(如果是多位全加器的位寬就是SLICE的高度x4,因為1個SLICE裡有4個級聯的全加器)。
32位進位選擇加法器_FPGA從入門到精通(5) - 進位鍊

圖10:最大進位鍊最大級聯數示意

  • 進位鍊級聯數越多,造成的路徑延遲就會越大,這樣會讓時序十分的緊張。是以在使用進位鍊時要綜合考慮級聯數與整個系統速率的關系。例如在設計位寬較大的計數器,可以選擇用DSP替換,也可以選擇将位寬分隔。(如32位計數器,可将它分成高16位,與低16位,低16位計數到16'hffff,高16位計數才+1)

好的本節就到這裡,又到了一節一度的求贊求關注環節,謝謝老闆們!!!

公衆号關注 FPGA說,你的關注将引來更多的優質好文。

http://weixin.qq.com/r/ZDlOVuvE5Labra8192x2 (二維碼自動識别)