大家好,我是讯享网,很高兴认识大家。
实验室回来一批RGMII接口,SGMII接口等接口的板。如何测试这些网络端口是否正常?这的确需要一些经验。比如RGMII接口,最重要的是看在哪里做时钟和数据偏移。这时往往需要用VIO读取PHY中相应寄存器的值,看是否工作在正常的RGMII接口时序模式下。
测试场景
测试拓扑图如下所示
审判现场连接图
测试方法:TestCenter用于流式传输到被测板上的千兆以太网端口,通过FPGA中的自环从源端口返回到TestCenter。通过查看测试中心控制界面上显示的结果来判断自循环是否正确。
用于测试RGMII接口的PHY芯片是MARVELL 88e1512PHY芯片,RGMII的顶部接口信号如图1所示。
图1测试代码顶部接口信号
采用以往经验发现问题
根据之前RGMII接口的经验,接口的输出时钟被约束延迟了2ns,如图2所示。TestCenter用于测试以太网端口,但是以太网端口不能正常发送数据。具体来说,TestCenter接收的数据帧数等于发送的数据帧数,但接收的比特数明显少于发送的比特数。抓取测试代码的内部信号,发现FPGA接收的以太网数据帧都正常,推测是FPGA向PHY芯片发送数据的时序异常。
图2 发送时钟偏移2ns约束代码图2发送时钟偏移2ns的约束代码
修改代码,使发送时钟不偏移2ns,如图3所示。TestCenter用于测试以太网端口,以太网端口工作正常。
图3 发送时钟不进行偏移2ns图3发送时钟没有偏移2ns。
问题原因定位
据推测,不同的PHY芯片在不同的工作模式下有不同的时钟要求。
之前使用的REALTEK的RTL8211E PHY芯片需要将发送时钟延迟2ns。查阅PHY芯片手册。PHY芯片对发送时钟有要求,如图4所示。表格里说的很清楚,你需要自己在时钟和数据之间加上2ns的延迟。
图4 RTL8211E的发送时钟图4 RTL 8211 e的传输时钟
查阅目前调试板上使用的MARVELL的88e1512 PHY芯片的芯片手册,发现RGMII接口有四种不同的时钟工作模式。
图5 88e1512的4种时钟工作模式图5 88e 1512的四种时钟工作模式
四种时钟工作模式的信号时序图如图6和图7所示。结合上车现象推测当前运行模式为add delay模式,即Register21_2.4=1。
图6 RGMII发送时序图6 RGMII传输时序
图7 RGMII接收时序图7 RGMII接收时序
图8 寄存器的时钟模式配置图8寄存器的时钟模式配置
从上面的图6、7、8可以看出,与之前的RTL8211E PHY芯片不同,MARVELL的88e1512 PHY芯片可以配置PHY和FPGA的RGMII接口的时钟信号和数据信号是否有2ns的相对偏移。也就是说,通过读取PHY芯片对应的寄存器就可以看到默认的工作模式。
体验:调试RGMII接口时,最重要的是检查PHY芯片的型号,查阅PHY芯片手册,通过MDIO读取PHY芯片寄存器的值,看RGMII接口上的数据和时钟是否偏移2ns,再决定FPGA是否要偏移相应的管脚约束!
用VIO方法读取或配置PHY芯片的寄存器
在没有CPU的情况下,在线读取PHY芯片中的寄存器最好的方法是使用VIO通过MDIO接口读取PHY芯片中的寄存器。详见本微信官方账号上一篇文章:
一种动态调整RGMII接口时序的方法
Vivado用FPGA调试“犯罪现场”,并在仿真环境中再现。
使用VIVADO中的VIO模拟CPU接口调试在线寄存器读写(附源代码)
干货:Vivado直接修改RAM初始化文件,避免了重新合成实现的方法。
上图是一个测试场景,24个88E1512 PHY芯片通过24个Mdio接口被FPGA芯片控制。
具体测试步骤如下:通过VIO配置MDIO管理模块的PHY地址和寄存器地址,然后选择读操作读取一个PHY芯片的寄存器值,根据PHY的工作状态判断寄存器读取是否正确。因为读操作是通过先写地址再读数据来执行的,所以只需测试读操作就可以完全测试MDIO管理模块的功能。以下是与VIO对应的呼叫代码。
//-mdio _ module _ VSC 8658 U _ mdio _ module(。mdc(mdc_o),。mdio(mdio)。重置(reset)。mdir (mdir)。execute(执行),//。req(请求),//使用。phy _ addr (phy _ addr)。寄存器地址(寄存器地址)。data _ phy(数据_ phy)。数据_ rd(数据_ rd),。op _ done(op _ done//-on board-VIO _ 0 u _ VIO(。clk(时钟),//输入线clk。probe_out0(req),//输出线[0 : 0] probe_out1。probe_out1(phy_addr),//输出线[4 : 0] probe_out2。probe_out2(reg_addr),//输出线[4 : 0] probe_out3。probe_out3(data_phy) //输出线[15:0]probe _ out 4);/////-MDC generate-//MDC应该是0~12.5MHz,模块是n * 2 Dividemdio _ clk #(。分频器(25)) U_mdio_clk(.重置(reset)。clk(时钟),。clk _ o(MDC _ o));// – .的相应工作模式是图8所示的发送时钟内部延迟模式,即添加延迟模式,不需要将时钟偏移2ns。
图9 寄存器的地址图9寄存器地址
图10 读取的寄存器数值图10读取寄存器值
图11 用windows自带的计算器看二进制图11。用windows自带的计算器看二进制
确认后,Testcenter会流,一切正常。但有时候因为PCB设计问题,比如RGMII接口的时钟没有使用专用的时钟引脚,或者对应的4-4bit数据信号不在FPGA芯片的同一个BANK中,那么无论如何调整时钟和数据的相位关系,RGMII接口都不会正常工作。所以正常工作的前提是硬件和PCB板的连接关系OK。
FPGA使用RGMII接口与PHY芯片连接时经验总结
其实相比Altera的FPGA,Xilinx的FPGA在使用RGMII接口连接PHY芯片的时候更有讲究。总结以下几点与大家分享。
1.rgmii信号中的接收时钟phy_rxclk是一个单端时钟。如果这个时钟连接到FPGA中的多功能时钟引脚(MRCC或SRCC),则必须从正端(p)输入;
每个PHY芯片的tx和rx信号连接到FPGA的同一个bank,其中tx_clk和rx_clk需要连接到bank中时钟专用引脚的p端,n端不能连接其他信号;
2.rgmii中的接收信号(rxd、rxclk、rxctl)必须在FPGA中的同一存储体或相邻存储体上。如果是在相邻的银行,rxclk必须连接到MRCC;
每个PHY芯片有4个rxd、4个txd和2个ctl信号,每个PHY有10个信号,每个PHY有40个信号。接收每个PHY有两个时钟,总共1个PHY占用12个管脚。理论上,一个银行可以连接四个PHY芯片;
3.注意PHY芯片的电源电压和FPGA的电源电压是否相同;
4.每个PHY芯片使用单独的晶体振荡器来产生参考时钟;(在之前微信官方账号的文章中,SDN的开创者Nick教授和netFPGA无法实现6802时间同步的文章完美的指出了netFPGA疑似存在这个问题,多个端口由于抖动过大无法实现6802同步);
RGMII接口与GMII接口
在MAC内核与PHY芯片的通信过程中,有多种接口形式,如MII、GMII、RGMII、XGMII等。在千兆以太网端口中,GMII(千兆媒体独立接口)和RGM II(精简媒体独立接口)是最常见的。GMII可支持10Mbps、100Mbps和1000Mbps的数据传输,其关键接口信号如图4.1所示。
与GMII相比,RGMII接口的信号线数量大幅减少至12条,去掉了不必要的TXER、RXER、COL和CRS,数据线宽度由8位减少至4位,但也能支持10Mbps、100Mbps和1000Mbps传输。接口信号如下图4.2所示。
RGMII接口中的双边沿数据信号适合传输,但不适合数据处理。因此,在MAC核中处理PHY侧数据时,需要先将双边数据转换成单边数据。实现纵横制交换机时,硬件平台采用RGMII接口,因此需要实现RGMII接口和GMII接口的相互转换,如图4.3所示。
RGMII虽然比GMII减少了很多信号线,但依然可以实现1000Mbps的数据传输。原因是RGMII采用了双沿传输技术,在时钟的上下沿同时传输数据,这样就可以在一个时钟周期内完成8位数据的传输,这和GMII是一样的,如图4.4所示。然而,在RGMII中,在一个方向上只有一个指示信号RX_CTL(TX_CTL)。在双边沿传输中,GMII的RXEN和RXER也可以分别在RX_CTL的上下沿传输。
在上图4.4中,RGMII数据在时钟的上升沿在GMII传输3~0位,在时钟的下降沿在GMII传输7~4位,一个时钟完成8位s数据的传输。RX_CTL信号保持高电平,表示当前帧正确。
在图4.5中,数据传输与图4.4相同,RX_CTL在时钟的下降沿跳至0,这意味着GMII的RXER信号为1,表示传输错误。在RX_CTL持续时间结束时,它在时钟的上升沿被拉低。此时,在一个完整的时钟周期内,RXEN=0,RXER=0。可以看出RX_CTL和RXEN的关系,RXER = Rx _ CTL,xor代表异或运算。
为了实现RGMII信号和GMII信号的相互转换,本文利用了Xilinx提供的几种基于FPGA的原语,这些原语引用了Xilinx根据其设备特点开发的一系列通用模块的名称。下面列出了所使用的原语的名称和介绍。
(1)IDDR、ODDR
DDR(双倍数据速率)表示双倍速率。数据在时钟的上升沿和下降沿发生变化。IDDR用于将一路双边沿时钟数据转换为两路普通数据,ODDR用于将两路普通数据帧转换为一路双边沿时钟数据,如图4.6所示。
(2)布菲奥
独立于全局时钟的特殊时钟缓冲器适合于接收源同步数据。但需要的是这个缓冲器输出的时钟不能直接驱动逻辑资源,所以适合驱动IDDR等专用器件。
(3)BUFR
一种独立于全局时钟的特殊时钟缓冲器,其输出时钟用于驱动该区域的逻辑资源。
IBUFG
全局时钟缓冲器。应该在FPGA的时钟输入端加入IBUFG进行缓冲,使缓冲后的时钟线具有最小的延迟和抖动,驱动能力大大增加。
(5)碘DELAY1、IDELAYCTRL
IODELAY1是一种可编程的绝对延时元件,可以给某一行增加一定的延时,其延时值由IDEALYCTRL决定。IDELAYCTRL的延迟精度为参考时钟的1/64。如果提供200MHz的参考时钟,延迟精度为5ns/64 = 78ps,因此应一起使用。
接口转换的硬件实现可以分为接收转换和发送转换,两者差别很大。下面给出接收转换和发送转换的实现过程。
接收是RXD和RX_CTL的转换。当RGMII接口以千兆模式接收数据时,相关的时钟RXC为125MHz,并且是双边沿传输。所以不仅要用IDDR取出双边沿数据,还要对时钟进行额外的处理。转换过程如图4.7所示。
在图4.7中,RX_CTL的转换未示出,其转换原理类似于RXD转换。IDDR换算后,Q1是GMII旗下的RXDV,Q1 xor Q2是GMII旗下的RXER。图中,IBUFG用于将外部输入的性能较差的时钟RXC转换为内部可用的时钟RXC_BUFG,BUFIO用于将RXC_BUFG转换为适合采集源同步数据的时钟RXC_BUFG,BUFR用于将RXC_BUFG转换为适合区域内逻辑资源的时钟RXC _ to _ MAC,比RXC _ BUFG更适合驱动Rxd_to_mac。IBUF的功能和IBUFG类似,但IBUFG只适用于时钟信号,IBUF是数据线缓冲。IODELAY1用于给RXD信号增加一定的延迟,抵消时钟线穿过BUFIO和硬件布线带来的延迟,其延迟值需要根据硬件特性来确定。在本文中,当使用Zedboard实现纵横制交换机时,延迟值设置为0。图中只显示了一个IDDR,实现需要5个IDDR,分别对应RXD0~RXD4和RX_CTL。
传输是TXD和TX_CTL的转换。RGMII传输过程中,时钟信号由FPGA给出,不需要在时钟线上增加额外的缓冲器。需要指出的是,RGMII的传输时钟和传输数据不是沿边缘对齐,而是在中心对齐,如图4.8所示。采用这种时序的优点是双边沿采样对于对端的接收更加稳定。
在实际传输转换中,首先用125MHz时钟驱动ODDR得到TXD和TX_CTL(TX _ CTL转换中的D1是GMII的TXEN,D2是GMII的TXEN xorTXER),TXD和TX _ CTL与原来的125MHz时钟对齐。特别是,TXC也由ODDR产生,其驱动时钟是初始125MHz时钟相移90度后的另一个时钟tx_clk90,如图4.9所示。TXC之所以由ODDR产生,是因为此时的TXC与TXD和TX_CTL具有相同的ODDR延迟,最终TXC以TXD和TX_CTL为中心。
全文。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/10570.html