我們知道FPGA內部有很多可供使用者任意配置的資源,其中包括:可程式設計邏輯、可程式設計I/O、互連線、IP核等資源,很多學過數位電路的人都知道與或非門可以構成幾乎所有的數位電路,但是FPGA內部最基本的主要單元並不是這些與或非門,而是由無數個查詢表(Look Up Tabe,簡稱為LUT)和暫存器構成。
雖然FPGA的內部結構對於初學者來說是雲裡霧裡,一頭霧水,但是瞭解FPGA的內部結構能讓我們更好的理解FPGA設計過程中我們所編寫的程式碼和硬體是怎樣的一個對映關係,從而更深刻理解FPGA和微控制器、ARM的不同。當我們對FPGA內部結構瞭解透徹後,就可以把FPGA的設計瞭如指掌,才能有助於進一步優化我們的設計,優化好的設計能使我們設計的整個系統跑的更快、更加節省資源、功耗更低,穩定性更好。
我們選用的是CycloneIV系列的EP4CE10F17C8,很多入門開發板一般都配置的這款晶片,其主要資源如下圖所示。
首先我們來認識一下FPGA內部的一些資源。點選下圖所示圖示開啟Chip Planner來檢視這款FPGA晶片的版圖模型。
開啟後的版圖模型如下圖所示,第一張圖是未進行佈局不線的圖,因為資源未被使用所以都是淺色。第二張圖是已經佈局佈線後的圖,也就是已經將使用的資源對映到了版圖模型上(只有全編譯後才能看到對映效果),其中深色表示該資源已經被使用,而顏色越深的地方表示資源利用率越高。黑色區域為一些固定功能的資源或沒有資源,使用者不可對其進行任意配置。
①邏輯陣列塊(Logic Array Block,也簡稱為LAB):每個LAB由16個LE(Logic Element)組成,下圖是兩個已經對映資源後的LAB,資源利用率不同的LAB其顏色深淺也有所差異(左邊使用的資源少,顏色就淺;右邊使用的資源多,顏色就深)。
放大後的LE如下圖所示,每個LE由左邊一個藍色LUT和右邊一個紅色暫存器組成。整個晶片中共有10320個LE。
雙擊其中一個LE可以觀察到其大致的內部結構(內部結構只有被使用才能夠雙擊開啟檢視),我們可以看到主要的兩個部分,一是左邊的4輸入LUT,另一個是可程式設計暫存器,還包括一些選擇器、與門等輔助邏輯電路。(藍色高亮的部分是已經使用的資源,未高亮灰色的部分是未被使用的資源)。
②使用者可程式設計I/O(User I/Os,也被稱為IOE):可程式設計I/O資源分佈在整個晶片的四周。該晶片共有256個管腳,除去一些固定功能的管腳,可供使用者任意配置的管腳資源只有180個,下圖是其中一個可程式設計I/O單元,裡面又包含三個最小單元(每個可程式設計I/O單元中的最小單元個數不固定,有的包含兩個,也有的包含四個)。
下圖是可程式設計I/O最小單元內部結構圖,包括雙向I/O緩衝器、OE暫存器、對齊暫存器、同步暫存器、DDR輸出暫存器、三態門、延時模組等組成。
③嵌入式儲存單元(Memory Bits,也被稱為Block RAM或簡稱為BRAM):該部分資源主要用於生成RAM、ROM、FIFO、移位暫存器,在儲存較多資料或作跨時鐘域處理時常用到。該晶片共有423936bit儲存單元,並以每9Kbit容量為一個塊,共有46個,下圖所示為一個M9K的RAM塊。相對於LUT構成的分散式RAM(Distribute RAM,簡稱為DRAM),這種專門的儲存單元容量更大,從而避免LUT資源的浪費。
下圖是一個M9K內部結構圖。由輸入輸出暫存器和一個RAM塊構成。
④嵌入式乘法單元(Embedded multiPlier 9-bit elements,也稱為DSP塊):該單元主要用於各種複雜的數學運算,乘法、除法以及常用的功能函式如:有限衝激響應濾波器(FIR),無限衝擊響應濾波器(IIR),快速傅立葉變換(FFT),離散餘弦變換(DCT)等時會消耗很多邏輯資源,而FPGA中的LUT和暫存器資源有限,這時候使用嵌入式乘法單元這部分資源就不會造成邏輯資源的浪費。該晶片共有46個DSP塊,成列式分佈在晶片的中間位置,下圖為一對DSP塊資源。
下圖是嵌入式乘法器單元DSP塊的內部結構圖。包含輸入輸出暫存器和一個乘數塊。
⑤鎖相環(Phase Lock Loop,也簡稱為PLL):該晶片一共有兩個鎖相環,一個在右上角處附近,一個在左下角附近。PLL的參考時鐘輸入都是由專用時鐘管腳上的晶振進來的,用於時鐘的倍頻、分頻,以及相位、佔空比調製。PLL出來的時鐘都會連線到全域性時鐘網路上,以保證時鐘的質量,減小時鐘偏斜(Skew)和抖動(Jitter)。
下圖是鎖相環內部的結構圖,每個鎖相環可以分出五個同源時鐘訊號。