十一月_FPGA專題|FPGA的歷史發展與產品定位
何謂現場可程式化邏輯閘陣列FPGA(Field Programmable Gate Array)呢?在談這個之前需要先談邏輯元件的分類與什麼是特定應用積體電路(ASIC Application Specific IC)。邏輯元件依據設計型態大致可分為標準品與定制品,標準品小從微控制器(MCU)大到中央處理器(CPU)等,相信大概都有聽過。定制品因為是依循特殊需求而設計的,因此運算性能較強,但因為生產數量較少,所以設計、製造相關的一次性工程(NRE)成本較高且從下單到出貨周期更長。定制品又可分成全定制與半定制等兩類,FPGA是屬於半定制型的可程式邏輯元件(PLD),其生產成本與交期低於全定制的邏輯元件。什麼是ASIC呢?簡單來說就是該晶片在出廠前就先設定好它的應用範圍,如早期的GPU圖形處理器,就是一組專門用來繪圖的晶片。與ASIC相反,FPGA就是一塊塊邏輯閘,出廠後能藉由程式語言重新設定功能調整它適合執行的任務。FPGA之所以能做到這一點,是因為採用可重新配置、重新設定的邏輯閘,並透過積體電路的布圖規劃,確保運算資源可彈性地重複使用。
回顧FPGA的歷史,在1970年代可程式邏輯元件發明之前,複雜和高性能的電子系統都是使用特殊應用標準產品(ASSP)或特殊應用IC(ASIC),但兩者不僅設計、製造費時與昂貴,而且功能固定,若設計出問題只能廢棄不用,因此需要開發可程式邏輯元件以減少設計風險。第一個可程式邏輯元件是Signetics公司於1975年推出的現場可程式邏輯陣列(FPLA),與隨後問世的可程式陣列邏輯(PAL)、通用型可程式陣列邏輯(GAL)、可抹除型可程式邏輯元件(EPLD)都是採用AND和OR的陣列,因此稱為簡易型可程式邏輯元件(SPLD),其優點是程式設計簡便,但陣列式結構會因輸入增加而使得邏輯資源浪費情況越嚴重。於是1980年代初期Altera開發出複雜型可程式邏輯元件(CPLD),用中央陣列連接多個簡易型可程式邏輯元件以節省空間,但由於同樣是基於乘積項(Product-Term)架構而較難顯著提高集成度。隨後在1985年Xilinx創始人Rose Freeman發明FPGA,其容量和擴充性遠勝CPLD。1990年代後FPGA的集成度和處理速度顯著提升,且性能和ASIC差距逐漸縮小,自此快速取代其他可程式邏輯元件而成為市場主流產品,2000年後FPGA朝向大規模集成化發展,目前可容納邏輯單元已高達數千萬個。就設計理念而言,FPGA即便使用與標準品同樣的電路模塊,只要電流走不一樣的路徑,這個電路所做的事情就會不一樣,因此就會產生不同的輸出。而我們只要連接更多這樣的區塊成為一個規模龐大的邏輯陣列(Logic Array),並且能透過指令來控制電流的走向,我們就能利用這個集成電路來做各式各樣的運算,如下圖以簡單的邏輯電路區塊(Cell)說明。在此區塊中,如果電流走上面的全加器路徑,兩個3-LUTs(Look up table)的輸出會被相加,加上carry-in之後就成了一組完整的全加器電路。而如果電流走下面的mux路徑,就不會做加法運算,而是執行二選一的多工運算,因此會在兩個LUTs的結果當中,選擇一個作為輸出。
圖1. 邏輯電路區塊示意圖

在電腦科學與程式語言的觀點,不同於標準品像是MCU、CPU等,FPGA比較偏向用「純硬體」的方式來執行運算。能夠用純硬體解決的事情,效能都會比還要使用高階語言的軟體指令還快上非常多,因為軟體還要透過轉譯成組合語言,組合語言又還要再轉譯成機械語言才能讓機器執行,而透過硬體直接操控機器當然省事不少,更加直接而快速。只不過在電腦科學領域,對人類來說,愈接近硬體的東西就愈複雜,例如機械語言的難度高於組合語言,組合語言又比高階語言困難,所以FPGA是比較難學的。以程式開發者觀點,標準品開發板所使用程式語言較高階,如C語言、C++、Java、Python是多數人比較熟悉的方式。而FPGA則因為硬體結構完全不同,因此FPGA看不懂這些大家熟知的高階語言,它看的是「硬體描述語言」,例如Verilog、VHDL之類的語言。「硬體描述語言」在一些地方和軟體高階程式語言類似,最大的區別是,硬體描述語言能夠對於硬體電路的「時序特性」進行描述,小到簡單的正反器,大到複雜的超大型積體電路,都可以利用硬體描述語言來控制,而這是軟體高階語言所做不到的。也由於FPGA比標準品如MCU強大的地方就在於執行效能更快,以及它能更好的與「特殊應用積體電路」(Application Specific Integrated Circuit,縮寫:ASIC)做銜接,在商業上能更快地推出新產品,所以在商業的潛力比MCU強(也就是說賺錢比較快),因此近幾年來FPGA成為全球商業電子公司主力的開發手段。






