OpenCores
URL https://opencores.org/ocsvn/ha1588/ha1588/trunk

Subversion Repositories ha1588

[/] [ha1588/] [trunk/] [rtl/] [tsu/] [tsu.v] - Diff between revs 34 and 37

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 34 Rev 37
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};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.