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>;
};
};
};
独立的
当使用独立应用程序时,我们必须通过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);
案列:
在本节结束时,我们将列出每个可能用例所需的rmmii延迟配置。由于大多数应用使用长度匹配的PCB走线,我们将假设PCB没有增加时钟偏差。以下是三个MAC选项所需的配置:
案例1:使用AXI以太网子系统
TX时钟倾斜必须在PHY中禁用(因为倾斜是在FPGA中实现的)
RX时钟倾斜必须在PHY中启用
在Linux中,使用:
phy-mode = "rgmii-rxid";
在独立应用程序中,使用以下代码:
// 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);
案例2:使用GMII-to-RGMII (Zynq GEM通过EMIO)
当使用GMII-to-RGMII时,你可以选择在哪里实现TX时钟倾斜,所以有两种可能性:
选项1:在FPGA中启用TX时钟倾斜
TX时钟倾斜必须在PHY中禁用
RX时钟倾斜必须在PHY中启用
在Linux中,使用:
phy-mode = "rgmii-rxid";
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);
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";
In standalone applications, use the following code:文章来源地址https://www.toymoban.com/news/detail-848302.html
// 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);
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:文章来源:https://www.toymoban.com/news/detail-848302.html
phy-mode = "rgmii-id";
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);
到了这里,关于PHY RGMII Interface Timing注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!