diff options
-rw-r--r-- | mictoled/mictoled.v | 45 | ||||
-rw-r--r-- | mictoled/mictoled_tb.v | 2 | ||||
-rw-r--r-- | mictoled/wave.gtkw | 34 |
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 |