上一節(jié)我們創(chuàng)建了算術(shù)邏輯單元ALU,它可以進行算術(shù)、邏輯運算,但計算出來的結(jié)果如何保存呢?這就需要用到存儲單元,接下來我們看看用什么電路能夠保存數(shù)據(jù)。
由淺入深,我們先來存儲1位二進制數(shù)。先看這個改造過的或門電路。
它的特殊之處在于其輸出信號會作為輸入信號之一,看起來很奇怪是吧。一開始A、B都為0,輸出=0,當A=1時或門輸出=1,那么B=1,這時A、B都是1,輸出還是1,保持不變,接下來即使將A設為0,輸出依然是1。于是這個電路可以保存信號1。但我們也會發(fā)現(xiàn)一個問題,即這個保存是永久性的,不論A的值是什么,輸出都是1,這顯然不符合實際需求,保存的數(shù)據(jù)應該可以修改才對,這個問題暫時放一放,后面再解決。
接下來我們再看這個改造過的與門電路,同樣它的輸出信號也作為輸入信號之一。
一開始將A、B都設為1,輸出=1,當A設為0時,輸出=0,進而B=0,輸出還是0,保持不變。接下來不論A如何變化,輸出始終保持為0,所以這個電路可以保存0。
然后我們開始著手解決如何修改保存內(nèi)容的問題,設計如下電路:
其中“輸入”端的信號就是這個電路要保存的值,“允許寫入”代表是否可以修改保存值,如果是0,代表不能修改,如果是1,代表可以修改,“輸出”端的信號就是保存的值。這個電路大家可以自行分析,我將四種不同的情況列在下面供大家參考。
允許寫入情況,輸入端信號1會保存起來
允許寫入情況,輸入端信號0會保存起來
禁止寫入情況,電路原本保存1,不論輸入端是什么都沒有影響
禁止寫入情況,電路原本保存0,不論輸入端是什么都沒有影響
我們用一個簡化的符號代替這個電路,這個電路可以保存1位二進制數(shù),并且可以隨意修改,我們把它叫做鎖存器。
當我們將8個鎖存器放在一起,就可以保存8位二進制數(shù)了,這樣一組鎖存器被稱為寄存器。早期電腦使用8位寄存器,即由8個鎖存器組成,能保存8位二進制數(shù),后來出現(xiàn)了16位寄存器、32位寄存器,到現(xiàn)在的電腦基本都是64位寄存器了。
接下來我們設計一個能存儲256位二進制數(shù)的電路,如下圖:
我們共需要16*16=256個鎖存器,將他們設計成16行16列的矩陣,為了能準確存取數(shù)據(jù),我們需要知道每個鎖存器的位置,所以需要一個額外的電路確定要操作的鎖存器的地址。如果要確定地址,必須知道行數(shù)、列數(shù),一共16行、16列,所以行和列各用4位二進制數(shù)表示就行(0000代表第1行,0001代表第2行……,1111代表第16行,列也是一樣的),這樣就需要8位的地址輸入信號。受篇幅所限,細節(jié)的電路不再畫了,最終我們有了一個能存取256位二進制數(shù)的電路,用這個圖形表示。
“8位地址”用于定位鎖存器的位置,“允許寫入”=1時,“數(shù)據(jù)”被存入某個鎖存器,“允許讀取”=1時,某個鎖存器的數(shù)據(jù)可以被讀取出來。
一個這樣的電路還是沒什么卵用的,還需要繼續(xù)擴大規(guī)模,我們將8個相同的電路如圖所示連接在一起。
這樣我們一次就可以讀寫8位二進制數(shù)了,8位也叫做一個字節(jié)(Byte,簡稱B)。同樣,我們簡化一下,使用下圖表示。
這個電路有256個地址,每個地址可以讀寫一個8位二進制數(shù),一共可以保存256個字節(jié)(256B)的數(shù)據(jù)。這個容量的存儲空間能夠保存什么呢?很遺憾,現(xiàn)在的文檔、圖片動輒以KB、MB為單位,似乎什么也干不了。
補充一下小知識,1GB=1024MB,1MB=1024KB,1KB=1024B。
至此我們使用多個鎖存器構(gòu)建出了可以存取數(shù)據(jù)的內(nèi)存,雖然只有256B,更大的內(nèi)存也是同樣的原理,下節(jié)我們就開始打造完整的CPU了!