跳轉到

1985-XC2064 首款 FPGA#

案件摘要#

(1985 年,Xilinx 推出世界首款 FPGA——XC2064:64 個 CLB 構成 8×8 陣列、2 輸入 LUT、NMOS-on-CMOS 製程(約 850nm)。本案追查 LUT 實作布林函數的數學、CLB 與可程式路由的架構、規格驗證,以及 Verilog 範例如何映射到硬體——一顆晶片如何讓「流片即賭博」的 ASIC 世界變成「軟體般可重寫」。)

前因 -- 為什麼會會有這個案子#

1984 年 Xilinx 創立時,ASIC 的困境已經清晰:一片全客戶化 ASIC 的 NRE 費用(光罩、設計、驗證)動輒數萬美元起跳,設計週期以季計;更致命的是交期——從送出 GDSII 到拿到晶片要數個月,而一旦流片後發現邏輯錯誤(哪怕一條線接反),整批晶片報廢、只能重跑一輪光罩。對於原型開發、中小量產品、以及需求多變的系統商,這是無法承受的賭博。

閘陣列(gate array)雖然降低了 NRE(只做金屬層光罩),但仍需數週交期與費用;PAL/GAL 即時可用卻只有數十閘的規模。市場需要的是一種「交付即時、可反覆修改、規模可達數千閘」的邏輯晶片。Ross Freeman 的洞察(SRAM 開關開銷隨摩爾定律遞減)+ LUT 邏輯思想,在此刻變成產品。

1985 年,Xilinx 推出 XC2064——史上第一款商用 FPGA。它以 64 個可組態邏輯塊(CLB)排成 8×8 陣列,四周環繞可程式 I/O 塊(IOB),CLB 之間由可程式路由通道與開關矩陣連接,所有組態存於片上 SRAM,上電時從外部串列 PROM 自動載入。製程採 NMOS-on-CMOS(約 850 nm 世代),速度約 33 MHz 級、等效閘數約 1,200 閘。「Field Programmable Gate Array」這個名字正式立案:把「閘陣列」的規則陣列搬到「現場(field)」——使用者自己就是晶圓廠的最後一道光罩。

線索與推理 -- 數學式、程式、理論(本體,最詳細)#

線索一:LUT 實作布林函數的數學——真值表就是電路#

LUT(Look-Up Table)實作布林函數的數學基礎極其優雅。一個布林函數是映射:

\[ f: \{0,1\}^n \to \{0,1\}, \qquad f \in \{0,1\}^{2^n} \]

任何這樣的函數都由它的完整真值表唯一決定—— \(2^n\) 個位元。而一個 \(2^n \times 1\) 的記憶體恰好能存 \(2^n\) 個位元。所以:

\[ \boxed{\text{一個 } n \text{ 輸入 LUT} = \text{一個 } 2^n \times 1 \text{ 的 SRAM}} \]

輸入 \(x_1 \ldots x_n\) 接到 SRAM 的位址線,SRAM 的資料輸出就是 \(f\) 。不需要任何化簡、不需要任何兩級結構——真值表本身就是電路。這與 PLA 的根本差異在:

特性 PLA(AND-OR 平面) LUT(SRAM)
實作原理 化簡後的 SOP,乘積項之和 完整真值表直接查表
需要化簡? 必須(乘積項配額有限) 不需要( \(2^n\) 個位元全存)
面積 vs \(n\) \(O(p \cdot n)\) , \(p\) 為乘積項數 \(O(2^n)\) ,指數
延遲 隨函數複雜度變化 常數(與函數無關,只看位址線數)
適合的 \(n\) 大 \(n\) (多輸入單函數) 小 \(n\) (3~6 輸入,多個串接)

關鍵推理:LUT 的 \(O(2^n)\) 看似指數爆炸,但 XC2064 的架構把 \(n\) 壓在 2(2 輸入 LUT,每個 LUT 僅 4 個 SRAM 位元),大函數用多個 LUT 樹狀串接實作。例如 4 輸入函數 \(f(x_1,x_2,x_3,x_4)\) 可用 Shannon 展開拆成兩個 3 輸入子函數、再用 MUX 合併——LUT 的常數延遲特性(與函數內容無關)還帶來一個意外的工程優勢:時序模擬在佈局前就能精確估算,這是 PLA/隨機邏輯做不到的。

線索二:CLB 的架構——LUT + 正反器 + MUX#

XC2064 的可組態邏輯塊(CLB,Configurable Logic Block)由三部分組成:

  1. 組合邏輯:2 輸入 LUT(4 個 SRAM 組態位元)+ 可選的第三輸入路徑,可實作任意 \(f = f(x_1, x_2)\) 或含 \(\overline{f}\) 的組合。
  2. 正反器(D-FF):可組態為邊緣觸發或電平觸發、帶同步/非同步復位,實作時序邏輯。
  3. 多工器(MUX):選擇輸出是「LUT 直接輸出」還是「正反器輸出」,即組合邏輯與時序邏輯的組態開關。

CLB 的行為數學:

\[ Q^{+} = \begin{cases} f(x_1, x_2, x_3) & \text{(組合模式)} \\ f(x_1, x_2, x_3) & \text{(時序模式,時脈邊緣鎖存)} \end{cases} \]

一個 CLB 因此能實作:任意 3 輸入組合函數、一個位元的狀態暫存、或小型狀態機。這個「邏輯 + 暫存器 + 選擇器」的三件套結構,成為此後所有 FPGA 架構的標準範式——後來的 LUT 從 2 輸入長到 4 輸入(XC4000)、6 輸入(Xilinx 7 系列),但 CLB/LEC 的骨架不變。

線索三:可程式路由——通道、開關矩陣與組態位元#

CLB 之間的連接靠可程式互連架構:

  • 路由通道(routing channels):CLB 陣列的行與列之間有水平與垂直的金屬線段(segment)。
  • 開關矩陣(switch matrix):線段交叉點上的可程式開關盒,決定線段如何轉彎、連接。
  • 可程式互連點(PIP, Programmable Interconnect Point):由 SRAM 位元控制的傳輸閘,接通或斷開兩條線段。

XC2064 的互連層級:

層級 資源 作用
局部互連 CLB 直接相鄰連線 快速連接相鄰 CLB
一般互連 水平/垂直線段 + 開關矩陣 CLB 間的任意連接
長線(long lines) 貫穿整列/整行的長金屬線 時脈、全域控制訊號

所有 PIP 的狀態組成組態位元流(configuration bitstream)。組態總位元數包括:所有 LUT 的真值表位元 + 所有 MUX 選擇位元 + 所有 PIP 開關位元 + IOB 組態位元。上電時,片上組態邏輯從外部串列 PROM(如 XC1736)以串列方式把位元流載入片上 SRAM——FPGA 的「程式」就是這個位元流,載入過程就是「把自己程式化」。揮發性的代價(斷電即失)以「每次上電自動重載」換取,帶來附贈的好處:遠端更新——改版只需換一片 PROM 或透過介面重載,不必動硬體。

線索四:XC2064 規格表驗證#

1985 年的 XC2064 作為實物證據:

項目 規格
CLB 數量 64 個,8×8 陣列
LUT 輸入數 2 輸入(4 個組態位元/LUT)
每個 CLB 1 個 LUT + 1 個 D-FF + MUX
IOB(可程式 I/O) 58 個(可組態輸入/輸出/雙向)
等效閘數 約 1,200 閘
觸發器數 64 個(每 CLB 一個)
製程 NMOS-on-CMOS,約 850 nm 世代
組態儲存 片上 SRAM,上電自外部 PROM 載入
最高時脈 約 33 MHz 級(toggle 級)
封裝 44/48 腳 PLCC/DIP 等

驗證推理:64 個 CLB、每個含 1 個 D-FF,故總共 64 個正反器——足以實作 64 狀態的 FSM 或多位元計數器;等效 1,200 閘遠超 PAL 的 20 閘級,直逼小型閘陣列的規模,而交期是「買一顆 + 燒一片 PROM」的當天完成。

線索五:Verilog 範例與合成映射#

以現代視角回看:一個 4 位元計數器如何映射到 FPGA。Verilog 描述:

module counter4 (
    input  wire       clk,
    input  wire       rst_n,
    output reg  [3:0] count
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            count <= 4'b0000;
        else
            count <= count + 4'b0001;
    end
endmodule

合成映射的推理過程:

  1. 暫存器推斷:count 是 4 位元暫存器 → 映射到 4 個 CLB 的 D-FF(4 個 CLB 各出一個正反器)。
  2. 下一狀態邏輯:count + 1 是 4 輸入函數 \(Q_i^{+} = g(x_1,x_2,x_3,x_4)\) (含進位鏈)→ 每 1 個位元的下一狀態函數用 Shannon 展開拆成 2 輸入 LUT 樹:一個 4 輸入函數 ≈ 3 個 2 輸入 LUT + 2 個 MUX(或 XC2064 架構下由 CLB 的第三輸入路徑部分吸收)。
  3. 復位邏輯:rst_n 併入 D-FF 的非同步復位腳 → 不耗 LUT,直接用 CLB 的復位組態。
  4. 路由:4 個 CLB 之間的進位/回饋訊號由開關矩陣的 PIP 連接;clk 與 rst_n 走長線(全域訊號)。

若以「3 輸入 LUT 實作布林函數」直接示範——實作全加器 \(S = a \oplus b \oplus c\) :

module full_adder (
    input  wire a, b, cin,
    output wire sum, cout
);
    assign sum  = a ^ b ^ cin;
    assign cout = (a & b) | (a & cin) | (b & cin);
endmodule

映射推理:sum 是 3 輸入函數,真值表 8 個位元 10100101( \(a,b,c\) 由高到低排列,1 的個數為奇數時為 1)→ 一個 3 輸入 LUT(8 個 SRAM 位元)直接裝下;cout 也是 3 輸入函數(多數決)→ 再一個 LUT。一個 3-LUT 的全加器,零化簡、零兩級結構——真值表即電路。這條推理徹底驗證了線索一的數學。

線索六:FPGA vs ASIC 對照表#

比較項 ASIC(全客戶化) FPGA(XC2064 世代)
NRE 費用 數萬~數十萬美元 ≈ 0(開發板 + 軟體)
交期 數月(流片) 當天(買晶片 + 燒錄)
修改成本 重流片一輪 重新下載位元流,數秒
單位成本(量產) 低 高(開關 overhead)
單位成本(小量) 高(攤提 NRE) 低
速度/功耗 最優 較差(RC 延遲 + overhead)
適合場景 大量、穩定規格 原型、小量、需改版

經濟推理:設計量為 \(N\) 顆、ASIC 單顆成本 \(c_{\mathrm{ASIC}}\) 、NRE 為 \(F\) ;FPGA 單顆成本 \(c_{\mathrm{FPGA}} > c_{\mathrm{ASIC}}\) 、NRE \(\approx 0\) 。總成本:

\[ C_{\mathrm{ASIC}} = F + N c_{\mathrm{ASIC}}, \qquad C_{\mathrm{FPGA}} = N c_{\mathrm{FPGA}} \]

兩者交叉的損益平衡點為:

\[ N^* = \frac{F}{c_{\mathrm{FPGA}} - c_{\mathrm{ASIC}}} \]

\(N < N^*\) 時 FPGA 便宜, \(N > N^*\) 時 ASIC 便宜。1985 年時 \(N^*\) 大約在數千顆級;而隨 FPGA 製程微縮( \(c_{\mathrm{FPGA}}\) 下降)與 ASIC NRE 持續上升(設計複雜度上升), \(N^*\) 不斷右移——這條損益線的右移,正是 FPGA 市場三十年成長的數學本質。

結案 -- 後果與影響#

XC2064 的問世,把「流片即賭博」的邏輯設計變成「軟體般可重寫」的工程實務。雖然第一代產品的速度與密度都遠遜 ASIC,但 Freeman 的損益平衡論證在市場上全面應驗:FPGA 市場從 1985 年的零成長至今日數百億美元規模,並在原型驗證、通訊、軍工、資料中心、AI 推論中扮演無可替代的角色。

  • 確立「SRAM 組態 + LUT + CLB + 可程式路由」的 FPGA 架構範式,LUT 從 2 輸入演化到 6 輸入而骨架不變。
  • 確立「位元流 + 開發工具鏈」的產品形態,成為 EDA 產業的新支柱。
  • \(N^* = F/(c_{\mathrm{FPGA}} - c_{\mathrm{ASIC}})\) 的損益平衡點右移,是 FPGA 市場成長的數學引擎。
  • Ross Freeman(FPGA 之父)於 1989 年過世,2009 年入選美國發明家名人堂,其 LUT 專利成為 FPGA 產業的法理基石。
  • Xilinx 從 XC2064 起家,歷經 XC4000、Virtex、7 系列、UltraScale,至 2020 年被 AMD 併購,FPGA 與 CPU/GPU 走向融合(如 Versal ACAP)。

關鍵人物與文獻#

  • Ross Freeman(Xilinx 共同創辦人):FPGA 構想與 LUT 架構的原創者,美國專利 4,642,487《Configurable electrical interconnect system》等;1989 年過世,2009 年入選美國發明家名人堂(National Inventors Hall of Fame),被尊為 FPGA 之父。
  • Bernard Vonderschmitt(Xilinx 共同創辦人):商業模式與 fabless 代工策略的主導者。
  • James Barnett(Xilinx 共同創辦人):早期工程與團隊建構的關鍵角色。
  • Xilinx:XC2064 資料手冊(1985)與《The Programmable Logic Data Book》——CLB/IOB/組態架構的原始文獻。
  • Steve Trimberger:《Three Generations of FPGA Evolution》(ICCAD/回顧性論文)與《Field-Programmable Gate Array Technology》(1994,編著)——FPGA 架構三世代演化的經典文獻。
  • S. Brown 與 J. Rose:《Architecture of FPGAs and CPLDs: A Tutorial》(IEEE Design & Test of Computers, 1996)——FPGA/CPLD 架構的標準教學文獻。
  • S. Brown、R. Francis、J. Rose、Z. Vranesic:《Field-Programmable Gate Arrays》(1992)——LUT 架構與合成映射的學術專書。
  • 教科書:Wayne Wolf《FPGA-Based System Design》、Brown & Vranesic《Fundamentals of Digital Logic with Verilog Design》。