Learning Objectives
- 從位址線與資料寬度算出記憶體容量,反過來算需要幾條位址線
- 操作讀寫訊號,說明位址、資料與 WE 各自的作用
- 比較 SRAM、DRAM、ROM 與 Flash 的儲存方式與取捨
- 用解碼器、D 正反器與多工器接出一個小記憶體
- 說明 DRAM 為什麼要更新,不更新會發生什麼事
暫存器一個一個做,太貴了
第 8 課的暫存器每個位元用一個正反器,每個正反器又要好幾個閘。CPU 裡的暫存器數量不多,這樣做沒問題。但是如果要存一篇論文、一張照片,用這種作法,光是把每個暫存器的輸入輸出拉出來,線就接不完了。
記憶體(memory)換一個想法:把位元排成一張表,每次只讀寫其中一列。外面只看到三組線:
- 位址(address):要哪一列
- 資料(data):要寫進去或讀出來的值
- 控制:例如寫入致能 WE(write enable),決定這次是讀還是寫
位址線 n 條可以表示 2ⁿ 個編號,所以容量是:
格數 = 2 的 n 次方
容量 = 格數 × 每格的位元數
位址多一條,容量就翻倍,而外面只多了一條線。這就是記憶體划算的地方。例如位址 10 條、每格 8 位元(1 位元組),是 1024 × 8 = 8192 位元,也就是 1024 位元組。
同樣是一張表,存法差很多
表的介面都差不多,差別在每一格怎麼存一個位元:
| 種類 | 每格怎麼存 | 斷電後 | 要更新嗎 | 特性 |
|---|---|---|---|---|
| SRAM | 通常 6 個電晶體(6T),其中 4 個組成兩個頭尾相接的反相器 | 消失 | 不用 | 快;每個位元佔的面積大、貴 |
| DRAM | 1 個電晶體加 1 個電容(1T1C),電容有沒有電荷就是 1 或 0 | 消失 | 要 | 便宜、密度高;比 SRAM 慢 |
| ROM | 內容在製造或燒錄時決定 | 保留 | 不用 | 平常只讀不寫 |
| Flash | 浮動閘極電晶體,把電子關在絕緣層裡 | 保留 | 不用 | 要整塊抹除才能重寫,抹寫次數有限 |
SRAM 的結構和第 7 課的栓鎖是同一個想法:兩個反相器頭尾相接,只要有電就一直維持。DRAM 省掉回授,一個位元只用一顆電晶體,1966 年 IBM 的 Robert Dennard 提出這個架構。代價是電容會漏電,資料撐不了多久。JEDEC 的規格要求一般溫度下每一列至少每 64 毫秒更新(refresh)一次:讀出來再寫回去。
DRAM 的讀出也會消耗電荷,所以每次讀完都要立刻寫回去。下面的工具先操作 SRAM,再切到 DRAM 看漏電。
自己接一個小記憶體
把前面學過的零件組起來,就是一個 4 格、每格 1 位元的記憶體:
- 寫入路徑:位址進解碼器,選出一格。解碼器的致能接 WE:WE=0 時誰都不選。每一格的時脈是
解碼器輸出 · CLK,只有被選中的那一格會在時脈上升時把 DIN 存起來。 - 讀出路徑:四格的輸出接到 4 選 1 多工器,位址同時接到選擇線。
注意位址同時接到兩個地方:解碼器負責「寫到哪一格」,多工器負責「讀哪一格」。這正好是第 4 課那兩種電路。
用 AND 擋時脈的作法叫時脈閘控(clock gating),接起來短,適合看懂原理。但是它有第 6 課說過的風險:這條線的 glitch 會直接變成時脈。真實的同步設計通常改用工具自動插入的專用閘控單元,或是在每一格的 D 前面放一個 2 選 1,把舊值接回去。
ROM:把真值表直接存起來
如果輸入是位址、輸出是資料,那記憶體就是一張真值表。任何函數都可以直接存進去,不用化簡,也不用想要接什麼閘。
把多工器的資料腳接常數,就是一顆最簡單的 ROM:位址接選擇線,常數就是內容。要改函數,只改內容,電路結構不動。
該用哪一種? 函數很複雜或常常要改,就用查表;函數很簡單,用閘比較省。下面這個例子,Y0 其實只是一個 NOT,用 ROM 就要多佔 4 個位元。
把容量、解碼與漏電算一次
容量和解碼都是簡單的算式。最後一段算的是剛才工具的 DRAM 示意模型:電荷每 128 毫秒少一半。
讀寫的時間順序,以及為什麼要有快取
真實的記憶體有時序規定,大致的順序是:
寫入:位址穩定 → 資料穩定 → WE 打開 → WE 關閉 → 資料才可以改
讀出:位址穩定 → 等待存取時間 → 資料才可靠
順序的理由你已經知道了:位址沒穩定就打開 WE,解碼器的過渡值可能選到別的列,把不該改的格子改掉。讀出時也一樣,太早讀到的是還在傳遞的值。
DRAM 比 SRAM 慢,而 CPU 又比兩者快得多。所以電腦不會只放一種記憶體,而是把少量又快的 SRAM 當成快取記憶體(cache),放常用的資料,大量的 DRAM 當主記憶體。細節在計算機概論軌「記憶體階層與快取」那一課。
確認一下
位址 12 條、每格 16 位元的記憶體,容量是幾個位元組?
要定址 4096 格,最少要幾條位址線?
容量不變,把資料寬度從 8 位元改成 16 位元,位址線要怎麼改?
為什麼 DRAM 比 SRAM 便宜,卻不能完全取代 SRAM?
讀一次 DRAM 之後,那一列的資料會怎樣?
上面接的 4 格記憶體,如果解碼器的 EN 直接接常數 1,會發生什麼事?
重點整理
- 記憶體是一張表:位址選列,資料進出,WE 決定讀或寫。n 條位址線可以選 2ⁿ 格,容量是格數乘上每格的位元數。
- 解碼器選寫入的格子,多工器選讀出的格子;開機內容未知,要先寫過再讀。
- SRAM 靠回授維持、不用更新;DRAM 靠電容存電荷,密度高但是會漏電,要定期更新;ROM、Flash 斷電也保留。
- 更新只能補滿還讀得到的值,掉到判斷不出來就救不回來了。
- ROM 可以直接實作任何真值表,換函數只要換內容。
- 寫入時位址與資料要先穩定,所以真實記憶體有嚴格的時序規定。
零件到這裡都齊了:閘、多工器、加法器、暫存器、記憶體。下一課把它們接起來,看一道指令怎麼讓資料走過這些零件。