我們都知道,「通電」代表「真」,用邏輯1表示;「不通電」代表「假」,用邏輯0表示?!概c門(mén)」電路是用晶體管搭建的,符號(hào)長(zhǎng)這樣:
A與B的通斷,可以決定Y點(diǎn)是否通電。
我們還為A、B與Y之間的關(guān)系畫(huà)了一張表(真值表):
接著我們?cè)O(shè)計(jì)出了簡(jiǎn)單的「或門(mén)」「非門(mén)」,用它們可以搭建各式各樣其他的門(mén)電路。
這篇文章講一下,怎么利用基礎(chǔ)門(mén)電路進(jìn)行加法計(jì)算。
二進(jìn)制加法
我已經(jīng)忘了是什么時(shí)候?qū)W的加法了,應(yīng)該是小學(xué)吧,先學(xué)10以內(nèi)的,再學(xué)100以內(nèi)的,然后不管多大的數(shù)都可以隨便加了,算式很簡(jiǎn)單,就是逢10進(jìn)1。
下面這個(gè)式子是一個(gè)萬(wàn)以內(nèi)的加法:
相應(yīng)的,二進(jìn)制就是逢2進(jìn)1,下面這個(gè)式子是2個(gè)8位二進(jìn)制數(shù)的加法計(jì)算:
半加器
8位二進(jìn)制數(shù)還太復(fù)雜,我們先來(lái)看看1位二進(jìn)制數(shù)怎么計(jì)算的,一共有以下4種情況:
觀察一下就能發(fā)現(xiàn)2個(gè)規(guī)律。
第一個(gè)規(guī)律,只考慮加法,不考慮進(jìn)位時(shí),加數(shù)與和之間的關(guān)系如下:
相同為0,不同為1。這個(gè)關(guān)系和「異或門(mén)」是相同的:
異或門(mén)我們之前沒(méi)有聊到過(guò),電路圖長(zhǎng)這樣:
第二個(gè)規(guī)律是,如果只考慮進(jìn)位,不考慮加法,加數(shù)與進(jìn)位之間的關(guān)系如下:
只有全1時(shí),才為1。發(fā)現(xiàn)了嗎,這和本文開(kāi)頭與門(mén)的真值表是一樣的。
2個(gè)一位二進(jìn)制數(shù)相加將產(chǎn)生一個(gè)加法位和一個(gè)進(jìn)位位,加法位輸入與輸出的關(guān)系跟與門(mén)是一樣的,進(jìn)位位跟異或門(mén)相同。
所以,可以像這樣把兩個(gè)門(mén)電路連起來(lái),計(jì)算2個(gè)二進(jìn)制數(shù)(A和B)的和:
我們稱這個(gè)電路為「半加器」,因?yàn)樗荒苡?jì)算2個(gè)一位二進(jìn)制數(shù)的加法,沒(méi)有辦法將前面加法可能產(chǎn)生的進(jìn)位納入下一次計(jì)算中,如果有進(jìn)位則實(shí)際上是需要3個(gè)加數(shù)參與計(jì)算。
用門(mén)電路畫(huà)太復(fù)雜,可以封裝起來(lái)這樣表示半加器:
全加器
怎樣計(jì)算3個(gè)加數(shù)的二進(jìn)制加法呢?需要將2個(gè)半加器和一個(gè)或門(mén)如圖連接起來(lái):
左邊能看到它有3個(gè)輸入,右邊依舊是1位加和輸出,1位進(jìn)位輸出。
2個(gè)數(shù)的加和與上一次的進(jìn)位相加,得出的加和作為3個(gè)數(shù)最終的加和;2個(gè)數(shù)相加或3個(gè)數(shù)相加的進(jìn)位作為3個(gè)數(shù)加和最終的進(jìn)位位。
用文字描述有點(diǎn)不好理解,把這個(gè)電路圖全部輸入和輸出情況都展示出來(lái),畫(huà)一個(gè)表就明白了:
很明顯,這個(gè)表就是2個(gè)一位二進(jìn)制數(shù)帶進(jìn)位的全部狀態(tài)。
每次做加法時(shí)畫(huà)2個(gè)半加器和一個(gè)或門(mén)很麻煩,我們用下面這個(gè)圖示把它們封裝起來(lái),這個(gè)能計(jì)算3位二進(jìn)制數(shù)加法的電路就稱為「全加器」。
加法器
現(xiàn)在回到開(kāi)頭那個(gè)二進(jìn)制加法:
它有8個(gè)二進(jìn)制位,到目前為止我們還只能計(jì)算2個(gè)一位二進(jìn)制數(shù),最多再增加一個(gè)進(jìn)位的加法,我們最終的目標(biāo)當(dāng)然是2個(gè)8位、16位乃至32位數(shù)的加法。
其實(shí),非常簡(jiǎn)單,用8個(gè)全加器一塊算!
把8個(gè)全加器每個(gè)進(jìn)位輸出作為下一個(gè)的進(jìn)位輸入,首尾相連就可以啦!
每次這樣畫(huà)太麻煩,可以封裝成一個(gè)框圖:
大箭頭代表8個(gè)輸入/輸出端,有8個(gè)獨(dú)立的信號(hào)。
一旦我們擁有了8位二進(jìn)制加法器,把它們級(jí)聯(lián)起來(lái),很容易就能得到一個(gè)16位或32位的加法器啦。
加法計(jì)算是計(jì)算機(jī)的基本運(yùn)算,其實(shí),計(jì)算機(jī)唯一的工作就是做加法計(jì)算。不論是減法、乘法、除法、在線支付、火箭升空還是AI下棋,都是利用加法實(shí)現(xiàn)的。
把加減乘除和邏輯運(yùn)算等運(yùn)算單元集成起來(lái),就組成了CPU中的基本計(jì)算單元:ALU(算術(shù)邏輯單元Arithmetic and Logic Unit)。
用加法器計(jì)算2個(gè)數(shù)的加法其實(shí)就是用硬件方式實(shí)現(xiàn)了一個(gè)加法計(jì)算器,輸入A和輸入B的高低電平?jīng)Q定了輸出S和CO的高低電平。
這樣的電路同一時(shí)刻只能表示一種狀態(tài),只要改變了A、B中任意一位,輸出就會(huì)有所變化。
現(xiàn)在我們想計(jì)算更多二進(jìn)制數(shù)的加法,比如5個(gè)數(shù)A、B、C、D、E的加法(先不考慮進(jìn)位)。
步驟應(yīng)該是這樣:首先把A、B作為輸入,得出一個(gè)輸出S1,我們要記下來(lái)S1的值,然后把S1和C作為輸入,得出S2.。。。以此類推,要記下很多個(gè)數(shù),然后再用加法器計(jì)算。
5個(gè)數(shù)都已經(jīng)很麻煩了,如果要計(jì)算更多個(gè)數(shù)該怎么辦?能不能把每次計(jì)算完的結(jié)果存起來(lái),下次繼續(xù)使用呢?
我們的需求
這個(gè)加法器有個(gè)特點(diǎn),就是兩個(gè)加數(shù)A和B的值決定著加和S的值。
這個(gè)值是實(shí)時(shí)決定的,也就是說(shuō),A、B中只要有一個(gè)數(shù)據(jù)位發(fā)生了改變(0變1或1變0),加和就一定、立即發(fā)生改變。
我們?nèi)绻胗眠@個(gè)加法器算「累加和」將會(huì)很麻煩,比如5個(gè)數(shù)A、B、C、D、E的加法。
首先把A、B作為輸入,得出一個(gè)輸出S1,我們要記下來(lái)S1的值,然后把S1和C作為輸入,得出S2.。。。以此類推,要記下很多個(gè)數(shù),然后再用加法器計(jì)算。
工程師怎么會(huì)做這種無(wú)腦循環(huán)的工作呢,得想辦法交給計(jì)算機(jī)寄幾做。
好像只要做一個(gè)什么器件連在這個(gè)加法器的輸出上,這個(gè)新器件能夠保存加法器輸出的和,并將算好的和再作為一個(gè)參數(shù)輸入,傳遞給加法器就可以了。
注意這個(gè)新器件,首先它支持輸入和輸出;其次它能「保存」當(dāng)前的值;最后,有一個(gè)類似「開(kāi)關(guān)」的引腳決定它是否保持當(dāng)前的值。
「保存」是什么意思?其實(shí)很好理解,就是不論輸入的數(shù)據(jù)位怎么變化,輸出都不變。
不考慮8個(gè)數(shù)據(jù)位,先只搭建一個(gè)這樣具有「保存」功能的門(mén)電路,能保存一個(gè)bit就ok。
或非門(mén)點(diǎn)燈
科巖已經(jīng)點(diǎn)燈無(wú)數(shù),這次依然從點(diǎn)燈開(kāi)始,用或非門(mén)試一下。
「或非門(mén)」的真值關(guān)系如下表,記住輸入只要有1,輸出一定為0就可以了。
或非門(mén)的符號(hào):
按照下面這個(gè)電路把兩個(gè)或非門(mén)與一個(gè)小燈泡連起來(lái),如圖:
仔細(xì)觀察,能發(fā)現(xiàn)我把右邊或非門(mén)的輸出直接作為輸入連接到左邊或非門(mén)上,這會(huì)產(chǎn)生什么神奇的現(xiàn)象呢?
如上圖,最開(kāi)始,左邊或非門(mén)的輸入都是0,輸出為1;右邊或非門(mén)輸入一個(gè)是0,一個(gè)是1,輸出0,燈泡是不亮的。
現(xiàn)在把開(kāi)關(guān)S1連通,連通瞬間,左邊或非門(mén)輸出0,右邊或非門(mén)輸出1,燈泡被點(diǎn)亮,然后右邊或非門(mén)輸出的1給到左邊或非門(mén),2個(gè)輸入都是1,它的輸出為0保持不變,燈泡點(diǎn)亮不變。
接著我們把開(kāi)關(guān)S1斷開(kāi),如下圖神奇的事情發(fā)生了,燈泡依然保持點(diǎn)亮狀態(tài)!因?yàn)樽筮吇蚍情T(mén)仍有一個(gè)輸入是1。
如果把S2閉合會(huì)怎樣呢?燈泡馬上熄滅了。
這時(shí)再打開(kāi)S2,電路回到最初的狀態(tài),燈泡還是熄滅狀態(tài)。
可以總結(jié)規(guī)律了:
?導(dǎo)通S1,燈泡點(diǎn)亮,不論我們?cè)趺纯刂芐1,燈泡都是亮的
?導(dǎo)通S2,燈泡熄滅,不論我們?cè)趺纯刂芐2,燈泡都是亮的
這不就達(dá)到我們想要的「保存」功能了嘛,不論輸入的數(shù)據(jù)位怎么變化,輸出都不變。
觸發(fā)器(Flip-Flop)
像上面把兩個(gè)或非門(mén)連起來(lái),能夠穩(wěn)定保存電路狀態(tài)的電路被稱為「觸發(fā)器」。
Flip-Flop的意思是「翻轉(zhuǎn)」,中文翻譯比較奇怪,我們通常理解的觸發(fā)器是Trigger,不過(guò)沒(méi)關(guān)系,其實(shí)就是個(gè)名稱而已。
上面這個(gè)觸發(fā)器叫做R-S觸發(fā)器,它有2個(gè)輸入端S(Set)和R(Reset),2個(gè)輸出端Q和~Q(實(shí)在打不出Q上面的橫線o(╥﹏╥)o)。
當(dāng)S為1時(shí),輸出Q為1,~Q為0;當(dāng)R為1時(shí),輸出Q為0,~Q為1;當(dāng)S和R都為0時(shí),輸出Q和~Q保持不變;當(dāng)S和R都為1時(shí)是一個(gè)不正確的狀態(tài),我們不使用這個(gè)狀態(tài)。
不是特別繞吧?畫(huà)個(gè)表:
R-S觸發(fā)器最大特點(diǎn)就是它能記住2個(gè)輸入端的狀態(tài)。想要記住上一次的狀態(tài)時(shí),把2個(gè)輸入端都置0就可以了。
每次畫(huà)2個(gè)或非門(mén)太麻煩,封裝一下:
有了觸發(fā)器,計(jì)算機(jī)除了算些加減乘除、與或非邏輯運(yùn)算,開(kāi)始具備了存儲(chǔ)功能,我覺(jué)得觸發(fā)器真是一個(gè)神奇的存在,把平平無(wú)奇的門(mén)電路連起來(lái)竟然就賦予了計(jì)算機(jī)「記憶」。
計(jì)算機(jī)中寄存器(Register)、內(nèi)存(RAM)最最基礎(chǔ)的組成單元就是觸發(fā)器。
理解了觸發(fā)器的工作原理,也就理解了內(nèi)存的工作原理。
「觸發(fā)器」的電路實(shí)現(xiàn),最后畫(huà)出了一個(gè)R-S觸發(fā)器的框圖,它有2個(gè)輸入端,2個(gè)輸出端:
R-S觸發(fā)器最大特點(diǎn)就是它能記住2個(gè)輸入端的狀態(tài)。想要記住上一次的狀態(tài)時(shí),把2個(gè)輸入端都置0就可以了。
還記得上篇文章中我們提出的那個(gè)需求嗎,做一個(gè)什么器件連在加法器的輸出上,這個(gè)器件能夠保存加法器輸出的8位數(shù)的和,并將算好的和再作為一個(gè)參數(shù)輸入傳遞給加法器,從而實(shí)現(xiàn)一個(gè)累加器。
R-S觸發(fā)器只能記住1位數(shù)據(jù)的狀態(tài),怎樣能記住8位呢,這篇就來(lái)講講。
D觸發(fā)器
1個(gè)R-S觸發(fā)器能存1位數(shù)據(jù),所以需要8個(gè)R-S觸發(fā)器;1個(gè)R-S觸發(fā)器,有2個(gè)輸入端2個(gè)輸出端,8個(gè)就是16個(gè)輸入端,16個(gè)輸出端。
而我們需要的是一個(gè)8輸入、8輸出的器件,我們得想辦法簡(jiǎn)化R-S觸發(fā)器。
觀察一下R-S觸發(fā)器,雖然有2個(gè)數(shù)據(jù)輸入端和2個(gè)數(shù)據(jù)輸出端,但實(shí)際上它只能保存1種狀態(tài),即保存1個(gè)bit數(shù)據(jù)位,因?yàn)镼和Q`的狀態(tài)一定是相反的。
要保存數(shù)據(jù)時(shí),需要把2個(gè)數(shù)據(jù)輸入端都置成低電平。
這有點(diǎn)麻煩,因?yàn)橐瑫r(shí)控制兩個(gè)端;又有點(diǎn)浪費(fèi),明明只能存一位數(shù)據(jù)卻用了2根線;還有點(diǎn)耦合,因?yàn)閿?shù)據(jù)輸入端也有控制作用,同時(shí)也是控制端,沒(méi)區(qū)分開(kāi)。
能不能把數(shù)據(jù)和控制分開(kāi),并且輸入和輸出只用一個(gè)數(shù)據(jù)端?
我們?cè)囍黾右粋€(gè)具有控制功能的「保持位」,它能決定電路當(dāng)前的狀態(tài)是否被「記住」。
當(dāng)「保持位」為1時(shí),數(shù)據(jù)輸入的值就會(huì)被電路記住,當(dāng)保持位為0時(shí),數(shù)據(jù)輸入位的任何值都不會(huì)影響電路的狀態(tài)。
先畫(huà)一下這個(gè)理想電路的真值表:
試著用R-S觸發(fā)器搭建和這個(gè)表對(duì)應(yīng)的電路:
這個(gè)電路實(shí)現(xiàn)了我們要的保持位的效果,保持為為1時(shí),電路狀態(tài)與R-S觸發(fā)器相同;保持位置0時(shí),相當(dāng)于S和R為0,電路保存當(dāng)前狀態(tài)。
可這樣又增加了一條線,能不能用一根線替換掉S和R這兩根輸入端呢?可以注意到,R與S的狀態(tài)是相反的,所以很簡(jiǎn)單,用一個(gè)非門(mén)就可以了。
如上圖,當(dāng)保持位為1時(shí),輸出Q端與數(shù)據(jù)端相同;當(dāng)保持位為0時(shí),數(shù)據(jù)端怎么改變都不會(huì)影響電路狀態(tài),即電路會(huì)記住保持位最后一次置1時(shí)數(shù)據(jù)端的值,是不是很簡(jiǎn)潔很舒服。
上面這個(gè)電路被稱為電平觸發(fā)的D(Data)型觸發(fā)器。
鎖存器
通常,保持位需要不斷的在0和1之間有規(guī)律的按一定頻率變化,這就像鐘表一樣,滴答滴答,永不知疲倦。所以我們給保持位換一個(gè)稱呼:時(shí)鐘(clock)。
這樣用時(shí)鐘控制的D觸發(fā)器也稱作「鎖存器」,因?yàn)榇鎯?chǔ)進(jìn)去的數(shù)據(jù)就好像被鎖住了一樣。
把8個(gè)鎖存器的時(shí)鐘端接在一起,引出輸入端D和輸出端Q,就構(gòu)成了一個(gè)8位的鎖存器:
這個(gè)鎖存器可以一次保存一個(gè)字節(jié)(8位數(shù)),把這個(gè)框圖封裝一下:
這個(gè)8位鎖存器就是我們需要的那個(gè)新器件啦,把它和8位加法器相連,就能得到一個(gè)累加器:
來(lái)模擬一下它的運(yùn)轉(zhuǎn)過(guò)程。
最開(kāi)始,輸入A為0,鎖存器中8個(gè)輸出端數(shù)據(jù)也均為0,即輸入B為0。
把輸入A設(shè)為1,由于輸入B為0,此時(shí)加法器輸出與A相同。
這時(shí)把鎖存器的時(shí)鐘置1,鎖存器電路狀態(tài)改變,輸出的值和加法器相同;再把時(shí)鐘置0,鎖存器保存加法器的結(jié)果,此時(shí)加法器的輸出不會(huì)影響鎖存器。
鎖存器同時(shí)會(huì)把加和作為加法器的輸入B傳遞給加法器,把A的值換成2,加法器會(huì)計(jì)算A和B的加和,鎖存器時(shí)鐘置1后置0,再保存加和,如此循環(huán),就可以計(jì)算輸入A的累加和了。
編輯:jq
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6772瀏覽量
88659 -
加法器
+關(guān)注
關(guān)注
6文章
183瀏覽量
30046 -
鎖存器
+關(guān)注
關(guān)注
8文章
904瀏覽量
41395 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
1992瀏覽量
60983
原文標(biāo)題:一文了解硬件加法器、觸發(fā)器、鎖存器
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論