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器件都包含硬核。
Xilinx:
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代碼中優化,即可進行仿真、綜合、布局布線。