目前主流的FPGA芯片仍是基於查找表。FPGA芯片主要由以下6部分組成:
(1)可編程輸入輸出單元(IOB)
(2)基本可編程邏輯單元(CLB)
(3)完整的時鐘管理模塊
(4)豐富的佈線資源
(5)嵌入式塊RAM
(6)內嵌的底層功能單元和嵌入式專用硬核
通過配置以上6個不同的部分,基本可以讓FPGA實現任何你想要實現的功能。
一、FPGA的結構解析
對於一款芯片,我們肉眼看到的如圖1.1所示,看不出它有任何特點。
當我們對其內部放大時,看到如圖1.2所示結構,密密麻麻小方格,仍然完全看不出有什麼特點:
當我們再對其內部進行放大時,看到如圖1.3所示結構,這時可以看到芯片內部的最基本組成單元:可編程邏輯單元、佈線資源、可編程IO。對於複雜的芯片,內部還應包括時鐘管理模塊、嵌入式塊RAM、內嵌的底層功能單元和嵌入式專用硬核,各基本單元在芯片內部的分佈如圖1.4所示。
考慮到芯片內部的連接情況,對於圖1.4所示的芯片內部結構,可以簡化爲圖1.5所示內部結構相互連接的情況,不同部分通過豐富的佈線資源相連接,最終實現我們想要的功能。接下來我們來討論每個基本組成部分。
二、基本組成部分內部結構及功能
2.1、可編程輸入輸出單元(IOB)
I/O模塊包含兩個IOB、兩個ILOGIC、兩個OLOGIC和兩個IODELAY。圖2.1所示爲Virtex-5 I/O模塊。
基本IOB圖如圖2.2所示,每個IOB包含輸入、輸出和三態SelectIO驅動器。差分I/O使用在一個模塊中的兩個IOB。圖2.2中,紅色線代表設置IO爲output型時走線,綠色線代表設置IO爲input型時走線,藍色線代表設置IO爲inout型時走線,T用來控制三態門,當其爲0時,三態門導通,表示IO爲輸出類型,當爲1時,三態門關閉,表示IO爲輸入類型。如inout data_o;
assign data_o = !T?data_o_2:'bZ;當T爲0時,data_o被定義爲輸出類型;T爲1時,data_o被定義爲輸入類型。
由圖2.1可知,各IOB直接連接ILOGIC/OLOGIC對,該邏輯對包含輸入和輸出邏輯資源,可用於數據和IOB的三態控制。下面我們分別討論ILOGIC和OLOGIC資源。
2.1.1 ILOGIC/OLOGIC資源
ILOGIC邏輯資源的模塊圖如圖2.3所示:
ILOGIC資源可支持以下操作(這些資源之間的所有連接均由所編寫代碼控制):
- 邊沿觸發D型觸發器
- 電平敏感性鎖存器
- 異步/組合
- IDDR模式
OLOGIC由兩個主要的模塊組成,一個用於配置輸出數據通路,另一個用於配置三態控制通路。二者共用時鐘(CLK)。
OLOGIC邏輯資源的模塊圖如圖2.4所示:
OLOGIC資源可支持以下操作(這些資源之間的所有連接均由所編寫代碼控制):
- 邊沿觸發D型觸發器
- 電平敏感性鎖存器
- 異步/組合
- ODDR模式
2.1.2 ILOGIC/OLOGIC中的寄存器資源
這裏重點討論一下在實際工程中如何使用ILOGIC/OLOGIC中的寄存器。在實際工程中,進行高速數據傳輸時,對於高速信號要通過連接ILOGIC/OLOGIC中的寄存器進行傳輸。即在設計中將要傳輸的信號輸入或者輸出都用寄存器同步一下,然後對該寄存器進行約束,使其使用ILOGIC/OLOGIC內部的寄存器,由於ILOGIC/OLOGIC距離引腳的路徑固定,這樣就可以保證數據從輸入引腳進第一級寄存器的佈線延遲相同/輸出數據出最後一級寄存器到達引腳的佈線延遲相同。
某博客上的解釋如下:
如何使用ILOGIC/OLOGIC中的寄存器資源:
module beipin(input clk,
input data_in,
output data_o,
output clk_o
);
(*IOB = "TRUE"*)reg data_o_2; ///////使用IOB中的寄存器
always @(posedge clk)
data_o_2 <= data_in;
assign data_o =data_o_2;
endmodule
對於上述代碼,如果不對寄存器進行(*IOB=“TRUE”*)約束的話,編譯後使用FPGA Editor查看,會發現寄存器使用的是Slice中的寄存器(當軟件優化全關閉的情況下:在XST中打開屬性,設置xilinxspecific options 的 -iob (Pack I/O registers into IOB) 屬性爲No,在ISE的implementation的MAP屬性中設置 -pr(Pack I/O registers into IOB) 屬性爲“OFF”)。而如果進行約束的話,就會發現使用的是OLOGIC中的寄存器。
2.1.3 ILOGIC/OLOGIC中的IDDR/ODDR
對於ILOGIC/OLOGIC邏輯資源可以使用原語實現IDDR/ODDR
使用原語實現IDDR:
IDDR有以下三種工作方式:
- OPPOSITE_EDGE模式
- SAME_EDGE模式
- SAME_EDGE_PIPELINED模式
OPPOSITE_EDGE模式下的輸入DDR時序:
我對IDDR的工作過程理解(OPPOSITE_EDGE模式下):數據Q1在時鐘C的上升沿輸出,數據Q2在時鐘C的下降沿輸出,即使用時鐘C的上升沿和下降沿進行數據的接收。這樣FPGA就可以以較小時鐘進行數據的接收。如圖2.6所示,C_2X爲數據發送的時鐘,C爲通過IDDR進行接收的時鐘。
SAME_EDGE模式下輸入DDR時序:
在SAME_EDGE模式下:數據在時鐘C的同一上升沿送至FPGA內部資源。一對數據之間有一個時鐘週期的間隔。
SAME_EDGE_PIPELINED模式下輸入DDR時序:
在SAME_EDGE_PIPELINED模式下:數據在時鐘C的同一上升沿送至FPGA內部資源。與SAME_EDGE模式不同的是,一對數據之間沒有一個時鐘週期的間隔,但是需要增加一個時鐘週期的延遲。
對於IDDR的功能:我的理解是它可以降低FPGA內部的工作時鐘頻率,且可以實現數據的串並轉換(將串行的數據D轉成並行的數據Q1、Q2)。
ODDR有以下兩種工作方式:
- OPPOSITE_EDGE模式
- SAME_EDGE模式
OPPOSITE_EDGE模式下的輸出DDR時序:
對ODDR工作過程理解(OPPOSITE_EDGE模式下):數據D1和D2分別在時鐘CLK的上升沿和下降沿送進ODDR,ODDR以兩倍CLk的時鐘速率將數據發送出去。如圖2.10所示,在CLK的上升沿和下降沿分別將D1和D2加載進ODDR,在CLK_2X的上升沿將數據送出。CLK是採集數據時鐘,CLK_2X是數據發送時鐘。使用ODDR也實現了FPGA內部以較小的時鐘實現了較快的數據傳輸。
SAME_EDGE模式下的輸出DDR時序:
SAME_EDGE模式下,數據在CLk的同一上升沿送進ODDR,然後在CLK_2X的上升沿將數據送出。
對於ODDR的功能:我的理解是它的作用也是降低FPGA內部工作時鐘的頻率,並且可以實現數據的串並轉換(將並行數據D1、D2轉爲串行OQ)。
2.1.4 ILOGIC/OLOGIC中的ISERDES/OSERDES資源
ISERDES輸入串並轉換器
ISERDES是專用的串並轉換器,其功能包括:
- 專用解串器/串並轉換器
- Bitslip子模塊(使能後就是一個桶裝移位寄存器)
- 對選通存儲器接口的專門支持
- 對網絡接口的專門支持
ISERDES實現是通過原語實現(這裏僅討論串並轉換功能):
圖2.12所示爲8:1SDR ISERDES的ISERDES時序圖。由於ISERDES的性質,數據需要多個CLKDIV週期才能出現。(先進去的在低位)
由圖可知,串行數據D在CLK的上升沿送進ISERDES,在CLKDIV時鐘的上升沿(SDR)將數據轉換爲並行的送出。CLK與CLKDIV的關係取決於串並轉換比。如:要實現8:1(8個串行數據轉換爲1個並行數據)的串並數據轉換,CLKDIV就是CLK的8分頻。其關係如下表所示:
表1 數據串並轉換器的CLK/CLKDIV關係
OSERDES輸出並串轉換器:
輸出並串轉換器的實現也是通過原語實現,
一個OSERDES模塊中的數據並串轉換器接收來自內部資源的二到六位並行數據,將數據串行化,然後通過OQ輸出將數據送至IOB。並行數據串行化是按照從數據輸入引腳的最低位到最高位的順序進行的(即低位先輸出)。
SDR6:1 OSERDES時序:
在SDR模式下,並行數據D1…D6在時鐘CLKDV的上升沿送入並串轉換器,在CLK的上升沿將數據送出,CLKDIV與CLK的關係取決於並串轉換比。
DDR6:1 OSERDES時序:
在DDR模式下,並行數據D1…D6在CLK的上升沿將數據送進並串轉換器,在CLKDIV的上升沿和下降沿將數據送出,CLKDIV與CLK的關係取決於並串轉換比/2。
數據並串準換器的CLK/CLKDIV關係如下表所示:
表2 數據並串轉換器CLK/CLKDIV關係
3.1基本可編程單元(CLB)
可配置邏輯塊(CLB)是實現時序電路和組合電路的主要邏輯資源。每個CLB元件連接到一個可訪問通用佈線矩陣的開關矩陣(如圖2.15所示)。每個CLB元件包含一對Slice。這兩個Slice之間沒有直接連接,各Slice組成一個列。列中的Slice具有獨立的進位鏈。
Xilinx工具用以下定義表示Slice。“X”後跟一個數字表示各Slice在對中的位置以及該Slice的列位置。“Y”後跟一個數字表示CLB的行。在一個CLB內此數字保持不變,從底部起向上一次計數CLB行。如圖2.16所示。
3.11 Slice描述
每個Slice包含四個邏輯函數發生器(即查找表)、四個存儲元件、多功能多路複用器和進位邏輯。所有Slice都通過這些元件進行邏輯、算術和ROM函數運算。除此之外,有些Slice還支持兩個附加功能:用分佈式RAM存儲數據和用32位寄存器進行數據移位。支持這些附加功能的Slice稱爲SLICEM;其它稱爲SLICEL。
由圖2.17和圖2.18可知,SLICEL和SLICEM的區別是SLICEL中的邏輯函數發生器只能配置成LUT和ROM;而SLICEM中的邏輯函數發生器不僅可以配置成LUT和ROM,還可以配置成RAM(其中Distribute RAM就是由SLICEM中的邏輯函數發生器配置而成)。
每個CLB可以包含0個或1個SLICEM。每隔一個CLB列包含一個SLICEM。另外,DSP48E左邊的兩個CLB列各包含一個SLICEL和一個SLICEM。
一個CLB中的邏輯資源:
Slice |
LUT |
觸發器 |
算術和進位鏈 |
分佈式RAM(SLICEM) |
移位寄存器(SLICEM) |
2 |
8 |
8 |
2 |
256位 |
128位 |
分佈式RAM和存儲器(只能在SLICEM中使用)
可以使用各種方法將SLICEM中的多個LUT組合起來,以存儲較大量數據。
4.1 時鐘資源
爲時鐘控制之目的,每個V5器件分成若干個時鐘區域(8—24個區域),區域數因器件大小而異。xc5vlx50-1ff1153被分成12個時鐘區域。
4.1.1全局時鐘
每個V5器件有32條全局時鐘線,它們可以對整個器件上的所有順序資源(CLB、BRAM、CMT和IO)進行時鐘控制,並且還可以驅動邏輯信號。可以將這32條時鐘線中的任何10條用於任意區域。一條全局時鐘線僅由一個全局時鐘緩衝器驅動,該全局時鐘緩衝器還可以用作時鐘使能電路或無毛刺信號的多路複用器。它可以在兩個時鐘源之間進行選擇,還可以切離其中一個失效的時鐘源。
全局時鐘是一種專用互聯網絡,是專爲覆蓋對FPGA中各種資源的所有時鐘輸入設計的。這些時鐘網絡的設計旨在降低歪斜、佔空比失真和功耗。其設計的目的還在於支持甚高頻信號。
全局時鐘控制資源和網絡通常由以下通路和組件構成:
- 全局時鐘輸入
- 全局時鐘緩衝器
- 時鐘樹和時鐘網絡-GCLK
- 時鐘區域
全局時鐘輸入(IBUFG、IBUFGDS)
通過使用IBUFG(單端IO的輸入時鐘緩衝器)、IBUFGDS(差分IO的輸入時鐘緩衝器)將輸入時鐘接入全局時鐘網絡。
全局時鐘緩衝器(BUFGCTRL)
每個V5器件有32個全局時鐘緩衝器(與全局時鐘線個數一致)。一個全局時鐘的輸入可以從差分輸入引腳對的P端直接連接到器件中任意全局時鐘緩衝器的輸入。每個差分全局時鐘引腳可以連接到PCB上的一個差分或單端時鐘。如果使用單端時鐘,則必須使用引腳的P端,因爲只有這一引腳上存在直接連接。如果單端時鐘連接到差分引腳對的P端,則不能用其N端作爲另一個單端時鐘引腳。不過可以作爲普通IO。
全局時鐘緩衝器允許各種時鐘源/信號源接入全局時鐘樹和網絡。可以輸入全局時鐘緩衝器的源包括:
- 全局時鐘輸入
- 時鐘管理模塊輸出(DCM、PLL)
- 其它全局時鐘緩衝器輸入
- 通用互連
全局時鐘緩衝器基元如下表所示:
這些基元均可以通過原語實現。
FPGA內部最基本的基元是BUFGCTRL,其它基元都是由BUFGCTRL配置而成。BUFGCTRL如圖2.20所示:
4.1.2 區域時鐘
區域時鐘每區域有2個區域時鐘緩衝器BUFR和4個區域時鐘樹。區域時鐘網絡是一組獨立於全局時鐘網絡的時鐘網絡。與全局時鐘不同,區域時鐘信號(BUFR)的跨度限於三個時鐘區域,而IO時鐘信號只驅動一個區域。
4.13 IO時鐘
第三種時鐘資源是IO時鐘,可以達到非常高的速度,可用於局部的IO串行器/解串器。
對於IO時鐘實現是通過BUFIO的原語實現,目前沒有用過IO時鐘,對此不是很瞭解。
5.1對於FPGA內部的其它資源(佈線資源、嵌入式BRAM、嵌入式專用硬核DSP)等使用其它比較直觀,這裏不在討論。