summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mictoled/mictoled.v45
-rw-r--r--mictoled/mictoled_tb.v2
-rw-r--r--mictoled/wave.gtkw34
3 files changed, 53 insertions, 28 deletions
diff --git a/mictoled/mictoled.v b/mictoled/mictoled.v
index 0f14d71..eb41ca7 100644
--- a/mictoled/mictoled.v
+++ b/mictoled/mictoled.v
@@ -42,7 +42,7 @@ module mictoled
assign mic_clk = clkdiv >= 12;
/* CIC decimator by 64 => 2MHz -> 31.25 kHz */
- reg [INTEGRATOR_WIDTH-1:0] integrator = 0;
+ reg signed [INTEGRATOR_WIDTH-1:0] integrator = 0;
reg [5:0] decim_strobe_counter = 8'b0;
always @ (posedge clk) begin
if (mic_strobe) begin
@@ -57,8 +57,8 @@ module mictoled
/* Comb stage after decimation */
wire decim_strobe = decim_strobe_counter == 0 && mic_strobe;
- reg [INTEGRATOR_WIDTH-1:0] previous_integrator = 0;
- reg [COMB_WIDTH-1:0] comb_out = 0; // can be reduced_width
+ reg signed [INTEGRATOR_WIDTH-1:0] previous_integrator = 0;
+ reg signed [COMB_WIDTH-1:0] comb_out = 0; // can be reduced_width
always @ (posedge clk) begin
if (decim_strobe) begin
comb_out = integrator - previous_integrator;
@@ -70,27 +70,44 @@ module mictoled
// coef = 2 * cos(2 * PI * freq / sample_rate);
// 440 Hz -> 1.992178649
// 1200 Hz -> 1.942068556
- // Represent in fixed point in Q4.10, i.e. a scaling factor of 1024
- //integer coef_440 = 2040; // 439.75 Hz
- real coef_440 = 1.992178649;
+ // Represent in fixed point in Q.8, i.e. a scaling factor of 256
+ reg signed [31:0] coef_440 = 510; // 439.75 Hz
+ reg signed [31:0] q1_440 = 0;
+ reg signed [31:0] q2_440 = 0;
- real q1_440 = 0;
- real q2_440 = 0;
- reg [9:0] goertzel_strobe_counter = 0;
+ real coef_440_f = 1.992178649;
+ real q1_440_f = 0;
+ real q2_440_f = 0;
- real m_squared_440 = 0;
+ reg [7:0] goertzel_strobe_counter = 0;
+
+ real m_squared_440_f = 0;
+ reg signed [63:0] m_squared_440 = 0;
+
+ wire signed [31:0] comb_wide = comb_out << 8;
always @ (posedge clk) begin
if (decim_strobe) begin
- goertzel_strobe_counter <= goertzel_strobe_counter + 1; // overflow at 1024
+ goertzel_strobe_counter <= goertzel_strobe_counter + 1; // overflow at 256
- if (goertzel_strobe_counter % 256 == 0) begin
- m_squared_440 <= q1_440 * q1_440 + q2_440 * q2_440 - coef_440 * q1_440 * q2_440;
+ if (goertzel_strobe_counter == 0) begin
+ m_squared_440_f <= q1_440_f * q1_440_f +
+ q2_440_f * q2_440_f -
+ coef_440_f * q1_440_f * q2_440_f;
+ q1_440_f <= 0;
+ q2_440_f <= 0;
+
+ m_squared_440 <= ((q1_440 * q1_440) >>> 8) +
+ ((q2_440 * q2_440) >>> 8) -
+ ((coef_440 * ((q1_440 * q2_440) >>> 8)) >>> 8);
q1_440 <= 0;
q2_440 <= 0;
end
else begin
- q1_440 <= coef_440 * q1_440 - q2_440 + comb_out;
+ q1_440_f <= coef_440_f * q1_440_f - q2_440_f + $itor(comb_out);
+ q2_440_f <= q1_440_f;
+
+ q1_440 <= ((coef_440 * q1_440) >>> 8) - q2_440 + comb_wide;
q2_440 <= q1_440;
end
end
diff --git a/mictoled/mictoled_tb.v b/mictoled/mictoled_tb.v
index d2681d3..59c0b7a 100644
--- a/mictoled/mictoled_tb.v
+++ b/mictoled/mictoled_tb.v
@@ -42,7 +42,7 @@ module mictoled_tb;
#10 btn = 0;
$readmemh("pdmgen/pdm.hex", data);
- for (i = 0; i < 400000; i = i + 1) begin
+ for (i = 0; i < 40000; i = i + 1) begin
wait (mic_clk == 1'b1);
mic_dat = data[i];
wait (mic_clk == 1'b0);
diff --git a/mictoled/wave.gtkw b/mictoled/wave.gtkw
index a584a1a..b080afc 100644
--- a/mictoled/wave.gtkw
+++ b/mictoled/wave.gtkw
@@ -1,18 +1,19 @@
[*]
[*] GTKWave Analyzer v3.3.120 (w)1999-2024 BSI
-[*] Mon Dec 16 15:52:52 2024
+[*] Wed Dec 18 06:28:14 2024
[*]
[dumpfile] "/home/bram/work/icefun/iceFUN/mictoled/mictoled_tb.vcd"
-[dumpfile_mtime] "Mon Dec 16 15:52:27 2024"
-[dumpfile_size] 330579603
+[dumpfile_mtime] "Wed Dec 18 06:27:01 2024"
+[dumpfile_size] 31190481
[savefile] "/home/bram/work/icefun/iceFUN/mictoled/wave.gtkw"
-[timestart] 18873287
+[timestart] 785367
[size] 1878 1032
[pos] -1 -1
-*-8.400001 18874393 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+*-8.400001 786457 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] mictoled_tb.
+[treeopen] mictoled_tb.mictoled_1.
[sst_width] 203
-[signals_width] 335
+[signals_width] 354
[sst_expanded] 1
[sst_vpaned_height] 306
@28
@@ -24,19 +25,26 @@ mictoled_tb.mictoled_1.decim_strobe_counter[5:0]
mictoled_tb.mictoled_1.decim_strobe
@420
mictoled_tb.mictoled_1.previous_integrator[15:0]
-mictoled_tb.mictoled_1.comb_out[11:0]
-@22
-mictoled_tb.mictoled_1.goertzel_strobe_counter[9:0]
@88420
[color] 2
mictoled_tb.mictoled_1.integrator[15:0]
+@420
+mictoled_tb.mictoled_1.comb_out[11:0]
+mictoled_tb.mictoled_1.comb_wide[31:0]
@200
-
-Goertzel
+@420
+mictoled_tb.mictoled_1.goertzel_strobe_counter[7:0]
+@24
+mictoled_tb.mictoled_1.q1_440_f
@28
-mictoled_tb.mictoled_1.q1_440
-mictoled_tb.mictoled_1.q2_440
-@29
-mictoled_tb.mictoled_1.m_squared_440
+mictoled_tb.mictoled_1.q2_440_f
+mictoled_tb.mictoled_1.m_squared_440_f
+@420
+mictoled_tb.mictoled_1.q1_440[31:0]
+mictoled_tb.mictoled_1.q2_440[31:0]
+@421
+mictoled_tb.mictoled_1.m_squared_440[63:0]
[pattern_trace] 1
[pattern_trace] 0