我們每個(gè)人從小最先學(xué)的數(shù)學(xué)就是1+1=2,然后就是小九九,因?yàn)檫@是我們長大以后混世界的最基本的能力,加、減、乘、除是人腦“數(shù)字邏輯”的基礎(chǔ)。作為替代人腦進(jìn)行運(yùn)算的數(shù)字計(jì)算機(jī),無論是控制器還是處理器,無論是簡單的單片機(jī)還是大型的服務(wù)器,以加、減法為基礎(chǔ)的算術(shù)單元自然是最重要的核心部件。
雖然我們對(duì)十進(jìn)制的加減乘除都已經(jīng)熟悉到了本能的地步,如何讓晶體管構(gòu)建的、以二進(jìn)制為基礎(chǔ)的數(shù)字電路來實(shí)現(xiàn)我們?nèi)祟愋枰募印p、乘、除?
著名科普專家“冬瓜哥”在其定價(jià)為600元的巨著《大話計(jì)算機(jī)》開篇就對(duì)這個(gè)問題進(jìn)行了闡述:
十余年的困惑,自然是上升到了常人不可達(dá)的層面才想明白的一些道理,有興趣的同學(xué)可以跟著他的思路繞一繞,蘇老師讀了半個(gè)小時(shí)就已經(jīng)感覺到腦細(xì)胞嚴(yán)重疲勞。
他切入計(jì)算機(jī)的入口就是加法器,準(zhǔn)確地講就是在我們的數(shù)字電路中一帶而過的Adder - 半加器、全加器以及超前進(jìn)位加法器(很多教程僅給出了半頁的篇幅)。冬瓜哥得出的結(jié)論是“CPU內(nèi)部就是個(gè)加法器”。可見它的重要性,也可見我們對(duì)它真的是嚴(yán)重忽略了,就像1+1=2一樣,它重要得實(shí)在太平凡了。
但,它確實(shí)是我們數(shù)字計(jì)算的基礎(chǔ),理解了它才能夠理解整個(gè)的數(shù)字邏輯世界。
我們先通過硬禾學(xué)堂制作的一個(gè)7分鐘的視頻教程來看一下加法器最基本的兩個(gè)示例:
第一個(gè)案例 - 1位半加器
根據(jù)我們?nèi)祟愒谑M(jìn)制領(lǐng)域定義的加法規(guī)則,來操作2個(gè)1位的數(shù)據(jù)相加,從最基本的門的功能以及加法的規(guī)則需求,我們得到來實(shí)現(xiàn)它的電路 - 通過一個(gè)“異或門”得到加法以后的1位的結(jié)果,以及通過一個(gè)“與門”得到一個(gè)“進(jìn)位”位的值,就像我們十進(jìn)制的加法,如果兩個(gè)數(shù)字相加超過了一個(gè)“位”(十進(jìn)制的位)能夠表達(dá)的范圍,就要生成一個(gè)進(jìn)位信號(hào)。通過真值表能夠比較直觀地看出反映2個(gè)輸入位同經(jīng)過加法操作以后得到的輸出位的關(guān)系。
使用Verilog代碼的1位半加器:
module halfadder ( input a, //第一個(gè)加數(shù)a input b, //第二個(gè)加數(shù)b output sum, //顯示和的led output cout //顯示進(jìn)位的led ); assign sum=a ^ b; //sum=a⊕b assign cout=a & b; //cout=ab endmodule
第二個(gè)案例 - 1位全加器
畢竟2個(gè)1位的數(shù)相加只是基礎(chǔ),太局限,我們擴(kuò)展一下,如果需要有超過1位的數(shù)字相加,該如何操作?那就需要將“進(jìn)位”的值考慮進(jìn)來,作為一個(gè)輸入,有了進(jìn)位輸入、進(jìn)位輸出的加法器被稱之為“全加器”,全了,誰都不缺了。
使用Verilog代碼的1位全加器的Verilog代碼:
module adder1 ( input wire a, //輸入的低位進(jìn)位及兩個(gè)加數(shù)cin、a、b input wire b, input wire cin, output wire sum, //輸出的和與進(jìn)位 output wire cout ); wire s1,s2,s3; //定義中間變量 xor (s1,a,b); //調(diào)用基本異或門 xor (sum,s1,cin); nand (s2,a,b); //調(diào)用基本與非門 nand (s3,s1,cin); nand (cout,s2,s3); endmodule
通過上面的兩段Verilog代碼,可以看出用Verilog這種硬件描述語言的一些特點(diǎn),這個(gè)在后面的文章中會(huì)專門介紹。
多數(shù)的“數(shù)字電路”教程關(guān)于加法器也基本上點(diǎn)到此為止了。
但上述的基本單元能用來做啥的?如果不做擴(kuò)展,同學(xué)們很難有進(jìn)一步的理解,因此我建議大家可以自行做一些擴(kuò)展:
支持多位二進(jìn)制數(shù)相加的并行二進(jìn)制加法器
比如2個(gè)4位二進(jìn)制的加法器,它可以由3個(gè)全加器和1個(gè)半加器構(gòu)成,低位的加法進(jìn)位可以作為相鄰高位加法的一個(gè)輸入端,最低位僅用一個(gè)半加器,最高位生成的進(jìn)位信號(hào)作為后續(xù)電路的輸入。
是不是像極了我們的十進(jìn)制加法?原理是一樣的,只是采用的進(jìn)制不同,而二進(jìn)制可以通過數(shù)字電路的0、1比較容易地實(shí)現(xiàn)。
了解了加法器,減法器也就不難理解,就像我們十進(jìn)制中的加和減的關(guān)系一樣。它的基本規(guī)則:
0 - 0 = 0
0 - 1 = (借)1 1
1 - 0 = 1
1 - 1 = 0
既然多位的全減器也可以用全加器來實(shí)現(xiàn),是不是可以有一種統(tǒng)一的結(jié)構(gòu)能夠?qū)崿F(xiàn)加、減的功能?畢竟減和加是對(duì)偶的,減法也可以看作是+(-)的操作。
統(tǒng)一結(jié)構(gòu)的并行加、減法
從前面的加減法構(gòu)成可以看出,加法器和減法器都可以用共同的加法器來實(shí)現(xiàn),如果我們添加一個(gè)控制信號(hào)M,最低位也使用一個(gè)全加器,將這個(gè)M值連接到該全加器的進(jìn)位輸入端,就可以通過這個(gè)M是0或1來決定此電路時(shí)加法電路還是減法電路:
M=1的時(shí)候?yàn)闇p法器
M=0的時(shí)候行使加法器的功能。
如果你需要將更多的位數(shù)的二進(jìn)制數(shù)字相加或相減,你可以使用更多個(gè)加法器級(jí)聯(lián)即可得到。細(xì)心和動(dòng)腦的同學(xué)會(huì)發(fā)現(xiàn),如果任何操作需要哪怕一丁點(diǎn)的時(shí)間(有了時(shí)間的概念也就意味著 - 因果之間有了先后,有了“時(shí)延”,我們生存的世界時(shí)間是一個(gè)客觀存在的維度),那么圖中的操作在每個(gè)位上的輸出就會(huì)產(chǎn)生時(shí)間上的差異,最高位的值和進(jìn)位依賴于低位的值和每一位加法操作的時(shí)間(也就是構(gòu)成加法器的門的響應(yīng)時(shí)間)。就像綠燈亮起,并不是所有等待的車同時(shí)啟動(dòng)前行,而是從第一輛車逐級(jí)傳遞過來的一樣。
用上述方法構(gòu)建的加法器、減法器,位數(shù)越多,由于電路門時(shí)延帶來的計(jì)算結(jié)果會(huì)越慢出現(xiàn),聰明的前輩大神們竟然通過一系列的邏輯運(yùn)算發(fā)明了“超前進(jìn)位加法器”的結(jié)構(gòu),即便實(shí)際的電路上每個(gè)操作都有先后帶來的時(shí)延,我們也可以不需要考慮每個(gè)進(jìn)位的逐級(jí)傳遞,而是一次性地根據(jù)各個(gè)輸入端的位上的值直接得出運(yùn)算以后的結(jié)果。
是不是很不可思議?
為啥需要逐級(jí)傳遞的信息可以提前預(yù)知?為什么在布爾表達(dá)式中的一些變量經(jīng)過邏輯化簡以后發(fā)現(xiàn)它們只是打醬油的可有可無?
我們的生活中是否也是如此?每當(dāng)綠燈亮起的時(shí)候所有的車是否也能同步啟動(dòng)前行?
這些問題留給大家思考。
有了加法器、減法器,也就很容易構(gòu)建乘法器 - 重復(fù)多次的加,和除法器 - 重復(fù)多次的減。
因此加法器是構(gòu)成整個(gè)數(shù)字計(jì)算的基礎(chǔ),是最重要的一個(gè)部件,它的設(shè)計(jì)好壞直接影響了處理器/控制器的性能、性價(jià)比等。
比如在電子森林“電路仿真”中的Brent-Kung樹形加法器就是一種最小化芯片面積和成本的結(jié)構(gòu)。有興趣的同學(xué)可以點(diǎn)擊https://www.eetree.cn/war/circuitjs.html?lang=zh 來體驗(yàn)一下。
正如前面文章所述,在FPGA沒有大面積普及應(yīng)用的年代,曾經(jīng)有一系列的中等規(guī)模的集成電路模塊推出,最著名的就是74系列的器件,其中74HC283就是一種4位超前進(jìn)位的全加器器件。很多高校可能還在拿它做數(shù)電的實(shí)驗(yàn),
外形長這樣
內(nèi)部功能這樣
最后,給大家介紹一款國外公司制作的4位加法器的訓(xùn)練套件
為了方便大家實(shí)驗(yàn),這個(gè)產(chǎn)品中包含了如下的一些器件:
1個(gè)多路選擇器(CD74HC157E)
2個(gè)寄存器 /4個(gè)D觸發(fā)器 (CD74HC173E)
1個(gè)4位全加器 (CD74HC283E)
1個(gè)6通道具有施密特觸發(fā)器輸入的反相器 (CD74HC14E)
1個(gè)4位幅度比較器 (CD74HC85E)
1個(gè)雙4輸入異或門 (CD74HC4002E)
1個(gè)4組 2輸入異或門 (CD74HC86E)
得說,這個(gè)套件的文檔寫得特別的棒,有興趣的老師和同學(xué)可以自己搜一下。
這個(gè)套件用了8顆中等規(guī)模的集成電路,加上很多連線連線。其實(shí)呢,用小腳丫FPGA內(nèi)部的不到1%的資源就能實(shí)現(xiàn),而且只需要寫很短的幾行Verilog代碼。
責(zé)任編輯:haq
-
處理器
+關(guān)注
關(guān)注
68文章
19432瀏覽量
231249 -
電路圖
+關(guān)注
關(guān)注
10357文章
10725瀏覽量
533087 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7546瀏覽量
88685
原文標(biāo)題:淺談“數(shù)字電路”的學(xué)習(xí)(7)- 一切數(shù)字計(jì)算的核心功能、被教程忽略的加法器
文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論