# 什麼是FPGA,它和MCU的差別為何? 我們先說何謂MCU,它是Micro Controller Unit的縮寫,中文翻譯為「微控制器」,但其實它就是一顆CPU(Central Processing Unit),所以我比較喜歡叫它「微處理器」。顧名思義,它就是我們個人電腦(PC,Personal Computer)裡面CPU的微型化版本,我們個人電腦裡面的CPU已經夠小了,不過它還能再縮小,小到能夠塞進一顆IC裡面。如下圖,在IC封裝內部中間那個超小的chip就是MCU的本體,其他都是散熱構造和金屬接點,而整個IC封裝的尺寸就和小拇指差不多。 ![](https://i.imgur.com/64HsyoL.png) MCU本質上它就是CPU,它執行的就是各種數學和邏輯運算,和我們個人電腦的CPU功能類似,只是效能弱很多,但如果不玩3D遊戲,一些較為簡單的應用場合已經足夠應付了。而如果把MCU安裝到一塊電路板上,並搭配上記憶體模組、電源I/O模組,以及各種訊號的輸入和輸出接腳,便成了一個比手掌還小的電腦,具備有電腦的一切特質和功能,只是不一定有安裝作業系統(Operation System)。  註:請參考:馮紐曼提出的電腦(或稱計算機,Computer)的五大(硬體)架構。 使用效能比較陽春的MCU,而且沒有安裝作業系統、沒有硬碟,手掌大小的電腦,最著名的產品就是Arduino,俗稱Arduino開發板。 而使用效能比較強、體積比較大一點的MCU,並配上Linux作業系統和更完整的I/O(Input和Output),可以連接和PC一樣的液晶螢幕,還可以使用SD記憶卡充當硬碟,使它更像一台個人電腦,最著名的產品就是樹莓派(Raspberry Pi),所以也有人稱樹莓派為單版電腦。 ![](https://i.imgur.com/8UtPCPc.png) Arduino開發板就像是閹割板的小型電腦,優勢就是簡單、價格便宜,沒有硬碟、沒有作業系統也沒關係,對於一些簡單的電子勞作來說已經足夠應付,例如可以設計Arduino遙控車、監控裝置等。而對於樹莓派(Raspberry Pi),可以純粹把它當作是一台更小的個人電腦即可,當然它也可以做到Arduino能夠做到的一切事情,但殺雞焉用牛刀,一些簡單的應用使用Arduino開發板來做就可以了,即使壞了也比較不心疼。 說完了MCU,我們來看另一種與MCU很像的東西,就是多數人比較陌生的FPGA。FPGA是Field Programmable Gate Array的縮寫,中文翻譯為「現場可程式化邏輯閘陣列」,原文這個名字就很學術和彆扭,如果不是專業人士光聽名字不可能知道它是什麼。其實FPGA就像MCU一樣是處理器,專門用來做數學和邏輯運算。 ![](https://i.imgur.com/1gJ7zkn.png) 除了外觀不一樣、體積稍微大一點,那FPGA和MCU到底哪裡不一樣?除了功能相似,但其實它們無論在設計理念,以及實際硬體架構都完全不同,而效能和特性、控制方式也都完全不一樣。 MCU的設計理念比較單純,就是把CPU給進一步縮小(但犧牲效能),所以它的硬體架構和CPU幾乎一樣,裡面一樣是以ALU和控制單元為主,來執行我們輸入給它的一連串軟體指令,並產生運算後的輸出。 不過FPGA的設計理念就不同了,FPGA比較偏向用「純硬體」的方式來執行運算。請看下圖,在這樣一個邏輯閘電路的區塊中,如果電流走上面的全加器路徑,兩個3-LUTs的輸出會被相加,加上carry-in之後就成了一組完整的全加器電路。而如果電流走下面的mux路徑,就不會做加法運算,而是執行二選一的多工運算,因此會在兩個LUT的結果當中,選擇一個作為輸出。 ![](https://i.imgur.com/l7KwgTO.png) 這樣我們就知道FPGA的設計理念了:即使是同樣的一個電路,只要電流走不一樣的路徑,這個電路所做的事情就會不一樣,因此就會產生不同的輸出。而我們只要連接更多這樣的區塊成為一個規模巨大的Logic Array,並且能透過指令來控制電流的走向,我們就能利用這個集成電路來做各式各樣的運算了,這就是FPGA。所以宏觀的來看,雖然FPGA最終的功能和MCU相同,但它們的實現方式和特性非常不同。 在電腦科學領域,能夠用純硬體解決的事情,效能都會比還要使用高階語言的軟體指令還快上非常多,因為軟體還要透過轉譯成組合語言,組合語言又還要再轉譯成機械語言才能讓機器執行,而透過硬體直接操控機器當然省事不少,更加直接而快速。只不過在電腦科學領域,對人類來說,愈接近硬體的東西就愈複雜,例如機械語言的難度高於組合語言,組合語言又比高階語言困難,所以FPGA是比較難學的。 簡單的說,無論是MCU或是FPGA,在人類還沒給它們下達控制指令之前都相當於一張白紙,它們要做什麼運算,輸出什麼東西,純粹都是由人類設計者來決定的。 FPGA晶片也可以像MCU一樣被安裝在電路板上,並集成記憶體模組、電源I/O模組,以及各種訊號的輸入和輸出腳位,成為手掌大小的電腦,俗稱FPGA開發板。 ![](https://i.imgur.com/izXDsmb.png) 不過,站在使用者的立場,可以不必去理會MCU或FPGA實際的硬體原理,只要拿來用就好。站在使用者的立場,MCU開發板和FPGA開發板最大的不同,就在於其使用的程式語言。由於MCU開發板使用的是微型化的CPU,所以我們可以用一般的高階語言,如C語言、C++、Java、Python … 來撰寫程式、控制它要做的事情,是多數人比較熟悉的方式。 而FPGA則因為硬體結構完全不同,因此FPGA看不懂這些大家熟知的高階語言,它看的是「硬體描述語言」,例如Verilog、VHDL之類的語言。「硬體描述語言」在一些地方和軟體高階程式語言類似,最大的區別是,硬體描述語言能夠對於硬體電路的「時序特性」進行描述,小到簡單的正反器,大到複雜的超大型積體電路,都可以利用硬體描述語言來控制,而這是軟體高階語言所做不到的。 ________________________________________________________  補充說明: 屬於「硬體描述語言」的VHDL是Very High Speed Integrated Circuit Description Language的縮寫,簡單的說,它就是一種專門用來設計硬體電路的程式語言。它的起源是1970年代至1980年代由美國國防部所贊助的計畫,起初VHDL的目的是希望成為描述複雜電路文件的標準,如此一來,一份電路設計的文件就可以讓另一位設計者所了解,同時也希望VHDL可用在利用軟體模擬電路上。 但1984年Xilinx公司發明的FPGA與1983年出現的Verilog與VHDL改變了這種態勢,它們不僅將硬體設計軟體化,也使得一個人要做IC設計成為可能,大型客製化IC設計變成人人可在書房現學現做的東西,再也不是高不可攀的高科技。美國NI(National Instrument,翻譯為國家儀器)公司甚至在它們最核心的產品LabVIEW中擴充了FPGA模組,使得LabVIEW FPGA能像開發其他LabVIEW程式一般使用圖形化的方式來做FPGA程式開發,大大降低了開發FPGA的複雜度。 簡言之,FPGA就像可反覆寫入的USB隨身碟一樣,可以儲存/刪除不同的資料,不過FPGA實現的原理是使用偏向硬體的方式(硬體描述語言)來重新規劃與佈線FPGA裡面的電路圖,和USB隨身碟的原理不同。 ________________________________________________________ 即使如此,「硬體描述語言」的語法比起大家熟悉的高階語言更加複雜、更加不人性化。所以,就算是精通了C語言或嵌入式C語言的專家,如果要使用FPGA,還是必須學習很多新的東西,並適應差異很大的語法,並不是那麼容易上手。 舉個例子,FPGA的「硬體描述語言」,例如Verilog、VHDL,其執行順序並不是像軟體高階語言那樣由上至下、由左至右,並且它天生就有平行運算的能力(但又不是多核心CPU的概念),所以很多我們在軟體高階語言(如C語言、Java、Python…)的觀念都不同,語法也大相逕庭。 既然如此,那我們為什麼又要學FPGA?既然做的事情都差不多,那我們學MCU就好了啊? 其實FPGA比MCU強大的地方就在於執行效能更快,以及它能更好的與「特殊應用積體電路」(Application Specific Integrated Circuit,縮寫:ASIC)做銜接,因此在商業上能更快地推出新產品,所以在商業的潛力比MCU強(也就是說賺錢比較快啦),因此近幾年來FPGA成為全球商業電子公司主力的開發手段。 從FPGA的原理來看,因為一個產品只會有一些特定的功能,所以完成設計後,FPGA內部一定會有很多用不到的邏輯閘區塊,這樣不是很浪費嗎?所以剛才說的ASIC就是指,依產品需求不同,而客製化的「特殊規格積體電路」,也就是依據FPGA開發完成的功能,再進一步精簡電路設計,讓它成為只有特定功能的電路,這就是ASIC。雖然從此ASIC的功能被固定死了,不能再以程式控制它要做的事情,但這對於銷售來說是個優點,因為單一所以效能強大,並且讓消費者無法隨意修改產品,對手也很難破解。 而因為FPGA本身的原理就是偏向以硬體來做控制,當然能更快、更好的銜接上ASIC。其實,在量產上市的每一個產品都裝FPGA作為運算核心也是可以的,但這樣成本會太高,所以電子公司的研發部門在使用FPGA完成產品原型的開發後,就會把FPGA的設計成果轉變為ASIC,不只可以降低成本,也能更進一步提高運算效能。因此,先期以FPGA開發板完成樣品開發、測試沒問題之後,最終產品就會從FPGA轉成ASIC量產上市。在台灣,台積電(TSMC)就是專門幫全球客戶做ASIC代工製造的生意。 而以上的事情,其實使用MCU開發板也可以做到,但MCU開發板在轉為ASIC的方便度就輸給FPGA,以及運算效能也會比偏向硬體運作的FPGA要差一點。因此在追求價格便宜、效能強大,高CP值的商業市場來說,電子公司自然就會比較偏向使用FPGA來開發新產品,這都是為了能更快的賺到錢,以及讓消費者能以更便宜的價格買到效能更好的產品。 如果不是相關從業人員,一般的電子愛好者或業餘開發者,其實使用MCU開發板(例如Arduino、Raspberry Pi)來製作「新玩具」就已經足夠了,反正不是追求最大利潤、東西也不是要量產賣錢,對一點點的效能差異也不那麼在乎,就不必為此還去研究學習成本和學習曲線很高的FPGA了,除非有朝一日FPGA的開發門檻能夠降低,硬體描述語言能夠再平易近人一點。 做個總結,請看以下的三張圖: ![](https://i.imgur.com/pu5gOmH.png) ![](https://i.imgur.com/6YWV2ZC.png) ![](https://i.imgur.com/XsqUpED.png)