FPGA的用處比我們平時想象的用處更廣泛,原因在于其中集成的模塊種類更多,而不僅僅是原來的簡單邏輯單元(LE)。
現(xiàn)在的FPGA不僅包含以前的LE,RAM也更大更快更靈活,管教IOB也更加的復雜,支持的IO類型也更多,而且內(nèi)部還集成了一些特殊功能單元,包括以下部分:
DSP:實際上就是乘加器,F(xiàn)PGA內(nèi)部可以集成多個乘加器,而一般的DSP芯片往往每個core只有一個。換言之,F(xiàn)PGA可以更容易實現(xiàn)多個DSP core功能。在某些需要大量乘加計算的場合,往往多個乘加器并行工作的速度可以遠遠超過一個高速乘加器。
SERDES:高速串行接口。將來PCI-E、XAUI、HT、S-ATA等高速串行接口會越來越多。有了SERDES模塊,F(xiàn)PGA可以很容易將這些高速串行接口集成進來,無需再購買專門的接口芯片。
CPU core:分為2種,軟core和硬core.軟core是用邏輯代碼寫的CPU模塊,可以在任何資源足夠的FPGA中實現(xiàn),使用非常靈活。而且在大容量的FPGA中還可以集成多個軟core,實現(xiàn)多核并行處理。硬core是在特定的FPGA內(nèi)部做好的CPU core,優(yōu)點是速度快、性能好,缺點是不夠靈活。
不過,F(xiàn)PGA還是有缺點。對于某些高主頻的應用,F(xiàn)PGA就無能為力了。現(xiàn)在雖然理論上FPGA可以支持的500MHz,但在實際設計中,往往200MHz以上工作頻率就很難實現(xiàn)了。好了,下面步入正題:FPGA的設計要點。
2
FPGA發(fā)展史
FPGA的發(fā)展歷史如下圖所示。相對于PROM、PAL/GAL、CPLD而言,F(xiàn)PGA規(guī)模更大性能更高。

圖1 FPGA發(fā)展史
FPGA芯片主流生產(chǎn)廠家包括Xilinx、Altera、Lattice、Microsemi,其中前兩家的市場份額合計達到88%。目前FPGA主流廠商全部為美國廠商。國產(chǎn)FPGA由于研發(fā)起步較美國晚至少20年,目前還處于成長期,僅限于低端,在通信市場還沒有成熟應用。
2015年12月,Intel公司斥資167億美元收購了Altera公司。Altera被收購后不久即制定了英特爾處理器與FPGA集成的產(chǎn)品路線圖。這兩種產(chǎn)品集成的好處是可以提供創(chuàng)新的異構(gòu)多核架構(gòu),適應例如人工智能等新市場的需求,同時能大幅縮減功耗。

圖2 FPGA在電信領域的應用歷史
FPGA在航天、軍工、電信領域有非常成熟和廣泛的應用。以電信領域為例,在電信設備一體機階段,F(xiàn)PGA由于其編程的靈活性以及高性能被應用網(wǎng)絡協(xié)議解析以及接口轉(zhuǎn)換。
在NFV(NetworkFunction Virtualization階段,F(xiàn)PGA基于通用服務器和Hypervisor實現(xiàn)網(wǎng)元數(shù)據(jù)面5倍的性能提升,同時能夠被通用Openstack框架管理編排。
在云時代,F(xiàn)PGA已經(jīng)被作為基本IaaS資源在公有云提供開發(fā)服務和加速服務,AWS、華為、BAT均有類似通用服務提供。
截至目前,Intel的Stratix 10器件已被成功應用于微軟實時人工智能云平臺Brainwave項目。
3
FPGA整體結(jié)構(gòu)
FPGA架構(gòu)主要包括可配置邏輯塊CLB(Configurable Logic Block)、輸入輸出塊IOB(Input Output Block)、內(nèi)部連線(Interconnect)和其它內(nèi)嵌單元四個部分。
CLB是FPGA的基本邏輯單元。實際數(shù)量和特性會依器件的不同而改變,但是每個CLB都包含一個由4或6個輸入、若干選擇電路(多路復用器等)和觸發(fā)器組成的可配置開關(guān)矩陣。開關(guān)矩陣具有高度的靈活性,經(jīng)配置可以處理組合型邏輯、移位寄存器或 RAM。
FPGA可支持許多種I/O標準,因而可以為系統(tǒng)設計提供理想的接口橋接。FPGA 內(nèi)的I/O按bank分組,每個bank能獨立支持不同的I/O標準。目前最先進的FPGA提供了十多個I/O bank,能夠提供靈活的I/O支持。
CLB 提供了邏輯性能,靈活的互連布線則負責在CLB和I/O之間傳遞信號。布線有幾種類型,從設計用于專門實現(xiàn) CLB 互連(短線資源)、到器件內(nèi)的高速水平和垂直長線(長線資源)、再到時鐘與其它全局信號的全局低skew布線(全局性專用布線資源)。一般,各廠家設計軟件會將互連布線任務隱藏起來,用戶根本看不到,從而大幅降低了設計復雜性。
內(nèi)嵌硬核單元包括RAM、DSP、DCM(數(shù)字時鐘管理模塊)及其它特定接口硬核等,F(xiàn)PGA器件內(nèi)部結(jié)構(gòu)如下示意圖。

圖3 FPGA器件內(nèi)部結(jié)構(gòu)圖
一般來說,器件型號數(shù)字越大,表示器件能提供的邏輯資源規(guī)模越大。在FPGA器件選型時,用戶需要對照此表格,根據(jù)業(yè)務對邏輯資源(CLB)、內(nèi)部BlockRAM、接口(高速Serdes對數(shù))、數(shù)字信號處理(DSP硬核數(shù))以及今后擴展等多方面的需求,綜合考慮項目最合適的邏輯器件。
4
FPGA開發(fā)流程
FPGA的設計流程就是利用EDA開發(fā)軟件和編程工具對FPGA芯片進行開發(fā)的過程。FPGA的開發(fā)流程一般如下圖所示,包括功能定義/器件選型、設計輸入、功能仿真、邏輯綜合、布局布線與實現(xiàn)、編程調(diào)試等主要步驟。
1、功能定義/器件選型:在FPGA設計項目開始之前,必須有系統(tǒng)功能的定義和模塊的劃分,另外就是要根據(jù)任務要求,如系統(tǒng)的功能和復雜度,對工作速度和器件本身的資源、成本、以及連線的可布性等方面進行權(quán)衡,選擇合適的設計方案和合適的器件類型。
2、 設計輸入:設計輸入指使用硬件描述語言將所設計的系統(tǒng)或電路用代碼表述出來。最常用的硬件描述語言是Verilog HDL。
3、 功能仿真:功能仿真指在邏輯綜合之前對用戶所設計的電路進行邏輯功能驗證。仿真前,需要搭建好測試平臺并準備好測試激勵,仿真結(jié)果將會生成報告文件和輸出信號波形,從中便可以觀察各個節(jié)點信號的變化。如果發(fā)現(xiàn)錯誤,則返回設計修改邏輯設計。常用仿真工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS等軟件。
4、 邏輯綜合:所謂綜合就是將較高級抽象層次的描述轉(zhuǎn)化成較低層次的描述。綜合優(yōu)化根據(jù)目標與要求優(yōu)化所生成的邏輯連接,使層次設計平面化,供FPGA布局布線軟件進行實現(xiàn)。就目前的層次來看,綜合優(yōu)化是指將設計輸入編譯成由與門、或門、非門、RAM、觸發(fā)器等基本邏輯單元組成的邏輯連接網(wǎng)表,而并非真實的門級電路。
真實具體的門級電路需要利用FPGA制造商的布局布線功能,根據(jù)綜合后生成的標準門級結(jié)構(gòu)網(wǎng)表來產(chǎn)生。為了能轉(zhuǎn)換成標準的門級結(jié)構(gòu)網(wǎng)表,HDL程序的編寫必須符合特定綜合器所要求的風格。常用的綜合工具有Synplicity公司的Synplify/Synplify Pro軟件以及各個FPGA廠家自己推出的綜合開發(fā)工具。
5、布局布線與實現(xiàn):布局布線可理解為利用實現(xiàn)工具把邏輯映射到目標器件結(jié)構(gòu)的資源中,決定邏輯的最佳布局,選擇邏輯與輸入輸出功能鏈接的布線通道進行連線,并產(chǎn)生相應文件(如配置文件與相關(guān)報告);實現(xiàn)是將綜合生成的邏輯網(wǎng)表配置到具體的FPGA芯片上。由于只有FPGA芯片生產(chǎn)商對芯片結(jié)構(gòu)最為了解,所以布局布線必須選擇芯片開發(fā)商提供的工具。
6、編程調(diào)試:設計的最后一步就是編程調(diào)試。芯片編程是指產(chǎn)生使用的數(shù)據(jù)文件(位數(shù)據(jù)流文件,Bitstream Generaon),將編程數(shù)據(jù)加載到FPGA芯片中;之后便可進行上板測試。最后將FPGA文件(如.bit文件)從電腦下載到單板上的FPGA芯片中。
1. 面積與速度的平衡與互換
這里的面積指一個設計消耗FPGA/CPLD的邏輯資源的數(shù)量,對于FPGA可以用消耗的FF(觸發(fā)器)和LUT(查找表)來衡量,更一般的衡量方式可以用設計所占的等價邏輯門數(shù)。
面積和速度這兩個指標貫穿FPGA/CPLD設計的時鐘,是設計質(zhì)量的評價的終極標準 —— 面積和速度是一對對立統(tǒng)一的矛盾體。
要求一個同時具備設計面積最小、運行頻率最高是不現(xiàn)實的。更科學的設計目標應該是在滿足設計時序要求(包括對設計頻率的要求)的前提下,占用最小的芯片面積?;蛘咴谒?guī)定的面積下,是設計的時序余量更大、頻率跑的更高。這兩種目標充分體現(xiàn)了面積和速度的平衡的思想。
作為矛盾的兩個組成部分,面積和速度的地位是不一樣的。相比之下,滿足時序、工作頻率的要求更重要一些,當兩者沖突時,采用速度優(yōu)先的準則。
從理論上講,如果一個設計時序余量較大,所能跑的速度遠遠高于設計要求,那么就通過功能模塊的復用來減少整個設計消耗的芯片面積,這就是用速度的優(yōu)勢換取面積的節(jié)約。反之,如果一個設計的時序要求很高,普通方法達不到設計頻率,那么一般可以通過將數(shù)據(jù)流串并轉(zhuǎn)換,并行復制多個操作模塊,對整個設計采取乒乓操作和串并轉(zhuǎn)換的思想運行。
2. 硬件原則
硬件原則主要針對HDL代碼編寫而言:Verilog是采用了C語言形式的硬件的抽象,它的本質(zhì)作用在于描述硬件,它的最終實現(xiàn)結(jié)果是芯片內(nèi)部的實際電路。所以評判一段HDL代碼的優(yōu)劣的最終標準是:其描述并實現(xiàn)的硬件電路的性能,包括面積和速度兩個方面。
評價一個設計的代碼水平較高,僅僅是說這個設計是由硬件想HDL代碼這種表現(xiàn)形式的轉(zhuǎn)換更加流暢、合理。而一個設計最終性能,在更大程度上取決于設計工程師所構(gòu)想的硬件實現(xiàn)方案的效率以及合理性。(HDL代碼僅僅是硬件設計的表達形式之一)
初學者片面追求代碼的整潔、簡短,是錯誤的,是與HDL的標準背道而馳的。正確的編碼方法,首先要做到對所需實現(xiàn)的硬件電路胸有成竹,對該部分的硬件的結(jié)構(gòu)和連接十分清晰,然后再用適當?shù)腍DL語句表達出來即可。
另外,Verilog作為一種HDL語言,是分層次的。系統(tǒng)級--算法級--寄存器傳輸級--邏輯級--門級--開關(guān)級。構(gòu)建優(yōu)先級樹會消耗大量的組合邏輯,所以如果能夠使用case的地方,盡量使用case代替if.....else......
3. 系統(tǒng)原則
系統(tǒng)原則包含兩個層次的含義:更高層面上看,是一個硬件系統(tǒng),一塊單板如何進行模塊花費和任務分配,什么樣的算法和功能適合放在FPGA里面實現(xiàn),什么樣的算法和功能適合放在DSP/CPU里面實現(xiàn),以及FPGA的規(guī)模估算數(shù)據(jù)接口設計等。具體到FPGA設計就要對設計的全局有個宏觀上的合理安排,比如時鐘域、模塊復用、約束、面積、速度等問題,在系統(tǒng)上模塊的優(yōu)化最為重要。
一般來說實時性要求高,頻率快的功能模塊適合FPGA實現(xiàn)。而FPGA和CPLD相比,更適合實現(xiàn)規(guī)模較大、頻率較高、寄存器較多的設計。使用FPGA/CPLD設計時,應該對芯片內(nèi)部的各種底層硬件資源,和可用的設計資源有一個較深刻的認識。
比如FPGA一般觸發(fā)器資源豐富,CPLD的組合邏輯資源更加豐富。FPGA/CPLD一般是由底層可編程硬件單元、BRAM、布線資源、可配置IO單元、時鐘資源等構(gòu)成。
底層可編程硬件單元一般由觸發(fā)器和查找表組成。Xilinx的底層可編程硬件資源較SLICE,由兩個FF和2個LUT構(gòu)成。Altera的底層硬件資源叫LE,由1個FF和1個LUT構(gòu)成。使用片內(nèi)RAN可以實現(xiàn)單口RAM、雙口RAM、同步/異步FIFO、ROM、CAM等常用單元模塊。
一般的FPGA系統(tǒng)規(guī)劃的簡化流程
4. 同步設計原則
異步電路的邏輯核心是用組合邏輯電路實現(xiàn),比如異步的FIFO/RAM讀寫信號,地址譯碼等電路。電路的主要信號、輸出信號等并不依賴于任何一個時鐘性信號,不是由時鐘信號驅(qū)動FF產(chǎn)生的。異步時序電路的最大缺點是容易產(chǎn)生毛刺,在布局布線后仿真和用邏輯分析儀觀測實際信號時,這種毛刺尤其明顯。
同步時序電路的核心邏輯用各種各樣的觸發(fā)器實現(xiàn),電路的主要信號、輸出信號都是由某個時鐘沿驅(qū)動觸發(fā)器產(chǎn)生出來的。同步時序電路可以很好的避免毛刺,布局布線后仿真,和用邏輯分析儀采樣實際工作信號都沒有毛刺。
是否時序電路一定比異步電路使用更多的資源呢?從單純的ASCI設計來看,大約需要7個門來實現(xiàn)一個D觸發(fā)器,而一個門即可實現(xiàn)一個2輸入與非門,所以一般來說,同步時序電路比異步電路占用更大的面積。(FPGA/CPLD中不同,主要是因為單元塊的計算方式)
如何實現(xiàn)同步時序電路的延時?異步電路產(chǎn)生延時的一般方法是插入一個Buffer、兩級與非門等,這種延時調(diào)整手段是不適用同步時序設計思想的。首先要明確一點HDL語法中的延時控制語法,是行為級的代碼描述,常用于仿真測試激勵,但是在電路綜合是會被忽略,并不能啟動延時作用。
5. 乒乓操作
“ 乒乓操作 ” 是一個常常應用于數(shù)據(jù)流控制的處理技巧,乒乓操作的處理流程為:輸入數(shù)據(jù)流通過 “ 輸入數(shù)據(jù)選擇單元 ” 將數(shù)據(jù)流等時分配到兩個數(shù)據(jù)緩沖區(qū),數(shù)據(jù)緩沖模塊可以為任何存儲模塊,比較常用的存儲單元為雙口 RAM(DPRAM) 、單口 RAM(SPRAM) 、 FIFO 等。
在第一個緩沖周期,將輸入的數(shù)據(jù)流緩存到 “ 數(shù)據(jù)緩沖模塊 1” ;在第 2 個緩沖周期,通過 “ 輸入數(shù)據(jù)選擇單元 ” 的切換,將輸入的數(shù)據(jù)流緩存到 “ 數(shù)據(jù)緩沖模塊 2” ,同時將 “ 數(shù)據(jù)緩沖模塊 1” 緩存的第 1 個周期數(shù)據(jù)通過 “ 輸入數(shù)據(jù)選擇單元 ” 的選擇,送到 “ 數(shù)據(jù)流運算處理模塊 ” 進行運算處理;在第 3 個緩沖周期通過 “ 輸入數(shù)據(jù)選擇單元 ” 的再次切換,將輸入的數(shù)據(jù)流緩存到 “ 數(shù)據(jù)緩沖模塊 1” ,同時將 “ 數(shù)據(jù)緩沖模塊 2” 緩存的第 2 個周期的數(shù)據(jù)通過 “ 輸入數(shù)據(jù)選擇單元 ” 切換,送到 “ 數(shù)據(jù)流運算處理模塊 ” 進行運算處理。如此循環(huán)。
6. 串并轉(zhuǎn)換設計技巧
串并轉(zhuǎn)換是 FPGA 設計的一個重要技巧,它是數(shù)據(jù)流處理的常用手段,也是面積與速度互換思想的直接體現(xiàn)。串并轉(zhuǎn)換的實現(xiàn)方法多種多樣,根據(jù)數(shù)據(jù)的排序和數(shù)量的要求,可以選用寄存器、 RAM 等實現(xiàn)。
前面在乒乓操作的圖例中,就是通過 DPRAM 實現(xiàn)了數(shù)據(jù)流的串并轉(zhuǎn)換,而且由于使用了 DPRAM ,數(shù)據(jù)的緩沖區(qū)可以開得很大,對于數(shù)量比較小的設計可以采用寄存器完成串并轉(zhuǎn)換。如無特殊需求,應該用同步時序設計完成串并之間的轉(zhuǎn)換。比如數(shù)據(jù)從串行到并行,數(shù)據(jù)排列順序是高位在前,可以用下面的編碼實現(xiàn):prl_temp<={prl_temp,srl_in}。
其中, prl_temp 是并行輸出緩存寄存器, srl_in 是串行數(shù)據(jù)輸入。對于排列順序有規(guī)定的串并轉(zhuǎn)換,可以用 case 語句判斷實現(xiàn)。對于復雜的串并轉(zhuǎn)換,還可以用狀態(tài)機實現(xiàn)。串并轉(zhuǎn)換的方法比較簡單,在此不必贅述。
7. 流水線操作設計思想
首先需要聲明的是,這里所講述的流水線是指一種處理流程和順序操作的設計思想,并非 FPGA 、 ASIC 設計中優(yōu)化時序所用的 “Pipelining” 。
流水線處理是高速設計中的一個常用設計手段。如果某個設計的處理流程分為若干步驟,而且整個數(shù)據(jù)處理是 “ 單流向 ” 的,即沒有反饋或者迭代運算,前一個步驟的輸出是下一個步驟的輸入,則可以考慮采用流水線設計方法來提高系統(tǒng)的工作頻率。
8.流水線設計的結(jié)構(gòu)
流水線設計的結(jié)構(gòu)示意圖如圖所示。其基本結(jié)構(gòu)為:將適當劃分的 n 個操作步驟單流向串聯(lián)起來。流水線操作的最大特點和要求是,數(shù)據(jù)流在各個步驟的處理從時間上看是連續(xù)的,如果將每個操作步驟簡化假設為通過一個 D 觸發(fā)器 ( 就是用寄存器打一個節(jié)拍 ) ,那么流水線操作就類似一個移位寄存器組,數(shù)據(jù)流依次流經(jīng) D 觸發(fā)器,完成每個步驟的操作。
數(shù)據(jù)接口的同步方法數(shù)據(jù)接口的同步是 FPGA/CPLD 設計的一個常見問題,也是一個重點和難點,很多設計不穩(wěn)定都是源于數(shù)據(jù)接口的同步有問題。在電路圖設計階段,一些工程師手工加入 BUFT 或者非門調(diào)整數(shù)據(jù)延遲,從而保證本級模塊的時鐘對上級模塊數(shù)據(jù)的建立、保持時間要求。
還有一些工程師為了有穩(wěn)定的采樣,生成了很多相差 90 度的時鐘信號,時而用正沿打一下數(shù)據(jù),時而用負沿打一下數(shù)據(jù),用以調(diào)整數(shù)據(jù)的采樣位置。這兩種做法都十分不可取,因為一旦芯片更新?lián)Q代或者移植到其它芯片 組的芯片上,采樣實現(xiàn)必須重新設計。而且,這兩種做法造成電路實現(xiàn)的余量不夠,一旦外界條件變換 ( 比如溫度升高 ) ,采樣時序就有可能完全紊亂,造成電路癱瘓。
設計數(shù)據(jù)接口同步是否需要添加約束?建議最好添加適當?shù)募s束,特別是對于高速設計,一定要對周期、建立、保持時間等添加相應的約束。這里附加約束的作用有兩點:提高設計的工作頻率,滿足接口數(shù)據(jù)同步要求;獲得正確的時序分析報告。