National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 10

記憶體

SRAM、DRAM、ROM 與位址解碼
Interaction 40 minute(s)

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 看漏電。

互動練習:讀寫 SRAM 與 DRAM

按位址與資料的位元切換 0、1(也可以直接按表格左邊的位址)。選中的那一列字線(解碼器的輸出)是 1,其他都是 0。WE 決定讀或寫,按「送出一拍」才真的動作。

切到 DRAM 之後,每格的填色高度是電荷。存 1 的格子會一直漏電,電荷低於一半就判斷成 0。時間與電荷都是示意值:掉到一半要 128 毫秒是為了看得出變化設的,真實晶片的保持時間依溫度與個別格子而不同。

自己接一個小記憶體

把前面學過的零件組起來,就是一個 4 格、每格 1 位元的記憶體:

  • 寫入路徑:位址進解碼器,選出一格。解碼器的致能接 WE:WE=0 時誰都不選。每一格的時脈是 解碼器輸出 · CLK,只有被選中的那一格會在時脈上升時把 DIN 存起來。
  • 讀出路徑:四格的輸出接到 4 選 1 多工器,位址同時接到選擇線。

注意位址同時接到兩個地方:解碼器負責「寫到哪一格」,多工器負責「讀哪一格」。這正好是第 4 課那兩種電路。

用 AND 擋時脈的作法叫時脈閘控(clock gating),接起來短,適合看懂原理。但是它有第 6 課說過的風險:這條線的 glitch 會直接變成時脈。真實的同步設計通常改用工具自動插入的專用閘控單元,或是在每一格的 D 前面放一個 2 選 1,把舊值接回去。

互動練習:接一個 4 格的記憶體

第 0、1 格的寫入路徑接好了。你要做的是:解碼器的 EN 接 WE,再照樣接第 2、3 格:解碼器的 Y2 與 CLK 進 G2,G2 接到第 2 格的 CLK;第 3 格同理。

ROM:把真值表直接存起來

如果輸入是位址、輸出是資料,那記憶體就是一張真值表。任何函數都可以直接存進去,不用化簡,也不用想要接什麼閘。

把多工器的資料腳接常數,就是一顆最簡單的 ROM:位址接選擇線,常數就是內容。要改函數,只改內容,電路結構不動。

該用哪一種? 函數很複雜或常常要改,就用查表;函數很簡單,用閘比較省。下面這個例子,Y0 其實只是一個 NOT,用 ROM 就要多佔 4 個位元。

互動練習:用 ROM 實作「加 1」

輸入是 2 位元的數字 n(A1 A0),輸出 Y1 Y0 是 (n + 1) 除以 4 的餘數。兩顆多工器就是 ROM 的兩個資料位元,把每個資料腳接到常數 0 或 1,等於把內容燒進去。

把容量、解碼與漏電算一次

容量和解碼都是簡單的算式。最後一段算的是剛才工具的 DRAM 示意模型:電荷每 128 毫秒少一半。

讀寫的時間順序,以及為什麼要有快取

真實的記憶體有時序規定,大致的順序是:

寫入:位址穩定 → 資料穩定 → WE 打開 → WE 關閉 → 資料才可以改
讀出:位址穩定 → 等待存取時間 → 資料才可靠

順序的理由你已經知道了:位址沒穩定就打開 WE,解碼器的過渡值可能選到別的列,把不該改的格子改掉。讀出時也一樣,太早讀到的是還在傳遞的值。

DRAM 比 SRAM 慢,而 CPU 又比兩者快得多。所以電腦不會只放一種記憶體,而是把少量又快的 SRAM 當成快取記憶體(cache),放常用的資料,大量的 DRAM 當主記憶體。細節在計算機概論軌「記憶體階層與快取」那一課。

確認一下

1.

位址 12 條、每格 16 位元的記憶體,容量是幾個位元組?

2.

要定址 4096 格,最少要幾條位址線?

3.

容量不變,把資料寬度從 8 位元改成 16 位元,位址線要怎麼改?

4.

為什麼 DRAM 比 SRAM 便宜,卻不能完全取代 SRAM?

5.

讀一次 DRAM 之後,那一列的資料會怎樣?

6.

上面接的 4 格記憶體,如果解碼器的 EN 直接接常數 1,會發生什麼事?

第 1 次作答

重點整理

  • 記憶體是一張表:位址選列,資料進出,WE 決定讀或寫。n 條位址線可以選 2ⁿ 格,容量是格數乘上每格的位元數。
  • 解碼器選寫入的格子,多工器選讀出的格子;開機內容未知,要先寫過再讀。
  • SRAM 靠回授維持、不用更新;DRAM 靠電容存電荷,密度高但是會漏電,要定期更新;ROM、Flash 斷電也保留。
  • 更新只能補滿還讀得到的值,掉到判斷不出來就救不回來了。
  • ROM 可以直接實作任何真值表,換函數只要換內容。
  • 寫入時位址與資料要先穩定,所以真實記憶體有嚴格的時序規定。

零件到這裡都齊了:閘、多工器、加法器、暫存器、記憶體。下一課把它們接起來,看一道指令怎麼讓資料走過這些零件。

這一課完成了!
Next lesson:資料路徑
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。