5000字!FPGA開發必須知道的五件事 FPGA(Field Programmable Gate Array 現場可編程門陣列)是一種可以重構電路的芯片,是一種硬件可重構的體系結構。它是在PAL(可編程陣列邏輯)、GAL(通用陣列邏輯)等可編程器件的基礎上進一步發展的產物,是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。 鑒于其可編輯,更靈活;產品上市時間短,節省了ASIC流片周期;避免一次性工程費用,用量較小時具有成本優勢等特點,FPGA現已廣泛應用于原型驗證、通信、汽車電子、工業控制、航空航天、數據中心等領域。
一、FPGA的技術發展歷程 FPGA技術從發明到現在已經經歷了三十多年的發展歷程,其核心價值是可編程性和靈活性。隨著工藝技術、系統設計和應用創新的不斷進步,FPGA技術也在不斷創新和集成,實現了從邏輯器件到系統平臺的轉變。 根據智慧芽研發情報庫生成的技術路線圖可見,在近十多年間,隨著5G、人工智能、云計算等新技術的快速發展和廣泛應用,對于FPGA等可編程邏輯器件的需求也越來越大,代表性技術詳見下圖: 為了解決系統設計問題,FPGA越來越多地整合系統模塊:高速收發器、存儲器、DSP處理單元和完整處理器。同時還進一步集成了重要控制功能:比特流加密與驗證、混合信號處理、電源與溫度監控以及電源管理等。這些特性在Xilinx的Zynq系列和Intel的Arria系列中得到了充分體現。同時,器件也推動了工具的發展。系統FPGA需要高效的系統編程語言,現可利用OpenCL和C語言以類似軟件的流程來編程。FPGA正在越來越多地取代傳統上ASIC,在小批量、個性化的產品市場方面具有明顯優勢。
二、FPGA的基本架構 自Xilinx公司于1984年發明了世界首款基于SRAM可編程技術的FPGA至今,FPGA的基本架構已經確定,主要包括以下幾個部分: 可編程輸入輸出單元(IOB):IOB是FPGA與外部設備進行信號交互的接口,可以支持多種電氣標準和協議,如LVCMOS、LVDS、PCIe等。IOB可以配置為輸入、輸出或雙向模式,可以實現信號緩沖、鎖存、延遲等功能。 可配置邏輯塊(CLB):CLB是FPGA實現邏輯功能的基本單元,每個CLB由兩個SLICE組成,每個SLICE包含4個LUT(查找表)、8個寄存器、3個MUX(多路選擇器)和一個CARRY4(進位鏈)。LUT可以實現任意6輸入1輸出的布爾函數,也可以用作分布式RAM或移位寄存器。寄存器可以實現數據鎖存和同步功能。MUX可以將LUT擴展為7輸入或8輸入的選擇器。CARRY4可以實現高速的加法、減法、比較等算術運算。 嵌入式塊RAM(BRAM):BRAM是FPGA內部提供的大容量存儲資源,可以用作數據緩存、隊列、FIFO等應用。BRAM有18K和36K兩種規格,可以配置為不同的位寬和深度,支持單口或雙口模式,也可以級聯成更大的存儲空間。 布線資源:布線資源是FPGA內部連接各種資源的網絡,包括水平布線、垂直布線、長線、超長線等不同類型和長度的布線。布線資源通過開關矩陣(switch matrix)進行連接和分配,開關矩陣由可編程的開關組成,可以實現靈活的布線方案。 底層內嵌功能單元:底層內嵌功能單元是FPGA內部提供的一些特殊功能模塊,如數字時鐘管理(DCM)、相位鎖定環(PLL)、延遲鎖定環(DLL)、全局時鐘網絡(GCLK)、全局置位網絡(GRST)等。這些功能單元可以實現時鐘生成、分頻、相位調整、延遲補償、時鐘分配、復位分配等功能,提高了FPGA的性能和穩定性。 內嵌專用硬核:內嵌專用硬核是FPGA內部集成的一些專用功能模塊,如乘法器、除法器、DSP(數字信號處理器)、微處理器、PCIe控制器、以太網控制器等。這些硬核可以提供高效的計算和通信能力,降低了FPGA的邏輯資源消耗和功耗。
三、FPGA開發流程 FPGA的開發流程是利用EDA(Electronic Design Automation)開發軟件和編程工具對FPGA芯片進行開發的過程,主要步驟如下: 1)功能定義/器件選型:這個步驟主要進行方案驗證、系統設計和FPGA芯片選型等準備工作。根據任務要求,評估系統的指標和復雜度,對工作速度和芯片本身的資源、成本等方面進行權衡,選擇合理的設計方案和合適的器件類型。這個階段往往會花費大量的時間,這個階段之后一般已經完成了系統建模,功能劃分,模塊劃分以及設計文檔的撰寫等工作。 2)設計輸入:這個步驟是將劃分好的各功能模塊用硬件描述語言(HDL)表達出來,常用的硬件描述語言有Verilog HDL和VHDL。以后的教程中我們主要講解如何使用Verilog HDL進行FPGA設計。設計輸入方式有三種形式:IP核、原理圖、HDL。IP核是實現一定功能的模塊,可以形成一個項目。原理圖是一種最直接的描述方式,在可編程芯片發展的早期應用比較廣泛,它將所需的器件從元件庫中調出來,畫出原理圖。HDL是利用文本描述設計,可以分為普通HDL和行為HDL。普通HDL有ABEL、CUR等 ,支持邏輯方程、真值表和狀態機等表達方式, 主要用于簡單的小型設計 。而在中大型工程中,主要使用行為HDL,其主流語言是Verilog HDL和VHDL 。這兩種語言都是美國電氣與電子工程師協會 (IEEE)的標準,其共同的突出特點有:語言與芯片工藝無關,利于自頂向下設計,便于模塊的劃分與移植,可移植性好,具有很強的邏輯描述和仿真功能,而且輸入效率很高。 3)功能仿真:這個步驟是在編譯之前對用戶所設計的電路進行邏輯功能驗證,此時的仿真沒有延遲信息,僅對初步的功能進行檢測。仿真前,要先利用波形編輯器和HDL等建立波形文件和測試向量 (即將所關心的輸入信號組合成序列),仿真結果將會生成報告文件和輸出信號波形,從中便可以觀察各個節點信號的變化。如果發現錯誤,則返回設計修改邏輯設計。 4)邏輯綜合:這個步驟是將高級抽象層次的語言描述轉化成較低層次的電路結構。也就是說將硬件描述語言描述的電路邏輯轉化成與門、或門、非門、觸發器等基本邏輯單元的互連關系,也就是我們常說的門級網表。綜合是創造性的轉化過程,它不但能翻譯我們的電路,還能夠優化我們的電路,比如去除電路描述中冗余的電路結構,或者復用功能相同的電路結構。綜合的目標和要求可以通過約束文件來指定,比如時序約束、面積約束、功耗約束等。 5)前仿真:這個步驟也叫做綜合后仿真,仿真時,把綜合生成的標準延時文件反標注到綜合仿真模型中去。因為綜合后只能體現基本的邏輯門之間的互連關系,并不是實物電路,沒有連線長度信息,所以前仿真只能評估門延時帶來的影響,不能估計路徑延時,前仿真結果和布線后實際情況還有一定的差距,并不十分準確。目前的綜合工具較為成熟,一般的設計可以省略這一步。但如果布局布線后發現電路功能與設計意圖不符,就需要回溯到前仿真來確定問題所在。 6)實現與布局布線:這個步驟是將綜合生成的邏輯網表配置到具體的FPGA芯片上,布局布線是其中最重要的過程。布局將邏輯網表中的硬件原語和底層單元合理地配置到芯片內部的固有硬件結構上,并且往往需要在速度最優和面積最優之間作出選擇。布線根據布局的拓撲結構,利用芯片內部的各種連線資源,合理正確地連接各個元件。布局布線后就可以進行靜態時序分析了,靜態時序分析的方法是在布局布線后的實際電路中尋找寄存器和寄存器之間的最長路徑延遲,通過最大延遲可以得出系統最大時鐘速率。 7)后仿真:這個步驟也稱為時序仿真,是將布局布線的延時信息反標注到設計網表中來檢測有無時序違規現象(即不滿足時序約束條件或者器件固有的時序規則,如建立時間、保持時間等)。經過布局布線后,門與門之間的連線長度也確定了,所以后仿真包含的延遲信息最全,也最精確,能更好地反映芯片的實際工作情況。 8)板級仿真與驗證:這個步驟主要應用于高速電路設計中,對高速系統的信號完整性、電磁干擾等特征進行分析。板級仿真需要利用專業的軟件工具和儀器設備來進行。 9)芯片編程與調試:這個步驟是設計的最后一步,將EDA軟件產生的數據文件(位數據流文件)下載到FPGA芯片中,進行實際的測試。芯片編程需要滿足一定的條件,如編程電壓、編程時序和編程算法等方面。調試時,需要利用邏輯分析儀、示波器等儀器設備來觀察和分析芯片的工作狀態,檢查是否有功能錯誤或性能問題,如果有,就需要返回到前面的步驟進行修改和優化。
四、FPGA的設計方法和技巧 FPGA的設計方法有兩種:自上而下和自下而上。自上而下是指從整體功能出發,逐步細化到各個模塊,再實現每個模塊的細節。這種方法有利于保持設計的一致性和完整性,但可能導致資源浪費和性能降低。自下而上是指從最基本的模塊開始,逐步組合成復雜的功能,再整合到整體設計中。這種方法有利于優化資源和性能,但可能導致設計的復雜度和難度增加。無論采用哪種方法,都需要注意以下幾個技巧: 1)遵循良好的編碼規范:編碼規范是指一套約定俗成的編寫HDL代碼的規則和習慣,它可以提高代碼的可讀性、可維護性和可重用性,也可以避免一些常見的錯誤和問題。一些常用的編碼規范有:使用有意義的變量名、注釋和空格;使用一致的縮進和對齊方式;使用明確的賦值語句和運算符優先級;使用合理的信號類型和范圍;使用同步復位和時鐘邊沿觸發等。 2)使用層次化和模塊化的結構:層次化和模塊化是指將一個復雜的設計分解為若干個相對簡單的子模塊,然后將這些子模塊按照一定的邏輯關系連接起來,形成一個完整的設計。這樣做可以提高設計的清晰度和可管理性,也可以方便地進行測試、修改和重用。一些常用的層次化和模塊化的方法有:使用頂層模塊、中間層模塊和底層模塊;使用總線、接口和協議;使用庫、包和組件等。 3)利用參數化和生成語句:參數化和生成語句是指使用一些特殊的語法或關鍵字來定義一些可變的參數或條件,然后根據這些參數或條件來生成不同的代碼或結構。這樣做可以提高代碼的靈活性和通用性,也可以減少代碼的冗余和重復。一些常用的參數化和生成語句有:使用generic、parameter、define等定義參數;使用for loop、generate、case等生成結構等。 4)避免時序冒險和組合邏輯回路:時序冒險是指由于信號在不同路徑上傳輸延遲不同,導致輸出信號在一個時鐘周期內發生多次跳變或錯誤變化的現象。組合邏輯回路是指由于信號在多個組合邏輯門之間形成環路,導致輸出信號依賴于自身狀態而不穩定或振蕩的現象。這些現象都會影響FPGA的正確性和穩定性,甚至導致硬件損壞或故障。一些常用的避免時序冒險和組合邏輯回路的方法有:使用同步設計原則;使用觸發器、鎖存器、寄存器等存儲元件;使用延遲器、濾波器、去抖動器等處理元件;使用狀態機、計數器、定時器等控制元件等。 5)使用有效的調試手段:調試是指在設計過程中檢查和修正錯誤或問題的過程,它是保證FPGA正確工作的重要環節。調試可以分為軟件調試和硬件調試兩種。軟件調試是指在仿真環境中使用一些工具或方法來觀察和分析FPGA的運行情況,找出潛在的錯誤或問題。硬件調試是指在實際的硬件設備上使用一些工具或方法來觀察和分析FPGA的運行情況,找出實際的錯誤或問題。一些常用的調試手段有:使用斷點、單步執行、變量監視、波形顯示等軟件工具;使用示波器、邏輯分析儀、信號發生器等硬件工具;使用測試平臺、測試向量、測試套件等測試方法等。
五、FPGA技術研發趨勢 如今,FPGA技術依然在不斷演進,主要從以下四個維度在不斷突破研發瓶頸。首先,制程技術的進步:制程技術是影響FPGA性能、功耗、成本和可靠性的重要因素。隨著制程技術的不斷發展,FPGA可以采用更小的晶體管尺寸,從而提高集成度、降低功耗、縮小芯片面積、提高運行速度和信號完整性。目前,主流的FPGA廠商如賽靈思(Xilinx)和英特爾(Intel)已經推出了基于7nm和10nm工藝的FPGA產品,未來還有望進入5nm甚至3nm工藝。 第二,系統級集成的需求:隨著應用領域的不斷拓展,FPGA需要與其他類型的芯片進行系統級集成,以提供更強大和更靈活的功能。例如,在人工智能、云計算、邊緣計算等領域,FPGA需要與CPU、GPU、DSP、ASIC等芯片進行協同計算,以提高性能和效率。為了實現系統級集成,FPGA需要采用更先進的封裝技術,如2.5D或3D堆疊技術,以實現高密度、高帶寬和低延遲的互連。 第三,平臺化和可編程性的提升:為了滿足不同應用場景和用戶需求,FPGA需要提供更高層次的抽象和可編程性,以降低開發門檻和時間。例如,賽靈思推出了ACAP(Adaptive Compute Acceleration Platform)平臺,它是一種新型的FPGA架構,可以通過軟件工具和庫來配置和優化不同類型的計算引擎,如邏輯、存儲、DSP、AI等。ACAP平臺可以實現更快速、更靈活、更智能的計算加速。 第四,新興應用領域的驅動:隨著科技的進步和社會的發展,FPGA面臨著新興應用領域的挑戰和機遇。例如,在5G通信、物聯網、自動駕駛、醫療設備等領域,FPGA需要提供更高的帶寬、更低的延遲、更強的安全性和更好的適應性。為了適應這些應用領域,FPGA需要不斷創新和優化其架構、功能和接口。
身為FPGA開發大軍的一員,希望本文給你帶來了或多或少的幫助。FPGA作為一種靈活、高效的數字電路解決方案,在各個領域發揮著越來越重要的作用。未來,我們可以期待更多更先進的FPGA應用出現,為我們的生活帶來更多的改變和便利。
|