aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/timing
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/timing')
-rw-r--r--fpga/usrp3/lib/timing/Makefile.srcs1
-rw-r--r--fpga/usrp3/lib/timing/pps.v22
-rw-r--r--fpga/usrp3/lib/timing/timekeeper.v24
3 files changed, 38 insertions, 9 deletions
diff --git a/fpga/usrp3/lib/timing/Makefile.srcs b/fpga/usrp3/lib/timing/Makefile.srcs
index ff4ca17d2..09f0596c5 100644
--- a/fpga/usrp3/lib/timing/Makefile.srcs
+++ b/fpga/usrp3/lib/timing/Makefile.srcs
@@ -8,4 +8,5 @@
TIMING_SRCS = $(abspath $(addprefix $(BASE_DIR)/../lib/timing/, \
time_compare.v \
timekeeper.v \
+pps.v\
))
diff --git a/fpga/usrp3/lib/timing/pps.v b/fpga/usrp3/lib/timing/pps.v
new file mode 100644
index 000000000..49d3641b7
--- /dev/null
+++ b/fpga/usrp3/lib/timing/pps.v
@@ -0,0 +1,22 @@
+//
+// Copyright 2014 Ettus Research LLC
+//
+
+module pps_generator
+ #(parameter CLK_FREQ=0, DUTY=25)
+ (input clk, input reset, output pps);
+
+ reg[31:0] count;
+
+ always @(posedge clk) begin
+ if (reset) begin
+ count <= 32'b1;
+ end else if (count >= CLK_FREQ) begin
+ count <= 32'b1;
+ end else begin
+ count <= count + 1'b1;
+ end
+ end
+
+ assign pps = (count < CLK_FREQ * DUTY / 100);
+endmodule //pps_generator
diff --git a/fpga/usrp3/lib/timing/timekeeper.v b/fpga/usrp3/lib/timing/timekeeper.v
index 627472094..761bda5bc 100644
--- a/fpga/usrp3/lib/timing/timekeeper.v
+++ b/fpga/usrp3/lib/timing/timekeeper.v
@@ -1,5 +1,5 @@
//
-// Copyright 2013 Ettus Research LLC
+// Copyright 2013-2014 Ettus Research LLC
//
@@ -19,11 +19,11 @@ module timekeeper
setting_reg #(.my_addr(BASE), .width()) sr_time_hi
(.clk(clk), .rst(reset), .strobe(set_stb), .addr(set_addr), .in(set_data),
.out(time_at_next_event[63:32]), .changed());
-
+
setting_reg #(.my_addr(BASE+1), .width()) sr_time_lo
(.clk(clk), .rst(reset), .strobe(set_stb), .addr(set_addr), .in(set_data),
.out(time_at_next_event[31:0]), .changed());
-
+
setting_reg #(.my_addr(BASE+2), .width(2)) sr_ctrl
(.clk(clk), .rst(reset), .strobe(set_stb), .addr(set_addr), .in(set_data),
.out({set_time_pps, set_time_now}), .changed(cmd_trigger));
@@ -38,12 +38,6 @@ module timekeeper
wire pps_edge = !pps_del2 & pps_del;
//////////////////////////////////////////////////////////////////////////
- // track the time at last pps so host can detect the pps
- //////////////////////////////////////////////////////////////////////////
- always @(posedge clk)
- if(pps_edge) vita_time_lastpps <= vita_time;
-
- //////////////////////////////////////////////////////////////////////////
// arm the trigger to latch a new time when the ctrl register is written
//////////////////////////////////////////////////////////////////////////
reg armed;
@@ -65,4 +59,16 @@ module timekeeper
else
vita_time <= vita_time + 64'h1;
+ //////////////////////////////////////////////////////////////////////////
+ // track the time at last pps so host can detect the pps
+ //////////////////////////////////////////////////////////////////////////
+ always @(posedge clk)
+ if(reset)
+ vita_time_lastpps <= 64'h0;
+ else if(pps_edge)
+ if(time_event)
+ vita_time_lastpps <= time_at_next_event;
+ else
+ vita_time_lastpps <= vita_time + 64'h1;
+
endmodule // timekeeper