原创 Hardware-Assisted IEEE1588 Implementation Analysis

2011-6-26 23:20 7124 24 30 分类: FPGA/CPLD

06/18/11 11:00:05 PM

        最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步的精度,需要硬件的辅助。多家芯片厂商已经提供具备IEEE1588-2008硬件辅助功能的MAC芯片(National Semiconductor, Vittese, Marvell, Broadcom)或集成MACSoC芯片(Intel, ST, Freescale, Hyperstone),或者是专用的时间同步芯片(Maxim, Semtech),还有几家IP Core厂商提供可以在FPGAASIC中实现的IP CoreMoreThanIP, Ixxat, Oregano System, Hirschmann, IPClock)。

        在我们的产品中,硬件辅助功能需要通过FPGA来实现。最开始我们考虑购买一款IP Core和配套的软件程序。后来经过评估,决定自己开发硬件辅助功能,配以开源的PTPd软件实现全部的硬软件功能。

        接下来的几周,我会陆续分析上述几家厂商提供的Datasheet中对该功能实现细节和寄存器接口的介绍。由于部分厂商的网站需要用户签署NDA才能提供Datasheet,我拿不到Datasheet也就无法分析其实现细节。

        通过分析各家厂商公开的Datasheet,其硬件辅助逻辑实现的功能可以归纳为以下三个部分:

        1. 相位、频率可以粗调和精调的高精度实时时间定时器(RTC)。

        2. 对PTP报文到达时间的精确捕获(TimeStamping)。

        3. 定时触发和秒脉冲信号PPS产生功能。

        接下来的分析,主要集中在上述第一个部分。


06/20/11 10:55:14 PM

        MPC8315E PowerQUICC II Pro Integrated Host Processor Family Reference Manual

19 Enhanced Three-Speed Ethernet Controllers

19.6 Functional Description

19.6.6 Hardware Assist for IEEE 1588-Compatible Timestamping

19.5 Memory Map/Register Definition

19.5.3 Memory-Mapped Register Descriptions

19.5.3.10 IEEE 1588-Compatible Timestamping Registers

19.5.3.10.1 Timer Control Register (TMR_CTRL)

19.5.3.10.2 Timer Event Register (TMR_TEVENT)

19.5.3.10.3 Timer Event Mask Register (TMR_TEMASK)

19.5.3.10.4 Timer PTP Packet Event Register (TMR_PEVENT)

19.5.3.10.5 Timer Event Mask Register (TMR_PEMASK)

19.5.3.10.6 Timer Status Register (TMR_STAT)

19.5.3.10.7 Timer Counter Register (TMR_CNT_H/L)

19.5.3.10.8 Timer Drift Compensation Addend Register (TMR_ADD)

19.5.3.10.9 Timer Accumulator Register (TMR_ACC)

19.5.3.10.10 Timer Prescale Register (TMR_PRSC)

19.5.3.10.11 Timer Offset Register (TMROFF_H/L)

19.5.3.10.12 Alarm Time Comparator Register (TMR_ALARM1–2_H/L)

19.5.3.10.13 Timer Fixed Interval Period Register (TMR_FIPER1–3)

19.5.3.10.14 External Trigger Stamp Register (TMR_ETTS1–2_H/L)


         飞思卡尔的PowerPC系列芯片支持Hardware-assisted 1588。在19.6.6功能描述中没有对Timer实现细节和工作原理的介绍,只有对打时间戳功能的介绍。接下来,需要对19.5.3.10寄存器描述中Timer相关的寄存器进行分析。

        19.5.3.10.7 Timer Counter Register (TMR_CNT_H/L)64位,定时计数器寄存器。该寄存器与TMROFF_H/L寄存器相加,得到当前计数器值。两次 TMR_CNT_H/L+TMROFF_H/L相加操作的时间间隔,由TMR_ADDTMR_ACC确定。这样一来, TMR_CNT_H/L递增的步长和周期就都是可控的了。

         由于CPU访问总线的时钟与计数器工作时钟工作在两个时钟域,而且计数器时钟频率较高,所以该寄存器的设计需要考虑跨时钟域可靠传递数据的问题,这里采用的是“直接访问影子寄存器,间接访问本体寄存器”的单向握手操作方法。读写操作分别描述如下:

         一、读取定时器计数值:第一步读取 TMR_CNT_L32位寄存器,读取操作引发计数器TMR_CNT_LTMR_CNT_H当前值同步(计数器时钟域)拷贝到64位影子寄存器,读取值从影子寄存器的低32位得到(CPU时钟域);第二步读取TMR_CNT_H32位寄存器,读取值从影子寄存器的高32位得到(CPU时钟域)。

         二、加载定时器计数值:第一步写入TMR_CNT_L32位寄存器,仅更新影子寄存器低32位(CPU时钟域);第二步写入TMR_CNT_H32位寄存器,既更新影子寄存器高32位(CPU时钟域),写入操作还引发64位影子寄存器同步(计数器时钟域)拷贝到计数器,更新TMR_CNT_LTMR_CNT_H的当前值。

         在上面的步骤中,同步拷贝动作的触发可以采用标准的跨时钟域“两级寄存器同步,第三级寄存器边沿检测”方法实现。

        19.5.3.10.11 Timer Offset Register (TMROFF_H/L)64位,定时计数器递增步长寄存器。该寄存器周期性地与 TMR_CNT_H/L寄存器相加,更新 TMR_CNT_H/L寄存器当前值。

        19.5.3.10.8 Timer Drift Compensation Addend Register (TMR_ADD)32位,定时计数器递增周期累加值寄存器。TMR_ADD在每一个计数器工作时钟周期与TMR_ACC相加。

        19.5.3.10.9 Timer Accumulator Register (TMR_ACC)32位,定时计数器递增周期累加寄存器。TMR_ACC在每一个计数器工作时钟周期递增TMR_ADD,当其第32位产生进位操作时,进位脉冲触发TMR_CNT_H/LTMROFF_H/L相加操作

         递增周期累加值寄存器TMR_ADD的计算如下:

         TMR_ADD = ceil(2^32/(freqOsc/freqIncr))

其中,ceil()是进位取整运算,freqOsc是计数器工作时钟频率,freqIncr是计数器递增频率。freqIncr的选取应该使freqOsc/freqIncr >= 1.0001

         递增步长寄存器TMROFF_H/L的计算如下:

         TMROFF_H/L = 1/freqIncr*2^subNanoSecBit

        其中,subNanoSecBit64位定时计数器中用来表示亚纳秒(sub-nano second)时间值的位数。

        TMR_ADD的设置,使得freqOsc的精度提高至1/2^32TMROFF_H/L的设置,使得TMR_CNT_H/L/2^subNanoSecBit计算值的单位恰好为纳秒

        MPC8315E PowerQUICC II Pro的Datasheet并没有提供关于RTC Timer更详细的信息。
        (上述工作原理的描述有部分错误,用横线标出。相应的修改如下:)

06/21/11 09:34:33 PM
        在Freescale的一篇应用笔记AN3423 Support for IEEE 1588 Protocol in PowerQUICC and QorIQ Processors中,可以看到Datasheet中缺失的对定时计数器工作原理的介绍。
20110622202558400.jpg
        在前面对接口寄存器的分析中,有部分内容是错误的。现修改如下:
19.5.3.10.1 Timer Control Register (TMR_CTRL):32位,定时计数器控制寄存器。其中6~15位定义为TCLK_PERIOD,定时计数器递增步长值。TCLK_PERIOD周期性地与 TMR_CNT_H/L相加,更新TMR_CNT_H/L定时计数器取值。
19.5.3.10.7 Timer Counter Register (TMR_CNT_H/L):64位,定时计数器寄存器。TCLK_PERIOD周期性与 该寄存器相加,得到当前计数器值。两次 TMR_CNT_H/L+TCLK_PERIOD相加操作的时间间隔,由TMR_ADD和TMR_ACC确定。这样一来, TMR_CNT_H/L递增的步长和周期就都是可控的了。
19.5.3.10.8 Timer Drift Compensation Addend Register (TMR_ADD):32位,定时计数器递增周期控制寄存器。TMR_ADD在每一个计数器工作时钟周期与TMR_ACC相加。
19.5.3.10.9 Timer Accumulator Register (TMR_ACC):32位,定时计数器递增周期累加寄存器。TMR_ACC在每一个计数器工作时钟周期递增TMR_ADD,当其第32位产生进位操作时,进位脉冲触发TMR_CNT_H/L与TMROFF_H/L相加操作。
19.5.3.10.11 Timer Offset Register (TMROFF_H/L):64位,定时计数器偏移值寄存器。对PTP报文打时间戳的逻辑读取到的时间值,是该寄存器与 TMR_CNT_H/L寄存器相加之后的结果。

        递增周期控制寄存器TMR_ADD的计算如下:
        TMR_ADD = ceil(2^32/(freqOsc/freqIncr))
其中,ceil()是进位取整运算,freqOsc是计数器工作时钟频率,freqIncr是计数器递增频率。freqIncr的选取应该使freqOsc/freqIncr >= 1.0001。
         递增步长寄存器TCLK_PERIOD的计算如下:
        TCLK_PERIOD = (1/freqIncr)*10^9
        TMR_ADD的设置,使得freqIncr的平均精度提高至freqOsc的1/2^32;TCLK_PERIOD的设置,使得TMR_CNT_H/L取值的单位恰好为纳秒。
        当Slave的时间与Master的时间相差较大时,可以直接写入 TMR_CNT_H/L或TMROFF_H/L寄存器实现Slave时间的粗调(PTP时钟相位调整),以较大的步长快速接近Master的时钟相位;当Slave的时间与Master的时间比较接近时,需要通过反复调整TMR_ADD的取值,以freqOsc的1/2^32的精度实现Slave时间的微调(PTP时钟频率调整),逐步逼近并锁定于Master的时钟相位和频率。

06/22/11 08:32:36 PM
        MCF5441x Reference Manual
31 10/100Mbps Ethernet MAC-NET Core
31.3 Memory Map/Register Definition
31.3.33 Timer Control Register (ENETn_ATCR)
31.3.34 Timer Value Register (ENETn_ATVR)
31.3.35 Timer Offset Register (ENETn_ATOFF)
31.3.36 Timer Period Register (ENETn_ATPER)
31.3.37 Timer Correction Register (ENETn_ATCOR)
31.3.38 Time-Stamping Clock Period Register (ENETn_ATINC)
31.3.39 Timestamp of Last Transmitted Frame (ENETn_ATSTMP)
31.4 Functional Description
31.4.3 IEEE 1588 Message Formats
31.4.3.1 Transport Encapsulation
31.4.3.1.1 UDP/IP
31.4.3.1.2 Native Ethernet (PTPv2)
31.4.3.2 PTP Header
31.4.3.2.1 PTPv1 Header
31.4.3.2.2 PTPv2 Header
31.4.10 IEEE 1588 Functions
31.4.10.1 Adjustable Timer Module
31.4.10.1.1 Adjustable Timer Implementation
31.4.10.2 Timer Synchronization for Multi-Port Implementations
31.4.10.3 Transmit Timestamping
31.4.10.4 Receive Timestamping
31.4.10.5 Time Synchronization

        飞思卡尔的
ColdFire系列芯片支持Hardware-assisted 1588。在31.4.10.1.1 Adjustable Timer Implementation中,有对定时计数器的详细描述。其实现细节如下图:
20110622222315591.jpg

         32位定时计数器ENETn_ATVR在每一个时钟周期与7位递增步长寄存器ENETn_ATINC[6:0]相加,更新定时计数器取值。当定时计数器超过32位周期寄存器ENETn_ATPER时,定时计数器从超出值开始重新递增。另一个32位计数器在每一个时钟周期递增1,当其计数值等于调整周期寄存器ENETn_ATPER时,计数器归零,并触发7位递增步长调整寄存器ENETn_ATINC[14:8]代替ENETn_ATINC[6:0]ENETn_ATVR相加。

         其中,ENETn_ATINC[6:0]的设置,使定时计数器的取值恰好以纳秒为单位:

         ENETn_ATINC[6:0] = 10^9*(1/freqOsc)

         ENETn_ATPER的设置为10^9,使定时计数器超过10^9ns = 1s时翻转,实现“秒定时器”功能,并提供纳秒级时间精度。

         SlaveMaster时间相差很大时,可以通过直接写入定时计数器ENETn_ATVR,实现粗调;当SlaveMaster时间相差较小时,可以通过设置递增步长调整值ENETn_ATINC[14:8],与调整周期值ENETn_ATPER,以较小的幅度,较大的周期实现微调,逐步逼近Master的时间和频率。


06/23/11 09:02:27 PM

         ADSP-BF51x Blackfin? Processor Hardware Reference

         STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs Reference Manual

         Utilizing IEEE 1588 with Intel? EP80579 Integrated Processor Product Line

         从上述三篇文档可以看出,ADI, ST, Intel三家芯片厂商设计的1588实时时钟电路十分相似,电路的工作原理与FreeScalePowerPC处理器中的实时时钟电路如初一辙。三家芯片厂商的电路原理图如下:

20110623214840651.jpg20110623214912646.jpg
20110623214931714.jpg

06/26/11 10:03:07 PM
DS31408 8-Input, 14-Output, Dual DPLL Timing IC with Sub-ps Output Jitter and 1588 Clock
7. Functional Description
7.14 IEEE1588 Time Engine
7.14.1 Applications
7.14.2 Time Engine Operation
7.14.2.1 Direct Time Write
7.14.2.2 Frequency Control
7.14.2.3 Precise Time Adjustment
7.14.3 Input Signal Timestamper
7.14.4 Programmable Event Generators

        Maxim的DS31408是一款专用时间芯片。在实时时钟的实现精度和复杂度上,比前面分析过的几款芯片都要高。
        其定时计数器寄存器共86位(2^48s+2^30ns+2^8subns),定时计数器递增寄存器40位(2^8ns+2^32subns)。其工作原理如下图所示:
20110626231001907.jpg
        递增步长寄存器TIME_ADJ周期性与定时计数器相加,更新定时计数器取值。 TIME_ADJ的精度高于定时计数器,精度高出部分采用 delta-sigma 方法给予保留 TIME_ADJ可以周期性调整,其原理如下图所示:
20110626231033286.jpg
        PERIOD周期性与PER_ADJ相加,相加的频率受ADJ_CNT控制。相加的结果为TIME_ADJ。
        上述工作原理与Freescale的ColdFire芯片中1588实时时钟部分很相似,不同的地方在于Maxim的精度较高。 这类电路相对于ST/INTEL/PowerPC的实现,优势在于频率微调对输出时钟引入的Jitter较小。


相关链接:
PTPdv1 on www.sourceforge.net
PTPdv2 on www.sourceforge.net
Alan Bartky's porting of PTPdv2 to MPC8313E
我想找一种VCXO,能通过写寄存器改变频率   Silican Labs的Si5374行不行?


文章评论6条评论)

登录后参与讨论

用户377235 2016-2-17 16:28

???????????????

用户377235 2015-9-16 04:28

评论是对思考最好的总结…

用户377235 2012-12-16 20:25

哦~~我要交配

用户415454 2012-5-31 12:54

hi riple 1588规定打时间戳是在SFD最后一个BIT的后延上面,但是在MII总线上面怎么去对应到这个BIT

用户411257 2011-12-28 15:23

riple兄这是要作PTN设备么

ash_riple_768180695 2011-8-9 21:10

是以太网。等我忙过了这一阵子,还要继续写。争取上传一些HDL代码。搞好了,放到opencores上去。

用户1398106 2011-8-3 16:33

关注,楼主继续更新啊。楼主实现的1588物理层是什么?

用户1492539 2011-6-21 08:29

关注!

用户1275742 2011-6-20 17:32

关注中!以前和几位做智能电网和智能电表开发的朋友沟通,也谈到IEEE1588.
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
我要评论
6
24
关闭 站长推荐上一条 /2 下一条