超前進位加法器&行波進位加法器
- 八位超前進位加法器
- 原理
- 設計檔案
- 綜合電路
- 測試檔案
- 仿真波形
- 八位行波進位加法器
- 原理
- 設計檔案
- 測試檔案
- 仿真波形
- 總結
八位超前進位加法器
原理
有學弟問我,超前進位加法器中的和
p=add1 ^ add2
是什麼意思,是以這篇文章就稍微贅述一點吧~
g=add1 & add2
所謂超前進位,首先應該明白進位是什麼。
8+4=12
,其中的
1
就是進位,其中的
2
才是結果。
那麼在二進制中,
1+1=10
,其中的
1
就是進位,
就是結果。
明白了進位和結果,那麼多位的數字是怎麼計算呢?
其實上面的計算應該是
1+1+上一位的進位=10
,是以兩個數字的計算應該涉及三個内容——加數,被加數,上一位的進位。
在一位二進制加法中,
a
和
b
分别表示兩個加數,
cin
表示上一位的進位,
cout
表示下一位的進位,
sum
表示結果,我們列出其真值表:
add1 | add2 | cin | cout | sum |
---|---|---|---|---|
1 | 1 | |||
1 | 1 | |||
1 | 1 | 1 | ||
1 | 1 | |||
1 | 1 | 1 | ||
1 | 1 | 1 | ||
1 | 1 | 1 | 1 | 1 |
以數字**
1
為真**,數字**
為假**,
a
表示
1
,
a'
表示
,這樣的形式。學過離散數學或者數字電路的同學應該多少會點吧,“·”代表“與”,“+”代表“或”,是以上面的真值表,寫成表達式,就是:
經過部分化簡:
同理:
找到兩個等式的相同部分,都有
a⊕b
,其中
⊕
代表“異或”,在
Verilog
中用“^”表示,即
a^b
,是以令
p = add1 ^ add2
,現在知道幹什麼用的了嘛?
沒錯,就是中間變量而已,同理
g = add1 & add2
也是中間變量,這樣就可以把上面兩個等式改寫成:
cout = g | (cin & p)
和
sum = add1 ^ add2 ^ cin
(其實就是變短了一點點而已)
不過呢,适當的使用中間變量,可能會讓你的代碼精簡許多~
此外,我發現一個網站可以通過真值表生成表達式:http://www.32x8.com/index.html
設計檔案
上面的代碼應該看起來很長,像老太太的裹腳布,但這也就是所謂的超前進位。
Verilog
中“塊”和
assign
語句都是并行執行的,上面有許多
assign
語句,是以從
c[0]
到
c[7]
,根據第一步的
cin
,就可以同步計算出每一位的進位(超前進位),以及最後的結果,這些是同時完成的,也就完成了超前進位加法器。
綜合電路
點選
RTL-ANALYSIS——Synthesis
,可以檢視綜合電路圖:
19
個元件,
26
個
IO
口,
56
根線
測試檔案
還有些同學,對測試檔案的了解也還是不夠深刻,這裡稍提一嘴,測試檔案就是給電路加激勵資訊,使電路運作。至于加提示資訊之類的,各自加油就好啦~
仿真波形
右鍵某一信号,選擇相應的進制數,以
10+9
為例,最終輸出
cout=0
,
sum=19
那麼之後的
10+11
為什麼沒有進位使
cout=1
呢?
把他們轉換成二進制觀察一下就明白啦~
八位行波進位加法器
當時不知道在哪聽的這個名字,就一直用下了,其實這個應該叫做行波進位加法器——由N個全加器級聯而成,是以被我叫成了級聯進位emmm
原理
如上所說,行波進位加法器是由
N
個全加器級聯而成,比如
8
位的加法器可以由
8
個一位全加器級聯而成,也可以由
2
個四位全加器構成,差別就是所綜合出的電路大小。
設計檔案
方式一
這是把上述原理複現了一邊,上一步的進位輸出,傳入到下一位計算的進位輸入。
綜合後的電路如下,
48
個元件,
26
個
IO
口,
65
根線
綜合電路
方式二
上面的語句重複性太大,就用子產品例化的方式來寫
其中的
add_1_unit
子產品如下:
綜合後的電路如下,全展開後有
48
個元件,
26
個
IO
口,
97
根線
綜合電路
其中的每一個單元如下:
全展開後如下:
兩種寫法
資料總線的數量有差別:一個是
65
根線,一個是
97
根線。
代碼量有差別:一個
40
行左右,一個總共
27
行左右。
優缺點不言而喻。
測試檔案
都是八位加法器,與超前進位加法器也沒差別
還是放一下吧:
仿真波形
與超前進位一緻,用二進制檢視一下如下圖:
總結
行波進位加法器,由于後一位的進位依賴于前一位的進位,是以關鍵路徑更長,限制速度,性能不高,
超前進位加法器,由于進位計算是并行的,是以關鍵路徑短,速度快,但是位寬越寬,也就代表會綜合出更複雜的、面積更大的電路。