上一節中我們講到如何用邏輯門來構建一個ALU,它可以進行算術運算和邏輯運算,那麼如果将算出來的結果存起來呢?這就要講到今天的主角:「 内存 」了。
大家都有這樣的經驗,在計算機上進行文件編輯,或者正在看電視/電影,如果突然遇到斷電,那麼之前編輯的内容将沒有保存,因為這些内容存儲在内存中!電腦用的是"随機存取存儲器",簡稱為"RAM"!遇到這種狀況,隻是郁悶的份了。
存儲 1bit 的電路我們之前講過的電路都是單向的,就是說有輸入,經過電路運算得到輸出。現在假如我們将輸出連回輸入,有趣的事情将會發生!
讓我們拿一個 OR 門,将輸出傳回輸入,看看會發生什麼。
首先,兩個輸入都設為 0,電路輸出0;如果将 A 變成1,“1 OR 0”為 1,所以輸出 1;
一轉眼的功夫,輸出回到 B,OR門看到兩個輸入都是 1,“1 OR 1”仍然為1,所以輸出不變;
如果這時再将 A 變成 0,OR門依然輸出 1!并且無論怎麼試,都沒法再從 1 變回 0。
類似的方法,如果将OR門換成AND門,情況正好相反。
A 和 B 都設為 1,“1 AND 1”的輸出永遠是 1;如果之後 A 設為 0,由于是 AND 門,輸出會變成 0;就像之前,之後無論 A 設什麼值,電路始終輸出 0。
“AND-OR 鎖存器”
為了做出有用的存儲 (memory),我們将兩個電路合起來,變成“AND-OR 鎖存器”。它有兩個輸入,“設置”( SET ) 輸入1,将輸出變成 1 ;"複位" ( RESET )輸入1,将輸出變成 0;如果“設置”和“複位”都是 0,電路會輸出最後放入的内容,也就是說,它存住了 1 bit 的信息!這就是存儲!
之所以叫“鎖存”,是因為它“鎖定”一個特定值并保持狀态,将數據放入叫“寫入”,将數據輸出叫“讀取”。
麻煩的是,用兩條線來輸入,也就是 SET 和 RESET,有點難理解,為了更容易用,我們希望隻有一條輸入線,将它設為 0 或 1 來存儲值,還需要一根線來“啟用”(enable) 内存,啟用時允許寫入,沒啟用時“鎖定”,這條線叫“允許寫入線”!
我們将整個電路抽象一下,輸入現在隻有“允許寫入線”和“數據線”,有1個數據輸出。如果将 "數據線" 從 0 換到 1 或 從 1 換到 0,什麼也不會發生 - 輸出依然是 0,因為“允許寫入線”是關閉的(0)來防止内容變化;
當“允許寫入線” 輸入 1,現在可以在“數據線”上放 1,将 1 存起來。注意輸出這時候會變成1了,然後可以關掉 “允許寫入線”,這樣輸出就會保持 1 而無論輸入端再輸入什麼!
寄存器
隻能存1bit 沒什麼大用,但是如果我們并排放8個鎖存器,這樣就可以存8 位信息,比如一個8bit數字,一組這樣的鎖存器叫“寄存器”。寫入寄存器之前,首先要啟用裡面所有鎖存器,我們可以用一根線連接所有“允許輸入線”,然後設為1,然後用8條數據線發數據,然後将“允許寫入線”設回 0,現在 8 bit 的值就存起來了。
寄存器能存多少個bit叫“位寬”,早期電腦用8位寄存器,然後是16位,32 位。如今許多計算機都有64位寬的寄存器。
對于很少的 bit,并排放鎖存器勉強夠用。但是如果是64 位寄存器,要64 根數據線 64根連到輸出端,如果我們隻要1根線啟用所有鎖存器,但加起來也有129條線了;如果是256位寄存器,要513條線,解決這個問題的方法是用「矩陣」!
矩陣存儲在矩陣中,我們不并列排放鎖存器,而是做成網格,這樣存256 位,我們需要用 16x16 的鎖存器,要啟用某個鎖存器,就打開相應的 行線和列線。
行選和列選總共有有 16 16 =32根線,再加上1條“數據線”,1條“允許寫入線”,1條“允許讀取線”,總共也隻需要35根線!
内存地址
我們需要有一種方法來唯一指定這個交叉的點,這就是地址。比如一個bit 的地址是“12行 8列”,由于最多 16 行,用 4 個二進制 bit 就夠了,“12”用二進制表示為“1100”,“8”用二進制表示為“1000”,所以剛才說的地址可寫作“11001000”。
為了将地址轉成 行和列,我們還需要一個部件叫 “多路複用器”,多路複用器有不同大小,因為我們有 16 行,我們需要 1 到 16 多路複用器,它的工作方式是:輸入一個4bit數字,它會把那根線連到相應的輸出線,如果輸入 0000,它會選擇第一列;輸入 0001,則選擇下一列,依此類推。
一個多路複用器處理行(row),另一個多路複用器處理列(column)。
内存抽象
我們将這個能夠存儲256 bit的内存經行抽象,它輸入一個 8 位地址:4 位代表列,4 位代表行,我們還需要 "允許寫入線" 和 "允許讀取線",最後,還需要一條數據線,用于讀/寫數據。
如果我們将更多的這樣的單元連接在一起,就可以組成更大的存儲單元。
如果将8個這樣的256 bit 内存組在一起,就可以構建一個具有256 個地址,每個地址可以存儲1個byte的内存!
現代計算機的内存擴展到千兆字節(GB)的方式,和我們這裡做的一樣,就是不斷把内存打包到更大規模。如下是一條真的内存,上面焊了 8 個内存模塊,如果打開其中一個,然後放大,會看到 32 個内存方塊,放大其中一個方塊,可以看到有 4 個小塊,如果再放大,就可以看到存一個"位"的矩陣。
總結與展望
在這一期裡,我們從基本的鎖存器一步步構建出了寄存器,再到大型存儲器,就像計算機中的很多事情,底層其實都很簡單,讓人難以理解的,是一層層精妙的抽象!
那麼如何利用内存和上一期裡的ALU 來構建一個CPU呢?
關于這個話題,我們下一期再講~
PS:本系列文章首發于同名公衆号:「 三邵爺的夢呓 」,關注并回複關鍵字「 1024 」,你懂得!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!