URL
https://opencores.org/ocsvn/ha1588/ha1588/trunk
Subversion Repositories ha1588
Compare Revisions
- This comparison shows the changes necessary to convert path
/ha1588/trunk/rtl
- from Rev 27 to Rev 29
- ↔ Reverse comparison
Rev 27 → Rev 29
/tsu/tsu.v
159,6 → 159,30
end |
end |
|
reg [31:0] int_data_d1; |
reg int_valid_d1; |
reg int_sop_d1; |
reg int_eop_d1; |
reg [ 1:0] int_mod_d1; |
always @(posedge rst or posedge gmii_clk) begin |
if (rst) begin |
int_data_d1 <= 32'h00000000; |
int_valid_d1 <= 1'b0; |
int_sop_d1 <= 1'b0; |
int_eop_d1 <= 1'b0; |
int_mod_d1 <= 2'b00; |
end |
else begin |
if (int_valid) begin |
int_data_d1 <= int_data; |
int_mod_d1 <= int_mod; |
end |
int_valid_d1 <= int_valid; |
int_sop_d1 <= int_sop; |
int_eop_d1 <= int_eop; |
end |
end |
|
// ptp packet parser here |
// works at 1/4 gmii_clk frequency, needs multicycle timing constraint |
wire ptp_found; |
166,11 → 190,11
ptp_parser parser( |
.clk(gmii_clk), |
.rst(rst), |
.int_data(int_data), |
.int_valid(int_valid), |
.int_sop(int_sop), |
.int_eop(int_eop), |
.int_mod(int_mod), |
.int_data(int_data_d1), |
.int_valid(int_valid_d1), |
.int_sop(int_sop_d1), |
.int_eop(int_eop_d1), |
.int_mod(int_mod_d1), |
.ptp_found(ptp_found), |
.ptp_infor(ptp_infor) |
); |
177,7 → 201,7
|
// ptp time stamp dcfifo |
wire q_wr_clk = gmii_clk; |
wire q_wr_en = ptp_found; |
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 [3:0] q_wrusedw; |
wire [3:0] q_rdusedw; |
/tsu/ptp_parser.v
13,29 → 13,18
); |
|
reg [31:0] int_data_d1; |
reg int_valid_d1; |
reg int_sop_d1; |
reg int_eop_d1; |
reg [ 1:0] int_mod_d1; |
always @(posedge rst or posedge clk) begin |
if (rst) begin |
int_data_d1 <= 32'h00000000; |
int_valid_d1 <= 1'b0; |
int_sop_d1 <= 1'b0; |
int_eop_d1 <= 1'b0; |
int_mod_d1 <= 2'b00; |
end |
else begin |
if (int_valid) begin |
int_data_d1 <= int_data; |
int_mod_d1 <= int_mod; |
end |
int_valid_d1 <= int_valid; |
int_sop_d1 <= int_sop; |
int_eop_d1 <= int_eop; |
end |
end |
|
// packet parser: counter |
reg [ 9:0] int_cnt, bypass_ipv4_cnt, bypass_ipv6_cnt, bypass_udp_cnt, ptp_cnt; |
reg bypass_vlan, ptp_l2, bypass_ipv4, bypass_ipv6, found_udp, bypass_udp, ptp_l4, ptp_event; |
reg [ 3:0] ptp_msgid; |
48,28 → 37,34
bypass_udp_cnt <= 10'd0; |
end |
else begin |
if (int_valid_d1 && int_sop_d1) |
if (int_valid && int_sop) |
int_cnt <= 10'd0; |
else if (int_valid_d1) |
else if (int_valid) |
int_cnt <= int_cnt + 10'd1 - bypass_vlan - (bypass_ipv4 || bypass_ipv6 || bypass_udp); |
|
if (int_valid_d1 && int_sop_d1) |
if (int_valid && int_sop) |
bypass_ipv4_cnt <= 10'd0; |
else if (int_valid_d1 && bypass_ipv4) |
else if (int_valid && bypass_ipv4) |
bypass_ipv4_cnt <= bypass_ipv4_cnt + 10'd1; |
|
if (int_valid_d1 && int_sop_d1) |
if (int_valid && int_sop) |
bypass_ipv6_cnt <= 10'd0; |
else if (int_valid_d1 && bypass_ipv6) |
else if (int_valid && bypass_ipv6) |
bypass_ipv6_cnt <= bypass_ipv6_cnt + 10'd1; |
|
if (int_valid_d1 && int_sop_d1) |
if (int_valid && int_sop) |
bypass_udp_cnt <= 10'd0; |
else if (int_valid_d1 && bypass_udp) |
else if (int_valid && bypass_udp) |
bypass_udp_cnt <= bypass_udp_cnt + 10'd1; |
|
if (int_valid && int_sop) |
ptp_cnt <= 10'd0; |
else if (int_valid && (ptp_l2 || (bypass_udp_cnt>=10'd2 && ptp_l4))) |
ptp_cnt <= ptp_cnt + 10'd1; |
end |
end |
|
// packet parser: comparator |
always @(posedge rst or posedge clk) begin |
if (rst) begin |
bypass_vlan <= 1'b0; |
81,7 → 76,7
ptp_l4 <= 1'b0; |
ptp_event <= 1'b0; |
end |
else if (int_valid_d1 && int_sop_d1) begin |
else if (int_valid && int_sop) begin |
bypass_vlan <= 1'b0; |
bypass_ipv4 <= 1'b0; |
bypass_ipv6 <= 1'b0; |
93,116 → 88,102
end |
else begin |
// bypass vlan |
// ether_type == cvlan |
if (int_valid_d1 && int_cnt==10'd3 && int_data_d1[31:16]==16'h8100) |
if (int_valid && int_cnt==10'd3 && int_data[31:16]==16'h8100) // ether_type == cvlan |
bypass_vlan <= 1'b1; |
// ether_type == svlan |
else if (int_valid_d1 && int_cnt==10'd3 && int_data_d1[31:16]==16'h9100) |
else if (int_valid && int_cnt==10'd3 && int_data[31:16]==16'h9100) // ether_type == svlan |
bypass_vlan <= 1'b1; |
else if (int_valid_d1 && int_cnt==10'd4 && int_data_d1[31:16]==16'h8100 && bypass_vlan) |
else if (int_valid && int_cnt==10'd4 && int_data[31:16]==16'h8100 && bypass_vlan) // svlan_type == cvlan |
bypass_vlan <= 1'b1; |
else if (int_valid_d1 && bypass_vlan) |
else if (int_valid && bypass_vlan) |
bypass_vlan <= 1'b0; |
|
// bypass ipv4 |
// ether_type == ip, ip_version == 4 |
if (int_valid_d1 && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && bypass_ipv4_cnt==10'd0 && |
int_data_d1[31:16]==16'h0800 && int_data_d1[15:12]==4'h4) |
if (int_valid && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && bypass_ipv4_cnt==10'd0 && |
int_data[31:16]==16'h0800 && int_data[15:12]==4'h4) // ether_type == ipv4, ip_version == 4 |
bypass_ipv4 <= 1'b1; |
else if (int_valid_d1 && bypass_ipv4_cnt==10'd4) |
else if (int_valid && bypass_ipv4_cnt==10'd4) |
bypass_ipv4 <= 1'b0; |
|
// bypass ipv6 |
// ether_type == ip, ip_version == 6 |
if (int_valid_d1 && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && bypass_ipv6_cnt==10'd0 && |
int_data_d1[31:16]==16'h86dd && int_data_d1[15:12]==4'h6) |
if (int_valid && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && bypass_ipv6_cnt==10'd0 && |
int_data[31:16]==16'h86dd && int_data[15:12]==4'h6) // ether_type == ipv6, ip_version == 6 |
bypass_ipv6 <= 1'b1; |
else if (int_valid_d1 && bypass_ipv6_cnt==10'd9) |
else if (int_valid && bypass_ipv6_cnt==10'd9) |
bypass_ipv6 <= 1'b0; |
|
// check if it is UDP |
// ipv4_protocol == udp |
if (int_valid_d1 && bypass_ipv4_cnt==10'd1 && int_data_d1[ 7: 0]== 8'h11) |
if (int_valid && bypass_ipv4_cnt==10'd1 && int_data[ 7: 0]== 8'h11) // ipv4_protocol == udp |
found_udp <= 1'b1; |
// ipv6_protocol == udp |
else if (int_valid_d1 && bypass_ipv6_cnt==10'd1 && int_data_d1[31:24]== 8'h11) |
else if (int_valid && bypass_ipv6_cnt==10'd1 && int_data[31:24]== 8'h11) // ipv6_protocol == udp |
found_udp <= 1'b1; |
|
// bypass udp |
// ipv4_udp |
if (int_valid_d1 && bypass_ipv4_cnt==10'd4 && bypass_udp_cnt==10'd0 && found_udp) |
if (int_valid && bypass_ipv4_cnt==10'd4 && bypass_udp_cnt==10'd0 && found_udp) // ipv4_udp |
bypass_udp <= 1'b1; |
else if (int_valid_d1 && bypass_udp_cnt==10'd2) |
bypass_udp <= 1'b0; |
// ipv6_udp |
else if (int_valid_d1 && bypass_ipv6_cnt==10'd9 && bypass_udp_cnt==10'd0 && found_udp) |
else if (int_valid && bypass_ipv6_cnt==10'd9 && bypass_udp_cnt==10'd0 && found_udp) // ipv6_udp |
bypass_udp <= 1'b1; |
else if (int_valid_d1 && bypass_udp_cnt==10'd2) |
else if (int_valid && bypass_udp_cnt==10'd2) |
bypass_udp <= 1'b0; |
|
// check if it is L2 PTP |
// ether_type == ptp |
if (int_valid_d1 && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && int_data_d1[31:16]==16'h88F7) |
if (int_valid && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && int_data[31:16]==16'h88F7) // ether_type == ptp |
ptp_l2 <= 1'b1; |
// check if it is L4 PTP |
// udp_dest_port == ptp_event |
if (int_valid_d1 && bypass_udp_cnt==10'd0 && bypass_udp && |
(int_data_d1[31:16]==16'h013f || int_data_d1[31:16]==16'h0140)) |
if (int_valid && bypass_udp_cnt==10'd0 && bypass_udp && |
(int_data[31:16]==16'h013f || int_data[31:16]==16'h0140)) // udp_dest_port == ptp_event || ptp_general |
ptp_l4 <= 1'b1; |
|
// check if it is PTP Event message |
if (int_valid_d1 && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && int_data_d1[31:16]==16'h88F7 && |
(int_data_d1[11: 8]== 4'h0 || int_data_d1[11:8]==4'h2)) |
// ptp_message_id == sync || delay_req |
if (int_valid && (int_cnt==10'd3 || bypass_vlan && int_cnt==10'd4) && int_data[31:16]==16'h88F7 && |
(int_data[11: 8]== 4'h0 || int_data[11:8]==4'h2)) // ptp_message_id == sync || delay_req |
ptp_event <= 1'b1; |
else if (int_valid_d1 && (int_cnt==10'd4 || bypass_vlan && int_cnt==10'd5) && bypass_udp_cnt==10'd1 && ptp_l4 && |
(int_data_d1[11: 8]== 4'h0 || int_data_d1[11:8]==4'h2)) |
// ptp_message_id == sync || delay_req |
else if (int_valid && (int_cnt==10'd4 || bypass_vlan && int_cnt==10'd5) && bypass_udp_cnt==10'd1 && ptp_l4 && |
(int_data[11: 8]== 4'h0 || int_data[11:8]==4'h2)) // ptp_message_id == sync || delay_req |
ptp_event <= 1'b1; |
end |
end |
|
// ptp message |
reg [31:0] ptp_data; |
always @(posedge rst or posedge clk) begin |
if (rst) begin |
ptp_data <= 32'd0; |
ptp_msgid <= 4'd0; |
ptp_seqid <= 16'd0; |
end |
else if (int_valid_d1 && int_sop_d1) begin |
else if (int_valid && int_sop) begin |
ptp_data <= 32'd0; |
ptp_msgid <= 4'd0; |
ptp_seqid <= 16'd0; |
end |
else begin |
// get PTP identification information as additional information to Timestamp |
// ptp message body |
if (int_valid && (ptp_l2 || (bypass_udp_cnt>=10'd2 && ptp_l4))) |
ptp_data <= {int_data_d1[15:0], int_data[31:16]}; |
// message id |
if (int_valid_d1 && int_cnt==10'd3 && int_data_d1[31:16]==16'h88F7) |
ptp_msgid <= int_data_d1[11: 8]; |
else if (int_valid_d1 && int_cnt==10'd4 && bypass_udp_cnt==10'd1 && ptp_l4) |
ptp_msgid <= int_data_d1[11: 8]; |
if (int_valid && ptp_cnt==10'd1) |
ptp_msgid <= ptp_data[27:24]; |
// sequence id |
if (int_valid_d1 && int_cnt==10'd11 && ptp_l2) |
ptp_seqid <= int_data_d1[31:16]; |
else if (int_valid_d1 && int_cnt==10'd10 && ptp_l4) |
ptp_seqid <= int_data_d1[31:16]; |
if (int_valid && ptp_cnt==10'd8) |
ptp_seqid <= ptp_data[15:0]; |
end |
end |
|
// parser output |
always @(posedge rst or posedge clk) begin |
if (rst) begin |
ptp_found <= 1'b0; |
ptp_infor <= 20'd0; |
end |
else if (int_valid_d1 && int_sop_d1) begin |
else if (int_valid && int_sop) begin |
ptp_found <= 1'b0; |
ptp_infor <= 20'd0; |
end |
else if (int_valid_d1 && int_eop_d1) begin |
else if (int_valid && ptp_cnt==10'd9) begin |
ptp_found <= ptp_event; |
ptp_infor <= {ptp_seqid, ptp_msgid}; // 16+4 |
ptp_infor <= {ptp_msgid, ptp_seqid}; // 4+16 |
end |
else begin |
ptp_found <= 1'b0; |
ptp_infor <= 20'd0; |
end |
end |
|
endmodule |