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

ZYNQ 系统的IEEE1588 实现方法相关推荐

  1. 计算机安装双系统后系统引导修复的方法

    知友提出问题:电脑双系统怎么用,我装的是win8和win7.win8安装在C盘上,可以正常使用,我把win7安装在一个新分区的盘符上G盘,为什么开机没有win7系统选择项启动,只有一个win8和GHO ...

  2. Unity3D Mecanim 动画系统骨骼动画问题解决方法

    Unity3D Mecanim 动画系统骨骼动画问题解决方法 参考文章: (1)Unity3D Mecanim 动画系统骨骼动画问题解决方法 (2)https://www.cnblogs.com/al ...

  3. ios 系统提示框_经验分享:新购买移动硬盘格式化为Windows系统和Mac系统同时可以使用的方法...

    经常使用硬盘的小伙伴们都知道,新买的移动硬盘,要想在Windows系统使用的话是可以直接使用的,因为一般情况下新买的移动硬盘格式是适用于Windows系统的NTFS格式:如果想让该移动硬盘也能在苹果的 ...

  4. Git客户端TortoiseGit(Windows系统)的使用方法

    这篇文章主要介绍了Git客户端TortoiseGit(Windows系统)的使用方法,需要的朋友可以参考下 本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1 ...

  5. android系统电量优化,基于Android系统网络耗电量优化方法的.pdf

    基于Android系统网络耗电量优化方法的 2012年第10期,第 45卷 通 信 技 术 Vol.45,No.10,2012 总第250期 Communications Technology No. ...

  6. ios android 内存不足,怎样解决手机内存不足?iOS系统可以试试这些方法

    原标题:怎样解决手机内存不足?iOS系统可以试试这些方法 怎样解决手机内存不足?不管储存空间有多少GB,使用时间一长都会被满满的数据占据,有的时候甚至会出现储存空间不足的情况,怎么才能清理手机里的内存 ...

  7. 关闭自动更新_Win10系统关闭自动更新方法

    Windows 10是微软最新的操作系统,系统上的自动更新功能可以保障Win10系统处于最新的状态,不过对于普通用户来说并不是所有的更新都是必要的,且系统频繁更新会比较影响用户正常使用.下面就和大家分 ...

  8. python 回声程序_一种回声消除系统及回音消除方法与流程

    本发明涉及通信技术领域,具体涉及一种回声消除系统及回音消除方法. 背景技术: 回声消除器通常由滤波器和算法组成,根据具体应用和性能要求的不同可以有多种选择. 滤波器有FIR(有限长度冲激晌应)滤波器和 ...

  9. 关于收到部分还款SAP系统两种处理方法的说明和比较

    关于收到部分还款SAP系统两种处理方法的说明和比较 (昨天做100小时的时候进行到这一步,有一些疑问书上没有讲清楚,后来自己挨个试了下,又请教了下财务部的同事,总算搞明白了..有些收获,分享一下) 背 ...

  10. win7虚拟磁盘服务器,Win7系统如何删除虚拟磁盘 win7系统删除虚拟磁盘的方法

    虚拟磁盘就是在本地电脑里面虚拟出一个远程电脑里面的磁盘,可以加大硬盘的容量,从而提高电脑的运行速度,但是有些win7系统用户创建虚拟磁盘之后,又不想用了想要删除虚拟磁盘,但是却不知道要怎么操作,接下来 ...

最新文章

  1. activemq 异步和同步接收
  2. linux的du和df命令,du和df命令都是Linux系统的重要工具
  3. 【网址收藏】Hadoop3.2.1 【 YARN 】源码分析 : ResourceLocalizationService解析
  4. 包和模块_月隐学python第13课
  5. linux常用命令 打开文件,【Linux】常用命令 lsof查看打开的文件
  6. ibatis.net:第六天,QueryForList
  7. Java 读写json格式的文件方法详解
  8. java fork join demo_Fork/Join框架 demo
  9. WIN7下打开telnet工具
  10. SDRAM 控制器(七)——控制模块
  11. 《Inter汇编语言程序设计》8.6 创建多模块程序(ENTERN)
  12. 01 | 时势与英雄:HTTP的前世今生
  13. 联想z5可以刷鸿蒙系统吗,联想z5引用adb刷Project Treble通刷第三方rom教程(亲测成功)...
  14. The Rust Programming Language - 第7章 使用包、crate和模块管理不断增长的项目 - 7.1 包和crate
  15. 【周六福利来了~】优才安卓公开课:程序员到架构师之路
  16. C++中按名次排序的两个实现方式
  17. 项目管理论坛_活动预告|2019年“VUCA时代项目管理与项目治理”论坛通知
  18. 温言QQ全能网络工具箱
  19. USB-C(TYPE-C)接口安卓手机直播方案/同时直播跟充电的方案
  20. 第07课:使用 HTML 5 API 创建子窗口

热门文章

  1. java开发面试项目经验
  2. 专利与论文-4:专利申请流程与生命周期及费用
  3. html中如何制作手势密码,h5手势密码开发(使用jq)(示例代码)
  4. pxe启动找不到服务器,linux – PXE启动 – 在TFTP服务器上找不到内核
  5. android videoview 拉伸,android - 在ExoPlayer中轻按全屏时,视频会拉伸和旋转 - 堆栈内存溢出...
  6. 超分辨率谷歌卫星图下载经验贴
  7. 【转】扫盲 同步利器、分布式网盘--BT Sync
  8. natapp做一个内网穿透
  9. matlab中产生对角阵,关于matlab中的diag函数(矩阵对角元素的提取和创建对角阵)
  10. Linux就这个范儿 第10章 生死与共的兄弟