网络PTP同步及其verilog实现

          说明,该文章主要用来记录IEEE1588文档的学习,方便以后查看使用。

          1,数据类型定义

     IEEE1588里定义了一些基本数据类型,这些和c语言的数据类型基本一致。如boolean表示一个布尔量,其值为True or False;enumeration4表示一个4bit枚举量;nibble表示一个4bit的字段;integer32表示一个32位的有符号整数。其他数据都是由这些数据构成,需要注意的有:a,TimeInterval,这是一个integer64,代表一个放大后的时间间隔,放大倍数为2^16,单位为ns,例如64‘h0000_0000_0002_8000表示2.5ns;b,Timestamp,这是一个时间戳结构体,表示相对于epoch的时间(1 January 1970 00:00:00 TAI or 31 December 1969 23:59:51.999918 UTC),里面包含两个时间,一个uinteger48,表示整秒数,单位为s,一个uinteger32,表示一秒内的时间,单位为ns。

          2,PTP设备

     IEEE1588将一个PTP网络中的设备分为5类,OC(ordinary clock),BC(boundary clock),E2E TC(end-to-end transparent clock),P2P TC(peer-to-peer transparent clock)以及management node。OC只有一个物理端口用于PTP功能,要么作为grandmaster clock,为下一级设备提供同步时钟源,要么作为slave接收上一级的时钟,并与之同步。BC有多个物理口用于PTP功能,但是只有一个物理口用于接收上一级同步时钟,其余口用于为下一级提供时钟。TC相当于一个转发设备,不过除了转发正常的网络数据包,它还会对PTP事件报文进行时间修正,然后再转发,E2E型和P2P型的区别在于修正机制不同。管理节点用于服务PTP管理报文。

    这些设备上的端口分为master、slave和passive,master用于发布同步时钟,slave用于接收同步时钟,passive不参与时钟同步。一个简单的连接如下图所示。

          3,基本同步方式

          IEEE1588定义最基本的同步流程如下图所示,分为以下几步(假设master-to-slave与slave-to-master的propagation delay一致):a,master发起sync报文,并记录发送时间戳t1;b,slave接收sync,并记录接收时间t2;c,master接着发送follow_up报文,携带之前记录的t1时间;d,slave发送delay_req报文,并记录发送时刻t3;e,master收到delay_req报文,记录接收时间t4;f,master发起delay_resp报文,携带之前记录的t4。至此,则可以计算传输延时T_delay和主从时间轴偏差offset。T_delay =( (t2-t1)+(t4-t3))/2,offset = ((t2-t4)-(t1-t3))/2。

          4,基于UDP/ipv4的PTP传输

    IEEE1588规定当使用UDP进行PTP协议传输时,端口319用于event报文传输(sync、delay_req),端口320用于general报文传输(follow_up、delay_resp)。不论什么PTP报文,都有一个PTP header,在udp header后面,内容如下所示。

          5,PTP verilog实现

    实现的关键点如下:1,fpga不适合做复杂的运算,而ptp时间中 因此选择合适的计算公式对于程序编写有很大意义。这里我选择的计算方式为最终fpga的时间为t = t1 + T_delay + T_delta + T_cmp = ((t1 + t4) - (t3 -t2))/2 + T_delta + T_cmp。其中t1为follow_up或者sync中的时间,具体看采用单步法还是两步法同步;T_delay为传输延迟;T_delta为fpga收到sync包开始到fpga收到delay_resp包结束的时间;T_cmp为补偿时间,用于补偿网络数据包处理的延迟。t1和t4都属于同步服务器端的时间域,可以直接相加。t3-t2和T_delta都可以用fpga本地计数器算出,无需计算。因此整个式子中只需要做一次减法即可,一次除法和一次加法即可,稍微考虑下进位、秒和秒内时间的转换,还是比较容易实现的。2,计数器的触发与结束时刻是需要认真考虑的

         6,PTP时间转UTC

    这一点是自己项目中单独需求的,由于上位机显示需要UTC时间,因此还需要将PTP时间的整秒数部分转为UTC时间。PTP时间相当于unix时间,即电脑系统时间。转换思路如下:1,先用整秒数除以一天包含的秒数,得到当前ptp时间所包含的天数和一天内剩余的秒数,这里需要用到一个除法器(不建议调用ip,因为ip一般为流水线除法器,占用资源较多,建议自己写一个,因为我们一般1s进行一次转换)。2,一天内剩余的秒数转换为时分秒,相对简单,就是一个取余的过程,verilog用减法即可实现。3,天数转换为年月日,相对比较麻烦。状态机设计先是年数loop,需要考虑闰年,闰年判断以1970开始,差值比较法去判断,会比直接判断使用更少的资源。然后是月份loop,需要考虑28/29/30/31天数。最后是天数判断。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值