Corrected the counter/timer and made an enhancement to respond to a
disable/enable sequence as a counter reset. Generated testbenches
for both counter/timers.
diff --git a/verilog/rtl/counter_timer.v b/verilog/rtl/counter_timer.v
index ccd1431..9e25281 100755
--- a/verilog/rtl/counter_timer.v
+++ b/verilog/rtl/counter_timer.v
@@ -1,7 +1,7 @@
/* Simple 32-bit counter-timer for Caravel. */
module counter_timer_wb # (
- parameter BASE_ADR = 32'h2200_0000,
+ parameter BASE_ADR = 32'h2400_0000,
parameter CONFIG = 8'h00,
parameter VALUE = 8'h04,
parameter DATA = 8'h08
@@ -85,6 +85,7 @@
reg irq_out;
reg enable; // Enable (start) the counter/timer
+reg lastenable; // Previous state of enable (catch rising/falling edge)
reg oneshot; // Set oneshot (1) mode or continuous (0) mode
reg updown; // Count up (1) or down (0)
reg irq_ena; // Enable interrupt on timeout
@@ -96,10 +97,12 @@
always @(posedge clkin or negedge resetn) begin
if (resetn == 1'b0) begin
enable <= 1'b0;
+ lastenable <= 1'b0;
oneshot <= 1'b0;
updown <= 1'b0;
irq_ena <= 1'b0;
end else begin
+ lastenable <= enable;
if (reg_cfg_we) begin
enable <= reg_cfg_di[0];
oneshot <= reg_cfg_di[1];
@@ -117,10 +120,10 @@
if (resetn == 1'b0) begin
value_reset <= 32'd0;
end else begin
- if (reg_val_we[3]) value_reset <= reg_val_di[31:24];
- if (reg_val_we[2]) value_reset <= reg_val_di[23:16];
- if (reg_val_we[1]) value_reset <= reg_val_di[15:8];
- if (reg_val_we[0]) value_reset <= reg_val_di[7:0];
+ if (reg_val_we[3]) value_reset[31:24] <= reg_val_di[31:24];
+ if (reg_val_we[2]) value_reset[23:16] <= reg_val_di[23:16];
+ if (reg_val_we[1]) value_reset[15:8] <= reg_val_di[15:8];
+ if (reg_val_we[0]) value_reset[7:0] <= reg_val_di[7:0];
end
end
@@ -140,7 +143,9 @@
if (reg_dat_we[0] == 1'b1) value_cur[7:0] <= reg_dat_di[7:0];
end else if (enable == 1'b1) begin
if (updown == 1'b1) begin
- if (value_cur == value_reset) begin
+ if (lastenable == 1'b0) begin
+ value_cur <= 32'd0;
+ end else if (value_cur == value_reset) begin
if (oneshot != 1'b1) begin
value_cur <= 32'd0;
end
@@ -150,7 +155,9 @@
irq_out <= 1'b0;
end
end else begin
- if (value_cur == 32'd0) begin
+ if (lastenable == 1'b0) begin
+ value_cur <= value_reset;
+ end else if (value_cur == 32'd0) begin
if (oneshot != 1'b1) begin
value_cur <= value_reset;
end