當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > C語(yǔ)言與CPP編程
[導(dǎo)讀]對(duì)于程序員來(lái)說(shuō),計(jì)算機(jī)的重要性不言而喻,相信大家對(duì)計(jì)算機(jī)內(nèi)部也有一定的了解。但大家有沒(méi)想過(guò),為什么一堆邏輯門組合起來(lái)就能運(yùn)算了?它是如何運(yùn)作來(lái)實(shí)現(xiàn)加減法的? 為什么 cpu 會(huì)不停地取指執(zhí)行?是什么在驅(qū)動(dòng)著它?今天就和大家一起來(lái)探索一下底層的奧秘。

每個(gè)時(shí)代,都不會(huì)虧待會(huì)學(xué)習(xí)的人。

大家好,我是 yes。

對(duì)于我們程序員來(lái)說(shuō)計(jì)算機(jī)的重要性不言而喻,相信大家對(duì)計(jì)算機(jī)內(nèi)部也有一定的了解。

但是大家有沒(méi)想過(guò)為什么一堆邏輯門組合起來(lái)就能運(yùn)算了?它是如何運(yùn)作來(lái)實(shí)現(xiàn)加減法的?

為什么 cpu 會(huì)不停地取指執(zhí)行?是什么在驅(qū)動(dòng)著它?

今天我就和大家一起來(lái)探索一下底層的奧秘,但是術(shù)業(yè)有專攻,我們大致的了解一下即可,很多細(xì)節(jié)不清晰也不影響。

不過(guò)相信通過(guò)這篇文章你會(huì)對(duì)底層有不一樣的認(rèn)識(shí),包括運(yùn)算單元、內(nèi)存、時(shí)鐘、地址、溢出、補(bǔ)碼等等。

先打個(gè)預(yù)防針吧,這篇文章有很多電路圖,你可能感覺(jué)這啥啊,和我們開發(fā)有關(guān)系嗎?

看下去你會(huì)懂的,雖說(shuō)平日里我們都是 CRUD Boy,但是我們也得時(shí)刻保持著好奇心,要有求知欲和探索精神。

對(duì)了文末再送兩本書。

正文

這個(gè)故事得從「電」開始說(shuō)起。

生活中電無(wú)處不在,而它卻時(shí)刻保持著神秘感,為何插上電我們的屏幕就會(huì)亮?我們的服務(wù)器就能跑?

電是如何來(lái)的?

電起源于電子的運(yùn)動(dòng),我們知道一切物質(zhì)都是由原子組成的,而原子又是由中子、質(zhì)子和電子構(gòu)成。

在某種情況下電子從原子中電離出來(lái),這樣電就產(chǎn)生了。

質(zhì)子和電子都具有帶電荷的特性,質(zhì)子帶正電荷、電子帶負(fù)電荷。

而異電相吸,同電相斥,當(dāng)質(zhì)子數(shù)和電子數(shù)相等的時(shí)候是最穩(wěn)定的,如果數(shù)量不平衡也會(huì)往趨于平衡的方向發(fā)展

像雷雨天氣,云層下層積累電子而云層頂層失去電子,而閃電就是大量的電子迅速?gòu)囊欢宿D(zhuǎn)移到另一端產(chǎn)生的結(jié)果,為了趨于平衡。

題外話 :細(xì)心的朋友可能看到這原子核質(zhì)子不都合在一起了啊,不是說(shuō)同電相斥嘛?這是因?yàn)橛袀€(gè)叫強(qiáng)內(nèi)力的玩意聚集了它們,釋放核能的原子核裂變就是由強(qiáng)內(nèi)力導(dǎo)致的。

相信大家都做過(guò)電池點(diǎn)亮燈泡的物理實(shí)驗(yàn)。

這其實(shí)就是電池發(fā)生化學(xué)反應(yīng),在負(fù)極產(chǎn)生多余的電子,然后通過(guò)回路中的原子類似接力的形式,一個(gè)原子得到電子之后會(huì)傳遞給相鄰的另一個(gè)原子,如此循環(huán)傳遞電路就形成了,最終通過(guò)燈泡到達(dá)電池的正極。

改裝下再套上個(gè)外殼,手電筒就這樣被造出來(lái)了。

而手電筒不僅僅可以用來(lái)照明,還能用來(lái)通信。相信大家都看過(guò)類似的電影場(chǎng)景,我這手電筒的光閃三下咱們就上!

而說(shuō)到這樣簡(jiǎn)易的通信就不得不提摩爾斯電碼,相信大家也從各渠道對(duì)摩爾斯電碼有一定的了解,比如「星際穿越」這部賊好看的電影。

在 19 世紀(jì)初期,那時(shí)候的遠(yuǎn)距離通信還得利用馬車等工具長(zhǎng)時(shí)間運(yùn)輸傳遞,人們一直在摸索即時(shí)遠(yuǎn)距離通信的方法。那時(shí)的摩爾斯就開始埋頭實(shí)驗(yàn),最終發(fā)明了電報(bào)。

電報(bào)的思想和上述說(shuō)的手電筒思想一樣,手電筒通信的思想是通過(guò)開關(guān)來(lái)控制燈的亮暗,而電報(bào)利用的是電磁現(xiàn)象。

將導(dǎo)線纏繞在鐵棒上,然后通電之后鐵棒就變成了磁鐵,斷電了磁性又會(huì)消失,然后再搞個(gè)發(fā)聲器,通過(guò)磁性來(lái)吸引可動(dòng)棒敲擊發(fā)聲。

通電后可動(dòng)棒被拉下,敲擊下方就會(huì)發(fā)出 “滴” 的聲音,斷電則可動(dòng)棒復(fù)位,敲擊上方發(fā)出 “嗒” 的聲音。將快速的滴答作為點(diǎn),慢速的滴答作為劃。

通過(guò)導(dǎo)線的長(zhǎng)距離連接就能實(shí)現(xiàn)遠(yuǎn)距離通信,通過(guò)判別點(diǎn)和劃的組合查閱摩爾斯電碼表,轉(zhuǎn)成最終的信息。

如果要雙向通信,就再搞一個(gè)反過(guò)來(lái)部署就好了,這就是電報(bào)機(jī)了。

不過(guò)導(dǎo)線是有電阻的,導(dǎo)線越長(zhǎng)電阻越大,所以是有距離限制的,不過(guò)這難不倒我們,最簡(jiǎn)單的方法就是轉(zhuǎn)發(fā)一下。

在中間距離也建個(gè)電報(bào)站,然后雇一個(gè)人,得到發(fā)送方的電報(bào)信息之后,重新敲一遍發(fā)送給真正的接收方,但是這需要多余的人力,所以可以如下圖所示,搞個(gè)棒子連起來(lái)帶動(dòng)下一個(gè)開關(guān)的輸出

這其實(shí)就是繼電器原理,我們來(lái)看看繼電器是如何的設(shè)計(jì)的。

下方通電產(chǎn)生磁力,吸引上方的金屬桿掛下,然后上方形成回路因此也通電了,這樣遠(yuǎn)距離傳輸?shù)奈⑷蹼娏骶捅挥忠淮畏糯筝敵隽耍宰罱K的遠(yuǎn)距離電報(bào)應(yīng)該是這樣的。

可以看到繼電器這個(gè)發(fā)明是真的巧妙。

理解了上面所述的電的生成、電報(bào)以及繼電器之后我們?cè)賮?lái)看看二進(jìn)制。

基于二進(jìn)制的數(shù)字系統(tǒng)是最簡(jiǎn)單的,只有 0 和 1,不能再進(jìn)一步簡(jiǎn)化了,而簡(jiǎn)單就代表著清晰,就像開關(guān)要么開要么關(guān)。

而二進(jìn)制的組合又可以代表多種可能,比如第一個(gè) 0 表示男,1 表示女 ,第二個(gè) 0 表示胖,1 表示瘦。

讓我們?cè)倩氐街暗碾姵仉姛魣D中,這次搞兩個(gè)開關(guān)。

可以得知兩個(gè)開關(guān)都閉合電燈才會(huì)亮,如果轉(zhuǎn)化成二進(jìn)制表示,0 表示開關(guān)斷開,1 表示開關(guān)閉合,0 表示燈泡不亮,1 表示燈泡亮,總結(jié)成一張表格的話就是:

左開關(guān) 右開關(guān) 燈泡
0 0 0
0 1 0
1 0 0
1 1 1

這其實(shí)就是我們熟知的 AND 操作,如果把電路稍微改一下就是 OR 操作了。

如果把很多開關(guān)組合起來(lái)就能執(zhí)行簡(jiǎn)單的邏輯任務(wù),但是開關(guān)需要手動(dòng)的去控制。

記得之前提到的繼電器嗎?它也能串聯(lián)或者并聯(lián)電路,而且可以被其他繼電器聯(lián)動(dòng)控制,不需要一個(gè)一個(gè)撥動(dòng),因此用繼電器來(lái)組合更加合適,而繼電器的組合稱之為邏輯門。

簡(jiǎn)單點(diǎn)的就像下圖所示,開關(guān)閉合燈泡就會(huì)亮。

有些人覺(jué)得這不是多次一舉嗎,這其實(shí)是個(gè)緩沖器,可以延遲信號(hào),也可以放大信號(hào),而且這個(gè)電路比較簡(jiǎn)單,實(shí)際上有很多組合,比如下圖的這個(gè)反向操作,開關(guān)閉合的燈反而不會(huì)亮。

還有像這樣的串聯(lián)組合,只有兩個(gè)開關(guān)都閉合燈泡才會(huì)亮。

當(dāng)然這里的輸入不一定得是開關(guān),輸出也不一定得是燈泡,只是為了更加直觀的表現(xiàn)出來(lái),不過(guò)這樣畫電路太麻煩了,于是電氣工程師們就搞了個(gè)符號(hào)來(lái)表示這些電路,比如上面的串聯(lián)其實(shí)就是 AND 操作,是與門。

簡(jiǎn)化一下上面的圖就變成下面的樣子。

如果電路圖如下所示,就是并聯(lián),隨便一個(gè)開關(guān)開了燈泡都會(huì)亮,這就是或門。

簡(jiǎn)化符號(hào)是這樣的:

前面還提到個(gè)反向操作的,開關(guān)閉上燈泡反而不亮的叫反向器,符號(hào)如下圖所示。

我們?cè)賮?lái)看看這樣的電路。

只有當(dāng)兩個(gè)開關(guān)都斷開的情況下燈泡才會(huì)亮,任何一個(gè)開關(guān)閉合燈泡都會(huì)熄滅,這個(gè)操作和 OR 操作相反,稱之為 NOR 即或非門,簡(jiǎn)化后的符號(hào)比或門多了個(gè)小圓圈,代表反向。

或者這樣,組合著畫也一樣。

然后我們?cè)賮?lái)看看這種電路,只有兩個(gè)開關(guān)都斷開才會(huì)熄滅,這和與門正好相反,稱之為 NAND 與非門。

簡(jiǎn)化符號(hào)是這樣的,也是多了個(gè)圓圈:

我再總結(jié)一下這幾個(gè)簡(jiǎn)化圖,加深一下印象。

二進(jìn)制加法機(jī)

有了上面這幾樣?xùn)|西,我們就可以造個(gè)二進(jìn)制加法機(jī),不要小看加法,因?yàn)榭梢杂眉臃▉?lái)實(shí)現(xiàn)減法、乘法、除法等操作。

加法我們知道會(huì)得到當(dāng)前的和、進(jìn)位這兩個(gè)信息,例如二進(jìn)制中 1 + 1,當(dāng)前和是 0 ,進(jìn)位 1。

進(jìn)位 0 1
0 0 0
1 0 1

可以看到只有 1 +1 進(jìn)位 1 ,再仔細(xì)看看是不是和 AND 操作很像?只有 1 AND 1 結(jié)果才為1 。

AND 0 1
0 0 0
1 0 1

我們?cè)賮?lái)看看當(dāng)前和的計(jì)算

0 1
0 0 1
1 1 0

大家可以在腦子里面想象下,如果拿 OR 操作來(lái)套用的話右下角結(jié)果不對(duì),如果是 NAND 操作的話左上角結(jié)果不對(duì),所以得兩個(gè)結(jié)合一下,電路圖如下。

分別通過(guò)或門和與非門之后再做與門,出來(lái)的結(jié)果就是當(dāng)前和的結(jié)果,這個(gè)其實(shí)就是 XOR 異或門,簡(jiǎn)化表示就是:

所以加法需要通過(guò)兩個(gè)邏輯門,分別是異或門來(lái)操作當(dāng)前和,與門來(lái)操作進(jìn)位,結(jié)合起來(lái)如下圖所示:

這其實(shí)就是個(gè)半加器,簡(jiǎn)化的圖如下所示:

那為什么叫半加器?因?yàn)橹荒芤晃灰晃坏募?,而前一位的進(jìn)位參與不到下一位的計(jì)算,如果要加入進(jìn)位那下一位的運(yùn)行就是 A 的當(dāng)前位 + B 的當(dāng)前位 + A 和 B 之前的進(jìn)位。

因此需要改裝一下,兩個(gè)半加器合起來(lái)再加一個(gè)或門。

假設(shè) A 輸入 1 , B 輸入 1, 進(jìn)位輸入 1,從最左邊開始第一個(gè)半加器 S 輸出 0 , CO 輸出 1,第二個(gè)半加器 S輸出 1,CO 輸出 0,最終和輸出 1,進(jìn)位輸出 1,結(jié)果沒(méi)毛病可行,這叫全加器,簡(jiǎn)化一下圖:

全加器有了,咱們得組合起來(lái),并且需要有輸入和輸出,我們通過(guò)開關(guān)來(lái)輸入數(shù)字,由燈泡的亮暗顯示結(jié)果。

這就是一個(gè) 8 位的計(jì)算器,有 9 個(gè)燈是因?yàn)閮蓚€(gè) 8 位相加結(jié)果可能是 9 位。

然后從最右邊開始如下圖所示接上全加器,進(jìn)位接地表示 0 輸入

中間的都如下接法,前一個(gè)的進(jìn)位輸出是下一位的進(jìn)位輸入。

最后一個(gè)就是把進(jìn)位輸出直接接到第九個(gè)燈上就行了。

此時(shí)你擺動(dòng)控制面板的開關(guān),就可以通過(guò)機(jī)器得到相加的結(jié)果。簡(jiǎn)化的畫法如下圖所示:

現(xiàn)在我們已經(jīng)造出了八位加法器了,如果要 16 位呢?簡(jiǎn)單合一下就好了。

當(dāng)然真實(shí)的計(jì)算機(jī)原理差不多是這樣的,不過(guò)會(huì)更復(fù)雜,比如不會(huì)像我們的加法器,一個(gè)一個(gè)的進(jìn)位加,而是會(huì)先行進(jìn)位,而且也不會(huì)用繼電器,而是晶體管等等。

減法怎么弄?

加法器我們搞出來(lái)了,那減法怎么做?減法需要有借位操作。

我們先拿熟悉的十進(jìn)制來(lái)說(shuō)。假設(shè)你的賬戶上限是499,你的透支額度是500,也就是說(shuō)你的賬戶金額范圍是 -500~499 這 1000 個(gè)數(shù)字,要求不能用負(fù)號(hào)來(lái)表示。

可以看到這是個(gè)三位數(shù),而最大值就到 499 過(guò),說(shuō)明 500~999 之間的數(shù)沒(méi)用,那拿來(lái)表示負(fù)數(shù)不就剛剛好嗎?

所以讓 500 表示 - 500 ,501 表示 ?-499,以此類推。

500,501.......998,999,000,001......498,499讓5、6、7、8、9開頭的數(shù)都代表負(fù)數(shù),而且是不是看起來(lái)還形成了個(gè)環(huán)形, 499 + 1 就變成 500 了,然后 999 + 1 變成 1000 ,但是只能三位數(shù)表示,所以溢出了變成 000。

這種處理叫 10 的補(bǔ)數(shù),如果要把三位負(fù)數(shù)轉(zhuǎn)為 10 的補(bǔ)數(shù),就是讓 999 減去它再加一,也就是說(shuō) 10 的補(bǔ)數(shù)等于 9 的補(bǔ)數(shù)加一。

補(bǔ)數(shù)的概念:拿 9 的補(bǔ)數(shù)來(lái)說(shuō),將一個(gè)數(shù)從一串 9 中減去得到的結(jié)果就叫這個(gè)數(shù) 9 的補(bǔ)數(shù),比如 123 ,它是三位數(shù) ,999-123 = 876 所以 123 的 9 的補(bǔ)數(shù)就是 876,如果把結(jié)果 + 1那就是 10 的補(bǔ)數(shù)了。

就拿 -499 來(lái)說(shuō),我們要轉(zhuǎn)化成補(bǔ)數(shù),就是 999 - 499 + 1 等于 501 ,看上面的排列確實(shí)用 501 來(lái)代表 - 499。

那減去一個(gè)數(shù)不就是加上一個(gè)數(shù)的負(fù)數(shù)嗎?所以通過(guò)補(bǔ)數(shù)我們就不需要做減法,只需要轉(zhuǎn)成補(bǔ)數(shù)再相加就行了!

現(xiàn)在我們?cè)贀Q成二進(jìn)制,二進(jìn)制相比于十進(jìn)制就更簡(jiǎn)單了。

拿八位二進(jìn)制數(shù)來(lái)說(shuō),范圍是 00000000~11111111, 對(duì)應(yīng)的十進(jìn)制是 0~255,但現(xiàn)在我們想讓它能表示負(fù)數(shù),前面十進(jìn)制的時(shí)候我們將 5、6、7、8、9開頭的正數(shù)來(lái)表示負(fù)數(shù),對(duì)應(yīng)于二進(jìn)制我們可以將第一位以1開頭的作為負(fù)數(shù)。

那此時(shí)的范圍就是:

如果你理解了上面的十進(jìn)制轉(zhuǎn)化,這個(gè)二進(jìn)制肯定是沒(méi)問(wèn)題的,這其實(shí)就是算出 2 的補(bǔ)數(shù),而 2 的補(bǔ)數(shù)又是 1 的補(bǔ)數(shù) +1。

我們拿 125 來(lái)舉個(gè)例子,125 二進(jìn)制表示是 01111101,求 1 的補(bǔ)數(shù)就是 11111111 - 01111101,這個(gè)減法在二進(jìn)制中不需要,因?yàn)檫@其實(shí)就是求反,還記得上文提到的反向器嗎?

取反了之后再加一,就得到 2 的補(bǔ)碼。

所以 ?-125 就是 10000011。

當(dāng)然這一切的前提都是數(shù)字的位數(shù)需要固定,所以計(jì)算機(jī)中的位數(shù)就是固定的,超出了就會(huì)溢出,到這里你應(yīng)該可以理解計(jì)算機(jī)中的補(bǔ)碼是怎么來(lái)的,而且理解了為什么最大值 +1會(huì)變成最小值?

所以減法我們只需要改造一下上面的加法器,給個(gè)開關(guān)表示要這個(gè)數(shù)是負(fù)數(shù),如果是負(fù)數(shù)則進(jìn)行一波反向器操作然后再 +1,之后再進(jìn)行加法操作即可得到最終的結(jié)果。

乘法和除法我就不分析了,一樣也能通過(guò)加減法來(lái)實(shí)現(xiàn)。

振蕩器(時(shí)鐘)、鎖存器(觸發(fā)器)和計(jì)數(shù)器

當(dāng)然這個(gè)和我們所認(rèn)識(shí)的計(jì)算機(jī)還差很多,現(xiàn)在只能進(jìn)行一些非常簡(jiǎn)陋的加減操作,別急我們先來(lái)看看這個(gè)電路。

這個(gè)電路很有意思,當(dāng)你閉合開關(guān)的時(shí)候電路通了,此時(shí)由于電磁效應(yīng)可動(dòng)棒被吸了下來(lái),電路就斷了,斷了之后磁性消失了可動(dòng)棒又移了上去,這樣電路又通了,如此往復(fù)。

這種電路叫振蕩器,這是一個(gè)很關(guān)鍵的東西,記住它。

它的來(lái)回振蕩其實(shí)就是在輸出 0 和 1 的交替序列,畫成圖如下所示:

隨著時(shí)間的變化在 0 和 1之間交替變化,因此也稱之為時(shí)鐘。

一個(gè)變化循環(huán)所需要的時(shí)間稱之為周期,頻率是周期的倒數(shù),如果周期是 0.05 秒,那么頻率就是 20,每秒 20 個(gè)循環(huán),用赫茲來(lái)作其單位,所以就是 20 Hz。

我們?cè)賮?lái)看下這個(gè)電路。

此時(shí)燈泡是不亮的。當(dāng)上面的開關(guān)閉合后,左邊的或非門輸出 0 ,右邊的或非門輸出是 1,因此燈泡亮了。神奇的地方來(lái)了,此時(shí)你斷開上面的開關(guān),燈泡依然是亮的,因?yàn)樽筮叺幕蚍情T輸出還是 0,而或非門只要有一個(gè)輸入是 1,輸出就是 0 。

此時(shí)如果閉合下面的開關(guān),燈泡就會(huì)熄滅,再斷開下面的開關(guān)燈泡仍舊不亮。

可以看到這個(gè)電路是有記憶功能的,你看如果你發(fā)現(xiàn)此時(shí)的燈泡是亮的,你就能推斷上一次閉合的是上面的開關(guān),如果此時(shí)燈泡是暗的那么上次閉合的就是下面的開關(guān)!

這種電路叫觸發(fā)器,其實(shí)上面的開關(guān)就等于置位(set),下面的開關(guān)等于復(fù)位(Reset),所以這也叫 R-S觸發(fā)器。

不過(guò)更有用的電路應(yīng)該能記住某個(gè)特定時(shí)間點(diǎn)的上上一個(gè)信號(hào)是 0 是 1。

所以還需要搞個(gè)保持位,使得保持位關(guān)了之后,上下兩個(gè)開關(guān)隨意撥動(dòng)都不影響之前保持結(jié)果(下面的圖復(fù)位和置位位置和我們電路圖是相反了,不過(guò)沒(méi)影響一樣的)。

其實(shí)就是當(dāng)保持位 0 的時(shí)候,復(fù)位和置位通過(guò)與門的輸出肯定是 0 根本影響不到之前的結(jié)果。

但是這樣就有三位輸入了,比較麻煩。從上面的觀察來(lái)看有意義的輸入其實(shí)是上面開下面關(guān),或者上面關(guān)下面開,所以一定是相反的。所以搞個(gè)反向器這樣就只有兩個(gè)輸入了。

這個(gè)叫電平觸發(fā)的D型觸發(fā)器,D表示 Data,數(shù)據(jù)的輸入。電平觸發(fā)就是當(dāng)保持位為某一個(gè)特定電平時(shí) (例子是 1),觸發(fā)器就會(huì)保存數(shù)據(jù)端的輸入值。

理解了保持位之后,我們需要引入時(shí)鐘(標(biāo)志為 clk),一個(gè)有規(guī)律的來(lái)回變化的時(shí)鐘,當(dāng)時(shí)鐘從 1 切換到 0 的時(shí)候上一次操作的內(nèi)容就被保存了,所以把保持位的輸入替換成時(shí)鐘輸入。

這樣的電路叫做電平觸發(fā)的D型鎖存器,它表示電路鎖存住一位數(shù)據(jù),并保持到將來(lái)使用,它也稱之為 1 位存儲(chǔ)器。

有了 1 位存儲(chǔ)器,那多位存儲(chǔ)器就很簡(jiǎn)單了,就是將多個(gè)鎖存器合在一起,如下圖是八位鎖存器。

這里還需要提一下邊沿觸發(fā)器,不同于電平觸發(fā)器的是邊沿觸發(fā)器是在 0 變成 1 的瞬間記錄結(jié)果,像電平觸發(fā)器是在 1 的時(shí)候每個(gè)結(jié)果都會(huì)被覆蓋性的記住,在某些場(chǎng)景下邊沿觸發(fā)器的瞬時(shí)性更合適。

電路圖如下,由兩級(jí) R-S 觸發(fā)器鏈接而成,其實(shí)這種電路看不的很亂覺(jué)得很復(fù)雜沒(méi)事,知道結(jié)果就行了。

簡(jiǎn)化的畫法如下:

然后我們?cè)賮?lái)看下這個(gè)電路:

將振蕩器的輸出作為時(shí)鐘的輸入,然后反向 Q 端(上圖中下面的Q代表反向Q,圖少了一橫)的輸入又作為 D 的輸入。

出來(lái)的波形圖是這樣的,可以看到 Q 的輸出頻率是時(shí)鐘的一半,所以這種電路稱為分頻器。

而分頻器的輸出又可以是下一個(gè)分頻器的輸入,我們?cè)賮?lái)看下這個(gè)圖:

出來(lái)的波形圖是這樣的:

再填上 0 和 1:

從 Q3 開始每一列從下往上看,是不是 0000、0001、0010.... 這就是計(jì)數(shù)器,把 8 個(gè)集成一下放在黑盒中,就構(gòu)成了 8 位的計(jì)數(shù)器。

當(dāng)然這個(gè)計(jì)數(shù)器是異步的,后面的得等前面的通知,比較不準(zhǔn)確,所以更好的是同步計(jì)數(shù)器,不過(guò)比較復(fù)雜,這里就不介紹了。

簡(jiǎn)單組裝一下

至此我們已經(jīng)有了加法器、振蕩器(時(shí)鐘)、鎖存器(觸發(fā)器)和計(jì)數(shù)器,接下來(lái)我們就開始組裝一下它們。

比如現(xiàn)在我們有一個(gè)燈泡,想測(cè)試一下八個(gè)鎖存器,八個(gè)鎖存器的話那么需要 3 個(gè)開關(guān)來(lái)表示具體選擇哪個(gè)鎖存器,2 的 3 次方等于8。

中間的黑盒肯定是拿來(lái)選擇的,通過(guò)開關(guān)來(lái)控制通路,比較復(fù)雜我覺(jué)得稍微看看就行,反正就是電路選擇。

輸入的話也不用直接用八個(gè),所以也搞個(gè)三個(gè)開關(guān)。

內(nèi)部構(gòu)造我就不貼了,也和選擇器一樣復(fù)雜,這叫譯碼器,最終完整電路圖如下:

而是S0、S1、S2 其實(shí)就是地址,通過(guò)地址來(lái)選擇寫入哪個(gè)鎖存器中,并且對(duì)應(yīng)輸出結(jié)果,這種配置叫讀/寫存儲(chǔ)器,也稱為隨機(jī)訪問(wèn)存儲(chǔ)器即 RAM。

因?yàn)樗鼙4嫘畔ⅲ越写鎯?chǔ)器,因?yàn)槟芨鶕?jù)地址選擇來(lái)寫入讀取所以是隨機(jī)。

上圖電路簡(jiǎn)化圖如下,能存儲(chǔ) 8 個(gè)獨(dú)立的 1 位數(shù)據(jù)。

兩個(gè) 8*1 RAM 結(jié)合一下就能表示存儲(chǔ) 8 個(gè)獨(dú)立的 2 位數(shù)據(jù)。

如果是通過(guò)下面這樣的組合,則能表示 16*1 RAM,那個(gè) DI 其實(shí)就是第四根地址線,所以是 2 的 4 次方。

可以看到 RAM 陣列的存儲(chǔ)容量等于 2 的地址數(shù)次方,然后注意下我們圖是簡(jiǎn)化了的,里面其實(shí)有很多繼電器的,像邏輯門都是由繼電器構(gòu)成的,當(dāng)斷電之后電磁效應(yīng)就沒(méi)了,所有的觸點(diǎn)都回歸原樣,這就是 RAM 為什么是易失性存儲(chǔ)介質(zhì)的原因。

咱們現(xiàn)在已經(jīng)把內(nèi)存給搞出來(lái)了

接下來(lái)我們的目標(biāo)就是把要計(jì)算的數(shù)據(jù)輸入內(nèi)存中,然后讓加法器計(jì)算了之后把結(jié)果寫回內(nèi)存,并且可以再通過(guò)內(nèi)存查看結(jié)果,大致的組裝樣子如下:

然后我們可以將加法器和鎖存器結(jié)合起來(lái)作為一個(gè)累加器,即每次加法的值存儲(chǔ)到鎖存器中并作為下一次累加的值。

有了累加器之后,我們可以將存儲(chǔ)器的值傳到累加器中,稱為 Load 裝載,把下一個(gè)值添加到累加器中,稱為 Add,然后將結(jié)果保存在某個(gè)位置,稱為 Store。

可以通過(guò)控制面板先往存儲(chǔ)器里面寫好要操作的值并且可以通過(guò)控制面板上的燈來(lái)查看內(nèi)存寫入結(jié)果,然后一開始訪問(wèn)存儲(chǔ)器的地址為 0000,由計(jì)數(shù)器來(lái)驅(qū)動(dòng)地址的前進(jìn),然后進(jìn)行相加,最終將結(jié)果存儲(chǔ)回 RAM 陣列中,當(dāng)然也需要設(shè)置停止信號(hào)。

把我們前面定義的 Load 等操作碼,轉(zhuǎn)化為特定的代碼來(lái)控制整體的流程(你就認(rèn)為這代碼會(huì)指示電路做某種操作,沒(méi)必要細(xì)想反正就是通過(guò)邏輯門組合產(chǎn)生的)。

這個(gè)操作碼僅是個(gè)助記符,因?yàn)榈刂肥枪潭ǖ?,并且操作碼指令字節(jié)是固定長(zhǎng)度(1個(gè)字節(jié)),所以我們可以在每條操作后面跟上地址,總的而言每條指令(除停止)需要 3 個(gè)字節(jié)。

簡(jiǎn)單的看下圖,就是在存儲(chǔ)器地址0000處存入以下“代碼”。

并且可以搞個(gè) Jump 指令用來(lái)跳轉(zhuǎn)地址,可以通過(guò)設(shè)置計(jì)數(shù)器來(lái)達(dá)成跳轉(zhuǎn)地址的功能,有了跳轉(zhuǎn)我們就能做循環(huán)操作了。某些重復(fù)的指令只需要編寫一次,通過(guò)條件跳轉(zhuǎn)來(lái)完成循環(huán),最終的組裝示意圖如下:

2-1 選擇器是切換計(jì)數(shù)器的地址輸入或者是計(jì)算得出的輸入,通過(guò)三個(gè) 8 位鎖存器來(lái)分別代表代碼,地址高位和低位,上圖來(lái)看可能有點(diǎn)繞,不理解細(xì)節(jié)也沒(méi)有關(guān)系,大致的流程還是簡(jiǎn)單的。

至此我們其實(shí)已經(jīng)組裝了一臺(tái)計(jì)算機(jī)了,之所以能叫計(jì)算機(jī)而不是計(jì)算器是因?yàn)樗梢愿鶕?jù)你寫入存儲(chǔ)器的指令自動(dòng)取指執(zhí)行,并且可以進(jìn)行條件跳轉(zhuǎn)和循環(huán)執(zhí)行自動(dòng)停止。

計(jì)算機(jī)的處理器就是我們上面的累加器,可以稱之為算數(shù)邏輯單元,即 ALU。

那個(gè)計(jì)數(shù)器就是我們的程序計(jì)數(shù)器PC。

存儲(chǔ)器就是內(nèi)存了,輸入就是控制面板,輸出就是控制面板上的燈。

計(jì)算機(jī)幾個(gè)核心模塊就都有了。

至于前面我們定義的操作碼其實(shí)就是機(jī)器語(yǔ)言,而人類為了好記就會(huì)搞一些助記符來(lái)標(biāo)識(shí),發(fā)展到后來(lái)就是匯編語(yǔ)言,而匯編語(yǔ)言又太麻煩了,因此又抽象搞了高級(jí)語(yǔ)言,比如 C、Java 等等。

最后

這篇文章最終所描述的計(jì)算機(jī)其實(shí)是相當(dāng)簡(jiǎn)陋的,真正的計(jì)算機(jī)也肯定不會(huì)這樣造的,比如不會(huì)用繼電器,線路也會(huì)用各種總線啥的搭建起來(lái)各種集成電路等等,ALU 也不會(huì)如此簡(jiǎn)單,會(huì)有各種并行計(jì)算等等。

主要是想借此大致的說(shuō)下計(jì)算機(jī)基本的運(yùn)行原理和構(gòu)成,因?yàn)楸举|(zhì)上的道理是一樣的。如果要我把很多細(xì)節(jié)都說(shuō)出來(lái)我也不會(huì),我也就懂一點(diǎn)點(diǎn)點(diǎn)點(diǎn)皮毛,我也不是搞硬件的,啥模電的課我也沒(méi)上過(guò),我就會(huì)裝裝機(jī)的水準(zhǔn)。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉