ZYNQ 系统的IEEE1588 实现方法

本文详细介绍了Zynq系统中实现IEEE1588/PTP协议的两种主要方法:通过MAC控制器或PHY芯片。重点讨论了Zynq的PS端和PL端以太网接口,以及不同IP核如trimodeEthernetMAC、AXI1G/2.5GEthernetSubsystem和100M/1GTSNSubsystem的特点。建议使用带有IEEE1588功能的PHY芯片如DP83640,因其实现相对简单。还提供了Linux下访问MDIO的测试程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IEEE1588/PTP 协议是实时工业软件的一个重要的协议,本博文讨论该协议在Xilinx Zynq 系统·上如何实现IEEE1588 协议。

ZYNQ 系统的以太网

Zynq 系统中有两类Ethernet 接口,一种是PS 端的硬件千兆以太网,另一种是PL 实现的以太网接口。

PS 端以太网

zynq 中带有两个硬核千兆以太网MAC,ENET0,ENET1。与普通SOC 芯片不同,zynq PS 断地外设可以通过MIO连接到芯片的引脚上,也可以通过EMIO 接口连接到PL 端。连接到PL端后,带来了灵活性,可以转换成各种接口。比如设计一个交换机。定义端其它的引脚。

PS 端MIO 引出的以太网接口是RGMII接口,可以连接具有RGMII 的Phy 芯片。

PS 端的Ethernet 透过EMIO 连接各种接口(通过1000BASE-X/SGMII PCS/PMA  IP)

PL 端以太网

PL 端的以太网是通过IP核实现的。vivado 中有下列几种以太网IP。

  • tri mode Ethernet MAC
  • AXI 1G/2.5G Ethernet Subsystem
  • 100M/1G TSN Subsystem

其中

        AXI 1G/2.5G Ethernet Subsystem 支持IEEE1588 ,但是只有在使用SGMII和SFP(small form factor pluggable)接口。并且带有GTX 功能的Zynq 芯片才支持IEEE1588。如此看来只能在光纤接口,或者SGMII接口上实现。网络上资料也不多。

小贴士

-----------------------------------------------------------------

GTX

        GTX是一种就是G级速率以上的SERDES串行/解串器。Xilinx芯片里内嵌的串行/解串器GTX,GTH,GTP等模块。

        7系列中,按支持的最高线速排序,GTP<GTX<GTH<GTZ。GTP被用于A7系列,GTZ被用于少数V7系列。从K7到V7,最常见的是GTX和GTH,GTH的最高线速比GTX稍微高一点点。

        100M/1G TSN Subsystem 也支持IEEE1588 但是看上去也是比较复杂的样子。

SGMII

SGMII协议是CISCO公司提出来的,可以减少芯片间互联的管脚。传统的GMII前面说了是8bits数据线,此外还需要时钟,和一些控制线,双向加起来要20根线左右。而SGMII接口是1根数据线加1根时钟线,双向共4根。如果去掉时钟线(采用CDR),那么2根线就可以实现互联了。

        SGMII本质上并没有对以太网协议的分层做改动,还是MAC层,PCS层和PMA层。原来GMII模式下,MAC层一般做在SOC侧,PHY层包括PCS+PMA做在另一个单独的芯片上。而SGMII的实施是将PCS层也同时放在了原来的MAC侧。这样SOC芯片和PHY芯片各有一个PCS层。

        对于SOC发送来说,数据包有MAC层过来,经过tx 的pcs,从SGMII接口发送出去。在PHY芯片上,有一个rx的pcs先将SGMII的信号解出GMII信号,然后再经过传统的PHY层处理发送到介质上。对于SOC接收来说,则反过来。

-----------------------------------------------------------------

tri mode Ethernet MAC在100Mbps 时可以使用MAC 接口,可以通过一个MAC to RMII 的IP 转换成为RMII 接口。

IEEE1588/PTP实现方案

IEEE1588 的硬件实现的方法有两种:

  • 在MAC控制器中实现
  • 在Phy 芯片中实现,比较常见的有TI 公司的DP83640 芯片

ZYNQ 中实现IEEE1588 协议的方式

        笔者做了一些厂商,在PL 端使用现成的IP 支持1588 似乎只有1g/2.5g ethernet subsystem 这一种。但是它只有在带有GT 传输的zynq 中使用,而且并没有多少成功的参考。

      基于本人的经验,使用带有IEEE1588 /PTP 功能的PHY 芯片实现,比较简单。

  • 使用DP83640

使用DP83640 实现IEEE1588 协议相对比较简单。主要的问题是要通过RMII接口与DP83640 相连接。

使用rtl8211fs-vs-cg

        realtek 公司的rtl8211fs-vs-cg 支持IEEE1588.注意:一定要带有vs 后缀的才支持IEEE1588/PTP.

使用高通atheros AR8031 芯片

 

  • ​​​​​​​Linux 下访问mdio 的方法

测试程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/mii.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <linux/types.h>
#include <netinet/in.h>
#include <unistd.h>
 
//#include <QDebug>
 
 
int main(int argc, char *argv[])
{
    int sockfd;
    struct mii_ioctl_data *mii = NULL;
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    ioctl(sockfd, SIOCGMIIPHY, &ifr);
    mii = (struct mii_ioctl_data*)&ifr.ifr_data;
 
    if(argc == 4)
    {
        strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
        sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
        ioctl(sockfd, SIOCGMIIPHY, &ifr);
        mii = (struct mii_ioctl_data*)&ifr.ifr_data;
 
        mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);
        mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);
 
        ioctl(sockfd, SIOCGMIIREG, &ifr);
 
        printf("read --- value : 0x%x\n", mii->val_out);
    }
    else if(argc == 5)
    {
        strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
        sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
        ioctl(sockfd, SIOCGMIIPHY, &ifr);
        mii = (struct mii_ioctl_data*)&ifr.ifr_data;
        mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);
        mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);
        mii->val_in     = (uint16_t)strtoul(argv[4], NULL, 0);
 
        ioctl(sockfd, SIOCSMIIREG, &ifr);
    }else{
       printf("mdio ethX phyId addr value\n");
    }
 
    close(sockfd);
 
 
 
    return 0;
}

 我是在Z7 nano开发板的pynq 操作系统下调试通过的。

使用AXI 1G/2.5G Ethernet Subsystem

只有在使用SGMII和FDP接口。并且带有GTX 功能的Zynq 芯片才支持IEEE1588。

结束语

笔者更倾向使用带有IEEE1588/PTP 的PHY 芯片实现zynq 的IEEE1588

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值