Line 1... |
Line 1... |
/*
|
/*
|
* $tsu.v
|
* $tsu.v
|
*
|
*
|
* Copyright (c) 2012, BBY&HW. All rights reserved.
|
* Copyright (c) 2012, BABY&HW. All rights reserved.
|
*
|
*
|
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
* version 2.1 of the License, or (at your option) any later version.
|
* version 2.1 of the License, or (at your option) any later version.
|
Line 33... |
Line 33... |
|
|
input q_rst,
|
input q_rst,
|
input q_rd_clk,
|
input q_rd_clk,
|
input q_rd_en,
|
input q_rd_en,
|
output [ 7:0] q_rd_stat,
|
output [ 7:0] q_rd_stat,
|
output [63:0] q_rd_data // seqId_16bit + msgId_4bit + null_8bit + timeStamp1s_4bit + timeStamp1ns_32bit
|
output [127:0] q_rd_data // null_16bit + timeStamp1s_48bit + timeStamp1ns_32bit + msgId_4bit + ckSum_12bit + seqId_16bit
|
);
|
);
|
|
|
// buffer gmii input
|
// buffer gmii input
|
reg int_gmii_ctrl;
|
reg int_gmii_ctrl;
|
reg int_gmii_ctrl_d1, int_gmii_ctrl_d2, int_gmii_ctrl_d3, int_gmii_ctrl_d4, int_gmii_ctrl_d5;
|
reg int_gmii_ctrl_d1, int_gmii_ctrl_d2, int_gmii_ctrl_d3, int_gmii_ctrl_d4, int_gmii_ctrl_d5;
|
Line 79... |
Line 79... |
ts_req_d1 <= ts_req;
|
ts_req_d1 <= ts_req;
|
ts_req_d2 <= ts_req_d1;
|
ts_req_d2 <= ts_req_d1;
|
ts_req_d3 <= ts_req_d2;
|
ts_req_d3 <= ts_req_d2;
|
end
|
end
|
end
|
end
|
reg [35:0] rtc_time_stamp;
|
reg [79:0] rtc_time_stamp;
|
always @(posedge rst or posedge rtc_timer_clk) begin
|
always @(posedge rst or posedge rtc_timer_clk) begin
|
if (rst)
|
if (rst)
|
rtc_time_stamp <= 36'd0;
|
rtc_time_stamp <= 80'd0;
|
else
|
else
|
if (ts_req_d2 & !ts_req_d3)
|
if (ts_req_d2 & !ts_req_d3)
|
rtc_time_stamp <= rtc_timer_in[35:0]; // 16.000,000,000 sec
|
rtc_time_stamp <= rtc_timer_in;
|
end
|
end
|
reg ts_ack, ts_ack_clr;
|
reg ts_ack, ts_ack_clr;
|
always @(posedge ts_ack_clr or posedge rtc_timer_clk) begin
|
always @(posedge ts_ack_clr or posedge rtc_timer_clk) begin
|
if (ts_ack_clr)
|
if (ts_ack_clr)
|
ts_ack <= 1'b0;
|
ts_ack <= 1'b0;
|
Line 109... |
Line 109... |
ts_ack_d1 <= ts_ack;
|
ts_ack_d1 <= ts_ack;
|
ts_ack_d2 <= ts_ack_d1;
|
ts_ack_d2 <= ts_ack_d1;
|
ts_ack_d3 <= ts_ack_d2;
|
ts_ack_d3 <= ts_ack_d2;
|
end
|
end
|
end
|
end
|
reg [35:0] gmii_time_stamp;
|
reg [79:0] gmii_time_stamp;
|
always @(posedge rst or posedge gmii_clk) begin
|
always @(posedge rst or posedge gmii_clk) begin
|
if (rst) begin
|
if (rst) begin
|
gmii_time_stamp <= 36'd0;
|
gmii_time_stamp <= 80'd0;
|
ts_ack_clr <= 1'b0;
|
ts_ack_clr <= 1'b0;
|
end
|
end
|
else begin
|
else begin
|
if (ts_ack_d2 & !ts_ack_d3) begin
|
if (ts_ack_d2 & !ts_ack_d3) begin
|
gmii_time_stamp <= rtc_time_stamp;
|
gmii_time_stamp <= rtc_time_stamp;
|
Line 205... |
Line 205... |
end
|
end
|
|
|
// ptp packet parser here
|
// ptp packet parser here
|
// works at 1/4 gmii_clk frequency, needs multicycle timing constraint
|
// works at 1/4 gmii_clk frequency, needs multicycle timing constraint
|
wire ptp_found;
|
wire ptp_found;
|
wire [19:0] ptp_infor;
|
wire [31:0] ptp_infor;
|
ptp_parser parser(
|
ptp_parser parser(
|
.clk(gmii_clk),
|
.clk(gmii_clk),
|
.rst(rst),
|
.rst(rst),
|
.int_data(int_data_d1),
|
.int_data(int_data_d1),
|
.int_valid(int_valid_d1),
|
.int_valid(int_valid_d1),
|
Line 221... |
Line 221... |
);
|
);
|
|
|
// ptp time stamp dcfifo
|
// ptp time stamp dcfifo
|
wire q_wr_clk = gmii_clk;
|
wire q_wr_clk = gmii_clk;
|
wire q_wr_en = ptp_found && int_eop_d1;
|
wire q_wr_en = ptp_found && int_eop_d1;
|
wire [63:0] q_wr_data = {ptp_infor, 8'd0, gmii_time_stamp}; // 20+8+36 bit
|
wire [127:0] q_wr_data = {16'd0, gmii_time_stamp, ptp_infor}; // 16+80+32 bit
|
wire [3:0] q_wrusedw;
|
wire [3:0] q_wrusedw;
|
wire [3:0] q_rdusedw;
|
wire [3:0] q_rdusedw;
|
|
|
ptp_queue queue(
|
ptp_queue queue(
|
.aclr(q_rst),
|
.aclr(q_rst),
|
|
|
.wrclk(q_wr_clk),
|
.wrclk(q_wr_clk),
|
.wrreq(q_wr_en && q_wrusedw<=15), // write with overflow protection
|
.wrreq(q_wr_en && q_wrusedw<15), // write with overflow protection
|
.data(q_wr_data),
|
.data(q_wr_data),
|
.wrusedw(q_wrusedw),
|
.wrusedw(q_wrusedw),
|
|
|
.rdclk(q_rd_clk),
|
.rdclk(q_rd_clk),
|
.rdreq(q_rd_en && q_rdusedw>= 1), // read with underflow protection
|
.rdreq(q_rd_en && q_rdusedw>0 ), // read with underflow protection
|
.q(q_rd_data),
|
.q(q_rd_data),
|
.rdusedw(q_rdusedw)
|
.rdusedw(q_rdusedw)
|
);
|
);
|
|
|
assign q_rd_stat = {4'd0, q_rdusedw};
|
assign q_rd_stat = {4'd0, q_rdusedw};
|