Virtex系列的FPGA的 基本I/O邏輯資源都包括組合輸入、輸出資源,三態輸出控制、寄存器輸入輸出控制、SDR輸入輸出、DDR輸出三態控制等。此外V5、V6器件還包括了IODELAY提供了對高分辨率可調整延遲單元的用戶控制、SAME_EDGE 輸出DDR模式,SAME_EDGA和SAME_EDGA_PIPELINED輸入DDR模式等,以下主要是總結個人學習記錄。
一、輸入輸出延遲單元IODELAY
每個I/O模塊都包含一個可編程絕對的延遲單元IODELAY。它可以連接到ILOGIC/ISERDES或者OLOGIC/OSERDES模塊。IODELAY有64個tap的環繞單元。通過選擇IDELAYCTRL的參考時鍾,可以改變這64個tap的延遲分辨率。IODELAY可以用於組合輸入/輸出通路、寄存器輸入/輸出通路,也可以在內部資源中直接使用。
(1) 當用作IDELAY時,數據從IBUF或者內部資源輸入,然后輸出到ILOGIC/ISERDES。
*零保持時間模式,此時IDELAY_TYPE =Default,這種模式不需要例化IDELAYCTRL基元。
*固定時間延遲模式,此時IDELAY_TYPE= FIXED,這種模式下,配置時將延遲值預設置成由屬性IDELAY_VALUE確定的Tap數。使用時必須例化IDELAYCTRL基元。
*可變延遲模式,可以在配置后通過控制信號CE和INC來改變延遲,使用時必須例化IDELAY_CTRL。
(2) 當中ODELAY時,數據從OLOGIC/OSERDES輸入。配置時將預設值成由ODELAY_VALUE確定的Tap數,使用時必須例化IDELAYCTRL元件。
(3) 當中雙向延遲時,將IOB配置成雙向模式,IODELAY交替延遲輸入輸出通過的延遲。有下面兩種可配的模式
*固定時間延遲模式,此時IDELAY_TYPE= FIXED,這種模式下,配置時將延遲值預設置成由屬性IDELAY_VALUE確定的Tap數。使用時必須例化IDELAYCTRL基元。
*可變延遲模式,可以在配置后通過控制信號CE和INC來改變延遲,使用時必須例化IDELAY_CTRL。
一般情況下,如果只是例化了一個IDELAYCTRL,那么可以不添加LOC約束,但是當例化的IDELAYCTRL超過一個的時候就必須添加位置約束,否則會ISE軟件在綜合實現的時候就會報錯。
二、IDELAYCTR的使用
如果IOBDELAY_TYPE屬性被設置為FIXED或者VARIABLE,則必須在代碼中例化IDELAYCTRL模塊,IDELAYCTRL模塊在其區域里連續標定各個延遲單位,簡單總結下IDELAYCTRl的使用方法。
(1) 無LOC約束的IDELAYCTRL
當例化無LOC約束的IDELAYCTRL時,HDL代碼中必須只例化一個IDELAYCTRL實例,ISE實現時會自動復制到整個器件的延遲單元時鍾區域當中,這樣每一個時鍾區域都有消耗一個全局時鍾資源比,使用的布局布線資源也比較高,進而使得芯片的功耗也比較大。
當忽略RDY端口時,所以復制的IDELAYCTRL實例的RDY信號均不連接,但是當連接RDY端口時,例化一個寬度等於時鍾區域數的與門,ISE實現時會自動連接到已經例化的所有IDELAYCTRL實例的RDY端口的信號與門輸出。
(2) 有LOC約束的IDELAYCTRL
使用IDELAYCTRL模塊最有效的方法是定義並且鎖定代碼中例化的所有的IDELAYCTRL實例的位置,Xilinx官方推薦在使用延遲單元時,應該定義並且鎖定所有的ISERDES和IDELAY元件的位置,使用有LOC約束的IDELAYCTRL
添加有LOC的IDELAYCTRL需要注意:
一個IDELAYCTRL基元可同時覆蓋一個clock region,而一個clock region包含不止一個IOB,在約束IDELAYCTRL基元LOC時,需要仔細定位該IOB屬於哪個LOC的IDELAYCTRL。
(3) 位置約束
每一個IDELAYCTRL模塊都有XY坐標位置,為了約束位置,IDELAYCTRL實例可以附帶LOC屬性,為IDELAYCTRL附加LOC屬性可以在UCF文件中加入 INST “Instance name” LOC = IDELAYCTRL_X#Y#; 或者在HDL設計文件中直接嵌入LOC約束
下列語法用於在HDL設計文件中嵌入LOC約束。
// synthesis attribute loc of instance_name is "IDELAYCTRL_X#Y#";
比如一個完整的實例:
IODELAY #(
.DELAY_SRC ( "O" ), //IODELAY源是ODATAIN
.IDELAY_TYPE ( "FIXED" ), //靜態延遲
.ODELAY_VALUE ( 16 ), //固定延遲數為16個tap
.REFCLK_FREQUENCY ( 200.0 ) //IDELAYCTRL參考時鍾200MHz
)IODELAY_INST
(
.C ( 1'b0 ), //可變模式下使用的時鍾輸入
.CE ( 1'b0 ), // 是否啟動遞增/遞減功能
.DATAIN ( 1'b0 ),
.IDATAIN ( 1'b0 ),
.INC ( 1'b0 ), //tap延遲的遞增/遞減選擇
.ODATAIN ( LED ), //來自OLOGIC/OSERDES的信號
.RST ( 1'b0 ),
.T ( 1'b0 ), //用作ODELAY
.DATAOUT ( LED )
);
IDELAYCTRL IDELAYCTRL_inst
(
.RDY ( RDY ), // 1-bit ready output
.REFCLK ( System_Clk ), // 1-bit reference clock input
.RST ( 1'b0 ) // 1-bit reset input
);
三、高級的SelectIO邏輯資源(ChipSync)
高級SelectIO邏輯資源包括ISERDES和OSERDES,它可以支持非常高的I/O數據速率,允許內部邏輯以低於I/O的速率運行。BitSlip子模塊,可以根據培訓模式檢測數據重新對齊邊界。
(1) ISERDES功能
專用的解串器/串並轉換器:ISERDES可以實現高速數據傳輸,完全不需要FPGA內部邏輯與輸入數據頻率匹配,此轉換器支持SDR、DDR兩種模式。在SDR模式下,串並轉換器可以創建2、3、4、5、6、7、8位寬的並行字,在DDR模式下,串並轉換器可以創建4、6、8、10位寬的並行字。
BitSilp子模塊:這個模塊支持對進入FPGA內部資源的並行數據進行重新排序的功能,可以用來培訓模式的源同步端口。
(2) ISERDES寬度拓展方法
每一個I/O模塊中都有一主一從兩個ISERDES模塊,對於構建大於1:6串行轉換器時需要用級聯的方式將兩個ISERDES連接起來。通過主ISERDES的SHIFOUT端口連接到從ISERDES的SHIFIN端口,可以將串並轉換器的最大擴展到1:10(DDR模式)和1:8(SDR模式)。 擴展串並轉換器位寬的原則如下:
A、 兩個ISERDES模塊必須是相鄰的主從對。
B、 將主ISERDES的SERDES_MODE設置為MASTER,將從ISERDES的SERDES_MOD設置為Slaver。
C、 將Slave的shifin端口連接到master的shifout端口。
D、 Slave僅僅使用端口Q3~Q6作為輸入端口。
E、 Master和Slave的數據寬度相等。
(3) OSERDES模塊
每一個OSERDES模塊都包括一個用於數據和三態控制的專用轉換器。數據和三態都可以配置成SDR和DDR模式,數據串行化可達6:1 ,如果使用寬度擴展的話,可以到達10:1,三端口串行化可達4:1。
(4) OSERDES模塊的擴展方法:Oserdes擴展和Iserdes擴展方式一致。