FPGA內部結構


本文主要以Xilinx Virtex Ⅱ系列為例,對FPGA內部結構作簡要介紹,其內容主要來自Xilinx Virtex Ⅱ datasheet、user guide、以及其它來自Xilinx網站上的資料。

內部結構概述

FPGA內部比較復雜,根據Datasheet上的分類,主要包括以下幾個部分:

l 輸入/輸出模塊 Input/Output Blocks (IOB)

l 可配置邏輯單元 Configurable Logic Blocks (CLB)

l Bram Block SelectRAM

l 18 x 18 乘法器 (18-Bit x 18-Bit Multipliers)

l 全局時鍾網絡 (Global Clock Mux)

l 數字時鍾管理模塊 (DCM)

l 布線資源 Routing Resources

圖表 1 FPGA內部結構

clip_image002

輸入/輸出模塊 Input/Output Blocks (IOB)

IOB 模塊兩個一組或者4個一組分布在芯片的周邊部分,如圖表 1所示。

每一個IOB模塊都可以用作輸入或者輸出;兩個IOB可以組成一組差分信號(Differential Pair);IOB同交換矩陣(Switch Matrix)相連。

圖表 2 IOB 和Switch Matrix

clip_image004

IOB支持的I/O標准

IOB能夠支持多種I/O標准,包括:

l LVTTL, LVCMOS (3.3V, 2.5V, 1.8V, and 1.5V)

l PCI-X compatible (133 MHz and 66 MHz) at 3.3V

l PCI compliant (66 MHz and 33 MHz) at 3.3V

l CardBus compliant (33 MHz) at 3.3V

l GTL and GTLP

l HSTL (Class I, II, III, and IV)

l SSTL (3.3V and 2.5V, Class I and II)

l AGP-2X

IOB還能夠支持差分信號I/O標准:

l LVDS

l BLVDS (Bus LVDS)

l ULVDS

l LDT

l LVPECL

如圖表3所示,在FPGA中,所有的IOB分成8組(Bank),每一邊有兩組。

一些I/O標准需要外部的參考電壓VCCO或者VREF,這些外部電壓必須同FPGA引腳相連。每個組(Bank)中都有多個VCCO引腳,在相同的Bank中所有VCCO引腳必須與相同電壓連接。電壓大小由使用的I/O標准決定。在一個組內部,如果所有I/O標准都使用相同的VCCO,則它們可以兼容。

每一組IOB中,能夠使用的時鍾網絡只有兩個,也就是說在每一組中,至多可以同時使用兩組不同時鍾的輸入輸出。

圖表 3 I/O 組(I/O Bank)

clip_image006

IOB中的邏輯資源

圖表 4 IOB模塊的邏輯資源

clip_image008

如圖表4所示IOB模塊中包括6個存儲單元(Reg),每個單元即可以配置成為邊沿觸發的D寄存器(flip-flop,FF),也可以配置能電平觸發的鎖存器(latch)。

IOB中,每條路徑上都有兩個寄存器用來進行DDR(double data rate)數據傳送,兩個寄存器的時鍾需要保持反相,可以通過DCM來達到這一點。

圖表 5 DDR寄存器

clip_image010

可配置邏輯單元 Configurable Logic Blocks (CLB)

CLB是FPGA中的基本邏輯單元,其結構比較復雜。在Xilinx Virtex Ⅱ系列FPGA中,一個CLB單元由,四個結構類似的Slice模塊組成。在FPGA內部,所有CLB單元排列成陣列,並於交換矩陣(Switch Matrix)相連,如圖表6所示:

圖表 6 Virtex-II 中的CLB 單元

clip_image012

圖中,“X1Y1”、“X1Y0”、“X0Y1”、“X0Y0”是Slice在FPGA中的位置編號,在FPGA中每一個Slice都會根據自己的橫縱坐標有一個獨一無二的編號。

每一個Slice模塊中包含2個4輸入LUT(Look Up Table,查找表)和2個1bit的存儲單元。其中,LUT能夠根據設計需要配置成為:組合邏輯、單口RAM、雙口RAM、ROM、移位寄存器和多路選通器;存儲單元可以配置成為邊沿觸發的寄存器或者電平觸發的鎖存器。

圖表 7 Slice 的配置方式

clip_image014

LUT

LUT本質上講就是一個16bit的SRAM(靜態隨機存儲器),4個輸入實際上就是SRAM的地址。對於一個4輸入得組合邏輯來說,他的結果最多只可能有16種,那么,我們完全可以把所有的16種結果事前全部計算出來,存放在一塊16bit的區域中,再將組合邏輯的輸入作為SRAM的讀取地址,這樣我們就可以通過LUT的方式實現了任意4輸入的組合邏輯功能。而且,使用這樣的實現方法,電路延遲同組合邏輯無關,只取決於SRAM的讀寫速度。

Distributed SelectRAM Memory

既然LUT本質上就是一小塊RAM,那么在實際的設計過程中,我們也可以把LUT配置成為RAM來使用。LUT作為RAM來使用的時候也有兩種配置方式:單口RAM和雙口RAM。一個LUT配置成為一塊16bit x 1的RAM,而雙口RAM要多占用一倍的資源,既需要兩個LUT才能配置成一塊16bit x 1的RAM。圖8所示配置成RAM所占用資源的情況,其中“S”代表單口RAM;“D”代表雙口RAM。

無論是LUT配置成的單口RAM還是雙口RAM都可以通過並聯或者串聯來增加RAM的數據位寬度和地址位深度(容量)。

圖表 8 LUT配置成RAM占用資源情況

clip_image016

通RAM類似,LUT還能夠配置能ROM。圖表9所示為LUT配置成ROM的情況。

圖表 9 配置能ROM的情況

clip_image018

移位寄存器

LUT還有一種非常重要的配置方式是移位寄存器。LUT的輸入A[3:0]用來選擇移位寄存器輸出長度,對於單個LUT構成的移位寄存器來說,最大程度為16bit。移位寄存器即可以配置成固定長度的、靜態移位寄存器,也可以配置成動態的移位寄存器。

在每個時鍾(CLK)的上升沿,移位寄存器從D(BY)讀取一位數據。信號Output作為移位寄存器的輸出,輸出的位置由A[3:0]的值決定。

移位寄存器有兩種工作模式:靜態模式和動態模式。

靜態模式中,地址A[3:0]都是定值(static value),移位寄存器的長度的范圍為1bit到16bit。可以由以下公式確定:

Length = (8*A3) +(4*A2) + (2*A1) + A0 +1

如果輸入全部為零,則移位寄存器的長度為1;如果輸入全部為1,則移位寄存器長度為16。

在動態模式中,移位寄存器的長度可以根據A[3:0]變化,計算公式同靜態模式中相同。

需要注意的是,盡管我們可以動態的配置移位寄存器的長度,但是對於一個LUT來說,它本質上講還是一個16bit的移位寄存器,一位寄存器的長度僅僅是指出了數據出口的位置。例如,當我們將移位寄存器的長度從12改為8的時候,輸出的是第8個數據,但移位寄存器並沒有將后面的數據丟掉,如果我們這個時候再把長度設為10還是能夠得到正確的數據。

圖表 10 為移位寄存器的結構,這里需要指出的是在上面的討論中都是沒有寄存器的情況下,如果移位寄存器包含了寄存器,既輸出為Registered Output,則在靜態模式下移位寄存器的長度要加1,動態模式下的情況比較復雜,請讀者自己分析。

圖表 10 移位寄存器

clip_image020

移位寄存器,還可以級聯以進行擴展。在FPGA內部,有一條專用聯線,用於移位寄存器的級聯擴展,既圖表6種的“SHIFT”,它將前級移位寄存器的輸出同后級移位寄存器的輸入相連。在一個CLB單元中至多可以構成一個256bit的移位寄存器。

寄存器/鎖存器 (Register/Latch)

Slice中的存儲單元即可以配置成邊沿觸發的寄存器,也可以配置成電平觸發鎖存器。

寄存器的輸入即可以使LUT的輸出,也可以是來自交換矩陣(Switch Matrix)的數據。

可以通過設置屬性的方式設置寄存器的初值和清零方式,INIT1表示初值為1;INIT0表示初值為0。設定SRHIGH時,在“SR”有效時寄存器值為“1”;設定SRLOW時,在“SR”有效時寄存器值為“0”。

在默認情況下,設定SRHIGH即表示了INIT1;設定SRLOW即表示了INIT0;當然,這兩組屬性也可以分別獨立設置。

每個Slice都可以配置成同步清零或者異步清零。

在圖11種,CLK為時鍾信號;SR為清零信號;CE為時鍾有效信號(Clock Enable);DY、BY、DX、BX都是寄存器的輸入。

可以看出,在同一個Slice中的CLK、SR、CE信號都是共用的。

圖表 11 寄存器

clip_image022

多路選通器 (Multiplexers)

在圖表7中,有兩個選通器:MUXF5和MUXFx。其中,MUXF5在每一個slice中都是完全一樣的,MUXFx則略有區別,分別對應於MUXF6、MUXF7和MUXF8。區別主要是連線結構不同,如圖12所示。

圖表 12 MUXF5 和 MUXFx

clip_image024

在每一個Slice中都有一個MUXF5,每一個CLB中有兩個MUXF6、一個MUXF7和一個MUXF8,其連接結構如圖11。

任何一個LUT都可以構成一個2:1的選通器;

在一個Slice中,可以構成一個4:1的選通器;

在兩個Slice中,可以構成一個81的選通器;

在一個CLB中,可以構成一個16:1的選通器;

在兩個CLB中,可以構成一個32:1的選通器;

快速進位邏輯(Fast Lookahead Carry Logic

FPGA內部有專用的進位邏輯,可以對加減法運算速率進行優化,每個CLB單元中有兩條獨立的進位鏈。每個Slice中的進位鏈寬度為2bit。專用進位鏈和專用的選通器MUXCY還可以用於串聯LUT,以實現更復雜的邏輯。

圖表 13 快速進位鏈與算術邏輯

clip_image026

算數邏輯 (Arithmetic Logic)

Slice內部有異或門(XOR)可以實現兩位全加器。還有一個專用的與門,可以提高選通器的實現效率。

加法是最常用的邏輯結構,FPGA內部之所以有算數邏輯結構主要是為了對加法的速率和實現進行優化。

三態緩存器 (3-State Buffers)

每一個Slice中都有2個三態緩存器。即圖6中的TBUF。

圖表 14 利用三態門構建片內總線

clip_image028

如圖14所示,可以利用三態緩存器構建片內的總線,實現同一條連線上的雙向通信。

BRAM (18 Kbit Block SelectRAM Resources)

Xilinx Virtex Ⅱ中集成了大量18 Kbit Block SelectRAM Resources(以下簡稱BRAM)。每一塊BRAM都是物理上的雙口RAM,它有兩個獨立的時鍾和兩組獨立的控制端口。

每一組端口都包括以下輸入:時鍾(CLK)、時鍾有效(CE,Clock Enable)、寫有效(WE,Write Enable)、復位(SSR,Set/Reset)、地址(ADDR,Address),以及數據通路DI(Data In)和DO(Data Out)。

BRAM的工作時同寄存器類似,控制信號,地址信號以及數據輸入信號必須要在時鍾邊沿(一般是上升沿,可以根據需要配置)的建立時間(Set-up Time)內保持有效,BRAM會在這個時鍾周期輸出結果(讀操作)或者寫入數據(寫操作)。

BRAM的地址位/數據位的配置方式

BRAM支持多種配置方式,可以根據設計需要靈活的改變地址位長度和數據為寬度。

圖表 15 BRAM 的配置方式

clip_image030

從圖15中可以看出,BRAM可以配置成18Kbit的RAM:2Kx9bit,1Kx18bit和512x36bit;也可以配置成16Kbit的RAM:16Kx1bit,8Kx2bit和4Kx4bit;

之所以支持9bit、18bit、36bit的數據為寬度,是因為,可以使用戶在數據中加入校驗位(Parity),具體實現校驗位的邏輯需要用戶在BRAM以外自行構建。

BRAM配置成單口模式

BRAM配置成單口RAM的情況比較簡單,所有的信號都是同步信號。圖16中的“DIP”、“DOP”分別為數據輸入校驗位和輸出校驗位。

圖表 16 單口BRAM

clip_image032

BRAM配置成雙口模式

BRAM的兩組端口可以分別配置,也就是說兩組端口可以使用不同的地址位/數據位配置方式。如圖17所示:

圖表 17 雙口BRAM 的配置方式

clip_image034

每一塊BRAM都是完全同步的RAM。兩組端口和時鍾都是完全獨立的。

圖表 18 雙口 BRAM

clip_image036

BRAM的讀寫操作

BRAM的所有操作都是完全同步的,在時鍾的上升沿(或者下降沿,取決於設置)的過程中,如果EN有效,WE信號無效,則輸出端口輸出地址線上地址所在的數據,這個稱作讀操作;如果EN信號有效,WE信號也有效則將輸入端口的數據寫入地址線地址中,這個稱作寫操作。

在讀寫操作過程中,根據輸出端口輸入的不同,可以將BRAM的工作模式分為3種:“WRITE_FIRST”、 “READ_FIRST”和“NO_CHANGE”。

在“WRITE_FIRST” 模式中,寫操作的時候,輸出端口會將新寫入RAM的數據輸出。

在“READ_FIRST” 模式中,寫操作的時候,輸出端口會將原來保存在目標地址的數據輸出。

在“NO_CHANGE”模式中,寫操作的時候,輸出端口會保留原來的輸出不變。只有在讀操作的過程中輸出端口才會變化,換句話說,在這個模式下如果想讀取數據,WE信號必須無效。

18 x 18 乘法器 (18-Bit x 18-Bit Multipliers)

FPGA中,為了對定點數乘法進行優化,內置了許多乘法器硬核。

圖19中可以看到,乘法器同交換矩陣、BRAM相連。這里需要指出的是,乘法器同BRAM在物理上是緊挨着的,而且兩者共用了某些連線,他們可以連在一起共同使用,也可以分別獨立使用。如果是分別使用那么BRAM必須配置成數據位寬為18bit的模式,否則將導致錯誤。這樣做的目的是為了對“乘加”運算進行優化。可以提高運行速度和減少使用的資源。

圖表 19 乘法器同交換矩陣、BRAM相連

clip_image038

乘法器是一個異步器件,他接受兩個18bit的有符號定點數作為輸入,輸出一個36bit有符號定點數。

圖表 20 乘法器模塊

clip_image040

全局時鍾網絡 (Global Clock Mux)

由於FPGA內部大部分器件都是同步器件,所以在FPGA開發過程中不可避免的要使用很多共用時鍾的同步器件。當頻率較高時,信號在芯片內部的傳輸時間不能忽略,如果時鍾信號到達每個同步器件的時間不同,那么會導致災難性后果。

為了解決這個問題,FPGA內部有專用的時鍾樹。時鍾信號源連接在樹的根部,同步器件連接在樹的“樹葉”上,這樣,通過特定的結構,使同一時鍾信號到達所有器件的延時全部一樣。

時鍾網絡可以和專用的時鍾輸入引腳(也可以用作一般用戶自定義引腳)相連,可以和DCM的輸出相連,也可以和來自交換局針的其他信號相連。

圖表 21 時鍾選擇器

clip_image042

還有就是千萬不要將兩個時鍾通過一個與門或者或門,這樣很可能會產生毛刺,影響系統穩定性,如果要對時鍾進行操作,例如切換時鍾等,請使用FPGA內部的專用器件“BUFGMUX”。

DCM(Digital Clock Management)

DCM是FPGA內部處理時鍾的重要器件,他的左右主要有三個:消除時鍾偏斜(Clock De-skew)、頻率合成(Frequency Synthesis)和相位調整(Phase Shifting)。

圖表 22 DCM

clip_image044

圖22中:

l CLKIN DCM的輸入時鍾信號,可以來自IBUFG、IBUF或者BUFGMUX。

l CLKFB DCM接受到的反饋時鍾(原則上必須連接),該反饋信號必須源於CLK0或者CLK2X,並通過IBUFG、IBUF或者BUFGMUX相連。

l RST DCM的復位信號,控制DCM的初始化。

l DSSEN 已經不再使用,請不要在設計中連接。

l PSINCDEC DCM的控制信號,控制輸出時鍾的相位動態調整方向。當CLKOUT_PHASE_SHIFT=VARIABLE時,該信號有效,否則,該信號接地。

l PSEN 為DCM控制信號,該信號是輸出時鍾相位調整的使能信號。當CLKOUT_PHASE_SHIFT=VARIABLE時,該信號有效,否則,該信號接地。

l PSCLK DCM的參考時鍾信號,該信號是輸出時鍾動態調整的參考時鍾。當CLKOUT_PHASE_SHIFT=VARIABLE時,該信號有效,否則,該信號接地。

l CLK0 DCM的輸出時鍾信號,與CLKIN無相位偏移。

l CLK90 DCM輸出時鍾信號,與CLKIN有90°的相差。在high-frequency模式下此信號無效。

l CLK180 DCM輸出時鍾信號,與CLKIN有180°的相差。

l CLK270 DCM輸出時鍾信號,與CLKIN有270°的相差。在high-frequency模式下此信號無效。

l CLK2X DCM輸出信號,使CLKIN的兩倍頻信號。在high-frequency模式下此信號無效。

l CLK2X180 DCM輸出時鍾信號,該時鍾信號與CLK2X有180°的相差。

l CLKDV DCM的輸出時鍾信號,是CLKIN的分頻時鍾信號。其分頻系數由CLKDV_DIVIDE設定。

l CLKFX DCM的輸出時鍾信號,是CLKIN經過頻率綜合后的時鍾信號。其中CLKFX=M/D*CLKIN,M由CLKFX_MULTIPLY設定,D由CLKFX_DIVIDE設定。

l CLKFX180 DCM輸出時鍾信號,該時鍾信號與CLKFX有180°的相差。

l LOCKED DCM狀態信號,用於顯示DCM時候鎖定CLKIN。DCM的輸出時鍾信號只有在LOCKED為高時有效。

l STATUS DCM的狀態信號,用於顯示DCM的工作狀態。

l PSDONE DCM的狀態信號,用於顯示輸出時鍾相位動態調整是否正常

消除時鍾抖動

DCM的核心器件是數字鎖相環(DLL,Delay Locked Loop)。它是由一串固定時延的延時器組成,根據網上的相關資料,每一個延時器的時延為30ps,也就是說,DCM所進行的倍頻、分頻、調相的精度為30ps。

圖表 23 DCM反饋連接方法

clip_image046

上文提到過,由於FPGA芯片中信號傳輸時間不能夠忽略,所以在全局時鍾緩存中也存在一定時延。根據圖23種所示的連接方法,DCM接受BUFG出口的時鍾信號作為反饋,通過調整內部串聯延時器的個數,當延時器延時時間加上BUFG延時時間等於工作頻率整數倍時,DCM就可以保證CLKIN的相位同BUFG出口處的相位完全保持一致,這樣就做到了抖動消除。

但需要注意的是,DCM可以消除時鍾上升沿位置的抖動,但同時會造成時鍾邊沿的斜率變小(時鍾偏斜),時鍾信號變化變得平坦。所以,請盡量避免一個時鍾通過多個DCM。

頻率綜合

DCM具有強大的頻率綜合能力,可以方便的進行頻率轉換。

CLK2X輸出的是CLKIN的2倍頻;CLKDV輸出的是CLKIN的分頻時鍾信號。其分頻系數由CLKDV_DIVIDE設定;CLKFX是CLKIN經過頻率綜合后的時鍾信號。其中CLKFX=M/D*CLKIN,M由CLKFX_MULTIPLY設定,D由CLKFX_DIVIDE設定。

其他具體細節信息請參考User Guide。使用時請注意在每種頻率下的輸入時鍾和輸出時鍾的范圍。

相位調整

DCM調相功能也十分強大。

器件本身自帶了一些端口可以輸出固定相差,1/4、1/2和3/4個周期的相位差。

還可以通過設定屬性的方式更為精確的設定相位調整的值,在VARIABLE模式下,甚至可以通過PSINCDEC、PSCLK、PSEN在程序運行中動態的調整相位。

圖表 24 使用DCM 調整相位

clip_image048

如果通過設置屬性改變相位,將會影響到DCM所有的輸出。

調相的精度由輸入、輸出的時鍾頻率、DLL時延的最小精度等多方面因素決定。

其他具體細節信息請參考User Guide。

布線資源

布線資源連通FPGA內部所有單元,連線的長度和工藝決定着信號在連線上的驅動能力和傳輸速度。布線資源的划分:

1)全局性的專用布線資源:以完成器件內部的全局時鍾和全局復位/置位的布線;

2)長線資源:用以完成器件Bank間的一些高速信號和時鍾信號的布線;

3)短線資源:用來完成基本邏輯單元間的邏輯互連與布線;

4)其他:在邏輯單元內部還有着各種布線資源和專用時鍾、復位等控制信號線。

這里的連線其實是位於半導體上方的金屬線(我不清楚上面提到的所有連線是不是都是金屬線,尤其是短線資源很可能直接是半導體內部的直接互連,但絕大多數連線,尤其是長距離的連接都是金屬線)。

圖表 25 金屬線的互連方式

clip_image050

金屬線通過圖25的方式進行互連,這樣所有的不線資源構成一個龐大的交換矩陣(switch matrix)。能夠將片內所有資源連接起來。

當FPGA中設計比較復雜、使用邏輯資源比較多的時候,往往布線資源變成為瓶頸,導致設計難以布局布線(Place and Route,PAR)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM