014 Xilinx 原语(千兆以太网相关)
原語是 Xilinx 器件底層硬件中的功能模塊,它使用專用的資源來實現一系列的功能。相比于 IP 核,原語的調用方法更簡單,但是一般只用于實現一些簡單的功能。 本文主要講解BUFG、BUFIO、IDDR、ODDR、IDELAYE2和IDELAYCTRL。
一、BUFG
BUFG: 全局緩沖,BUFG的輸出到達FPGA內部的IOB、CLB、塊RAM的時鐘延遲和抖動最小。BUFG原語模板如下:
1 BUFG BUFG_inst ( 2 .O(O), // 1-bit output: Clock output 3 .I(I) // 1-bit input: Clock input 4 );
View Code
除了 BUFG 外,常用的還有 BUFR, BUFR 是 regional 時鐘網絡,它的驅動范圍只能局限在一個 clock region的邏輯。BUFR相比BUFG的最大優勢是偏斜和功耗都比較小。
二、BUFIO
BUFIO: BUFIO 是 IO 時鐘網絡, 其獨立于全局時鐘資源,適合采集源同步數據。 它只能驅動 IO Block里面的邏輯,不能驅動CLB里面的LUT,REG等邏輯。BUFIO原語模板如下:
1 BUFIO BUFIO_inst ( 2 .O(O), // 1-bit output: Clock output (connect to I/O clock loads). 3 .I(I) // 1-bit input: Clock input (connect to an IBUF or BUFMR). 4 );
View Code
BUFIO 在采集源同步 IO 數據時,提供非常小的延時,因此非常適合采集比如 RGMII 接收側的數據,但是由于其不能驅動FPGA的內部邏輯,因此需要BUFIO和BUFG配合使用,以達到最佳性能。如ETH_RXC的時鐘經過BUFIO,用來采集端口數據;ETH_RXC經過BUFG,用來作為除端口采集外的其他模塊的操作時鐘。
三、IDDR
IDDR: 在7系列設備的ILOGIC block中有專屬的registers來實現input double-data-rate(IDDR) registers,將輸入的上下邊沿DDR信號,轉換成兩位單邊沿SDR信號。IDDR的原語結構圖如下圖所示:
C:輸入的同步時鐘;
D:輸入的 1 位 DDR 數據;
Q1 和 Q2:分別是“C”時鐘上升沿和下降沿同步輸出的 SDR 數據。
CE:時鐘使能信號;
S/R:置位/復位信號,這兩個信號不能同時拉高。
IDDR 原語模板如下:
1 IDDR #(
2 .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"
3 // or "SAME_EDGE_PIPELINED"
4 .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
5 .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
6 .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
7 ) IDDR_inst (
8 .Q1(Q1), // 1-bit output for positive edge of clock
9 .Q2(Q2), // 1-bit output for negative edge of clock
10 .C(C), // 1-bit clock input
11 .CE(CE), // 1-bit clock enable input
12 .D(D), // 1-bit DDR data input
13 .R(R), // 1-bit reset
14 .S(S) // 1-bit set
15 );
View Code
DDR_CLK_EDGE 參數為 IDDR 的三種采集模式,分別為“OPPOSITE_EDGE”、“SAME_EDGE”和“SAME_EDGE_PIPELINED”模式。OPPOSITE_EDGE模式的時序圖如下圖所示:
OPPOSITE_EDGE 模式下, 在時鐘的上升沿輸出的 Q1, 時鐘的下降沿輸出 Q2。
SAME_EDGE 模式的時序圖如下圖所示:
圖27.1.17 IDDR“SAME_EDGE”模式時序圖
SAME_EDGE 模式下,在時鐘的上升沿輸出 Q1 和 Q2,但 Q1 和 Q2 不在同一個 cycle 輸出。
SAME_EDGE_PIPELINED 模式的時序圖如下圖所示:
SAME_EDGE_PIPELINED 模式下,在時鐘的上升沿輸出 Q1 和 Q2, Q1 和 Q2 雖然在同一個 cycle 輸出,但整體延時了一個時鐘周期。在使用IDDR時,一般采用此種模式。
四、ODDR
ODDR: 通過 ODDR 把兩路單端的數據合并到一路上輸出,上下沿同時輸出數據,上升沿輸出 a 路,下降沿輸出b路;如果兩路輸入信號一路固定為1, 另外一路固定為0,那么輸出的信號實際上是時鐘信號。
ODDR 的原語結構圖如下圖所示:
C:輸入的同步時鐘;
Q:輸出的 1 位 DDR 數據;
D1 和 D2:分別是“C”時鐘上升沿和下降沿同步輸入的 SDR 數據。
CE:時鐘使能信號;
S/R:置位/復位信號,這兩個信號不能同時拉高。
ODDR 原語模板如下:
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 );
View Code
DDR_CLK_EDGE 參數為 ODDR 的兩種輸出模式,分別為“OPPOSITE_EDGE”和“SAME_EDGE”模式。
OPPOSITE_EDGE 模式的時序圖如下圖所示:
此種模式下, 在 FPGA 內部需要兩個反相時鐘來同步 D1 和 D2, 此種模式使用較少。
SAME_EDGE 模式的時序圖如下圖所示:
此種模式下,數據可以在相同的時鐘邊沿輸出到 Q,一般采用此種模式。
五、IDELAYE2
IDELAYE2: IO 延時原語,用于在信號通過引腳進入芯片內部之前,進行延時調節,一般高速端口信號由于走線延時等原因,需要通過IDELAYE2原語對數據做微調。IDELAYE2原語模板如下:
1 IDELAYE2 #(
2 .CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
3 .DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
4 .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
5 .IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
6 .IDELAY_VALUE(0), // Input delay tap setting (0-31)
7 .PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
8 .REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz
9 .SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
10 )
11 IDELAYE2_inst (
12 .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
13 .DATAOUT(DATAOUT), // 1-bit output: Delayed data output
14 .C(C), // 1-bit input: Clock input
15 .CE(CE), // 1-bit input: Active high enable increment/decrement input
16 .CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
17 .CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
18 .DATAIN(DATAIN), // 1-bit input: Internal delay data input
19 .IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
20 .INC(INC), // 1-bit input: Increment / Decrement tap delay input
21 .LD(LD), // 1-bit input: Load IDELAY_VALUE input
22 .LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
23 .REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
24 );
View Code
IDATAIN 為延時前的輸入信號, DATAOUT 為延時后的輸出信號。
REFCLK_FREQUENCY 參數為 IDELAYCTRL 原語的參考時鐘頻率,一般為 200Mhz;IDELAY_VALUE參數用來設置延時的tap數,范圍為1~31,每個tap數的延時時間和參考時鐘頻率有關。
和 IDELAYE2 對應的還有 ODELAYE2,由于 A7 系列沒有 ODELAYE2 原語, 故此處不做討論。
六、IDELAYCTRL
IDELAYCTRL: IDELAYCTRL 和 IDELAYE2 一般同時使用, IDELAYCTRL 對 IDELAYE2 延時進行校準。
IDELAYCTRL原語如下:
1 (* IODELAY_GROUP = <iodelay_group_name> *) 2 IDELAYCTRL IDELAYCTRL_inst ( 3 .RDY(RDY), // 1-bit output: Ready output 4 .REFCLK(REFCLK), // 1-bit input: Reference clock input 5 .RST(RST) // 1-bit input: Active high reset input 6 );
View Code
IODELAY_GROUP 為延時 IO 分組,一般數據接口位于多個 BANK 時,才需要分組。
IDELAYCTRL 通過參考時鐘 REFCLK 來校準 IDELAY2 每個 tap 的延時值,可用的 REFCLK 頻率為190Mhz~210Mhz或者290Mhz~310Mhz。時鐘頻率越高對應的tap延時平均值越小,即延時調節精度越高。
當參考時鐘為 200Mhz 時,一個 tap 為 78ps。
七、參考資料
1、1_領航者ZYNQ之FPGA開發指南_V1.3,以太網 ARP 測試實驗
總結
以上是生活随笔為你收集整理的014 Xilinx 原语(千兆以太网相关)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: log4j2配置文件模板(带详细注释)
- 下一篇: 基本ILS面的评估