接口接收数据_基于原语的千兆以太网RGMII接口设计

2023-11-16

之前介绍MII接口时,有介绍过RGMII接口的由来,下面在贴一下:

表8‑7 MII接口介绍

简述

Pins

速率计算

MII

基本的100Mbps/10Mbps接口

RXD[3:0]、TXD[3:0]

TX_ER、TX_EN

RX_ER、RX_DV

TX_CLK、RX_CLK

CRS、COL

Clock=25MHz or 2.5MHz

数据位宽4bit(一个时钟周期传输4bit数据)

100Mbps=25 MHz *4bit

10Mbps=2.5 MHz *4bit

RMII

在MII基础上精简的100Mbps/10Mbps接口;

通过提升Clock频率保持与MII一样的速率;

RXD[1:0]、TXD[1:0]

TX_EN

RX_ER

CLK_REF

CRS_DV

Clock=50MHz

数据位宽2bit(一个时钟周期传输2bit数据)

100Mbps=50 MHz *2bit

10Mbps是利用10个周期采样一次数据,相当于

10Mbps=50MHz/10*2bit

SMII

串行MII 100Mbps/10Mbps接口;

进一步提升Clock频率保持与MII一样的速率;

RXD[1:0]

TXD[1:0]

TX_EN

RX_ER

CLK_REF

CRS_DV

Clock=125MHz

数据位宽1bit(一个时钟周期传输1bit数据)

串行数据帧:一帧10bit(8bit data+2bit control)

计算有效带宽时需要去掉控制位

100Mbps=125 MHz *(8bit/10bit)

10Mbps是利用10个周期采样一次数据,相当于

10Mbps=(125 MHz/10)*(8bit/10bit)

GMII

在MII接口基础上提升了数据位宽和Clock频率成为1000Mbps接口

RXD[7:0]、TXD[7:0]

TX_ER、TX_EN

RX_ER、RX_DV

GTX_CLK、RX_CLK

CRS、COL

Clock=125MHz

数据位宽8bit(一个时钟周期传输8bit数据)

1000Mbps=125 MHz *8bit

RGMII

GMII的简化版本

RXD[3:0]、TXD[3:0]

TX_EN

RX_DV

TX_CLK、RX_CLK

CRS、COL

Clock=125MHz

数据位宽4bit(一个时钟周期里,上升沿取TX\RX的0-3bit,下降沿取TX\RX的4-7bit,所以实际还是在一个时钟周期里传输8bit数据)

100

0Mbps=125 MHz *8bit

100Mbps=25 MHz *8bit

10Mbps=2.5MHz *8bit

SGMII

串行GMII,在此基础上提升了时钟频率达到1000Mbps

RXD[0]、TXD[0]

RX_CLK

Clock=125MHz

数据位宽1bit(一个时钟周期传输1bit数据)

串行数据帧:一帧10bit(8bit data+2bit control)

计算有效带宽时需要去掉控制位

1000Mbps=125 0MHz *(8bit/10bit)

RGMII是GMII的简化版本,发送端信号:TXD[3:0]、 TX_CLK、TX_EN,接收端信号:RX_DV、RXD[3:0]、RX_CLK,当Clock=125MHz,数据位宽4bit(一个时钟周期里,上升沿取TX\RX的0-3bit,下降沿取TX\RX的4-7bit,所以实际还是在一个时钟周期里传输8bit数据),1000Mbps=125 MHz *8bit、100Mbps=25 MHz *8bit、10Mbps=2.5MHz *8bit。

其实从实现方式看,很容易看出RGMII传输/收取数据的方式和DDR的方式类似,所以下面会针对这方面详细介绍。

8.5.1.1 RGMII信号定义及时序

RGMII 使用 4bit 数据接口采用上下沿 DDR( Double Data Rate)的方式在一个时钟周期之内传输 8bit数据信号,即上升沿发送或接收数据的低 4 位[3:0],下降沿发送或接收数据的高 4 位[7:4]。

发送端:

TXC:发送数据信号和控制信号对应的同步时钟信号( 125M、 25M、 2.5M)

TXD[3:0]:发送数据信号, 4bit 位宽

TX_CTL:发送控制信号

发送端信号时序如下图所示。

7e99c87e876dea933f34c10aac2825f6.png

图8‑18 RGMII发送端信号时序(来源88E1512datasheet,下同)

一般的 PHY 芯片都支持两种 RGMII 发送端口的时序关系。一种称为非延时模式,如下图所示:

b0b2f7fd99cef9a7ab6e6ee5c3fbfde5.png

图8‑19 RGMII发送端非延时模式(来源88E1512datasheet,下同)

cae42d20499585d00497a3b17919fe6a.png

即要满足时钟信号 TXC 的边沿对准数据信号 TXD[3:0]和控制信号 TX_CTL 有效窗口中心附近的位置,也就是说 TXC 比其他信号存在 2ns( 90°相位)(2ns来源:当 RGMII 接口工作于 1000M 速率时, TXC 和RXC 时钟信号都为 125MHz,那么单个接口的数据率便等同于 250Mbps,单个信号的有效数据窗最大为 4ns。)左右的延时。

另一种为延时模式,如下图所示。

a079d166b7c120e3233951346d9df749.png

图8‑20 RGMII发送端延时模式(来源88E1512datasheet,下同)

666eb704605dae61fc48f59bc8f04b5b.png

这种时序要求 TXC 的边沿不其发送的数据 TXD 和控制信号 TX_CTL 边沿对齐,所有信号具有相同的相位。

一般来说,大部分 PHY 芯片默认都是采用正常时序模式,可通过 MDIO 接口设置寄存器,或者芯片特殊功能引脚将其配置为延时模式。

接收端:

RXC:接收数据信号和控制信号对应的同步时钟信号( 125M、 25M、 2.5M)

RXD[3:0]:接收数据信号,4bit 位宽

RX_CTL:接收控制信号

接收端信号的时序如下图所示。

0f7931748abb3e32fdeea243db4b754a.png

图8‑21 RGMII接收端信号时序

同理接收端也有非延时和延时模式,原理同上,时序图如下。

1014f792877e280d9c924acbff1de80b.png

图8‑22 RGMII接收端非延时模式(来源88E1512datasheet,下同)

737fb96c6d1ecc7cd26d6b47e3265615.png

7c4cbde857c34b4545e40ac35c7fc3ec.png

图8‑23 RGMII接收端延时模式(来源88E1512datasheet,下同)

ad997227e2f6140d60e259dbe0f07167.png

8.5.1.2 RGMII时序中的原语使用

在 FPGA 中设计高速源同步接口的重点在于时序控制和时序约束。

在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、 ODDR、 IDELAYE2、ODELAYE2(A7 中没有)、 IDELAYCTRL。

其中, IDDR 和 ODDR 分别是输入和输出的双边沿寄存器,位于 IOB 中。IDELAYE2 和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时, IDELAYE2 和 ODELAYE2 的延时值需要使用原语 IDELAYCTRL 来进行校准。另外,需要注意的是,在 7 系列器件的 HR Bank 中没有ODELAYE2,只有在 HP BANK 中才有 ODELAYE2。

上述几个原语在Xilinx中属于I/O计算组件,其他常见的原语如下:

表8‑8 I/O端口组件

65015128c3c21cd327f19652d88512c8.png

下面针对即将使用的几个原语进行介绍(摘选自米联客教程,在此谢过):

( 1) IDDR

IDDR 将输入的双边沿 DDR 信号,在输出端恢复为两个并行单边沿 SDR 信号。IDDR 的原语如下。详细参数可参考 UG471。

代码8‑1 IDDR 的原语

1.//      IDDR     : In order to incorporate this function into the design,  

2.//     Verilog   : the following instance declaration needs to be placed  

3.//    instance   : in the body of the design code.  The instance name  

4.//   declaration : (IDDR_inst) and/or the port declarations within the  

5.//      code     : parenthesis may be changed to properly reference and  

6.//               : connect this function to the design.  Delete or comment  

7.//               : out inputs/outs that are not necessary.  

8.  

9.//    

10.  

11.   // IDDR: Input Double Data Rate Input Register with Set, Reset  

12.   //       and Clock Enable.  

13.   //       Artix-7  

14.   // Xilinx HDL Language Template, version 2018.3  

15.  

16.   IDDR #(  

17.      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"   

18.                                      //    or "SAME_EDGE_PIPELINED"   

19.      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1  

20.      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1  

21.      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"   

22.   ) IDDR_inst (  

23.      .Q1(Q1), // 1-bit output for positive edge of clock  

24.      .Q2(Q2), // 1-bit output for negative edge of clock  

25.      .C(C),   // 1-bit clock input  

26.      .CE(CE), // 1-bit clock enable input  

27.      .D(D),   // 1-bit DDR data input  

28.      .R(R),   // 1-bit reset  

29.      .S(S)    // 1-bit set  

30.   );  

31.  

32.   // End of IDDR_inst instantiation  

33.                      

34.              

C 为同步时钟, Q1 和 Q2 则是分别与 C 上升沿和下降沿同步的输出的 SDR 数据, D 为 DDR 输入。参数 DDR_CLK_EDGE 用来决定了 C、 Q1、 Q2 和 D 之间的时序关系。DDR_CLK_EDGE 有 3 种模式:OPPOSITE_EDGE、 SAME_EDGE 以及 SAME_EDGE_PIPELINED,3 种时序关系如下图所示。

31e1e0156442be2e632bdfe24a6d2f0d.png

f52dcebeb3dfedf7248a6d4d36744ee8.png

86fa3738a8967e46574f52ad9512b858.png

图8‑24 DDR_CLK_EDGE 3 种模式(来源UG741)

(2) ODDR

使用 ODDR 将 TXC 同一个时钟周期内的两个 SDR 信号分别通过上升沿和下降沿输出为 DDR 信号。ODDR 的原语如下,详细参数可参考 UG471。

代码8‑2 ODDR原语

1.//      ODDR     : In order to incorporate this function into the design,  

2.//     Verilog   : the following instance declaration needs to be placed  

3.//    instance   : in the body of the design code.  The instance name  

4.//   declaration : (ODDR_inst) and/or the port declarations within the  

5.//      code     : parenthesis may be changed to properly reference and  

6.//               : connect this function to the design.  Delete or comment  

7.//               : out inputs/outs that are not necessary.  

8.  

9.//    

10.  

11.   // ODDR: Output Double Data Rate Output Register with Set, Reset  

12.   //       and Clock Enable.  

13.   //       Artix-7  

14.   // Xilinx HDL Language Template, version 2018.3  

15.  

16.   ODDR #(  

17.      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"   

18.      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1  

19.      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"   

20.   ) ODDR_inst (  

21.      .Q(Q),   // 1-bit DDR output  

22.      .C(C),   // 1-bit clock input  

23.      .CE(CE), // 1-bit clock enable input  

24.      .D1(D1), // 1-bit data input (positive edge)  

25.      .D2(D2), // 1-bit data input (negative edge)  

26.      .R(R),   // 1-bit reset  

27.      .S(S)    // 1-bit set  

28.   );  

29.  

30.   // End of ODDR_inst instantiation  

31.                      

32.                  

DDR_CLK_EDGE 有两种模式: OPPOSITE_EDGE 和 SAME_EDGE,两种时序关系如下图所示。

7c464291b0a10483bbf42da9115d034d.png

7f5dea0f74420b5fe89ffc2310dfea6a.png

图8‑25 DDR_CLK_EDGE两种模式

对于 OPPOSITE_EDGE 模式,在 FPGA 内部也同样需要两个反相时钟来同步 D1 和 D2,较少使用。在设计 RGMII 接口时使用了 SAME_EDGE 模式。

(3) IDELAYE2

IDELAYE2 用于在信号通过引脚进入芯片内部之前,进行延时调节。这里给出本方案中的用法,原语描述如下。详细参数可参考 UG471。

代码8‑3 IDELAYE2 原语

1.//  IDELAYE2   : In order to incorporate this function into the design,  

2.//   Verilog   : the following instance declaration needs to be placed  

3.//  instance   : in the body of the design code.  The instance name  

4.// declaration : (IDELAYE2_inst) and/or the port declarations within the  

5.//    code     : parenthesis may be changed to properly reference and  

6.//             : connect this function to the design.  All inputs  

7.//             : and outputs must be connected.  

8.  

9.//    

10.  

11.   // IDELAYE2: Input Fixed or Variable Delay Element  

12.   //           Artix-7  

13.   // Xilinx HDL Language Template, version 2018.3  

14.  

15.   (* IODELAY_GROUP =  *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL  

16.  

17.   IDELAYE2 #(  

18.      .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)  

19.      .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)  

20.      .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")  

21.      .IDELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE  

22.      .IDELAY_VALUE(0),                // Input delay tap setting (0-31)  

23.      .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE  

24.      .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).  

25.      .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal  

26.   )  

27.   IDELAYE2_inst (  

28.      .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output  

29.      .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output  

30.      .C(C),                     // 1-bit input: Clock input  

31.      .CE(CE),                   // 1-bit input: Active high enable increment/decrement input  

32.      .CINVCTRL(CINVCTRL),       // 1-bit input: Dynamic clock inversion input  

33.      .CNTVALUEIN(CNTVALUEIN),   // 5-bit input: Counter value input  

34.      .DATAIN(DATAIN),           // 1-bit input: Internal delay data input  

35.      .IDATAIN(IDATAIN),         // 1-bit input: Data input from the I/O  

36.      .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input  

37.      .LD(LD),                   // 1-bit input: Load IDELAY_VALUE input  

38.      .LDPIPEEN(LDPIPEEN),       // 1-bit input: Enable PIPELINE register to load data input  

39.      .REGRST(REGRST)            // 1-bit input: Active-high reset tap-delay input  

40.   );  

41.  

42.   // End of IDELAYE2_inst instantiation  

43.                      

44.                  

(4) ODELAYE2

ODELAYE2原语如下,更多详细信息可参考 UG471。

代码8‑4 ODELAYE2原语

1.//  ODELAYE2   : In order to incorporate this function into the design,  

2.//   Verilog   : the following instance declaration needs to be placed  

3.//  instance   : in the body of the design code.  The instance name  

4.// declaration : (ODELAYE2_inst) and/or the port declarations within the  

5.//    code     : parenthesis may be changed to properly reference and  

6.//             : connect this function to the design.  All inputs  

7.//             : and outputs must be connected.  

8.  

9.//    

10.  

11.   // ODELAYE2: Output Fixed or Variable Delay Element  

12.   //           Kintex-7  

13.   // Xilinx HDL Language Template, version 2018.3  

14.  

15.   (* IODELAY_GROUP =  *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL  

16.  

17.   ODELAYE2 #(  

18.      .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)  

19.      .DELAY_SRC("ODATAIN"),           // Delay input (ODATAIN, CLKIN)  

20.      .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")  

21.      .ODELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE  

22.      .ODELAY_VALUE(0),                // Output delay tap setting (0-31)  

23.      .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE  

24.      .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).  

25.      .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal  

26.   )  

27.   ODELAYE2_inst (  

28.      .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output  

29.      .DATAOUT(DATAOUT),         // 1-bit output: Delayed data/clock output  

30.      .C(C),                     // 1-bit input: Clock input  

31.      .CE(CE),                   // 1-bit input: Active high enable increment/decrement input  

32.      .CINVCTRL(CINVCTRL),       // 1-bit input: Dynamic clock inversion input  

33.      .CLKIN(CLKIN),             // 1-bit input: Clock delay input  

34.      .CNTVALUEIN(CNTVALUEIN),   // 5-bit input: Counter value input  

35.      .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input  

36.      .LD(LD),                   // 1-bit input: Loads ODELAY_VALUE tap delay in VARIABLE mode, in VAR_LOAD or  

37.                                 // VAR_LOAD_PIPE mode, loads the value of CNTVALUEIN  

38.  

39.      .LDPIPEEN(LDPIPEEN),       // 1-bit input: Enables the pipeline register to load data  

40.      .ODATAIN(ODATAIN),         // 1-bit input: Output delay data input  

41.      .REGRST(REGRST)            // 1-bit input: Active-high reset tap-delay input  

42.   );  

43.  

44.   // End of ODELAYE2_inst instantiation  

45.                      

46.                  

(5) IDELAYCTRL

IDELAY2 和 ODELAY2 都需要 IDELAYCTRL 来进行校准。IDELAYCTRL 原语如下。更多详细信息可参考 UG471。

代码8‑5 IDELAYCTRL 原语

1.// IDELAYCTRL  : In order to incorporate this function into the design,  

2.//   Verilog   : the following instance declaration needs to be placed  

3.//  instance   : in the body of the design code.  The instance name  

4.// declaration : (IDELAYCTRL_inst) and/or the port declarations within the  

5.//    code     : parenthesis may be changed to properly reference and  

6.//             : connect this function to the design.  All inputs  

7.//             : and outputs must be connected.  

8.  

9.//    

10.  

11.   // IDELAYCTRL: IDELAYE2/ODELAYE2 Tap Delay Value Control  

12.   //             Artix-7  

13.   // Xilinx HDL Language Template, version 2018.3  

14.  

15.   (* IODELAY_GROUP =  *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL  

16.  

17.   IDELAYCTRL IDELAYCTRL_inst (  

18.      .RDY(RDY),       // 1-bit output: Ready output  

19.      .REFCLK(REFCLK), // 1-bit input: Reference clock input  

20.      .RST(RST)        // 1-bit input: Active high reset input  

21.   );  

22.  

23.   // End of IDELAYCTRL_inst instantiation  

24.                      

25.                      

IDELAYCTRL 需要一个参考时钟信号 REFCLK 来校准 IDELAY2 和 ODELAY2 每个 tap 的延时值,可用的 REFCLK 频率为 200M、 300M、 400M。时钟越高对应的 tap 延时平均值越小,也就是说延时调节精度越高。DS182 中对此有如下描述。

314847f7b2d8d2190d26e14e301e4ab6.png

图8‑26 DS182 中描述

大部分情冴下使用 200M 的参考时钟就可以满足实际需求。

8.5.1.3 RGMII发送接口设计

(1) PHY RGMII 发送接口时序

相关的时序在上面已经介绍,主要关注tsetup、thold 默认模式具体如下:

e0d4d8fb5d646eda8782432ea93e6a61.png

(2)设计方案

针对上述时序关系, RGMII 发送接口的设计方案如下图所示。

28aaa2b2d85422fa6d3953ea0c2a68ed.png

图8‑27 RGMII 发送接口的设计方案

(3)时序约束

针对 RGMII 发送接口需要进行 output delay 约束,如下所示。使用 MMCM 输出的时钟 phy_tx_clk 作为所有 ODDR 的输入时钟。这里以 1 个 RGMII 接口为例。

代码8‑6 时序约束

1.settx_clk [get_clocks -include_generated_clocks -of [get_pins clk_wiz_0/inst/mmcm_adv_inst/CLKOUT1]]  

2.create_generated_clock -name phy_tx_clk -source [get_pins clk_wiz_0/inst/mmcm_adv_inst/CLKOUT1] -multiply_by1 [get_ports phy1_rgmii_tx_clk]  

3.set_output_delay -clock [get_clocksphy_tx_clk] -max -0.900 [get_ports {phy1_rgmii_tx_ctl phy1_rgmii_tx_data[*]}}]  

4.set_output_delay -clock [get_clocksphy_tx_clk] -min -2.900 [get_ports {phy1_rgmii_tx_ctl {phy1_rgmii_tx_data[*]}}]  

5.set_output_delay -clock [get_clocksphy_tx_clk] -max -0.900 [get_ports {phy1_rgmii_tx_ctl {phy1_rgmii_tx_data[*]}}] -clock_fall -  

6.add_delay  

7.set_output_delay -clock [get_clocksphy_tx_clk] -min -2.900 [get_ports {phy1_rgmii_tx_ctl {phy1_rgmii_tx_data[*]}}] -clock_fall -add_delay  

由于时序分析中存在 2 个时钟 phy_tx_clk 和 tx_clk,这两个时钟在物理上实际是同 1 个时钟,都是由MMCM 同 1 个引脚输出的。但是时序分析工具会把它们当做 2 个不同的时钟而进行跨时钟域分析。因此,需要剔除这 2 个时钟之间的一些虚假路径,避免时序报错。

针对本文档的设计方法,RGMII 发送接口 DDR 的 setup time 分析是从 rise 到 rise,或者 fall 到 fall。因此需要剔除 rise 到 fall 和 fall 到 rise 的 setup time 伪路径。同理, hold time 分析是从 rise 到 fall 或fall 到 rise,因此需要剔除 rise 到 rise 和 fall 到 fall 的 hold time 伪路径。如下所示:

1.set_false_path -fall_from $tx_clk -rise_to [get_clocksphy_tx_clk] -setup  

2.set_false_path -rise_from $tx_clk -fall_to [get_clocksphy_tx_clk] -setup  

3.set_false_path -fall_from $tx_clk -fall_to [get_clocksphy_tx_clk] -hold  

4.set_false_path -rise_from $tx_clk -rise_to [get_clocksphy_tx_clk] -hold  

除此之外,由于 setup time 分析是从 rise 到 rise 或fall 到 fall 的。为了避免时序分析工具对 2 个时钟phy_tx_clk 和 tx_clk 之间 setup time 进行错误的多周期分析,需要进行如下约束。

1.set_multicycle_path 0 -setup -end -rise_from $tx_clk -rise_to [get_clocksphy_tx_clk]  

2.set_multicycle_path 0 -setup -end -fall_from $tx_clk -fall_to [get_clocksphy_tx_clk]  

8.5.1.4 RGMII接收接口设计

(1) PHY RGMII 接收接口时序

相关的时序在上面已经介绍,主要关注tsetup、thold 默认模式具体如下:

ad997227e2f6140d60e259dbe0f07167.png

(2)设计方案

针对上述时序关系, RGMII 接收接口的设计方案如下图所示。通过 FPGA 引脚输入的时钟 RXC 经过BUFIO 可以通过最短的延时接入 IDDR 中。另外,输入时钟经过 BUFG 或者 BUFR 进入 FPGA 内部时钟网络供内部逻辑所使用。BUFR 仅局限于单个 clock region 内部的逻辑资源,如果逻辑规模较大,建议使用 BUFG

c1fc620aace09956d537a223870ec66c.png

图8‑30 RGMII 接收接口的设计方案

(3)时序约束

针对 RGMII 接收接口需要进行 intput delay 约束,如下所示。使用 PHY 芯片输入时钟作为所有 IDDR的输入时钟。这里以 1 个 RGMII 接口为例。

1.create_clock -period 6.000 -name phy1_rx_clk [get_ports phy1_rgmii_rx_clk]  

2.set_input_delay -clock [get_clocks phy1_rx_clk] -max 2.800 [get_ports {{phy1_rgmii_rx_data[*]} phy1_rgmii_rx_ctl}]  

3.set_input_delay -clock [get_clocks phy1_rx_clk] -min 1.200 [get_ports {{phy1_rgmii_rx_data[*]} phy1_rgmii_rx_ctl}]  

4.set_input_delay -clock [get_clocks phy1_rx_clk] -clock_fall -max -add_delay 2.800 [get_ports {{phy1_rgmii_rx_data[*]} phy1_rgmii_rx_ctl}]  

5.set_input_delay -clock [get_clocks phy1_rx_clk] -clock_fall -min -add_delay 1.200 [get_ports {{phy1_rgmii_rx_data[*]} phy1_rgmii_rx_ctl}]  

除此之外,还需要将所有 IDELAYE2 和 IDELAYCTRL 约束到一个 group 中。在 7 系列器件中, 1 个BANK 对应一个 clock region,每个 clock region 对应 1 个 IDELAYCTRL。FPGA中有 4 组 RGMII 接收接口,分布在 BANK13 和 BANK14 中。因此,需要分 2 个 group 进行约束,约束如下。

1.set_property IODELAY_GROUP iodelay_grp_bank13 [get_cells {idelayctrl_inst1 rgmii_receive_module1/delay_rgmii_rx_ctl  

2.{rgmii_receive_module1/RGMII_RX_DATA_BUS[*].delay_rgmii_rxd}}]  

3.set_property IODELAY_GROUP iodelay_grp_bank13 [get_cells {rgmii_receive_module2/delay_rgmii_rx_ctl  

4.{rgmii_receive_module2/RGMII_RX_DATA_BUS[*].delay_rgmii_rxd}}]  

5.set_property IODELAY_GROUP iodelay_grp_bank14 [get_cells {idelayctrl_inst2 rgmii_receive_module3/delay_rgmii_rx_ctl  

6.{rgmii_receive_module3/RGMII_RX_DATA_BUS[*].delay_rgmii_rxd}}]  

7.set_property IODELAY_GROUP iodelay_grp_bank14 [get_cells {rgmii_receive_module4/delay_rgmii_rx_ctl  

8.{rgmii_receive_module4/RGMII_RX_DATA_BUS[*].delay_rgmii_rxd}}]  

另外,约束每组 RGMII 接收接口的 IDELAYE2 的延时 tap 数,经尝试最佳 tap 为 14。如下所示。

1.set_property IDELAY_VALUE 14 [get_cells rgmii_receive_module1/delay_rgmii_rx_ctl]  

2.set_property IDELAY_VALUE 14 [get_cells {rgmii_receive_module1/RGMII_RX_DATA_BUS[*].delay_rgmii_rxd}]  

8ed6ce3108706f06436af85dced3cd33.pngOpenFPGA推荐搜索

ZYNQ

图像处理

数字信号处理

eb7be953b68444412a7c7ed94d60d1d0.png

推荐阅读

Xilinx原语的用法

例说七层OSI参考模型

TCP/IP模型

TCP和UDP

以太网遵循的IEEE 802.3 标准

媒体访问控制(MAC,Media Access Control)

媒体独立接口(MII,Meida Independent Interface)

GMII、SGMII和SerDes的区别和联系

PHY(Physical Layer,PHY)通俗理解

FPGA实现网口通信的几种方式

千兆网UDP通信

FPGA千兆网TCP通信分析

基于FPGA的网口通信实例设计

基于UDP/IP协议的电口通信(一)

基于UDP/IP协议的电口通信(二)

基于UDP/IP协议的电口通信(三)
一大波HLS设计资料来了

2020版深入浅出玩转FPGA视频教程

点击上方字体即可跳转阅读哟

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接口接收数据_基于原语的千兆以太网RGMII接口设计 的相关文章

  • docker gitlab 数据 迁移 2770

    我的操作步骤 1 把 gitlab目录下 的 data etc log 目录下压缩并拷贝 2 把压缩文件 拷贝到新的gitlab 指定目录下 3 启动 错误 up to date storage directory var opt gitl
  • Qt中使用OpenGL渲染视频

    Qt5 4之后 OpenGL在Qt中可以通过QOpenGLWidget和QOpenGLFunctions来实现 以下Demo 只展示OpenGL相关部分 解码出AVFrame后对其进行渲染 顶点Shader static const cha
  • go语言基础-----24-----命令行解析Go flag、uuid唯一ID

    一 命令行解析Go flag 1 定义flag参数的相关函数 参数有三个 第一个为 参数名称 第二个为 默认值 第三个是 使用说明 1 通过 flag String Bool Int 等 flag Xxx 方法 该种方式返回一个相应的指针
  • powershell初探(九)

    最近公司需要用到com 其中涉及到很多的注册问题 记录在这里 希望在帮到别人的同时 也能解决自己的问题 0 写在前面 本人菜鸟一枚 本章的总结都来自于网络 如果有错漏之处 还望牛人指正 1 COM是做什么用的 com是包含了实现一个或多个接
  • jQuery 入门教程(15): 删除HTML元素

    jQuery使用下面两个方法来删除或是清空某个HTML元素 remove 删除指定的元素 包括其子元素 empty 清空指定元素的子元素 例如 html view plain copy print
  • 通过查看Qt助手(QtAssistant)了解并使用自己需要Qt库

    常用库 我们需要知道常用的库有哪些 才能使用他们 QtCore基本库 基本数据类型 QString 不直接使用c 中String QByteArray 字节数组 基本数据结构 QList QVector QMap 输入输出类 QTextSt
  • MFC中删除控件的操作

    一 手动删除 1 首先确定控件有哪些相关的变量和函数 打开 rc2文件在里面删除对应的控件图标 2 打开主对话框头文件 一般类向导生成的函数和变量定义都在头文件的最后一个 public l里 找到生成的变量定义和函数定义将其删除 3 打开对
  • 计算机专业推荐游戏本,十大游戏笔记本电脑排名 热门游戏本推荐

    1 惠普 暗影精灵4 Pro 15 6英寸游戏本 暗影精灵4 Pro最吸引人的点莫过于搭载了新一代GeForce RTX2060显卡 拥有6G显存 性能提升高达6倍 并将AI增强图形技术和光线追踪技术引入游戏 让游戏世界可以模拟每道光迹的真
  • Quick Test Professional9.0编程常用方法及实例详解

    通过QTP获取Web页面中对象属性 在制作自动化用例时需要知道大部分控件的name值 我们不可能都向开发人员询问 QTP为我们提供了一个很好的工具 Object Spy 使用它可以为我们把每个需要的对象属性全部列出来 打开QTP 工具 对象
  • 解决keil5仿真提示内存不对齐

    仿真提示 JLink Warning Mis aligned memory write Address 0x20000000 NumBytes 2 Alignment 2 Halfword aligned 解决办法 将keil安装目录D K
  • Manjaro linuxqq闪退问题

    删除配置文件即可 rm r config QQ
  • Java中的抽象类和接口有什么区别(面试题)

    Java中的抽象类和接口有什么区别 面试题 概念 对比 补充 概念 抽象类 在面向对象的概念中 所有的对象都是通过类来描绘的 但是反过来 并不是所有的类都是用来描绘对象的 如果一个类中没有包含足够的信息来描绘一个具体的对象 这样的类就是抽象
  • 【深度】区块链技术安全威胁分析(附下载)

    解码区块链 专题文章一 区块链技术安全威胁分析 2020年4月20日 国家发改委明确 新基建 定义和范围 表态 区块链 被纳入其中 为深入探索区块链技术的发展应用 挖掘对零售行业产生的影响和机遇 苏宁零售技术研究院联合业内资深学者和企业技术
  • MSP432 串口通信

    文章目录 MSP432P401R基础使用 四 串口收发 一 MSP432P401R串口资源 二 UART模式的特性 三 库函数 四 一般配置步骤 五 代码 MSP432P401R基础使用 四 串口收发 一 MSP432P401R串口资源 详
  • python中数据结构之列表,元组,字典,集合

    一 列表 列表 引入一个新的概念 数据结构 数据结构是通过某种方式组织在一起的数据元素的集合 这些数据元素可以是数字或字符 甚至可以是其他数据结构 在 python 中 最基本的数据结构是序列 序列中的每个元素匾被分配一个序号 即元素的位置
  • php://filter(文件包含漏洞利用)

    网址 index php page php filter convert base64 encode resource index php 例如 http 120 24 86 145 8005 post index php file php
  • 论文写作 计算机类顶会顶刊,及论文发表指导

    计算机方向的一些顶级会议和期刊 转载 国内的学报期刊 SCI级 但是IF比较低 也不是特别专门针对计算机视觉 物理学报 红外与毫米波学报 etc EI级 自动化学报 光学精密工程 电子学报 软件学报 计算机研究与发展 计算机学报 征稿指南
  • C#通过TCP传送结构体

    1 定义结构体 命名空间 using System Runtime InteropServices 注意这个属性不能少 StructLayoutAttribute LayoutKind Sequential CharSet CharSet

随机推荐

  • 元器件选型实例(如何选一款合适的 DC-DC )

    授人以鱼不如授人以渔 实际项目的元器件选型 如何选择合适的元器件 矜辰所致 目录 前言 一 应用背景 二 选型准备 2 1 考虑因素 通用因数 结合实际 2 2 初步确定方案 三 实际选型 3 1 查找目标 3 2 筛选目标 价格和库存 3
  • 设计模式详解(四)——原型模式

    一 场景问题 在电商系统中 订单服务通常是业务核心模块之一 在提交订单的过程中 往往会出现某个订单数额较大的订单 例如一些企业订单订购公司员工节假日礼品 往往会订购成千上万件 如果不做拆分 就会导致订单票据较长 此时就会有拆分订单的操作 假
  • CSS 媒体查询

  • FTPUpload

    std string g strVer Mozilla 5 0 Windows NT 6 1 WOW64 rv 13 0 Gecko 20100101 Firefox 13 0 1 size t CallBackHeader void pS
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • [vue3]vue3中引入class类的写法

    1 在src utils topu下创建一个ts文件 topu ts class Topu Topu类中涉及到的变量 都要提前在这个部分定义好 width Number 结尾必须顿号 不然报错 height Number data any
  • Android之Adapter用法总结

    1 概念 Adapter是连接后端数据和前端显示的适配器接口 是数据和UI View 之间一个重要的纽带 在常见的View ListView GridView 等地方都需要用到Adapter 如下图直观的表达了Data Adapter Vi
  • 【解决方法】Windows7 任务计划程序 “任务计划程序服务不可用。任务计划程序将尝试重新与其建立连接。”

    目录 问题背景 问题描述 折腾过程 解决方法 适用于我的解决方法 2 其他解决方法 供参考 解决方法1 3 解决方法2 4 解决方法3 4 解决方法4 5 出错原因 参考资料 问题背景 今天刚好给家里的旧电脑加上新的内存条 组了个双通道 顺
  • FTP搭建教程

    FTP搭建教程 目录 一 FTP简介 二 搭建FTP 一 FTP简介 FTP中文为文件传输协议 简称为文传协议 它也是一个应用程序 不同的操作系统有不同的FTP应用程序 这些应用程序都遵守同一种协议以传输文件 FTP主要的功能是 上传 和
  • 1011. 在 D 天内送达包裹的能力

    传送带上的包裹必须在 D 天内从一个港口运送到另一个港口 传送带上的第 i 个包裹的重量为 weights i 每一天 我们都会按给出重量的顺序往传送带上装载包裹 我们装载的重量不会超过船的最大运载重量 返回能在 D 天内将传送带上的所有包
  • 用Python 编写Logistics算法

    我们用Python来自己编写Logistics算法 首先 先将一些理论 Logistics算法用于实现线性可分的二分类问题 1 Sigmoid函数 fx 1 1 exp x Sigmoid函数是常用的阈值函数之一 函数图像如下 是不是很像累
  • Kotlin内部类

    一 内部类 定义在类内部的类 与类成员有相似的访问控制 kotlin 默认是静态内部类 非静态用inner关键字 this outter this inner的用法 二 匿名内部类 没有定义名字的内部类 类名编译时生产 类似Outter 1
  • 算法[第四版]-图灵程序设计丛书-笔记

    第一章 笔记 1 1 9 编写一段代码 将一个正整数 N 用二进制表示并转换为一个 String 类型的值 s public class Conversionbinary public static void main String arg
  • 计算机科学巨匠

    贝尔实验室联合多家准备开发Multics 系统 但是最后退出了 但是却培养了优秀的人才 如肯汤姆森 花了四周时间自己做了一个简化的系统 这就是Unix的雏形 因为简化所以同事称为unics 后来觉得用B语言编写性能差 与Ritchie 合作
  • u版YOLOv3的卷积权重分享

    网上有许多关于预训练权重的分享 但大部分都要收费 官网下载又太慢了 自己就破费一把 本着一人收费 大家共享的原则 将自己花钱下载的权重文件分享出来 yolov3 tiny conv 15 darknet53 conv 74 链接 https
  • 动态规划C语言初学

    动态规划问题解决的基本思想 1 根绝问题所求的那一项和变量的个数 确定是一维数组 二维数组或者多维数组 2 写出初始值 一般是某个变量为1或者0 的特殊情况时候的解 3 通过循环 一般是两个循环中间每一层循环表示一个变量的递增情况 4 在循
  • 查看服务器文件命令,服务器上查看文件命令

    服务器上查看文件命令 内容精选 换一换 您可以使用JDK自带的keytool工具自制客户端的密钥库文件 client p12 再使用第三方openssl工具将client p12转换为client pem 最后根据client pem文件得
  • python期货基本面分析_Python量化炒期货入门与实战技巧

    1 1 初识量化炒期货 2 1 1 1 什么是量化炒期货 2 1 1 2 为什么要学习量化炒期货 3 1 2 量化炒期货的特点 4 1 2 1 严格的纪律性 5 1 2 2 完备的系统性 5 1 2 3 妥善运用套利的思想 5 1 2 4
  • 消息摘要算法

    文章目录 概述 MD Message Digest SHA Secure Hash Algorithm MAC Message Authentication Code 其它 概述 看图 我们在下载commons codec时候会有这么一个页
  • 接口接收数据_基于原语的千兆以太网RGMII接口设计

    之前介绍MII接口时 有介绍过RGMII接口的由来 下面在贴一下 表8 7 MII接口介绍 简述 Pins 速率计算 MII 基本的100Mbps 10Mbps接口 RXD 3 0 TXD 3 0 TX ER TX EN RX ER RX