gateware: Wrap capture/counter units and allow use of SB_MAC16
We have a bunch of Multiply Add units that are un-used, we can
make use of the "accumulate" part to implement the few wide
counters we have to win some LCs.
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
diff --git a/gateware/icE1usb/rtl/misc.v b/gateware/icE1usb/rtl/misc.v
index a1d1a9c..634ed5d 100644
--- a/gateware/icE1usb/rtl/misc.v
+++ b/gateware/icE1usb/rtl/misc.v
@@ -81,12 +81,10 @@
wire gps_pps_r;
// Counters
- reg [15:0] cnt_e1_rx[0:1];
- reg [15:0] cap_e1_rx[0:1];
- reg [15:0] cnt_e1_tx[0:1];
- reg [15:0] cap_e1_tx[0:1];
- reg [31:0] cap_gps;
- reg [31:0] cnt_time;
+ wire [15:0] cap_e1_rx[0:1];
+ wire [15:0] cap_e1_tx[0:1];
+ wire [31:0] cap_gps;
+ wire [31:0] cnt_time;
// PDM
reg [12:0] pdm_clk[0:1];
@@ -227,41 +225,28 @@
// --------
// E1 ticks
- for (i=0; i<2; i=i+1) begin
+ capcnt #(
+ .W(16)
+ ) e1_cnt_I[3:0] (
+ .cnt_cur (),
+ .cnt_cap ({cap_e1_tx[1], cap_e1_rx[1], cap_e1_tx[0], cap_e1_rx[0] }),
+ .inc ({tick_e1_tx[1], tick_e1_rx[1], tick_e1_tx[0], tick_e1_rx[0]}),
+ .cap (tick_usb_sof),
+ .clk (clk),
+ .rst (rst)
+ );
- always @(posedge clk or posedge rst)
- if (rst)
- cnt_e1_rx[i] <= 16'h0000;
- else if (tick_e1_rx[i])
- cnt_e1_rx[i] <= cnt_e1_rx[i] + 1;
-
- always @(posedge clk or posedge rst)
- if (rst)
- cnt_e1_tx[i] <= 16'h0000;
- else if (tick_e1_tx[i])
- cnt_e1_tx[i] <= cnt_e1_tx[i] + 1;
-
- always @(posedge clk)
- if (tick_usb_sof) begin
- cap_e1_rx[i] <= cnt_e1_rx[i];
- cap_e1_tx[i] <= cnt_e1_tx[i];
- end
-
- end
-
- // GPS
- always @(posedge clk or posedge rst)
- if (rst)
- cap_gps <= 32'h00000000;
- else if (gps_pps_r)
- cap_gps <= cnt_time;
-
- // Time counter
- always @(posedge clk)
- if (rst)
- cnt_time <= 32'h00000000;
- else
- cnt_time <= cnt_time + 1;
+ // Time / GPS
+ capcnt #(
+ .W(32)
+ ) time_cnt_I (
+ .cnt_cur (cnt_time),
+ .cnt_cap (cap_gps),
+ .inc (1'b1),
+ .cap (gps_pps_r),
+ .clk (clk),
+ .rst (rst)
+ );
// PDM outputs