FPGA由6部分組成,分别為可程式設計輸入/輸出單元、基本可程式設計邏輯單元、嵌入式塊RAM、豐富的布線資源、底層嵌入功能單元和内嵌專用硬核等。
每個單元簡介如下:
1.可程式設計輸入/輸出單元(I/O單元)
目前大多數FPGA的I/O單元被設計為可程式設計模式,即通過軟體的靈活配置,可适應不同的電器标準與I/O實體特性;可以調整比對阻抗特性,上下拉電阻;可以調整輸出驅動電流的大小等。
2.基本可程式設計邏輯單元
FPGA的基本可程式設計邏輯單元是由查找表(LUT)和寄存器(Register)組成的,查找表完成純組合邏輯功能。FPGA内部寄存器可配置為帶同步/異步複位和置位、時鐘使能的觸發器,也可以配置成為鎖存器。FPGA一般依賴寄存器完成同步時序邏輯設計。一般來說,比較經典的基本可程式設計單元的配置是一個寄存器加一個查找表,但不同廠商的寄存器和查找表的内部結構有一定的差異,而且寄存器和查找表的組合模式也不同。
學習底層配置單元的LUT和Register比率的一個重要意義在于器件選型和規模估算。由于FPGA内部除了基本可程式設計邏輯單元外,還有嵌入式的RAM、PLL或者是DLL,專用的Hard IP Core等,這些子產品也能等效出一定規模的系統門,是以簡單科學的方法是用器件的Register或LUT的數量衡量。
3.嵌入式塊RAM
目前大多數FPGA都有内嵌的塊RAM。嵌入式塊RAM可以配置為單端口RAM、雙端口RAM、僞雙端口RAM、CAM、FIFO等存儲結構。
CAM,即為内容位址存儲器。寫入CAM的資料會和其内部存儲的每一個資料進行比較,并傳回與端口資料相同的所有内部資料的位址。簡單的說,RAM是一種寫位址,讀資料的存儲單元;CAM與RAM恰恰相反。
除了塊RAM,Xilinx和Lattice的FPGA還可以靈活地将LUT配置成RAM、ROM、FIFO等存儲結構。
4.豐富的布線資源
布線資源連通FPGA内部所有單元,連線的長度和工藝決定着信号在連線上的驅動能力和傳輸速度。布線資源的劃分:
1)全局性的專用布線資源:以完成器件内部的全局時鐘和全局複位/置位的布線;
2)長線資源:用以完成器件Bank間的一些高速信号和一些第二全局時鐘信号的布線(這裡不懂什麼是“第二全局時鐘信号”);
3)短線資源:用來完成基本邏輯單元間的邏輯互連與布線;
4)其他:在邏輯單元内部還有着各種布線資源和專用時鐘、複位等控制信号線。
由于在設計過程中,往往由布局布線器自動根據輸入的邏輯網表的拓撲結構和限制條件選擇可用的布線資源連通所用的底層單元子產品,是以常常忽略布線資源。其實布線資源的優化與使用和實作結果有直接關系。
5.底層嵌入功能單元(書上舉了很多例子,不過這些東東要看具體哪個廠商的哪種型号的晶片上嵌有什麼資源決定)
6.内嵌專用硬核
與“底層嵌入單元”是有差別的,這裡指的硬核主要是那些通用性相對較弱,不是所有FPGA器件都包含硬核。
1、總體結構
FPGA内部最主要的、最需要關注的部件是CLB(Configurable Logic Block,可配置邏輯塊)、Input/Output Block(輸入/輸出塊)和BlockRAM(塊RAM)。
CLB是FPGA具有可程式設計能力的主要承擔者。通過配置這些CLB可以讓FPGA實作各種不同的邏輯功能。Input/Output Block分布在FPGA的周邊,也具有可程式設計特性,可以配置支援各種不同的接口标準,如LVTTL、LVCMOS、PCI和LVDS等。BlockRAM是成塊的RAM,可以在設計中用于存儲資料,是設計的重要資源。在大規模設計選擇FPGA時,RAM資源是否夠用是重要的考慮因素。
除了CLB、Input/Output Block和BlockRAM以外,FPGA還有很多其他的功能單元,例如布線資源、DCM(Digital Clock Manager,數字時鐘管理器)和Multiplier(乘法器)等。布線資源在FPGA内部占用矽片面積很大,為FPGA部件提供靈活可配的連接配接;DCM子產品提供各種時鐘資源,包括多種分頻、移相後的時鐘;Multiplier為18bit×18bit硬體乘法器,可以在一個時鐘周期内完成乘法運算。
在進階的FPGA中,還包含了嵌入式處理器、DSP子產品、以太網MAC、高速串行IO收發器等。
1.1 可配置邏輯塊CLB
Xilinx Virtex-5 FPGA的一個CLB包含兩個Slice。Slice内部包含4個LUT(查找表)、4個觸發器、多路開關及進位鍊等資源。部分Slice還包括分布式RAM和32bit移位寄存器,這種Slice稱為SLICEM,其他Slice稱為SLICEL。
CLB内部的兩個Slice是互相獨立的,各自分别連接配接開關陣列(Switch Matrix),以便與通用布線陣列(General routing Matrix)相連。
在Xilinx FPGA設計工具中,Slice的位置用“XmYn”表示,其中m為Slice所在橫坐标,一個CLB的兩個Slice的橫坐标分别是m和m+1;n為CLB的縱坐标,一個CLB的兩個Slice有相同的n。Virtex-5左下角的Slice編号為X0Y0。
實際上,查找表類似于一個ROM,容量是64bit,6個輸入作為位址輸入,存儲的内容作為布爾運算的結果。查找表中的内容由ISE生成并在FPGA配置時加載進去。
Slice中的觸發器可以配置成多種工作方式,例如是FF或Latch,同步複位或異步複位、複位高有效或低有效等。
CLB内部包含多個選擇器。CLB的選擇器與一般的選擇器不同,它們沒有選擇端。通路的選擇在FPGA配置後固定下來。
CLB内部還包含了一個重要的資源——進位鍊,其作用是友善加法器的實作。
SLICEM的結構與SLICEL的結構類似,最大的差別是使用了一個新的單元代替SLICE中的查找表。這個新的單元可以配置為LUT、RAM、ROM或移位寄存器(SRL16/SRL32),進而可以實作LUT的邏輯功能,也能做存儲單元(多個單元組合起來可以提供更大的容量)和移位寄存器(提供延遲等功能)
CLB内部查找表、觸發器、多路器等基本單元的配置是由ISE自動完成,一般情況下不需要設計者幹預。但是,如果認為有必要,設計者可以通過ISE中內建的FPGA底層編輯器——FPGA Editor直接編輯CLB内部觸發器和多路器的配置。
1.2 輸入輸出子產品(Input/Output Block)
Input/Output Block 作用是為FPGA提供内部資源與外圍電路之間的接口,提供輸入緩沖、輸出驅動、接口電平轉換、阻抗比對、延遲控制等功能。高端FPGA的輸入/輸出子產品還提供了DDR輸入/輸出接口、高速串行接口(SERDES)(見注1)等功能。
Xilinx FPGA 的輸入/輸出子產品采用SelectIO技術(SelectIO是Xilinx公司的注冊商标),提供多達960個使用者IO,支援20多個單端和差分電平I/O标準;還支援DDR、DDR-2、SDRAM、QDR-II和RLDRAM-II等Memory接口标準。SelectIO經驗DCI(Digitally Controlled Imepedence,數字控制阻抗),提供有源I/O終端以實作阻抗比對。
Virtex-5的Input/Output Block以Tile為機關,IO Tile的概念與CLB有相似之處,同樣是一個較大的組成單元,内部包含多個相同單元。一個Tile包含兩個IOB、兩個ILOGIC/ISERDES單元和兩個OLOGIC/OSERDES單元。
IOB内部的主要組成部分是輸入/輸出Buffer和PAD(焊盤,在內建電路版圖上由金屬焊點和靜電防護二極管組成),提供輸入信号緩沖、輸出信号驅動等功能。
在Input/Output Block 中,每個ILOGIC/ISERDES 單元都可以配置為ILOGIC或ISERDES。配置為ILOGIC時,可以作為常見的輸入邏輯單元,或作為DDR接口的輸入端;配置為ISERDES時,可以完成1到6的串并轉換,兩個ISERDES單元相連可以完成1到10的串并轉換。
類似地,每個OLOGIC/OSERDES 單元可以配置為OLOGIC,實作常見的輸入邏輯單元,或作為DDR接口的輸出端。也可以配置為OSERDES,完成6到1的并串轉換,經過IOB和PAD驅動高速串行總線。兩個OSERDES單元相連可以完成10到1的并串轉換。
Input/Output Block中有IDELAY單元,可以提供精确的延遲,這個延遲不受工藝和溫度的影響。延遲共有64個抽頭,每個抽頭提供75ps的延遲,是以延遲的數值可以在0~4800ps之間進行選擇。
部分IO接口标準需要特定的Vcco和Vref電壓,這些電壓由FPGA外部電路提供,并連接配接到FPGA管腳,供多個I/O Tile共享。連接配接到同一組Vcco和Vref電壓的I/O Tile組成一個Bank(中文意思是“組”,但是通常直接用Bank表示更友善)。
1.3 塊RAM(BlockRAM)
Xilinx FPGA 内部成塊的RAM資源稱為BlockRAM;根據器件系列不同,BlockRAM大小有4096bit(Virtex、VirtexE和Spartan系列)、18Kbit(Virtex-II、Spartan-3和Virtex-4系列)和38Kbit等3種(Virtex-5)。BlockRAM是真正的雙口RAM結構,有兩套讀寫資料、位址和控制總線。兩套總線的操作是完全獨立的,共享同一組存儲單元。BlockRAM的雙口RAM結構對于邏輯設計至關重要,它有兩套獨立的接口,可以友善地連接配接兩個其他設計單元,允許一個端口寫入資料的同時,另一個端口讀出資料,提高了資料吞吐率(Throughput)。
BlockRAM的内容除了在電路運作中重寫以外,也可以通過配置檔案在FPGA上電配置時清零或初始化為特定值。寫BlockRAM時,資料輸出端可以輸出新寫入的資料、被覆寫的資料或保持不變。FIFO是邏輯設計中常用的功能單元,Virtex-5的BlockRAM具有FIFO專用邏輯,是以實作FIFO時将不需要額外的CLB資源,也不需要設計者自行設計FIFO邏輯控制電路,對BlockRAM進行配置即可。
BlockRAM的調用,一般通過CORE Generator進行,在CORE Generator的圖形界面中指定所需要RAM的資料寬度和深度、設定控制信号和初值,就可以生成設計者所需要的RAM(這些RAM通過調用BlockRAM實作),然後在項目RTL代碼中優化,即可進行仿真、綜合、布局布線。