一文看懂計(jì)算機(jī)設(shè)計(jì)原理
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
一、編碼與電路——信號(hào)的轉(zhuǎn)換 晚上父母會(huì)把手機(jī)沒(méi)收,但我們還想繼續(xù)聊天,又不敢發(fā)出聲音,于是我們想到了這個(gè)辦法... 我們把所有的中文都用燈泡的亮滅組合來(lái)表示,同時(shí)約定好每隔一秒讀取一次燈泡的狀態(tài)并記錄下來(lái),這是我們的暗號(hào)。 我:亮亮滅滅亮 喜:滅亮亮滅滅 歡:亮滅亮滅亮 你:亮亮亮滅滅 這樣,我們雖然沒(méi)有了手機(jī),依然可以日以繼日地聊天,雖然效率很低,但依然很快樂(lè)。 我和小宇就這樣在不經(jīng)意間,將語(yǔ)言轉(zhuǎn)換成為了燈泡的亮滅組合,這個(gè)過(guò)程叫做編碼。 二、門(mén)電路——信號(hào)的關(guān)聯(lián) 我和小宇就這樣一直秘密保持著通話,直到上了大學(xué),父母再也管不了我們用手機(jī)了。 但這么多年的小燈泡通話,使我們總覺(jué)得事情沒(méi)那么簡(jiǎn)單,于是我們開(kāi)始了一些新的探索。 我們?cè)黾恿艘粋€(gè)開(kāi)關(guān)。此時(shí)當(dāng)兩個(gè)開(kāi)關(guān)同時(shí)閉合時(shí),燈泡才會(huì)亮。 這樣兩個(gè)開(kāi)關(guān)與燈泡之間,不再是之前簡(jiǎn)單的對(duì)應(yīng)關(guān)系了,而是有了邏輯。 開(kāi)關(guān)的斷開(kāi)與閉合分別對(duì)應(yīng)著電路的斷開(kāi)與連通。而小燈泡的不亮與亮,也分別對(duì)應(yīng)著電路的斷開(kāi)與連通。那這兩者就可以統(tǒng)一,不再依賴于具體的實(shí)物表現(xiàn)了。 還有,開(kāi)關(guān)的連通與斷開(kāi),是主動(dòng)的。而小燈泡的連通與斷開(kāi),是被動(dòng)的,是結(jié)果。 我們把開(kāi)關(guān)這里的連通與斷開(kāi)稱為輸入端,把燈泡的連通與斷開(kāi)稱為輸出端,并且將整個(gè)電路都封裝在一個(gè)圖形里,可以得到如下抽象: 我們決定把這種電路叫做門(mén)電路, 上面這個(gè)叫與門(mén)。 為了今后更為抽象的探索,我們將電路連通表示為數(shù)字 1,電路斷開(kāi)表示為數(shù)字 0。 我們將這種表示方式稱為二進(jìn)制。
慢慢地,我們發(fā)現(xiàn)了越來(lái)越多的玩法。 上面這種電路,我把他抽象成如下門(mén)電路形狀,叫做或門(mén)。 之后便一發(fā)不可收拾,我和小宇設(shè)計(jì)了越來(lái)越多的門(mén)電路,我們發(fā)現(xiàn),只要是我們能想到的邏輯關(guān)系,都可以設(shè)計(jì)成對(duì)應(yīng)的門(mén)電路。 三、加法器——信號(hào)的計(jì)算 十進(jìn)制數(shù)可以轉(zhuǎn)換成二進(jìn)制數(shù),而二進(jìn)制數(shù)又可以對(duì)應(yīng)到門(mén)電路的輸入端與輸出端。 于是我和小宇有了一個(gè)大膽的想法,能不能設(shè)計(jì)一個(gè)計(jì)算加法的電路呢? 我們首先從最簡(jiǎn)單的一位二進(jìn)制數(shù)相加開(kāi)始: 0+0=0;0+1=1;1+0=1;1+1=10 變成一張表格如下
經(jīng)過(guò)不懈努力,終于發(fā)現(xiàn)這個(gè)電路可以由異或門(mén)和與門(mén)兩個(gè)門(mén)電路組成。 這個(gè)裝置實(shí)現(xiàn)了二進(jìn)制的一位加法,但它并不完美,因?yàn)橹豢紤]了這兩個(gè)數(shù)的進(jìn)位輸出,但沒(méi)有考慮上一位的進(jìn)位,所以只能叫半加器。 如果將前一個(gè)進(jìn)位考慮進(jìn)來(lái),只需再多一個(gè)半加器,并且拼接一個(gè)或門(mén)即可。 此時(shí)我們已經(jīng)建立好了一個(gè)完美的一位加法器,并自豪地稱之為全加器。 全加器做出來(lái)之后,無(wú)論多少位的加法器就都可以做出來(lái)了,只需將全加器逐個(gè)拼起來(lái)即可。我們嘗試做一個(gè)八位加法器。 OK,大功告成,有了加法器,理論上就可以實(shí)現(xiàn)任何的數(shù)學(xué)運(yùn)算了。 因?yàn)槲覀冎莱朔梢赞D(zhuǎn)換成加法,除法可以轉(zhuǎn)換成減法,而減法又可以轉(zhuǎn)換成補(bǔ)碼的加法。現(xiàn)在我們可以自豪地稱這個(gè)部件為,算術(shù)邏輯單元 ALU。
四、時(shí)鐘——信號(hào)的震蕩 我和小宇都非常高興,終于用電路的方式實(shí)現(xiàn)了計(jì)算功能。 但慢慢的覺(jué)得沒(méi)什么意思了,于是我們又突發(fā)奇想,設(shè)計(jì)了如下詭異的電路。 當(dāng)閉合開(kāi)關(guān) A 時(shí),整個(gè)電路聯(lián)通,開(kāi)關(guān) B 將會(huì)被吸下來(lái),整個(gè)電路斷開(kāi),電磁鐵失去磁性,開(kāi)關(guān) B 又會(huì)彈上去,此時(shí)電路又聯(lián)通,開(kāi)關(guān) B 又被吸下來(lái)。 就這樣,開(kāi)關(guān) B 不斷地快速地在開(kāi)和閉之間循環(huán)進(jìn)行,而我們始終沒(méi)有去干預(yù)這個(gè)電路,因此該電路有了自反饋的特性。 由于開(kāi)關(guān) B 的來(lái)回震蕩,我們將這種電路稱為振蕩器,由于它可以產(chǎn)生不斷變化的電信號(hào),就像時(shí)鐘一樣不停且規(guī)律地跑著,我們將這個(gè)裝置又稱為時(shí)鐘。它所產(chǎn)生的交替的電信號(hào)稱為時(shí)鐘信號(hào)。 五、RAM——保存信號(hào) 雖然有了加法器,但是輸入的數(shù)字從哪里來(lái)?能不能先保存在某個(gè)地方呢? 我和小宇經(jīng)過(guò)多次實(shí)驗(yàn),發(fā)明了一個(gè)非常復(fù)雜的電路: 如果想不明白也沒(méi)關(guān)系,只要記住這個(gè)電路的設(shè)計(jì),實(shí)現(xiàn)了一位的存儲(chǔ)功能!我們叫它 1 位鎖存器。 然后我們把多個(gè)鎖存器組合起來(lái),再加上一些 3-8 譯碼器,8-1 選擇器等電路,就可以實(shí)現(xiàn)一個(gè)能保存 8 位二進(jìn)制的存儲(chǔ)器,并且可以隨機(jī)地讀寫(xiě)它, 我們把它叫做 RAM,簡(jiǎn)稱為內(nèi)存。 這個(gè)組件通過(guò)再次組合,可以形成 N × M 的 RAM 陣列。比如我們可以表示一個(gè) 1024 * 8 的 RAM 陣列。 這表示存儲(chǔ)容量為 1024 個(gè)單位,每個(gè)單位占 8 位。 為了更方便地表示,我們規(guī)定 1024 = 1K,8 位 = 1 字節(jié)(8 bit = 1 byte),那么我們就可以說(shuō),這個(gè) RAM 的存儲(chǔ)容量為 1K 個(gè)單位,每個(gè)單位占 1B。或者說(shuō),地址空間為 1K,存儲(chǔ)容量是 1KB。 此時(shí)這個(gè) RAM 模塊已經(jīng)近乎完美了,我們甚至可以單獨(dú)對(duì)其進(jìn)行使用,將數(shù)據(jù)存入某個(gè)地址,將某個(gè)地址中的數(shù)據(jù)讀出。 怎么方便人操作呢?只需要將地址輸入、數(shù)據(jù)輸入、寫(xiě)操作端分別接入一個(gè)控制面板,由開(kāi)關(guān)來(lái)控制這些信號(hào)的輸入是 1 還是 0 即可,然后再將數(shù)據(jù)輸出接入一些燈泡方便觀察,這樣一個(gè)單獨(dú)的可以手動(dòng)操作的存儲(chǔ)裝置,就搞定啦。(下圖中有彩蛋~) 有了可讀寫(xiě)的內(nèi)存,我們就可以事先把幾個(gè)數(shù)字存儲(chǔ)內(nèi)存中了,接下來(lái),我們能否讓算術(shù)邏輯單元 ALU 自動(dòng)地讀取這個(gè)數(shù)字,進(jìn)行加法運(yùn)算呢? 六、程序——自動(dòng)化 我們先引入一個(gè)新的組件,10 位計(jì)數(shù)器,這里的 Clk 就接入我們?cè)诘谒牟糠种v的時(shí)鐘信號(hào),Clr 是清零端,具體效果下面動(dòng)圖一目了然。 計(jì)數(shù)器的輸出就是 0,1,2,3,4,5,可以當(dāng)作內(nèi)存中的地址。 我們把這個(gè)計(jì)數(shù)器,以及上面講的 ALU 與 RAM 全部連在一起,嘗試實(shí)現(xiàn)一個(gè)可以累積求和的裝置。 我們想計(jì)算的是 1+2+3+4+5+6+7, 這個(gè)自動(dòng)化的計(jì)算器是這么運(yùn)行的 我們將累加求和這個(gè)過(guò)程自動(dòng)化了!之后如果想計(jì)算累加和,只需要用控制面板事先在內(nèi)存里存好數(shù)據(jù)就可以了!是不是很方便?
七、程序指令 我們還想要更多的自動(dòng)化! 現(xiàn)在這個(gè)裝置,只能無(wú)腦地將 RAM 中的數(shù)據(jù)從頭到尾一直累加下去,無(wú)法選擇加哪個(gè)不加哪個(gè),也無(wú)法選擇什么時(shí)候停止。 比如我們 RAM 中的數(shù)據(jù)是這樣的。
我們只想讓 RAM 藍(lán)色地址處的數(shù)據(jù)進(jìn)行累加,其他地方的數(shù)據(jù)忽略,并且到 RAM 0x05 處就停止,該怎么做呢? 我們可以再增加一個(gè) RAM,這個(gè) RAM 里存放的數(shù)據(jù),表示"指令"的含義! 我們先發(fā)明三種指令。 那么要想達(dá)到上述功能,相應(yīng)的這個(gè)指令 RAM 中的數(shù)據(jù)應(yīng)該是這樣的。 注意:下面指令 RAM 的地址和上面數(shù)據(jù) RAM 的地址之間有一一對(duì)應(yīng)關(guān)系!
我們需要引入一個(gè)控制單元,放在如下位置。 遇到 nop 指令(0x00),那輸出就將鎖存器的 W 位禁止,不允許鎖存器寫(xiě)操作,這樣累加結(jié)果就不會(huì)錄入。 再比如遇到輸入為 halt 指令(0x05),就將計(jì)數(shù)器的 EN 位禁止,不允許計(jì)數(shù)器 +1,這樣就達(dá)到了停止的效果。 此時(shí)再讓時(shí)鐘信號(hào)震蕩起來(lái),就可以達(dá)到有選擇地求和過(guò)程,并且在指定位置懸停。那現(xiàn)在我們就讓時(shí)鐘信號(hào)震動(dòng)起來(lái),看看這個(gè)過(guò)程吧。(此處只留關(guān)鍵組件) 這個(gè)控制單元該怎么實(shí)現(xiàn)呢?我們知道,只要給出輸入,給出輸出,任何組件都可以造出來(lái)。本文就不再展開(kāi)了。 有了三個(gè)指令,我們知道了通過(guò)指令這種方式,配合各種復(fù)雜的控制器,即可實(shí)現(xiàn)將所有操作統(tǒng)統(tǒng)自動(dòng)化。 接下來(lái)我們需要做的,就是設(shè)計(jì)控制器,以及約定好一大堆指令,使得通過(guò)這一大堆指令的排列組合,可以實(shí)現(xiàn)任何自動(dòng)化的計(jì)算操作。 我們將設(shè)計(jì)好的一大堆指令 稱作指令集 我們將指令排列組合后可以實(shí)現(xiàn)的功能 稱作程序 我們將指令的排列組合這個(gè)過(guò)程 稱作編程 我們將排列組合這些指令的人 稱作程序員 而我們將承載這一切的裝置,叫做什么呢? 沒(méi)錯(cuò),這個(gè)破玩意,就是 計(jì)算機(jī)
來(lái)源微信公眾號(hào):無(wú)聊的閃客 該文章在 2024/3/12 17:43:45 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |