当前位置:   article > 正文

PHY RGMII Interface Timing注意事项_rgmii-rxid

rgmii-rxid

RGMII Timing 背景

RGMII接口是以太网PHY和以太网MAC之间的物理连接。如果使用以太网FMC, PHY是Marvell 88E151x,以太网MAC在FPGA内部。RGMII接口是DDR (dual data rate)接口,由FPGA到PHY的发送路径和PHY到FPGA的接收路径组成。两个路径都有一个独立的时钟,4个数据信号和一个控制信号。
RGMII标准规定数据和时钟同时输出(即。时钟没有任何倾斜),如下面的左侧图像所示。为正确取样

如果你正在经历以下问题之一,那么你可能有一个问题与你的RGMII接口:
以太网端口正在发送但未接收
以太网端口正在接收但未发送
以太网端口工作在10Mbps和100Mbps,但无法工作在1Gbps

RGMII无时钟偏移

RGMII标准规定时钟和数据信号输出无倾斜,即。时钟边缘与数据边缘对齐。这对于接收器的采样电路来说并不理想,但它极大地简化了发送电路。
在这里插入图片描述

RGMII Interface 时钟偏移

时钟倾斜接口
RGMII时钟和数据信号,因为它们必须呈现给接收电路进行最佳采样。时钟偏差是由PCB走线或接收设备添加的。
在这里插入图片描述

添加时钟偏移

在基于FPGA的系统中,有三个阶段需要的倾斜(即。延迟)可以添加到TX和RX时钟信号。第一阶段是在FPGA中,第二阶段是在PCB走线上。时钟走线比数据走线长),第三阶段在PHY中。在最优的RGMII接口中,在TX和RX路径中仅在一个阶段添加倾斜,而其他两个延迟阶段被禁用或未实现。

时钟偏移阶段在RGMII接口

在这里插入图片描述
TX和RX时钟的倾斜可以独立管理,它不必在每个路径上的同一阶段实现,但必须在每个路径上的某个地方实现。因此,了解目标系统中的每个延迟阶段是至关重要的,以便确保rmmii接口中的时钟正确地倾斜。现在我们将讨论每个倾斜阶段以及启用或禁用它们的各种方法。

阶段1:FPGA
时钟偏差是否在FPGA中实现,以及如何实现取决于您用于实现MAC的IP。
以太网子系统
在这里插入图片描述
TX时钟偏差:YES
AMD Xilinx AXI以太网子系统IP IP核被设计为输出具有倾斜的TX时钟,并且在Vivado GUI中没有选项来禁用此倾斜。它通过时钟转发时钟来实现这一点,时钟相对于用于输出数据信号的时钟有90度的相移。总之,当使用AXI以太网子系统时,您必须禁用PHY中的TX时钟倾斜,并确保PCB上的TX时钟跟踪没有增加倾斜。

RX时钟偏差:无
AXI以太网子系统IP核不增加RX时钟的倾斜,因此倾斜必须由PHY或PCB走线添加。
有关AXI以太网子系统中TX和RX时钟偏差的更多详细信息,您必须参考AMD Xilinx AXI以太网子系统IP封装的三模式以太网MAC IP的产品指南。

GMII-to-RGMII
(用于通过EMIO连接Zynq GEM)
在这里插入图片描述
TX时钟偏差:可选
AMD赛灵思GMII-to-RGMII IP核可以选择在TX时钟上增加2ns的偏差。这个选项可以在Vivado GUI中通过“歪斜添加PHY”选项访问(见下图)。当这个选项被选中时,核心将输出没有倾斜的TX时钟。当不勾选时,核心将输出具有2ns偏差的TX时钟。

在这里插入图片描述
RX时钟偏差:无
根据AMD Xilinx GMII-to-RGMII IP产品指南第29页,GMII-to-RGMII内核不会给RX时钟增加倾斜,因此倾斜必须由PHY或PCB时钟迹线添加。
有关GMII-to-RGMII内核中TX和RX时钟偏差的更多详细信息,请参阅产品指南。

Zynq GEM通过MIO实现
在这里插入图片描述
TX时钟偏差:NO
Zynq GEMs不向TX时钟添加时钟倾斜,因此倾斜必须由PHY或PCB跟踪添加。
RX时钟偏差:无
Zynq GEMs不向RX时钟添加时钟倾斜,因此倾斜必须由PHY或PCB迹线添加。
如果您使用的是以太网FMC,那么Zynq MIO引脚不太可能路由到FMC连接器,但是为了完整起见,这里已经包含了这种情况。

第二阶段:PCB
在这里插入图片描述

以太网FMC具有FMC连接器和物理之间长度匹配的时钟和数据走线,因此,以太网FMC PCB走线不会增加时钟偏差。然而,为了获得完整的图像,我们还必须考虑FPGA板上走线的长度。幸运的是,大多数FMC载波(如ZedBoard和AMD Xilinx ZC706)在FPGA和所有FMC连接器的I/ o之间设计了长度匹配的走线。因此,在大多数情况下,当使用以太网FMC时,您可以期望从物理到物理的整个时钟和数据跟踪的长度都是匹配的

自定义FPGA板
虽然PCB走线可以设计为实现时钟倾斜,但在大多数情况下,这是实现倾斜的最不理想的位置,因此大多数电路板设计人员将路由长度匹配的RGMII时钟和数据走线。也就是说,重要的是要知道您的PCB的RGMII接口是否已经路由时钟倾斜,以便您知道如何适当地配置FPGA和物理-如果您不确定,请询问您的电路板设计师。如果您的PCB已经路由时钟倾斜,那么您必须禁用FPGA和PHY中的时钟倾斜。

阶段3:PHY
在Linux应用程序中,启用或禁用内部时钟延迟的最简单方法是通过设备树。设备树将为每个以太网接口包含一个部分,它应该与右侧显示的部分类似。
为了启用或禁用内部时钟延迟,我们为“phy-mode”参数指定一个特定的值。
Both internal delays DISABLED: phy-mode = “rgmii”;
Both internal delays ENABLED: phy-mode = “rgmii-id”;
Only RX internal delay ENABLED: phy-mode = “rgmii-rxid”;
Only TX internal delay ENABLED: phy-mode = “rgmii-txid”;

&axi_ethernet_0 {  
    local-mac-address = [00 0a 35 00 01 22];  
    phy-handle = <&phy0>;  
    xlnx,has-mdio = <0x1>;  
    phy-mode = "rgmii";  
    mdio {  
        #address-cells = <1>;  
        #size-cells = <0>;  
        phy0: phy@0 {  
            compatible = "marvell,88e1510";  
            device_type = "ethernet-phy";  
            reg = <0>;  
        };  
    };  
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

独立的
当使用独立应用程序时,我们必须通过MDIO总线执行特定的寄存器写操作,以便启用/禁用内部时钟延迟。
通过设置第2页寄存器21的第4位来启用TX时钟延迟。
RX时钟延迟通过设置第2页寄存器21的第5位来启用。
下面是对4种可能的配置中的每一种进行此操作的示例。注意,我们使用的是对AXI以太网子系统库的函数调用;Zynq GEM的等效函数名称将略有不同。

#define PHY_ADDRESS                0   // Ethernet FMC PHY address
#define IEEE_CONTROL_REG_MAC       21  // The register containing the TX/RX clock delay enables
#define IEEE_PAGE_ADDRESS_REGISTER 22  // For specifying the page number
#define IEEE_RGMII_TX_CLOCK_DELAYED_MASK 0x0010
#define IEEE_RGMII_RX_CLOCK_DELAYED_MASK 0x0020

u16 control;

// RGMII with both internal delays disabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control &= ~(IEEE_RGMII_TX_CLOCK_DELAYED_MASK | IEEE_RGMII_RX_CLOCK_DELAYED_MASK);
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);

// RGMII with both internal delays enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control |= (IEEE_RGMII_TX_CLOCK_DELAYED_MASK | IEEE_RGMII_RX_CLOCK_DELAYED_MASK);
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);

// RGMII with only RX internal delay enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control &= ~IEEE_RGMII_TX_CLOCK_DELAYED_MASK;
control |= IEEE_RGMII_RX_CLOCK_DELAYED_MASK;
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);

// RGMII with only TX internal delay enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control |= IEEE_RGMII_TX_CLOCK_DELAYED_MASK;
control &= ~IEEE_RGMII_RX_CLOCK_DELAYED_MASK;
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

案列:
在本节结束时,我们将列出每个可能用例所需的rmmii延迟配置。由于大多数应用使用长度匹配的PCB走线,我们将假设PCB没有增加时钟偏差。以下是三个MAC选项所需的配置:

案例1:使用AXI以太网子系统
TX时钟倾斜必须在PHY中禁用(因为倾斜是在FPGA中实现的)
RX时钟倾斜必须在PHY中启用
在Linux中,使用:

phy-mode = "rgmii-rxid";
  • 1

在独立应用程序中,使用以下代码:

// RGMII with only RX internal delay enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control &= ~IEEE_RGMII_TX_CLOCK_DELAYED_MASK;
control |= IEEE_RGMII_RX_CLOCK_DELAYED_MASK;
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

案例2:使用GMII-to-RGMII (Zynq GEM通过EMIO)
当使用GMII-to-RGMII时,你可以选择在哪里实现TX时钟倾斜,所以有两种可能性:
选项1:在FPGA中启用TX时钟倾斜
TX时钟倾斜必须在PHY中禁用
RX时钟倾斜必须在PHY中启用
在Linux中,使用:

phy-mode = "rgmii-rxid";
  • 1

In standalone applications, use the following code:

// RGMII with only RX internal delay enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control &= ~IEEE_RGMII_TX_CLOCK_DELAYED_MASK;
control |= IEEE_RGMII_RX_CLOCK_DELAYED_MASK;
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Option 2: TX clock skew DISABLED in FPGA

TX clock skew must be ENABLED in the PHY
RX clock skew must be ENABLED in the PHY
In Linux, use:

phy-mode = "rgmii-id";
  • 1

In standalone applications, use the following code:

// RGMII with both internal delays enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control |= (IEEE_RGMII_TX_CLOCK_DELAYED_MASK | IEEE_RGMII_RX_CLOCK_DELAYED_MASK);
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);
  • 1
  • 2
  • 3
  • 4
  • 5

Case 3: Using Zynq GEM via MIO

TX clock skew must be ENABLED in the PHY
RX clock skew must be ENABLED in the PHY
In Linux, use:

phy-mode = "rgmii-id";
  • 1

In standalone applications, use the following code:

// RGMII with both internal delays enabled
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_PAGE_ADDRESS_REGISTER, 2);
XAxiEthernet_PhyRead(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, &control);
control |= (IEEE_RGMII_TX_CLOCK_DELAYED_MASK | IEEE_RGMII_RX_CLOCK_DELAYED_MASK);
XAxiEthernet_PhyWrite(xaxiemacp, PHY_ADDRESS, IEEE_CONTROL_REG_MAC, control);
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号