【电路笔记 通信】IEEE 1588精密时间协议(PTP):时间戳格式+精确到ns的时间表示与处理

时间戳格式

项目 IEEE 1588 Truncated NTP 64‑bit
Epoch 1970‑01‑01 TAI 1900‑01‑01 UTC
秒字段 32‑bit 秒 32‑bit 秒
小数部分 32‑bit 纳秒(0--10⁹‑1) 32‑bit 秒分数(1/2³² s)
闰秒 不考虑(TAI) 考虑(UTC,由 NTP)
精度 纳秒 ~233 ps(理论)
常见场景 硬件/PTP/NSH NTP / 传统网络协议
字段 位数 说明
secondsField(整秒部分) 32 bit(4 字节) 自 PTP Epoch(1970-01-01 00:00:00 TAI)起的秒数,无闰秒
nanosecondsField(纳秒部分) 32 bit(4 字节) 0 ~ 999,999,999 ns,表示不足一秒的小数部分
bash 复制代码
 The two timestamp formats that can be used in the timestamp field
   are:

   o  IEEE 1588 Truncated Timestamp Format: the format of this field
      uses the 64 least significant bits of the IEEE 1588-2008 Precision
      Time Protocol format [IEEE1588].  This truncated format consists
      of a 32-bit seconds field followed by a 32-bit nanoseconds field.
      As defined in [IEEE1588], the timestamp specifies the number of
      seconds elapsed since 1 January 1970 00:00:00 according to the
      International Atomic Time (TAI).

Mizrahi, et al.         Expires February 21, 2018               [Page 4]
Internet-Draft                NSH Timestamp                  August 2017


       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                            Seconds                            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                           Nanoseconds                         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

        Figure 2: IEEE 1588 Truncated Timestamp Format [IEEE1588].

   o  NTP 64-bit Timestamp Format: this format consists of a 32-bit
      seconds field followed by a 32-bit fractional second field.  As
      defined in [RFC5905], the timestamp specifies the number of
      seconds elapsed since 1 January 1900 00:00:00 according to the
      Coordinated Universal Time (UTC).


       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                            Seconds                            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                            Fraction                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

              Figure 3: NTP [RFC5905] 64-bit Timestamp Format
- https://datatracker.ietf.org/doc/html/draft-mymb-sfc-nsh-allocation-timestamp-02?

精确到ns的时间表示与处理

verilog 复制代码
// 基本数据结构(推荐)
reg [31:0] sec;   // 秒(低32位)
reg [31:0] nsec;  // 纳秒(0--999_999_999) 经过了多少个ns

自增

  • 时间递增维护(最常见):每周期加固定纳秒(如 8 ns)
verilog 复制代码
always @(posedge clk) begin
    if (nsec >= 32'd1_000_000_000 - 32'd8) begin   // 进位条件是 `>= 1e9`,不是 `==`防止亚稳态和边界 bug
        nsec <= nsec + 32'd8 - 32'd1_000_000_000;
        sec  <= sec + 1'b1;
    end else begin
        nsec <= nsec + 32'd8;
    end
end

相减(使用高频mcu处理比较容易)

  • 两个PTP时间戳相减(Δt)
  • 在同一 ToD(Time of Day)源、单调递增计数器、无软件干预,可以假设 a_sec ≥ b_sec,甚至可以 assert(a_sec >= b_sec),不需要显式处理 a_sec < b_sec 的情况。
verilog 复制代码
// ts_a >= ts_b
reg [31:0] delta_sec;
reg [31:0] delta_nsec;

always @(*) begin
    if (a_nsec >= b_nsec) begin
        delta_sec  = a_sec - b_sec;
        delta_nsec = a_nsec - b_nsec;
    end else begin
        delta_sec  = a_sec - b_sec - 1'b1;
        delta_nsec = a_nsec + 32'd1_000_000_000 - b_nsec;
    end
end
减法中考虑a_sec < b_sec的情况
  • 有符号数(正确姿势)
  • 二进制补码(Two's Complement)是计算机内部表示和存储有符号整数的标准方法。它将符号位与数值位统一处理,使加减法硬件电路大大简化。正数的补码就是其本身,负数的补码则是将其原码除符号位外按位取反,末位再加 1。
verilog 复制代码
reg signed [31:0] a, b;
wire signed [31:0] diff;

assign diff = a - b;
  • 采用有符号数+标志位:
verilog 复制代码
reg [31:0] a_sec, a_nsec;
reg [31:0] b_sec, b_nsec;

reg valid;
reg [31:0] delta_sec;
reg [31:0] delta_nsec;

always @(*) begin
    if (a_sec < b_sec ||
       (a_sec == b_sec && a_nsec < b_nsec)) begin  // 小数减大数 → valid = 0
        valid = 1'b0;
        delta_sec  = 32'd0;
        delta_nsec = 32'd0;
    end else begin
        valid = 1'b1;
        if (a_nsec >= b_nsec) begin
            delta_sec  = a_sec - b_sec;
            delta_nsec = a_nsec - b_nsec;
        end else begin
            delta_sec  = a_sec - b_sec - 1'b1;
            delta_nsec = a_nsec + 32'd1_000_000_000 - b_nsec;
        end
    end
end
相关推荐
ysa0510301 小时前
【并查集】判环
c++·笔记·算法
aaaameliaaa6 小时前
计算斐波那契数(递归、迭代)(1,1,2,3,5.....)
c语言·开发语言·笔记·算法·排序算法
小c君tt6 小时前
linux学习笔记1
linux·笔记·学习
ysu_03147 小时前
高数期末复习笔记
笔记
疯狂打码的少年8 小时前
【操作系统】段式存储管理与段页式存储管理
笔记
半导体守望者10 小时前
MKS C系列MFC CMA10 CMA50快速紧凑型手侧与PC联网教程软件驱动USB
经验分享·笔记·功能测试·自动化·制造
小c君tt10 小时前
QT笔记记录
开发语言·笔记·qt
2601_9624408411 小时前
计算机毕业设计之jsp教室管理系统
java·开发语言·笔记·分布式·算法·课程设计·推荐算法