1971 - Intel 4004 微處理器:一顆晶片上的通用電腦#
案件摘要#
1971 年 11 月,Intel 推出 4004——2,300 顆電晶體、10µm 製程、740kHz 的 4 位元微處理器。 它原本是為日本 Busicom 計算機打造的 12 顆特製晶片方案,卻被 Ted Hoff 與 Stan Mazor 改寫成一顆通用 CPU 加軟體。 Federico Faggin 領導設計實作,把「程式化通用計算裝置」第一次塞進一枚指甲大的矽片。 這是微處理器時代的開端,也是 x86 帝國最遠的源頭。
前因 -- 為什麼會有這個案子#
- Busicom 的原始需求:1969 年日本 Busicom 委託 Intel 為新計算機設計晶片,原方案是 12 顆各司其職的特製晶片——每顆用硬體邏輯焊死一種功能(鍵盤掃描、列印控制、算術運算)。
- Hoff 的關鍵推理:Ted Hoff 看了方案後判斷——與其做 12 顆功能固定的晶片,不如做 一顆通用處理器,把功能邏輯搬進軟體。硬體函數 \(f_{\text{硬體}}(x)\) 一旦做成電路就改不了,而軟體程式可以隨時重寫:
- 取捨的數學:通用化讓電晶體數 \(\downarrow\) (12 顆晶片的總邏輯量壓縮成 1 顆 CPU + ROM + RAM),但代價是執行速度——解譯指令需要多個時脈週期,比硬體專用邏輯慢一個數量級。對計算機而言,人的按鍵速度遠低於 740kHz,這個取捨穩賺不賠。
- 摩爾定律的自我驗證:1965 年 Gordon Moore 預言電晶體密度每年翻倍(1975 年修正為每兩年)。4004 的 2,300 顆電晶體正是這條定律的實證起點——照此推演,五十年後應有數百億顆電晶體的晶片,而今天的 Apple M 系列與 NVIDIA GPU 恰好落在這條線上。
線索與推理 -- 數學式、程式、理論#
1. 案件現場:4004 的三件式架構#
\[ \text{MCS-4} = \underbrace{4004}_{\text{4-bit CPU}} + \underbrace{4001}_{\text{ROM(2048×8,含 I/O)}} + \underbrace{4002}_{\text{RAM(320 bits,含 I/O)}} \]
- 4004 CPU 內含 16 個 4-bit 暫存器(可組成 8 個 8-bit 對)、程式計數器、堆疊(3 層)、46 條指令。
- 4001 ROM 燒死程式與查找表;4002 RAM 存資料。三顆晶片共用一條 4-bit 匯流排,以 time-multiplexing 分時傳送位址與資料。
| 晶片 | 功能 | 容量 | 電晶體數 |
|---|---|---|---|
| 4004 | 4-bit CPU | 16 暫存器、46 指令 | 2,300 |
| 4001 | ROM + I/O | 2,048 × 8 bits | 約 2,000 |
| 4002 | RAM + I/O | 320 bits(4 組 × 80) | 約 1,400 |
- Busicom 原案的 12 顆特製晶片被壓縮成這三件式組合——MCS-4 晶片組的總電晶體數不到 6,000,卻能透過改寫 ROM 執行任何計算任務。
- 通用性的本質是 Turing completeness:只要有條件分支 + 無限記憶體(此處以有限的 3 層堆疊與外部 ROM 近似),任何可計算函數都能寫成程式:
\[ \forall f \in \text{可計算函數},\ \exists P:f(x) = \text{CPU}(P, x) \]
這正是 Hoff 的推理核心——**12 顆特製晶片只能算 12 個固定的 \(f_i\) ,一顆通用 CPU 能算所有的 \(f\) **。
2. 程式計數器與指令週期#
每道指令的執行被切分為 8 個時脈週期(2 個 phase × 4 個子週期):
\[ T_{\text{指令}} = 8 \times T_{clk} = \frac{8}{740\,\text{kHz}} \approx 10.8\ \mu s \quad\Longrightarrow\quad \text{約 } 92{,}500 \text{ 指令/秒} \]
- Fetch:程式計數器 \(PC\) 送出位址,從 4001 ROM 取回 8-bit 指令(兩個 4-bit 半位元組分兩拍傳)。
- Decode:前 3 bits 為 opcode 類別,後 9 bits 為運算元(暫存器編號、位址或立即值)。
- Execute:ALU 對 4-bit 暫存器運算, \(PC \leftarrow PC + 1\) 或跳躍。
\[ PC \xrightarrow{\text{fetch}} \text{IR} \xrightarrow{\text{decode}} \text{控制訊號} \xrightarrow{\text{execute}} \text{暫存器/記憶體} \]
3. 硬體函數 vs 軟體程式:成本函數的取捨#
給定功能集合 \(\{f_1,\dots,f_n\}\) (Busicom 的 \(n \approx 12\) ),兩種方案的成本:
\[ C_{\text{特製}} = \sum_{i=1}^{n} c_{\text{設計}}(f_i) + n \cdot c_{\text{光罩}}, \qquad C_{\text{通用}} = c_{\text{設計}}(\text{CPU}) + c_{\text{光罩}} + c_{\text{軟體}} \]
- 特製方案的成本隨功能數線性上升,且每改一次功能就要重新做光罩(NRE 爆炸)。
- 通用方案的成本固定,新增功能只需改寫 ROM 中的程式——這是「軟體取代硬體邏輯」的經濟學。
- 代價是速度: \(T_{\text{軟體}} \approx k \cdot T_{\text{硬體}}\) , \(k \approx 10\text{–}100\) 。只要應用是「人機互動」等慢速場景, \(k\) 就不是問題。
4. 4-bit 加法迴圈:在模擬器上重演歷史#
# 4-bit 簡易處理器模擬器:fetch / decode / execute
# 指令集(簡化版 4004):LDM 載入立即值、ADD 加法、JCN 條件跳躍、HLT 停機
PROG = [
('LDM', 0), # r0 = 0(累加器)
('LDM', 5), # r1 = 5(計數器)—— 4004 只有 4-bit,單一暫存器 0-15
('ADD', 1), # r0 = r0 + r1
('SUB1',), # r1 = r1 - 1(以加 0xF 模擬 4-bit 減一)
('JNZ', 2), # 若 r1 != 0 跳到第 2 道(ADD)
('HLT',),
]
pc, acc, cnt = 0, 0, 0
while True:
op = PROG[pc] # fetch
if op[0] == 'LDM': # decode + execute
if pc == 1: cnt = op[1]
else: acc = op[1]
pc += 1
elif op[0] == 'ADD':
acc = (acc + cnt) & 0xF # 4-bit 環繞
pc += 1
elif op[0] == 'SUB1':
cnt = (cnt - 1) & 0xF
pc += 1
elif op[0] == 'JNZ':
pc = op[1] if cnt != 0 else pc + 1
else:
break # HLT
print(f"PC={pc} ACC={acc} CNT={cnt}")
print(f"r0 = {acc}")
# 預期輸出(節錄):PC=2 ACC=0 CNT=5 / ... 迴圈五輪 ... / r0 = 15
# 1+2+3+4+5 = 15,恰好是 4-bit 能表示的最大值——Busicom 計算機的算術就在這種尺度上運作
5. Faggin 的實作難題:把 CPU 塞進 2,300 顆電晶體#
- 隨機邏輯設計:Faggin 沒有 microcode ROM 的餘裕,46 條指令全用 random logic 硬湊,每顆電晶體都要手算負載。
- 矽閘 CMOS:Faggin 發明的矽閘技術(silicon gate)讓電晶體更小更快,4004 是第一顆量產的矽閘商用晶片——他甚至在晶片上簽名「F.F.」。
- 分時匯流排:只有 16 支接腳,位址與資料共用 4-bit 匯流排,靠 \(\phi_1\) 、 \(\phi_2\) 兩相時脈協調三顆晶片。
6. 4004 的指令編碼:8-bit 指令裡的乾坤#
4004 的指令長度為 8-bit(兩個 4-bit 半位元組分兩拍從 ROM 傳來),單位址指令的欄位:
\[ \underbrace{\text{OP}}_{7:3}\ \underbrace{D_{2}, D_{1}}_{2:1}\ \underbrace{X}_{0} \]
以 FIM(立即載入 8-bit 到一對暫存器)與 JUN(無條件跳躍 12-bit 位址)為例,後者的長位址靠 SRC(Send Register Control)把暫存器對當位址鎖存器:
FIM 0P, 0x05 ; 載入 8-bit 立即值 0x05 到暫存器對 0(高半 r0=0,低半 r1=5)
loop: LDM 0 ; ACC = r0(清累加器,4004 有 16 個 4-bit 暫存器)
ADD 1 ; ACC = ACC + r1
XCH 0 ; ACC 與 r0 交換——4004 的核心指令,4-bit 暫存器交換
JUN loop ; 無條件跳躍(12-bit 位址分兩拍)
; r0 = 5,這正是 4004 執行 Busicom 計算機算術的方式
- XCH 的巧妙:16 個 4-bit 暫存器可兩兩配對成 8 個 8-bit 對,
XCH一條指令就完成累加器與記憶體暫存器的交換——2,300 顆電晶體下的省閘藝術。 - 對比同代競品:1972 年的 8008(3,300 電晶體)與 1974 年的 8080(4,500 電晶體)沿用相同的「通用 CPU + 軟體」哲學,但指令集從 4-bit 擴到 8-bit——8080 是 CP/M 的平台,PC 軟體產業的搖籃。
結案 -- 後果與影響#
- 通用 CPU 取代特製邏輯:從此「做晶片」與「寫程式」分家,硬體平台固定、軟體無限延伸——這是所有後續計算架構的母型。
- 軟體產業起飛:程式從 ROM 中的附屬品變成獨立商品;沒有 4004,就沒有 1975 年 Altair BASIC、沒有微軟。
- Intel 轉型:從記憶體公司轉為 CPU 公司——1980 年代 DRAM 被日本廠夾殺時,Andy Grove 決定全力押注微處理器,成為史上最成功的策略轉向之一。
- x86 帝國的路線圖:8008(1972,8-bit) \(\to\) 8080(1974, Gary Kildall 的 CP/M 平台) \(\to\) 8086(1978,16-bit,x86 指令集誕生) \(\to\) 80386(1985,32-bit) \(\to\) 至今百億電晶體。
- 摩爾定律的五十年長跑: \(2{,}300 \to 10^5\) (8086) \(\to 10^9\) (Pentium) \(\to 10^{11}\) (今日 GPU)——4004 是這條曲線的第一個實測點。
關鍵人物與文獻#
- Ted Hoff(Marcian Hoff)與 Stan Mazor:提出「一顆通用處理器 + 軟體」的架構構想。
- Federico Faggin:領導 4004 的實際設計與佈局,矽閘技術發明人;離開後創立 Zilog(1974,Z80)。
- Masatoshi Shima:Busicom 方代表,實際參與邏輯規格制定,後與 Faggin 共創 Zilog。
- Gordon Moore:「Cramming more components onto integrated circuits」, Electronics, 1965。
- F. Faggin, M. Shima, T. Hoff, S. Mazor, "The History of the 4004", IEEE Micro, 1996。
- Intel, " MCS-4 Micro Computer Set" Data Catalog(1971)。