1588時間戳軟件設計
通過上文對時鐘偏移量和延遲量的分析來設計1588時間戳的狀態機。狀態機中共有S0、S1、S2、S3、S4五種狀態,分別代表了時鐘同步初始狀態、Sync報文狀態、Follow報文狀態、Delay_Req報文狀態和Delay_Resp狀態。下面給出的是時間戳狀態機的軟件實現方式:
module ieee1588_time_stamp (in_data,clk,nclear,out);
input indata, clk,nclear;
output out; //端口聲明
reg out;
reg[2:0] state;
reg t_slave1,t_master1,t_slave2,t_master2,t_offset,t_
delay;
。。.。。.。。.。。.。?!?/變量和參數聲明
parameter [2:0] s0=1,s1=2,s2=3,s3=4,s4=4;
//各狀態的定義
always @(posedge clk)
begin
if(! nclear |主從時鐘同步) state = s0;
case(state)
s0: begin
if(indata ==同步報文)
state 《= s1;
else if(idata ==跟隨報文)
begin out = t_master1;state 《= s2; end
else state 《= s0;
end
s1:state 《= (indata ==傳輸t_slave1)? s1:s2;
s2:state 《= (indata ==延遲請求報文)? s3:s2;
s3:state 《= (indata ==延遲響應報文)? s4:s3;
s4:state 《=(indata ==同步)? s0:s3;
endcase
end
always @ (state) //探測到狀態的變化同時輸出
信號
begin
case (state)
s0:out=t_master1
s1:out=t_slave1;
s2:out=t_slave2;
s3:out=t_master2;
s4:out={t_offset,t_delay};
endcase
end
read_time _model test_time(
t_master1(t_master1),
t_slave1(t_slave1),
t_master2(t_master2),
t_slave2(t_slave2));//調用時鐘記錄模塊
……………。。
Endmodule
該狀態機利用兩個always語句分別實現狀態的轉換以及輸出。在ieee1588_time_stamp時間戳模塊中還調用了read_time_model時鐘讀取模塊為時間戳模塊實時的讀取時鐘。由于模塊上的網絡PHY為DP83848C,不具備IEEE1588幀檢測能力,需要更換成DP83640。DP83640芯片內置高精度IEEE1588時鐘,并設有由硬件執行的時間標記功能,可為接收及發送信息包打上時鐘標記,以實現IEEE1588功能。
評論