1588時(shí)間戳軟件設(shè)計(jì)
通過上文對時(shí)鐘偏移量和延遲量的分析來設(shè)計(jì)1588時(shí)間戳的狀態(tài)機(jī)。狀態(tài)機(jī)中共有S0、S1、S2、S3、S4五種狀態(tài),分別代表了時(shí)鐘同步初始狀態(tài)、Sync報(bào)文狀態(tài)、Follow報(bào)文狀態(tài)、Delay_Req報(bào)文狀態(tài)和Delay_Resp狀態(tài)。下面給出的是時(shí)間戳狀態(tài)機(jī)的軟件實(shí)現(xiàn)方式:
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;
。。.。。.。。.。。.。?!?/變量和參數(shù)聲明
parameter [2:0] s0=1,s1=2,s2=3,s3=4,s4=4;
//各狀態(tài)的定義
always @(posedge clk)
begin
if(! nclear |主從時(shí)鐘同步) state = s0;
case(state)
s0: begin
if(indata ==同步報(bào)文)
state 《= s1;
else if(idata ==跟隨報(bào)文)
begin out = t_master1;state 《= s2; end
else state 《= s0;
end
s1:state 《= (indata ==傳輸t_slave1)? s1:s2;
s2:state 《= (indata ==延遲請求報(bào)文)? s3:s2;
s3:state 《= (indata ==延遲響應(yīng)報(bào)文)? s4:s3;
s4:state 《=(indata ==同步)? s0:s3;
endcase
end
always @ (state) //探測到狀態(tài)的變化同時(shí)輸出
信號
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));//調(diào)用時(shí)鐘記錄模塊
……………。。
Endmodule
該狀態(tài)機(jī)利用兩個(gè)always語句分別實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換以及輸出。在ieee1588_time_stamp時(shí)間戳模塊中還調(diào)用了read_time_model時(shí)鐘讀取模塊為時(shí)間戳模塊實(shí)時(shí)的讀取時(shí)鐘。由于模塊上的網(wǎng)絡(luò)PHY為DP83848C,不具備IEEE1588幀檢測能力,需要更換成DP83640。DP83640芯片內(nèi)置高精度IEEE1588時(shí)鐘,并設(shè)有由硬件執(zhí)行的時(shí)間標(biāo)記功能,可為接收及發(fā)送信息包打上時(shí)鐘標(biāo)記,以實(shí)現(xiàn)IEEE1588功能。
評論
查看更多