FPGA是什麼?做好之後還能改寫電路的晶片原理
FPGA是在工廠製造完成後,還能一再重組內部邏輯電路的晶片。裡面排滿了寫著答案的小表格(LUT),以及可以切換連接方式的繞線。載入設定資料後,它們就會當成目標電路運作。它比專用晶片(ASIC)慢,也比較耗電。但它的強項是不必花重做晶片的費用和時間。
這篇文章可以了解
- 「電路可以事後改寫」是什麼意思,和改寫程式的CPU有什麼不同
- FPGA內部3種元件(LUT、正反器、繞線)的原理,以AND和XOR為例
- FPGA電路的製作方式,以及和專用晶片(ASIC)的分工
- FPGA用在哪裡,以及主要廠商的歷史
先備知識:如果知道AND、XOR等邏輯閘和真值表,會比較容易閱讀。這在「電腦怎麼用0和1計算?」中說明。
生活中的例子
在手機或家電裡,不太常見到FPGA。常用到它的是行動通訊基地台、量測儀器、資料中心的伺服器、人造衛星等。這些都是生產數量偏少,或出貨後還想改變功能的機器。
對開發新晶片的公司來說,FPGA也不可或缺。因為在工廠製造晶片之前,會先把設計好的電路放進FPGA,確認它真的能動。
FPGA是什麼:電路可以事後決定的晶片
一般的晶片,會在工廠把設計好的電路做進去。電晶體的連接方式在完成時就固定,之後不能更改(「積體電路(IC)是什麼?」)。CPU的電路本身也是固定的。CPU能改的,是交給電路執行的指令順序,也就是程式(「CPU是什麼?」)。
相對地,FPGA是買來之後,才決定電路本身的晶片。裡面有能變成任何功能的小元件,以及連接它們的繞線,像棋盤格一樣排列。設定好每個元件做什麼、怎麼連接,晶片就會當成那個電路運作。
FPGA是英文Field-Programmable Gate Array的縮寫,中文稱為現場可程式化邏輯閘陣列。意思是「在現場(field)就能設定(programmable)的邏輯閘排列(gate array)」。
原理1:LUT——寫著答案的小表格
邏輯電路的功能,可以用真值表寫出來。這是列出所有輸入組合,以及各組合輸出的表。例如2輸入的AND,輸入組合有4種,所以是4列的表。
FPGA不用邏輯閘組裝,而是把這張表直接寫進小小的記憶體。用輸入的0和1選出「表的第幾列」,再輸出那一列寫的值。因為是查表得出答案,這個元件稱為查找表(LUT)。
2輸入的LUT,由4個記憶格和選出其中1格的電路組成。要做成AND時,從上到下在4格裡寫入0、0、0、1。輸入A=1、B=1時,選中第4格,輸出1。其他輸入都輸出0,所以和AND的功能相同。
把同一個LUT的格子,從上到下改寫成0、1、1、0看看。這樣它就只在兩個輸入不同時輸出1。這正是XOR的功能。不必更換邏輯閘,只要改寫格子裡的內容,就變成另一個電路。
| A | B | AND的格子內容 | XOR的格子內容 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
4個格子填入0和1的方式共有16種。2輸入的邏輯功能,總共也是16種。2輸入的LUT,可以變成其中任何一種。
實際FPGA的LUT,輸入更多。例如超微(AMD)的7系列FPGA,使用6輸入的LUT。格子數是2連乘6次的64個,任何6輸入的邏輯,都能用1個LUT做出來。
原理2:正反器——記住結果
LUT的輸出,只由當下的輸入決定。光靠它,無法記住「剛才是什麼值」。計數的電路,或把計算分成幾段依序傳下去的電路,都需要能記住值的元件。
因此FPGA在LUT旁邊,放了正反器。正反器是記住0或1這1個位元的元件。它只在固定的訊號到來的瞬間讀入輸入,並持續輸出同一個值,直到下一個訊號。
這個訊號以固定間隔重複0和1,稱為時脈。和CPU的「3 GHz」是同一種訊號。本文把幾組LUT和正反器合在一起的單位,稱為「邏輯區塊」。
只由輸入決定輸出的電路,和也會用到記住的值的電路,兩者的差異整理在「組合邏輯電路與循序邏輯電路的差異」的表中。
原理3:可以切換連接方式的繞線
邏輯區塊之間,縱橫交錯著許多繞線。繞線交會的地方,有能選擇接通或切斷的開關。開關其實是電晶體,開或關由旁邊記憶格裡的0和1決定。
假設要把某個邏輯區塊的輸出,送到另一個區塊。只要打開途中的幾個開關,就能做出一條路徑。打開哪些開關,決定了電路的連接方式。這種能用設定改變連接的繞線,稱為可程式化繞線。
為了放進任何電路都不會不夠用,繞線和開關連可能用不到的路都事先準備好。因此需要多出來的電晶體和面積。這就是後面會看到「比專用晶片慢、也比較耗電」的原因之一。
也內建了專用元件
乘法這類大的計算,如果用LUT來做,需要很多LUT,速度也慢。因此現在的FPGA,一開始就做進了功能固定的電路。這些稱為硬體區塊。
- DSP區塊:把乘法和加法合在一起快速執行的電路。DSP是「數位訊號處理」的英文縮寫,用於聲音和無線電波的處理,以及AI的計算
- 區塊RAM:放置一定量資料的晶片內記憶體
- 高速收發器:用很少的線,和其他晶片快速交換資料的電路(SerDes)
- CPU核心:也有內建Arm等處理器的產品。靠程式運作的部分和組電路的部分,可以放在同一顆晶片上
設定資料,每次開機都要載入
LUT格子的內容,和繞線開關的開或關,全都是0和1的資料。把這些整合成一份,稱為位元流。所謂「把電路寫進FPGA」,就是把這份資料載入內部的記憶格。
多數FPGA的記憶格,使用斷電後內容就會消失的記憶體(SRAM)。所以每次開機,都要從同一塊電路板上的快閃記憶體等處載入位元流。載入完成之前,FPGA不會當成目標電路運作。
另一方面,也有斷電後設定不會消失的產品。例如Microchip公司的PolarFire系列,把設定存在一種快閃記憶體裡。不必在外面放設定用的記憶體,開機後馬上就能運作。
FPGA的電路怎麼做?
FPGA電路的做法,和專用晶片(ASIC)的設計很像。最大的不同在最後一步。不是把設計資料送到工廠,而是產生位元流,載入FPGA。
- 寫出功能:用硬體描述語言(HDL)寫出電路的動作。常用的是Verilog和VHDL。
- 轉成電路:軟體把寫好的動作,轉換成LUT、正反器、硬體區塊的組合。這個步驟稱為邏輯合成。
- 擺放並連接:由軟體決定使用哪些邏輯區塊、用哪些開關連接。這稱為佈局繞線。
- 寫入:把結果做成位元流,載入FPGA。
- 確認:實際運作來確認,要修改就回到第1步。
HDL看起來像程式語言,但寫的不是指令的順序,而是電路的形狀。兩種語言的差異,在「Verilog 與 VHDL 的差異」中比較。
最近也會用另一種方法:從C語言或C++寫的計算步驟,自動產生相當於HDL的電路描述。這稱為高階合成(HLS)。
CPU、FPGA、ASIC的差異
CPU用固定的電路,一次取出並執行一個指令。它什麼工作都能做,但每次都要花工夫取出並解讀指令。FPGA則是組出配合工作的電路來運作。例如「乘、加、比較」可以用各自的電路同時進行。
ASIC(特殊應用積體電路)是只為一種工作設計、在工廠製造的晶片。用同一世代的技術做出相同的功能,通常ASIC最快,也最省電。不過開始生產前,設計和電路的原版(光罩)要花很大的費用。必須大量生產,把這筆費用分攤到每一顆上,才能回本。
| CPU | FPGA | ASIC | |
|---|---|---|---|
| 事後能改的東西 | 程式 | 電路本身 | 不能改 |
| 固定工作的效率(參考) | 偏低 | 中等 | 最高 |
| 製作晶片的費用 | 不需要(現成品) | 不需要(現成品) | 非常高 |
| 適合的場合 | 什麼都能做 | 少量、規格會變 | 大量、規格已定 |
三者的差異,以及和把整個系統整合成一顆晶片(SoC)的關係,也整理在「ASIC、FPGA、SoC 的差異」的表中。
為什麼比專用晶片慢,也比較耗電?
在FPGA中,訊號每次在邏輯區塊之間移動,都要經過好幾個開關和長長的繞線。ASIC可以用最短的繞線連接兩點,FPGA卻只能轉乘事先準備好的路。另外,就連AND這種小功能,有時也要用掉1個有64格的LUT。
有研究實際量過這個差距。多倫多大學的Kuon和Rose在2007年的論文中,用FPGA和ASIC做出相同的電路來比較。兩者都是同一世代(90 nm)的技術。只用LUT和正反器時,FPGA的面積平均約35倍,訊號通過電路的時間約3~4倍。
功耗方面,比較的是0和1切換時用掉的部分(動態功耗),FPGA約14倍。另一方面,使用硬體區塊時,面積差距縮小到約18倍。這是將近20年前世代的量測,現在的產品數字不同。不過,能改寫就會降低效率的理由,現在也一樣。
用在哪裡?
- 新晶片的試作:在工廠製造ASIC之前,把設計好的電路放進FPGA,執行實際的軟體來確認。也有專為這種用途做的超大型FPGA。
- 通訊設備:通訊標準會不斷修訂。在基地台等設備使用FPGA,就保留了出貨後修改電路的空間。
- 量測儀器與工業設備:這些產品生產數量少,做專用晶片不划算。
- 資料中心:Microsoft在2014年的論文中,報告了用FPGA加速搜尋引擎Bing排序計算的試驗。在1,632台伺服器上各裝1片FPGA,每台的處理量增加了95%。
- 太空:在人造衛星上,發射後還能從地面改寫電路是一大優點。太空中容易因輻射讓記憶的位元翻轉,發生軟錯誤,所以會使用有對策的太空用產品。
FPGA的歷史與廠商
想出FPGA的人,是美國工程師羅斯.弗里曼(Ross Freeman)。1984年,他為了把這個構想做成產品,和夥伴一起創立了Xilinx。接著在1985年,發表了被視為第一顆FPGA的XC2064。裡面的邏輯元件有64個。
長久以來,最知名的FPGA大廠是Xilinx和Altera這2家公司。
- 2015年12月:英特爾(Intel)完成收購Altera
- 2022年2月:超微(AMD)完成收購Xilinx。Xilinx的產品現在以AMD的產品販售
- 2025年9月:投資公司Silver Lake取得Altera 51%的股份。Altera不再是英特爾的子公司(英特爾持有49%)
此外,Lattice和Microchip等公司也生產FPGA。這裡寫的公司關係,是2026年10月時的狀況。
常見的誤解
誤解:FPGA像CPU一樣在執行程式
實際上,位元流不是指令的排列。它是決定LUT內容和開關開或關的「電路設定」。寫入之後,是那個電路直接處理訊號,沒有取出指令的動作。不過,內建CPU核心的產品,那顆CPU會執行程式。同樣用「程式化」這個詞,是誤解的來源。
誤解:用FPGA,任何處理都會比CPU快
實際上,會變快的是能同時進行的計算多、步驟固定的處理。如前面所見,訊號通過FPGA電路要花時間,時脈通常也比CPU低。步驟會依條件大幅改變的處理,CPU反而常常比較快。大量的乘法運算,也常使用GPU(「AI為什麼要用GPU?」)。
誤解:寫入一次之後就不能再改
實際上,多數FPGA只要載入別的位元流,就能改寫任意次。使用SRAM的產品,甚至每次開機都會重新載入設定。不過,太空用等少數產品,採用只能寫入一次的方式(反熔絲)。
從數字來看
| 項目 | 數字 |
|---|---|
| 第一顆FPGA XC2064(1985年)的邏輯元件 | 64個 |
| 試作用的AMD Versal Premium VP1902(2023年發表)的規模 | 1,850萬個邏輯單元 |
| FPGA與ASIC的差距(Kuon、Rose,2007年,90 nm世代) | 面積約35倍、延遲約3~4倍、動態功耗約14倍 |
邏輯單元是廠商自訂的規模計算方式(AMD把1個6輸入LUT算作1.6個邏輯單元)。它和XC2064的「64個」算法不同,不能單純比較。即使如此,仍看得出約40年間規模大了好幾個數量級。
進一步學習
- 用表格看差異:閂鎖器與正反器的差異、靜態功耗與動態功耗的差異
- 下一步的用語:FPGA(詳細解說)、RTL、STA(檢查電路是否趕得上時脈)
- 動手試試看:邏輯電路模擬器(做出邏輯閘的真值表,就知道LUT要寫入什麼內容)、建立時間與保持時間時序計算器(電路延遲與時脈速度的關係)
- 用圖來看:正反器讀入值的時機,在圖解「建立時間與保持時間」中
- 相關文章:「微控制器(MCU)是什麼?」(靠程式運作的小型電腦,常拿來和FPGA比較)