寄存器&內存(Registers&RAM)
前言
前面學習了邏輯門和ALU,想要制作一個“CPU”我們還需要學習內存,因為CPU所運算
數據的讀寫都離不開內存。
一.內存單位
學習內存首先我們要了解存儲單位
1TB(太字節)=1024GB(千兆字節)
1GB=1024MB(兆字節)
1MB=1024KB(千字節)
1KB=1024byte(字節)
1byte=8bit(位)
二.深入了解內存
1.鎖存器
下圖為and-or鎖存器基本原理
鎖存器原理如圖
1.設置輸入為1,復位輸入為0

2.設置輸入為1,復位輸入為1

3.設置輸入為0,復位輸入為0

2.門鎖
我們通過上圖通過設置set和復位reset兩個輸入存入了一位為1的數據,但是上圖需要配合使用設置set和復位reset兩個輸入才能存儲數據。我們進一步改進上面的電路結構如下:

經過改進,我們將原來的set和復位reset兩個輸入合並成為了一個數據輸入,然后新增了一個允許輸入寫入線,當允許寫入為1的時候可以通過改變輸入輸出存入一位數據,反之為0時無法存入數據。簡單理解上面鎖存器的結構之后,我們將上圖結構進行抽象成為一個整體的組件,如下圖:

3.寄存器
上圖封裝的組件為我們后面就統一稱它為“鎖存器”,一個“鎖存器”只能存儲一位0或者1的數據,我們可以將多個鎖存器合並起來成為一個可以儲存多位數據的寄存器
下圖為8位寄存器,可以簡單的理解為上圖8個鎖存器的合並,下圖為8位寄存器存入數據的過程



4.矩陣寄存器
早期電腦用的是8位寄存器,更專業的單位應該叫8寬位寄存器,我們8位寄存器就需要用到了8根數據線輸入數據,8根數據線輸出數據,1根允許寫入線,1根允許讀取線一共18根線,但是隨着寄存器的寬位數的不斷增多,那么64位,128位,256位呢?我們需要用到更多的線去連接鎖存器。
再舉個栗子:如果我的寄存器可以存儲256位,那么我們需要256根輸入數據線,256根輸出數據線,1根允許寫入線,1根允許讀取線一共五百多根線。
所以上圖這種並排多數據線的寄存器排列設計,明顯不利於空間的利用和數據的管理,那有什么方式可以減少鎖存器之間的連線呢?我們可以采取矩陣的方式來排列更多的寄存器。
如圖為16X16矩陣的256寬位寄存器:

我們放大矩陣中的某一個鎖存器,如圖:

我們要改進上面這個鎖存器,在它的左下角加上一個“And門”,如下圖橙色標記的地方:

我們可以用“And門”加上一根“行線”和一根“列線”來鎖定指定的鎖存器,然后用一根“允許寫入線”(上圖的Write Enable接口連接的線)連接矩陣中所有寄存器來控制是否允許寫入數據,要准確控制每一個鎖存器就好像地圖上的經緯度一樣,我們要定位一個鎖存器並對該鎖存器寫入數據就先需滿足如下條件:
1.“行線”和“列線”同時為1
2.“允許寫入線”為1
該鎖存器才可以寫入數據,然后我們用一根“數據線”(上圖的data in/out連接的線)連接所有寄存器,然后通過data in/out接口來傳輸數據;

上面總結了寫入數據,同理我們可以用一根“允許讀取線”(Read Enable),然后通過“數據線”讀取數據,如下圖:

我們繼續回到前面的16X16矩陣256位寄存器,
我們這種矩陣的排列設計只需要16根行線,16根列線,1根數據線,1根是否允許寫入線,1根是否允許讀取線,一共35根線就可以搞定。
5.多路復用器(數據選擇器)
前面的圖片只是說明了數據的定位原理和數據在找到鎖存器后如何讀/寫到鎖存器,但是要滿足可以給指定鎖存器讀/寫數據,我們還需要一個步驟,那就是還需要在這個寄存器加入一個叫做為多路復用器的東西(也叫數據選擇器),這個多路復用器作用是記錄鎖存器的地址,然后根據這個地址指向指定的鎖存器,從而進行該鎖存器的數據讀/寫
如下圖:

我們分別用一個多路復用器記錄行,一個多為復用器記錄列。
舉個栗子:如果們要快速定位並寫入數據到“第十二行,第八列”的鎖存器,那么數字12行對應的二進制地址為1100,數字8列對應的二進制地址為1000,那么我們分別在行和列的多位復用器上面記錄這兩個地址,那我們就可以通過多路復用器快速找到“第十二行,第八列”鎖存器然后讀/寫數據,這樣就成功的完成了一次對數據的讀/寫。
對這個16x16的256位寄存器的理解到此為止,為了我們更好的理解后面的內容,我們繼續把這個256位寄存器抽象成為一個整體組件,如圖所示:
這個寄存有如下部分組成:
1.八位地址組成的多路復用器(四位記錄行,四位記錄列)
2.允許寫入線連接所有鎖存器
3.允許讀取線連接所有鎖存器
4.數據線連接所有鎖存器,用於讀/寫數據

但是256bit所存取的數據也非常有限,所以我們把這樣256bit的組件復制多個然后合並打包成一個整體
如圖:

上圖我們合並打包了上面的8個的組件,我們繼續把這個合並的圖更加細節化,給他們加上電路連線,一張256byte的內存卡就誕生了
如圖:

我們有256個地址(byte),每個地址可以讀寫一個8位值(也就是1byte或者說8bit);為了能更好的理解內存與程序之間的交互,我們不再把上面部分看成存儲模塊和電路,而是抽象的看成一個個整體可尋找的地址內存,后面在講到CPU的時候會用到這個抽象出來的內存,這里先提一下。如下圖:

如果還需要進一步擴大內存,我們就需要和和上面一樣,不斷的把小的內存模塊復制打包成更大規模,但是隨着內存的擴大,記錄內存地址的多路復用器也要隨之擴大,(8位可以記錄地址的最大值是二進制的11111111,對應十進制255),要給更大的內存卡記錄地址就需要32位或者64位的地址來記錄。
6.從硬件的角度去理解內存
上面我們從抽象電路簡單分析了內存的工作機制,為了我們更好的去理解內存的結構和原理,下面我們再直接通過圖片,從硬件的角度去分析內部的結構:
首先我們要知道內存的一個重要特性是:可以隨時訪問任何地址
因此我們的內存條也叫:隨機內存存取器(RAM)

下面開始從硬件的角度去逐步探索下面圖片中的這一張內存條:
這是一張內存,上面焊了8個內存模塊

我們放大其中一個模塊,會看到每一個模塊又由32個小模塊組成,下圖為8個內存模塊其中一個的放大部分:

我們繼續放大這三十二個小模塊的其中一個小小模塊,會發現這個小小模塊又由4個小塊組成,如圖:

我們繼續放大這四個小模塊的其中一個,會看到一排排密密麻麻小點組成的矩陣,那一個個小點也就是我們前面說的“鎖存器”,下圖這個矩陣是128X64位,也就是8192位

所以每一片芯片的位數是:
8192X4X32=1048576
每個芯片有一百萬位


這張內存一共有8個芯片,所以一共有8百萬位

那么根據前面最開始的內存計算單位我們可以得到,這張RAM內存的可以存儲1MB的數據,可能你會說在當今的日常生活中,1MB的內存也太小了吧,這種內存條可能連一首流行音樂都存入不了。那是因為上面這張內存條是上世紀八十年代生產的,那時的制作工藝和現在肯定會有差異,當今世界的內存通過不斷的技術改變讓單位面積芯片所存的位數量變得更多了,同樣大小的內存的存儲量是之前的一百倍甚至上千倍,所以現在的內存基本都是GB甚至TB量級的了,但是至少從目前的技術角度來看,內存的存儲基本原理還是和前面所說的大致一樣,沒有發生實質性的變革(量變而沒有質變)。
