FPGA实现PTP高精度时间同步:工业场景下完成亚微秒级时钟对齐
工业分布式IO、运动控制、采集记录要对到亚微秒,不能靠软件读系统时间。FPGA做PTP的核心是把时间戳打在MAC/PHY边界:本地维护纳秒TSU,RX在帧起始锁t2、TX在帧起始锁t1/t3,协议栈只算offset和路径延迟,本地时钟用频率字驯服,级联设备再上透明时钟补驻留时间。
一、TSU纳秒计数器
用一个独立时基,125MHz对应8ns步进,可再插值细化。PTP事件报文(Sync、Delay_Req等)在SOP打戳,普通报文不打。
module ptp_tsu #(parameter NS_W=64)(
input clk, rst_n, input [31:0] sec_in, input [31:0] ns_in,
input rx_sop, tx_sop, input [15:0] eth_type,
output reg [63:0] rx_ts, tx_ts, output reg rx_vld, tx_vld);
reg [31:0] sec; reg [31:0] ns;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) {sec,ns}<=0;
else begin
ns<=ns+8; // 125MHz=8ns,实际按TSU时钟改
if(ns>=1_000_000_000) begin ns<=0; sec<=sec+1; end
if(sec_in&&ns_in) {sec,ns}<={sec_in,ns_in}; // 初始对时
end
end
always @(posedge clk) begin
rx_vld<=0; tx_vld<=0;
if(rx_sop && eth_type==16'h88F7) begin
rx_ts<={sec,ns}; rx_vld<=1; end // 收Sync/Follow_Up等打t2/t4
if(tx_sop && eth_type==16'h88F7) begin
tx_ts<={sec,ns}; tx_vld<=1; end // 发Sync/Delay_Req打t1/t3
end
endmodule
打点位置越靠近MII/GMII/RGMII,越能避开DMA、协议栈、FIFO调度抖动;Xilinx千兆方案中PL在RGMII做识别与打戳,单跳可到约±100ns。
二、主从offset与路径延迟
Two-step最常用:主发Sync,硬件记t1;Follow_Up把t1回传。从收Sync记t2,从发Delay_Req记t3,主回Delay_Resp带t4。软件按四时间戳估链路延迟与偏差:路径延迟取“(t2−t1)+(t4−t3)”的一半,offset取“(t2−t1)−路径延迟”;若上下行不对称,再引入人工不对称补偿。工业级别要求打戳点、PHY延时、线缆长度都固定,普通交换机不感知PTP会引入随机排队,精度会掉到微秒级。
三、本地时钟频率驯服
别直接改秒值硬跳,先调频率再调相位。用32位频率字,默认0表示标称,PI控制器按offset更新:
module ptp_servo(
input clk, rst_n, input signed [31:0] offset_ns,
output reg signed [31:0] freq_ppb);
reg signed [31:0] i_term;
parameter Kp=8, Ki=1;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin freq_ppb<=0; i_term<=0; end
else begin
i_term<=i_term + Ki*offset_ns/1024;
freq_ppb<=Kp*offset_ns/1024 + i_term; // ppb级微调晶振/PLL
if(freq_ppb> 200000) freq_ppb<= 200000; // 限幅,防失控
if(freq_ppb<-200000) freq_ppb<=-200000;
end
end
endmodule
freq_ppb送TSU或外部DPLL/OCXO;TCXO温漂ppm级、OCXO可到ppb级,工业现场断主钟还能Holdover。大offset可一次性设相移,小offset只用频率跟踪,避免时间倒跳。
四、透明时钟与工业落地
多跳车间交换机若不支持PTP,每跳排队都会污染t2/t4。FPGA做透明时钟:入端口打tin、出端口打tout,驻留时间累加到报文correctionField,下游按“主到从总修正”抵掉交换延迟。 边界时钟按端口终结PTP再向下发,适合跨网段;纯线形采集用透明时钟更省。
工程要点:
打戳点统一在MAC入口/出口或RGMII,PHY内部延时、SFP、电缆时延单独标定,电缆约5ns/m;
PTP走独立VLAN/优先级队列,Sync、Delay_Req优先于数据;工业交换用BC/TC,不用家用交换机;
1G RGMII TSU时钟125MHz,10G/25G用MAC IP硬件TSU,TDC辅助可把周期量化误差压到1ns内;
上电先收Announce做BMCA选主,再Sync+Follow_Up+Delay求offset,稳定后1~4s一包即可;
ILA抓t1~t4、freq_ppb、sec/ns,和linuxptp主钟对比offset;若长期漂移大查晶振温漂,若跳动大查交换机





