diff options
author | Wade Fife <wade.fife@ettus.com> | 2021-03-10 14:17:41 -0600 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2021-06-03 11:26:54 -0500 |
commit | f9c97371048bfc69182187e6d8904a01efbe6d79 (patch) | |
tree | 1ddba5049944a484ba9e04fe822e012fe70c2746 /fpga | |
parent | c6035320215f270d7658cfb6195a96a0b84d6aa7 (diff) | |
download | uhd-f9c97371048bfc69182187e6d8904a01efbe6d79.tar.gz uhd-f9c97371048bfc69182187e6d8904a01efbe6d79.tar.bz2 uhd-f9c97371048bfc69182187e6d8904a01efbe6d79.zip |
fpga: lib: Add time_increment port to timekeeper
Adds a time_increment port for situations in which the parameter
TIME_INCREMENT can't be used. They offer the same behavior.
Diffstat (limited to 'fpga')
-rw-r--r-- | fpga/usrp3/lib/rfnoc/utils/timekeeper.v | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/fpga/usrp3/lib/rfnoc/utils/timekeeper.v b/fpga/usrp3/lib/rfnoc/utils/timekeeper.v index 404f45758..2b43c7ee6 100644 --- a/fpga/usrp3/lib/rfnoc/utils/timekeeper.v +++ b/fpga/usrp3/lib/rfnoc/utils/timekeeper.v @@ -1,24 +1,46 @@ // -// Copyright 2019 Ettus Research, a National Instruments Company +// Copyright 2021 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: LGPL-3.0-or-later // // Module: timekeeper // -// Description: Timekeeper for RFNoC blocks. This block contains a 64-bit -// counter to represent the current time in terms of sample clock cycles. The -// counter can be updated and synchronized using the pps input. +// Description: // -// WARNING: All register larger than a single 32-bit word should be read and -// written least significant word first to guarantee coherency. +// Timekeeper for RFNoC blocks. This block contains a 64-bit counter to +// represent the current time in terms of sample clock cycles. The counter +// can be updated and synchronized using the pps input. +// +// WARNING: All register larger than a single 32-bit word should be read and +// written least significant word first to guarantee coherency. +// +// Parameters: +// +// BASE_ADDR : Base address for the internal CtrlPort registers. +// TIME_INCREMENT : Amount by which to increment tb_timestamp for each radio +// strobe. When 0, the time_increment input is used instead. +// +// Signals: +// +// tb_clk : Time-base clock +// tb_rst : Time-base reset in tb_clk domain +// s_ctrlport_clk : Clock for CtrlPort bus +// s_ctrlport_* : CtrlPort bus for register access +// time_increment : Amount by which to increment timestamp. This is +// only used if TIME_INCREMENT parameter is 0. +// sample_rx_stb : Sample Rx strobe (data valid indicator). +// pps : Pulse-per-second input +// tb_timestamp : 64-bit global timestamp synchronous to tb_clk +// tb_timestamp_last_pps : 64-bit timestamp of the last PPS edge +// tb_period_ns_q32 : Time Period of time-base in nanoseconds // module timekeeper #( parameter BASE_ADDR = 'h00, - parameter TIME_INCREMENT = 1 // Amount by which to increment time on each sample clock cycle + parameter TIME_INCREMENT = 1 ) ( - input wire tb_clk, // Time-base clock - input wire tb_rst, // Time-base reset in tb_clk domain + input wire tb_clk, + input wire tb_rst, //--------------------------------------------------------------------------- // Control Interface @@ -33,14 +55,15 @@ module timekeeper #( output wire [31:0] s_ctrlport_resp_data, //--------------------------------------------------------------------------- - // Time + // Time (tb_clk domain) //--------------------------------------------------------------------------- - input wire sample_rx_stb, // Sample Rx strobe (data valid indicator) - input wire pps, // Pulse per second input - output reg [63:0] tb_timestamp, // 64-bit global timestamp synchronous to tb_clk - output reg [63:0] tb_timestamp_last_pps, // 64-bit global timestamp synchronous to tb_clk - output reg [63:0] tb_period_ns_q32 // Time Period of time-base in nanoseconds + input wire [ 7:0] time_increment, + input wire sample_rx_stb, + input wire pps, + output reg [63:0] tb_timestamp, + output reg [63:0] tb_timestamp_last_pps, + output reg [63:0] tb_period_ns_q32 ); //--------------------------------------------------------------------------- @@ -230,6 +253,9 @@ module timekeeper #( // Time Tracker //--------------------------------------------------------------------------- + // Amount by which to increment the timekeeper each clock cycle + wire [31:0] increment = TIME_INCREMENT ? TIME_INCREMENT : time_increment; + reg time_event_armed; // Boolean to indicate if we're expecting a timed event wire time_event = @@ -248,7 +274,7 @@ module timekeeper #( tb_timestamp <= time_at_next_event; end else if (sample_rx_stb) begin // Update time for each sample word received - tb_timestamp <= tb_timestamp + TIME_INCREMENT; + tb_timestamp <= tb_timestamp + increment; end if (new_time_ctrl) begin @@ -271,7 +297,7 @@ module timekeeper #( if (time_event) begin tb_timestamp_last_pps <= time_at_next_event; end else begin - tb_timestamp_last_pps <= tb_timestamp + TIME_INCREMENT; + tb_timestamp_last_pps <= tb_timestamp + increment; end end end |