@@ -42,7 +42,8 @@ module ptp_clock #
4242 parameter DRIFT_ENABLE = 1 ,
4343 parameter DRIFT_NS = 4'h0 ,
4444 parameter DRIFT_FNS = 16'h0002 ,
45- parameter DRIFT_RATE = 16'h0005
45+ parameter DRIFT_RATE = 16'h0005 ,
46+ parameter PIPELINE_OUTPUT = 0
4647)
4748(
4849 input wire clk,
@@ -131,15 +132,78 @@ reg pps_reg = 0;
131132
132133assign input_adj_active = adj_active_reg;
133134
134- assign output_ts_96[95 :48 ] = ts_96_s_reg;
135- assign output_ts_96[47 :46 ] = 2'b00 ;
136- assign output_ts_96[45 :16 ] = ts_96_ns_reg;
137- assign output_ts_96[15 :0 ] = FNS_WIDTH > 16 ? ts_96_fns_reg >> (FNS_WIDTH- 16 ) : ts_96_fns_reg << (16 - FNS_WIDTH);
138- assign output_ts_64[63 :16 ] = ts_64_ns_reg;
139- assign output_ts_64[15 :0 ] = FNS_WIDTH > 16 ? ts_64_fns_reg >> (FNS_WIDTH- 16 ) : ts_64_fns_reg << (16 - FNS_WIDTH);
140- assign output_ts_step = ts_step_reg;
135+ generate
136+
137+ if (PIPELINE_OUTPUT > 0 ) begin
138+
139+ // pipeline
140+ (* shreg_extract = "no" * )
141+ reg [95 :0 ] output_ts_96_reg[0 :PIPELINE_OUTPUT- 1 ];
142+ (* shreg_extract = "no" * )
143+ reg [63 :0 ] output_ts_64_reg[0 :PIPELINE_OUTPUT- 1 ];
144+ (* shreg_extract = "no" * )
145+ reg output_ts_step_reg[0 :PIPELINE_OUTPUT- 1 ];
146+ (* shreg_extract = "no" * )
147+ reg output_pps_reg[0 :PIPELINE_OUTPUT- 1 ];
148+
149+ assign output_ts_96 = output_ts_96_reg[PIPELINE_OUTPUT- 1 ];
150+ assign output_ts_64 = output_ts_64_reg[PIPELINE_OUTPUT- 1 ];
151+ assign output_ts_step = output_ts_step_reg[PIPELINE_OUTPUT- 1 ];
152+ assign output_pps = output_pps_reg[PIPELINE_OUTPUT- 1 ];
153+
154+ integer i;
155+
156+ initial begin
157+ for (i = 0 ; i < PIPELINE_OUTPUT; i = i + 1 ) begin
158+ output_ts_96_reg[i] = 96'd0 ;
159+ output_ts_64_reg[i] = 64'd0 ;
160+ output_ts_step_reg[i] = 1'b0 ;
161+ output_pps_reg[i] = 1'b0 ;
162+ end
163+ end
164+
165+ always @(posedge clk) begin
166+ output_ts_96_reg[0 ][95 :48 ] <= ts_96_s_reg;
167+ output_ts_96_reg[0 ][47 :46 ] <= 2'b00 ;
168+ output_ts_96_reg[0 ][45 :16 ] <= ts_96_ns_reg;
169+ output_ts_96_reg[0 ][15 :0 ] <= {ts_96_fns_reg, 16'd0 } >> FNS_WIDTH;
170+ output_ts_64_reg[0 ][63 :16 ] <= ts_64_ns_reg;
171+ output_ts_64_reg[0 ][15 :0 ] <= {ts_64_fns_reg, 16'd0 } >> FNS_WIDTH;
172+ output_ts_step_reg[0 ] <= ts_step_reg;
173+ output_pps_reg[0 ] <= pps_reg;
174+
175+ for (i = 0 ; i < PIPELINE_OUTPUT- 1 ; i = i + 1 ) begin
176+ output_ts_96_reg[i+ 1 ] <= output_ts_96_reg[i];
177+ output_ts_64_reg[i+ 1 ] <= output_ts_64_reg[i];
178+ output_ts_step_reg[i+ 1 ] <= output_ts_step_reg[i];
179+ output_pps_reg[i+ 1 ] <= output_pps_reg[i];
180+ end
181+
182+ if (rst) begin
183+ for (i = 0 ; i < PIPELINE_OUTPUT; i = i + 1 ) begin
184+ output_ts_96_reg[i] = 96'd0 ;
185+ output_ts_64_reg[i] = 64'd0 ;
186+ output_ts_step_reg[i] = 1'b0 ;
187+ output_pps_reg[i] = 1'b0 ;
188+ end
189+ end
190+ end
191+
192+ end else begin
193+
194+ assign output_ts_96[95 :48 ] = ts_96_s_reg;
195+ assign output_ts_96[47 :46 ] = 2'b00 ;
196+ assign output_ts_96[45 :16 ] = ts_96_ns_reg;
197+ assign output_ts_96[15 :0 ] = {ts_96_fns_reg, 16'd0 } >> FNS_WIDTH;
198+ assign output_ts_64[63 :16 ] = ts_64_ns_reg;
199+ assign output_ts_64[15 :0 ] = {ts_64_fns_reg, 16'd0 } >> FNS_WIDTH;
200+ assign output_ts_step = ts_step_reg;
201+
202+ assign output_pps = pps_reg;
203+
204+ end
141205
142- assign output_pps = pps_reg;
206+ endgenerate
143207
144208always @(posedge clk) begin
145209 ts_step_reg <= 0 ;
0 commit comments