1. 程式人生 > >轉發:Xilinx 7series FPGA SelectIO資源--ODDR

轉發:Xilinx 7series FPGA SelectIO資源--ODDR

OLOGIC 資源

OLOGIC塊在FPGA內的位置緊挨著IOB,其作用是FPGA通過IOB傳送資料到器件外部的專用同步塊。OLOGIC 資源的型別有OLOGIC2(位於HP I/O banks)和OLOGIC2(位於HR I/O banks)。在本文的下述論述中,除非特殊說明,OLOGIC2和OLOGIC3在功能和埠上都是相同的。

OLOGIC2和OLOGIC3不屬於原語,正因為這樣,所以它們不能被直接例化。它包含在佈局佈線後用戶可例化的一些元素,例如一個輸出觸發器(OFD--output  flip-flop)或者一個ODDR(output DDR element).

OLOGIC主要由兩個block組成,一個用於配置輸出路徑。另外一個用於配置三態控制路徑。這兩個block具有共同的時鐘,但是具有不同的使能訊號OCE和TCE。兩者具有由SRVAL屬性精緻的一部和同步set和reset(S/R訊號)。

輸出路徑和三態枯井可以以下列模式之一獨立配置:

  • 邊沿觸發的D觸發器
  • DDR模式(ASAME_EDGE 或 OPPOSITE_EDGE)
  • 電平敏感鎖存器
  • 非同步電路/組合邏輯
下圖說明了OLOGIC block中的各種邏輯資源

    組合輸出資料路徑和三態控制路徑

組合輸出路徑建立一個從FPGA邏輯到輸出驅動或輸出驅動控制的直接連線。這些路徑常常由軟體自動設定,當:

  1. 從FPGA邏輯內的邏輯資源到輸出資料或者三態控制的直接連線(未經過暫存器)。
  2. pack i/o register/larches into IOBs 軟體map指令被設定為OFF。

Output DDR概述(ODDR)

7系列器件在OLOGIC中有專用暫存器來實現輸出DDR暫存器。這個功能在例化ODDR時可見。在使用OLOGIC時,DDR的複用是自動的,不需要手動控制多路複用。這個控制是從時鐘產生的。

ODDR原語是由一個時鐘輸入,下降沿資料由輸入時鐘的本地反轉來計時。反饋到I/O塊的所有的時鐘被完全複用。例如:在ILOGIC和OLOGIC塊之間沒有時鐘共享。ODDR原語支援一下操作模式:

  • OPPOSITE_EDGE 模式
  • SAME_EDGE模式
SAME_EDGE模式與Virtex-6架構相同,這個模式允許設計者在ODDR時鐘的上升沿向ODDR原語提供資料輸入,從而節省CLB和時鐘資源,並提高效能。此模式使用DDR_CLK_EDGE屬性實現。它也支援三態控制。一下各節詳細介紹了各種模式。

   OPPOSITE_EDGE 模式

在此模式中,時鐘邊沿被用來以兩倍的吞吐量從FPGA邏輯中捕獲資料。這種結構與virtex-6的實現比較相似。兩個輸出都提供給IOB的資料輸入或者三態控制輸入。使用OPPOSITE_EDGE模式的輸出DDR時序圖如下圖所示:

    SAME_EDGE 模式

在此模式下,資料可以在相同的時鐘邊沿從給IOB。相同的時鐘沿江資料送給IOB可以避免建立時間違規,並允許使用者使用最小的暫存器來執行更高的DDR頻率來進行暫存器的延遲,而不是使用CLB暫存器。下圖顯示了使用SAME_EDGE模式的輸出DDR的時序圖:

    時鐘前向

輸出DDR可以傳送時鐘的副本到輸出。這對於傳播時鐘和DDR資料之間相同的延時是非常有用的,並且對於多個時鐘生成,每個時鐘負載具有唯一的時鐘驅動器。這是通過將ODDR原語中D1輸入設定為High,D2輸入設定為低來實現的。Xilinx建議使用此方案將FPGA邏輯時鐘轉發到輸出引腳。

    輸出DDR原語(ODDR)

圖2-20顯示了ODDR原語結構圖。Set和Reset不能同時置位。表2-21列出了ODDR埠訊號。表2-11描述了各種可哦那個的屬性和ODDR原語的預設值。

    ODDR在verilog中的介面例化

  1. ODDR #(
  2. .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
  3. .INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
  4. .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
  5. ) ODDR_inst (
  6. .Q(Q), // 1-bit DDR output
  7. .C(C), // 1-bit clock input
  8. .CE(CE), // 1-bit clock enable input
  9. .D1(D1), // 1-bit data input (positive edge)
  10. .D2(D2), // 1-bit data input (negative edge)
  11. .R(R), // 1-bit reset
  12. .S(S) // 1-bit set
  13. );