一、FPGA是什么?
在《FPGA至簡設計原理與應用》一書里是這樣描述的:『FPGA的全稱為Field-Programmable Gate Array,即現場可編程門陣列。在開始學習FPGA之前,同學們首先應該清楚地了解FPGA的概念,明白FPGA到底是什么東西,可以用來做什么。FPGA是在PAL、GAL、CPLD等可編程器件的基礎上進一步發展的產物,是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。簡而言之,FPGA就是一個可以通過編程來改變內部結構的芯片。
直觀來說,FPGA就是一個可以“改變”內部結構的芯片,而讓這個芯片來實現怎樣的功能,就需要通過編程即設計硬件描述語言,經過EDA工具編譯、綜合、布局布線成后轉換為可燒錄的文件,最終加載到FPGA器件中去,改變FPGA內部的連線,最終完成所實現的功能。此時的FPGA就可以認為是用來實現具體功能的一個粗糙的芯片。
稍微接觸過硬件的人大概都聽說過另一種集成電路芯片即單片機,那么FPGA與單片機在結構上有著怎樣的差別呢?對于單片機而言,FPGA是一種微處理器,類似于電腦的CPU,一般是基于哈佛總線結構或者馮·諾依曼結構。單片機用途廣泛,多用于控制流水線上;FPGA的結構是查找表,它的結構比較復雜,相對應的它可以實現的功能也很強大,一般應用于通信接口設計、數字信號處理等比較高端的場合,而且FPGA還有一個特殊的應用場合,即ASIC的原型驗證。
相較于專職專用的ASIC,FPGA工具在開發難度上降低了許多,并且大大縮短了開發周期,而且由于FPGA是可重復編程的,其研發成本與風險也要比ASIC減少許多,更適用于復雜多變的數據中心等應用。
但是FPGA也不是萬能的,優勢有時候也是劣勢。雖然FPGA相比于單片機、CPU等集成電路芯片擁有效率更高、功耗更低的特點,但是易于開發程度遠遠不如單片機、CPU;在數字芯片設計領域,FPGA雖然相比ASIC具有更短的開發周期與開發難度,但是其存在著成本過高、性能較差并且在資源的利用率上遠不及ASIC等問題,不能真正的替代ASIC。』
這段描述非常的接地氣且通俗易懂,但從另一個層面來講,FPGA對于不同的人有不同的意義。FPGA有多種類型,每一種類型具有不同的功能和組合。二、FPGA的基本結構
FPGA可編程的特性決定了其實現數字邏輯的結構不能像專用ASIC那樣通過固定的邏輯門電路來完成,而只能采用一種可以重復配置的結構來實現,而查找表(LUT)可以很好地滿足這一要求,目前主流的FPGA芯片仍是基于SRAM工藝的查找表結構。
在任意一款FPGA芯片說明書中可以查看到該器件具體的參數指標,其中包含可編程邏輯模塊的數量、固定功能邏輯模塊(如乘法器)的數目及存儲器資源(如嵌入式RAM)的大小。當然僅僅依靠這些結構是構成不了FPGA的基本結構的,在芯片中還有其他眾多部分,但是在比較FPGA時,上述結構是最重要的參考指標。在最底層的可配置邏輯模塊(如片上的邏輯單元)上,存在著基本的兩種部件:觸發器和查找表(LUT),而觸發器和查找表的組合方式不同,是各個FPGA家族之間區別的重要依據,并且查找表本身的結構也可能各不相同(有4輸入或6輸入或其他)。
查找表(Look-Up-Table)簡稱為LUT,其本質上就是一個RAM。目前FPGA內部中多使用4輸入的LUT,每一個LUT可以看成一個有4位地址線的RAM。當用戶在EDA工具上通過原理圖或硬件描述語言設計了一個邏輯電路以后,FPGA開發軟件會自動計算邏輯電路的所有可能結果,并把真值表(即結果)事先寫入RAM中。這樣,每輸入一個信號進行邏輯運算就等于輸入一個地址進行查找表操作,通過地址找到對應的RAM中的結果,最后將其輸出。
以實現數字邏輯Y=A&B&C的功能為例。如果是在專用ASIC中,為了實現該邏輯,邏輯門都已經事先確定好,Y的輸出值為兩個邏輯與運算后的結果,其基本的實現結構如下圖所示:
圖 1 Y=A&B&C的實現結構
而在FPGA的結構中若要實現同樣的邏輯功能,用戶首先在EDA工具中使用硬件描述語言設計出“Y=A&B&C”邏輯代碼,EDA工具(QUARTUS或其他開發工具)分析這一行代碼,得出A、B、C在不同輸入組合下(共8種),Y的值分別是多少,其真值表如下表所示:表1 Y=A&B&C真值表
然后軟件工具將所有的結果寫到查找表上,從而實現了該代碼的功能。下圖就是FPGA的實現基本結構。查找表就類似于一個RAM,輸入A、B、C則相當于地址,通過A、B、C的地址就得讀到值賦給Y并輸出。
圖2 Y=A&B&C的FPGA實現基本結構三、更為復雜的FPGA架構
1985,賽靈思公司推出了第一塊FPGA芯片—XC2064,最初的FPGA包含了8×8=64的邏輯塊陣列和85000個晶體管,其門電路不超過1000個,且每個邏輯塊由一個四輸入的查找表和其它一些簡單功能模塊構成。FPGA誕生之初由于其容量非常有限,因此只能用來執行一些相對簡單的任務,如用來集中一些膠合邏輯或實現基本的狀態機。而在22年后,FPGA行業兩大巨頭Xilinx和Altera公司紛紛推出了采用最新65nm工藝的FPGA產品,其門數量已經達到千萬級,晶體管個數更是超過10億個。在這22年間,FPGA在緊跟半導體工藝進步的同時也推動了半導體的發展進程——2001年采用150nm工藝、2002年采用130nm工藝,2003年采用90nm工藝,2006年采用65nm工藝,而目前最新推出的FPGA產品更是已經使用上10nm工藝。隨著技術的發展和工藝節點的進步,FPGA的容量和性能在不斷提高的同時,其功耗卻不斷的優化減少。2006年以前四輸入查找表一直被廣泛使用,在一些高端器件可能會用上六輸入、八輸入或更多輸入端口的查找表。而一個多輸入的查找表又可以分解成較小輸入的查找表,即能夠分裂成許多更小的功能。例如一個八輸入的查找表可以分解成兩個四輸入的查找表或分解成一個三輸入加一個五輸入的查找表。在實際的高端器件中,這種可編程構造可以描述相當于百萬級(有時甚至千萬級)的原始邏輯門。
在FPGA內部,有著“軟內核”與“硬內核”之分。比如若利用FPGA的可編程性在芯片內部構造實現了一個計數器邏輯,那么在構造計數器邏輯過程中使用到的功能便可以被稱為“軟功能”,又稱之為軟內核。而如果某個功能若是直接利用芯片實現的,則是利用了芯片內部的“硬功能”,一般又稱之為硬內核。軟內核與硬內核之間優勢互補,軟內核的優勢在于可以在利用芯片資源的基礎上利用編程設計讓其完成需要實現的任何功能(注意是數字功能,不包括模擬功能)。而硬內核由于是實現固定功能的器件,因此其優勢在于資源利用率高且功耗較低,占用硅片的面積也較小,并具有較高的性能。而兩者最重要的區別在于:與軟內核相比硬內核可用于實現模擬功能,例如鎖相環的倍頻功能,這個功能需要在模擬電路下實現,所以這一部分是在FPGA內部用硬件來實現的。四、帶嵌入式處理器的FPGA
在上文中提到“軟內核”與“硬內核”的概念,而利用FPGA的可編程構造實現的事情之一即為使用其中的一部分數字邏輯資源制作一個或多個軟處理器內核,當然,也可以實現不同規模的處理器。舉例來說,可以創建一個或多個8位的處理器加上一個或多個16位或32位的軟處理器,而所有處理器都在同一器件中。
而如果FPGA供應商希望提供一個占用較少硅片面積、消耗較低功率但性能更高的處理器,解決方案是將其實現為硬內核。如果需要高速、高性能的處理器,并且需要實現邏輯編程時,傳統的方法是在電路板上放置處理器(如ARM、DSP等)和FPGA,ARM或者DSP工程師實現軟件部分,FPGA工程師實現可編程邏輯部分,兩者協同合作。現在最新的方案是使用ZYNQ一個芯片以更低的功耗、更高的速度實現以上功能。在2010年4月硅谷舉行的嵌入式系統大會上,賽靈思發布了可擴展處理平臺的架構詳情,這款基于無處不在的ARM處理器的SoC可滿足復雜嵌入式系統的高性能、低功耗和多核處理能力要求。賽靈思可擴展處理平臺芯片硬件的核心本質就是將通用基礎雙ARM Cortex-A9MP Core處理器系統作為“主系統”,結合低功耗28nm工藝技術,以實現高度的靈活性、強大的配置功能和高性能。由于該新型器件的可編程邏輯部分基于賽靈思28nm 7系列FPGA,因此該系列產品的名稱中添加了“7000”,以保持與7系列FPGA的一致性,同時也方便日后本系列新產品的命名。
考慮下面所示這個例子:
圖3 一種新的SoC FPGA
這個芯片完全以硬內核方式實現的雙路ARM Cortex-A9微控制器子系統(運行時鐘高達1GHz,包含浮點引擎,片上緩存,計數器,定時器等)以及種類廣泛的硬內核接口功能(SPI,I2C,CAN等),還有一個硬內核的動態內存控制器,所有這些組件都利用大量傳統的可編程構造和大量的通用輸入輸出(GPIO)引腳進行了性能增強。
如果是ZYNQ單芯片方案,是不是意味著只需要軟件工程師或者FPGA工程師獨立工作就可以了呢?筆者目前所了解的情況是:FPGA工程師負責搭建周邊電路,如ARM的接口、時鐘配置等,還負責可編程邏輯部分的開發。而軟件部分仍然還是軟件工程師負責。其主要原因在于FPGA邏輯開發和軟件開發都是專業性比較強的技能,非常少的工程師能同時掌握這兩個技能。當然,這里說的掌握性能,是專業性的、能應用到企業項目的技能,只是接觸一下的不算。
五、數據存儲以及配置方式
在FPGA內部存在著存儲單元片內RAM塊,數據是存放在RAM中并由其來設置工作狀態的,若想要FPGA進行工作,就需要對片內RAM進行編程。而如果外部有大量數據交互時,就要通過增加外設來對數據進行暫時性的存儲,如SDRAM存儲器或者DDR3存儲器,暫存在外設中的數據最終也是要通過FPGA內部的RAM進行存儲與處理。當在EDA工具上將程序設計完成之后,便需要將軟件上的程序燒錄進FPGA內部。通過不同的配置模式,FPGA便會有不同的編程方式。
以下為常用的幾種配置模式:1、并行模式:通過并行PROM、Flash配置FPGA;2、主從模式:使用一片PROM配置多片FPGA;3、串行模式:串行PROM配置FPGA;4、外設模式:將FPGA作為微處理器的外設,由微處理器對其編程。
目前,主流的FPGA都是基于SRAM工藝的,在大部分的FPGA開發板上,使用的都是串行配置模式。由于SRAM掉電就會丟失內部數據,因此往往都會外接一個能夠掉電保存數據的片外存儲器以保存程序。這樣一來,上電時FPGA便將外部存儲器中的數據讀入片內RAM以完成配置,對FPGA編程完成后便進入工作狀態;掉電后FPGA內部SRAM中存儲的數據丟失,邏輯清零。以這種方式配置FPGA不僅能反復使用,還無需重復的手動配置。完成一次主動配置之后每次上電便會自動的實現FPGA的內部編程。
更加詳細的介紹也可參考《FPGA至簡設計原理與應用》一書,并可提供配套的視頻教程和免費的答疑服務,答疑服務請加群:764574006。
六、為什么使用FPGA呢?
計算機應用是多種多樣的,最適合于應用的方法也會因應用而異,其中包括現成的微處理器(MPU)和微控制器(MCU)、現成的圖形處理單元(GPU)、FPGA和自定義片中系統(SOC)裝置。要決定使用哪種方法,需要根據具體的應用需求來綜合考慮。
舉例來說,在研究諸如5G基站這樣的尖端技術時,設計者需要考慮的是,基礎標準和協議還在不斷地發展。這就是說,設計者需要能夠迅速、有效地應對任何超出控制范圍的規范變更。
類似地,它們需要能夠靈活地對系統部署到現場之后發生的標準和協議變化作出反應。另外,他們還必須能夠應對系統功能中出現的意外錯誤或系統安全漏洞,通過修改已有功能或增加新功能來延長系統壽命。
雖然最好的性能通常由SoC提供,但是這種方法非常昂貴和耗費時間。此外,任何在芯片結構中實現的算法本質上都是“凍結在硅片中”。基于以上考慮,這種固有的不靈敏性便成為一個問題。要尋找性能和靈活性的最佳平衡,就需要另一種途徑。這一途徑通常由FPGA,微處理器/微控制器和FPGA的結合,或者以硬處理器內核為部分結構的FPGA提供。
FPGA適用于各種不同的應用,隨著技術的發展,現在FPGA普遍適用于實現智能接口功能、電機控制、算法加速和高性能計算(HPC)、圖像和視頻處理、機器視覺、人工智能、機器學習 (ML)、深度學習(DL)、雷達、激光波束、基站和通信等領域 。
七、哪些公司生產FPGA?
行業三巨頭:ALTREA(現已被INTEL收購)、XILINX(即將被AMD完成收購)、LATTICE。
有兩個主要的制造商生產高容量和高性能的器件,分別是。Intel(收購Altera)和Xilinx覆蓋了從低端FPGA到高端SoCFPGA, 在高容量和高性能的器件方面此兩家也提供了多種產品。而Lattice則是幾乎完全專注于面向中低端應用的FPGA供應商。其次,MicrochipTechnology(通過收購Actel,Atmel和Microsemi公司),現在可以提供多系列的中小型FPGA和低端SoCFPGA類產品。由于FPGA有很多的產品系列,每一個都提供了不同的資源,性能,容量 和封裝風格等,所以在項目開始器件選型階段的工作也是有一定難度的。
八、FPGA的設計流程
FPGA的設計流程就是利用EDA開發軟件和編程工具對FPGA芯片進行開發的過程。原理圖和HDL(Hardware descriptionlanguage,硬件描述語言)是兩種最常用的數字硬件電路描述方法。其中,運用HDL設計方法具有更好的移植性、通用性以及利于模塊劃分的特點,在工作學習中被廣泛使用。典型FPGA的開發流程一般如下圖所示,其包括功能定義/器件選型、設計輸入、功能仿真、綜合優化、綜合后仿真、實現、布線后仿真、板級仿真以及芯片編程與調試等主要步驟。
圖4 典型FPGA的開發流程
更多介紹詳見《FPGA至簡設計原理與應用》書籍及配套視頻。