12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
12 | 理解電路:從電報(bào)機(jī)到門電路,我們?nèi)绾巫龅健扒Ю飩餍拧?#xff1f;
我們前面講過機(jī)器指令,你應(yīng)該知道,所有最終執(zhí)行的程序其實(shí)都是使用“0”和“1”這樣的二進(jìn)制代碼來表示的。上一講里,我也向你展示了,對應(yīng)的整數(shù)和字符串,其實(shí)也是用“0”和“1”這樣的二進(jìn)制代碼來表示的。
那么你可能要問了,我知道了這個(gè)有什么用呢?畢竟我們?nèi)擞眉埡凸P來做運(yùn)算,都是用十進(jìn)制,直接用十進(jìn)制和我們最熟悉的符號不是最簡單么?為什么計(jì)算機(jī)里我們最終要選擇二進(jìn)制呢?
這一講,我和你一起來看看,計(jì)算機(jī)在硬件層面究竟是怎么表示二進(jìn)制的,以此你就會明白,為什么計(jì)算機(jī)會選擇二進(jìn)制。
從信使到電報(bào),我們怎么做到“千里傳書”?
馬拉松的故事相信你聽說過。公元前 490 年,在雅典附近的馬拉松海邊,發(fā)生了波斯和希臘之間的希波戰(zhàn)爭。雅典和斯巴達(dá)領(lǐng)導(dǎo)的希臘聯(lián)軍勝利之后,雅典飛毛腿菲迪皮德斯跑了歷史上第一個(gè)馬拉松,回雅典報(bào)喜。這個(gè)時(shí)候,人們在遠(yuǎn)距離報(bào)信的時(shí)候,采用的是派人跑腿,傳口信或者送信的方式。
但是,這樣靠人傳口信或者送信的方式,實(shí)在是太慢了。在軍事用途中,信息能否更早更準(zhǔn)確地傳遞出去經(jīng)常是事關(guān)成敗的大事。所以我們看到中國古代的軍隊(duì)有“擊鼓進(jìn)軍”和“鳴金收兵”,通過打鼓和敲鉦發(fā)出不同的聲音,來傳遞軍隊(duì)的號令。
如果我們把軍隊(duì)當(dāng)成一臺計(jì)算機(jī),那“金”和“鼓”就是這臺計(jì)算機(jī)的“1”和“0”。我們可以通過不同的編碼方式,來指揮這支軍隊(duì)前進(jìn)、后退、轉(zhuǎn)向、追擊等等。
“金”和“鼓”比起跑腿傳口信,固然效率更高了,但是能夠傳遞的范圍還是非常有限,超出個(gè)幾公里恐怕就聽不見了。于是,人們發(fā)明了更多能夠往更遠(yuǎn)距離傳信的方式,比如海上的燈塔、長城上的烽火臺。因?yàn)楣馑俦嚷曀俑?#xff0c;傳的距離也可以更遠(yuǎn)。
圖片來源
亞歷山大港外的法羅斯燈塔,位列世界七大奇跡之一,可惜現(xiàn)在只剩下遺跡了。可見人類社會很早就學(xué)會使用類似二進(jìn)制信號的方式來傳輸信息
但是,這些傳遞信息的方式都面臨一個(gè)問題,就是受限于只有“1”和“0”這兩種信號,不能傳遞太復(fù)雜的信息,那電報(bào)的發(fā)明就解決了這個(gè)問題。
從信息編碼的角度來說,金、鼓、燈塔、烽火臺類似電報(bào)的二進(jìn)制編碼。電報(bào)傳輸?shù)男盘栍袃煞N,一種是短促的點(diǎn)信號(dot 信號),一種是長一點(diǎn)的劃信號(dash 信號)。我們把“點(diǎn)”當(dāng)成“1”,把“劃”當(dāng)成“0”。這樣一來,我們的電報(bào)信號就是另一種特殊的二進(jìn)制編碼了。電影里最常見的電報(bào)信號是“SOS”,這個(gè)信號表示出來就是 “點(diǎn)點(diǎn)點(diǎn)劃劃劃點(diǎn)點(diǎn)點(diǎn)”。
比起燈塔和烽火臺這樣的設(shè)備,電報(bào)信號有兩個(gè)明顯的優(yōu)勢。第一,信號的傳輸距離迅速增加。因?yàn)殡妶?bào)本質(zhì)上是通過電信號來進(jìn)行傳播的,所以從輸入信號到輸出信號基本上沒有延時(shí)。第二,輸入信號的速度加快了很多。電報(bào)機(jī)只有一個(gè)按鈕,按下就是輸入信號,按的時(shí)間短一點(diǎn),就是發(fā)出了一個(gè)“點(diǎn)”信號;按的時(shí)間長一些,就是一個(gè)“劃”信號。只要一個(gè)手指,就能快速發(fā)送電報(bào)。
圖片來源
一個(gè)摩爾斯電碼的電報(bào)機(jī)
而且,制造一臺電報(bào)機(jī)也非常容易。電報(bào)機(jī)本質(zhì)上就是一個(gè)“蜂鳴器 + 長長的電線 + 按鈕開關(guān)”。蜂鳴器裝在接收方手里,開關(guān)留在發(fā)送方手里。雙方用長長的電線連在一起。當(dāng)按鈕開關(guān)按下的時(shí)候,電線的電路接通了,蜂鳴器就會響。短促地按下,就是一個(gè)短促的點(diǎn)信號;按的時(shí)間稍微長一些,就是一個(gè)稍長的劃信號。
有了電池開關(guān)和鈴鐺,你就有了最簡單的摩爾斯電碼發(fā)報(bào)機(jī)
理解繼電器,給跑不動的信號續(xù)一秒
有了電報(bào)機(jī),只要鋪設(shè)好電報(bào)線路,就可以傳輸我們需要的訊息了。但是這里面又出現(xiàn)了一個(gè)新的挑戰(zhàn),就是隨著電線的線路越長,電線的電阻就越大。當(dāng)電阻很大,而電壓不夠的時(shí)候,即使你按下開關(guān),蜂鳴器也不會響。
你可能要說了,我們可以提高電壓或者用更粗的電線,使得電阻更小,這樣就可以讓整個(gè)線路鋪得更長一些。但是這個(gè)再長,也沒辦法從北京鋪設(shè)到上海吧。要想從北京把電報(bào)發(fā)到上海,我們還得想些別的辦法。
對于電報(bào)來說,電線太長了,使得線路接通也沒有辦法讓蜂鳴器響起來。那么,我們就不要一次鋪太長的線路,而把一小段距離當(dāng)成一個(gè)線路,也和驛站建立一個(gè)小電報(bào)站。我們在小電報(bào)站里面安排一個(gè)電報(bào)員,他聽到上一個(gè)小電報(bào)站發(fā)來的信息,然后原樣輸入,發(fā)到下一個(gè)電報(bào)站去。這樣,我們的信號就可以一段段傳輸下去,而不會因?yàn)榫嚯x太長,導(dǎo)致電阻太大,沒有辦法成功傳輸信號。為了能夠?qū)崿F(xiàn)這樣接力傳輸信號,在電路里面,工程師們造了一個(gè)叫作繼電器(Relay)的設(shè)備。
中繼,其實(shí)就是不斷地通過新的電源重新放大已經(jīng)開始衰減的原有信號
事實(shí)上,這個(gè)過程中,我們需要在每一階段原樣傳輸信號,所以你可以想想,我們是不是可以設(shè)計(jì)一個(gè)設(shè)備來代替這個(gè)電報(bào)員?相比使用人工聽蜂鳴器的聲音,來重復(fù)輸入信號,利用電磁效應(yīng)和磁鐵,來實(shí)現(xiàn)這個(gè)事情會更容易。
我們把原先用來輸出聲音的蜂鳴器,換成一段環(huán)形的螺旋線圈,讓電路封閉通上電。因?yàn)殡姶判?yīng),這段螺旋線圈會產(chǎn)生一個(gè)帶有磁性的電磁場。我們原本需要輸入的按鈕開關(guān),就可以用一塊磁力稍弱的磁鐵把它設(shè)在“關(guān)”的狀態(tài)。這樣,按下上一個(gè)電報(bào)站的開關(guān),螺旋線圈通電產(chǎn)生了磁場之后,磁力就會把開關(guān)“吸”下來,接通到下一個(gè)電報(bào)站的電路。
如果我們在中間所有小電報(bào)站都用這個(gè)“螺旋線圈 + 磁性開關(guān)”的方式,來替代蜂鳴器和普通開關(guān),而只在電報(bào)的始發(fā)和終點(diǎn)用普通的開關(guān)和蜂鳴器,我們就有了一個(gè)拆成一段一段的電報(bào)線路,接力傳輸電報(bào)信號。這樣,我們就不需要中間安排人力來聽打電報(bào)內(nèi)容,也不需要解決因?yàn)榫€纜太長導(dǎo)致的電阻太大或者電壓不足的問題了。我們只要在終點(diǎn)站安排電報(bào)員,聽寫最終的電報(bào)內(nèi)容就可以了。這樣是不是比之前更省事了?
事實(shí)上,繼電器還有一個(gè)名字就叫作電驛,這個(gè)“驛”就是驛站的驛,可以說非常形象了。這個(gè)接力的策略不僅可以用在電報(bào)中,在通信類的科技產(chǎn)品中其實(shí)都可以用到。
比如說,你在家里用 WiFi,如果你的屋子比較大,可能某些房間的信號就不好。你可以選用支持“中繼”的 WiFi 路由器,在信號衰減的地方,增加一個(gè) WiFi 設(shè)備,接收原來的 WiFi 信號,再重新從當(dāng)前節(jié)點(diǎn)傳輸出去。這種中繼對應(yīng)的英文名詞和繼電器是一樣的,也叫 Relay。
再比如說,我們現(xiàn)在互聯(lián)網(wǎng)使用的光纜,是用光信號來傳輸數(shù)據(jù)。隨著距離的增長、反射次數(shù)的增加,信號也會有所衰減,我們同樣要每隔一段距離,來增加一個(gè)用來重新放大信號的中繼。
有了繼電器之后,我們不僅有了一個(gè)能夠接力傳輸信號的方式,更重要的是,和輸入端通過開關(guān)的“開”和“關(guān)”來表示“1”和“0”一樣,我們在輸出端也能表示“1”和“0”了。
輸出端的作用,不僅僅是通過一個(gè)蜂鳴器或者燈泡,提供一個(gè)供人觀察的輸出信號,通過“螺旋線圈 + 磁性開關(guān)”,使得我們有“開”和“關(guān)”這兩種狀態(tài),這個(gè)“開”和“關(guān)”表示的“1”和“0”,還可以作為后續(xù)線路的輸入信號,讓我們開始可以通過最簡單的電路,來組合形成我們需要的邏輯。
通過這些線圈和開關(guān),我們也可以很容易地創(chuàng)建出 “與(AND)”“或(OR)”“非(NOT)”這樣的邏輯。我們在輸入端的電路上,提供串聯(lián)的兩個(gè)開關(guān),只有兩個(gè)開關(guān)都打開,電路才接通,輸出的開關(guān)也才能接通,這其實(shí)就是模擬了計(jì)算機(jī)里面的“與”操作。
我們在輸入端的電路,提供兩條獨(dú)立的線路到輸出端,兩條線路上各有一個(gè)開關(guān),那么任何一個(gè)開關(guān)打開了,到輸出端的電路都是接通的,這其實(shí)就是模擬了計(jì)算機(jī)中的“或”操作。
當(dāng)我們把輸出端的“螺旋線圈 + 磁性開關(guān)”的組合,從默認(rèn)關(guān)掉,只有通電有了磁場之后打開,換成默認(rèn)是打開通電的,只有通電之后才關(guān)閉,我們就得到了一個(gè)計(jì)算機(jī)中的“非”操作。輸出端開和關(guān)正好和輸入端相反。這個(gè)在數(shù)字電路中,也叫作反向器(Inverter)。
反向器的電路,其實(shí)就是開關(guān)從默認(rèn)關(guān)閉變成默認(rèn)開啟而已
與、或、非的電路都非常簡單,要想做稍微復(fù)雜一點(diǎn)的工作,我們需要很多電路的組合。不過,這也彰顯了現(xiàn)代計(jì)算機(jī)體系中一個(gè)重要的思想,就是通過分層和組合,逐步搭建起更加強(qiáng)大的功能。
回到我們前面看的電報(bào)機(jī)原型,雖然一個(gè)按鈕開關(guān)的電報(bào)機(jī)很“容易”操作,但是卻不“方便”操作。因?yàn)殡妶?bào)員要熟記每一個(gè)字母對應(yīng)的摩爾斯電碼,并且需要快速按鍵來進(jìn)行輸入。一旦輸錯(cuò)很難糾正。但是,因?yàn)殡娐分g可以通過與、或、非組合完成更復(fù)雜的功能,我們完全可以設(shè)計(jì)一個(gè)和打字機(jī)一樣的電報(bào)機(jī),每按下一個(gè)字母按鈕,就會接通一部分電路,然后把這個(gè)字母的摩爾斯電碼輸出出去。
雖然在電報(bào)機(jī)時(shí)代,我們沒有這么做,但是在計(jì)算機(jī)時(shí)代,我們其實(shí)就是這樣做的。我們不再是給計(jì)算機(jī)“0”和“1”,而是通過千萬個(gè)晶體管組合在一起,最終使得我們可以用“高級語言”,指揮計(jì)算機(jī)去干什么。
總結(jié)延伸
可以說,電報(bào)是現(xiàn)代計(jì)算機(jī)的一個(gè)最簡單的原型。它和我們現(xiàn)在使用的現(xiàn)代計(jì)算機(jī)有很多相似之處。我們通過電路的“開”和“關(guān)”,來表示“1”和“0”。就像晶體管在不同的情況下,表現(xiàn)為導(dǎo)電的“1”和絕緣的“0”的狀態(tài)。
我們通過電報(bào)機(jī)這個(gè)設(shè)備,看到了如何通過“螺旋線圈 + 開關(guān)”,來構(gòu)造基本的邏輯電路,我們也叫門電路。一方面,我們可以通過繼電器或者中繼,進(jìn)行長距離的信號傳輸。另一方面,我們也可以通過設(shè)置不同的線路和開關(guān)狀態(tài),實(shí)現(xiàn)更多不同的信號表示和處理方式,這些線路的連接方式其實(shí)就是我們在數(shù)字電路中所說的門電路。而這些門電路,也是我們創(chuàng)建 CPU 和內(nèi)存的基本邏輯單元。我們的各種對于計(jì)算機(jī)二進(jìn)制的“0”和“1”的操作,其實(shí)就是來自于門電路,叫作組合邏輯電路。
推薦閱讀
《編碼:隱匿在計(jì)算機(jī)軟硬件背后的語言》的第 6~11 章,是一個(gè)很好的入門材料,可以幫助你深入理解數(shù)字電路,值得你花時(shí)間好好讀一讀。
總結(jié)
以上是生活随笔為你收集整理的12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据时代之市场调研的必要性
- 下一篇: html li内部水平排列,怎样使用li