Switch to single clock + enable for sound generator
diff --git a/verilog/rtl/edgedet.v b/verilog/rtl/edgedet.v
new file mode 100644
index 0000000..c5c9721
--- /dev/null
+++ b/verilog/rtl/edgedet.v
@@ -0,0 +1,27 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+// Company: 
+// Engineer: Wenting Zhang
+// 
+// Create Date:    21:19:04 04/08/2018 
+// Module Name:    edgedet
+// Project Name:   VerilogBoy
+// Description: 
+//
+// Dependencies: 
+//
+// Additional Comments: 
+//
+//////////////////////////////////////////////////////////////////////////////////
+module edgedet(
+    input wire clk,
+    input wire i,
+    output wire o
+);
+
+    reg last_i;
+    always @(posedge clk)
+        last_i <= i;
+    assign o = (!last_i) && i;
+
+endmodule
diff --git a/verilog/rtl/simtop.v b/verilog/rtl/simtop.v
index 12f7b52..ad1072e 100644
--- a/verilog/rtl/simtop.v
+++ b/verilog/rtl/simtop.v
@@ -26,6 +26,9 @@
     output wire vs,
     output wire [1:0] pixel,
     output wire valid,
+    // Audio output
+    output wire audiol,
+    output wire audior,
     // For testbench only
     output wire done,
     output wire fault
@@ -55,8 +58,8 @@
         .pvalid(valid),
         .pixel(pixel),
         .skey(skey),
-        .audiol(),
-        .audior(),
+        .audiol(audiol),
+        .audior(audior),
         .mode(1'b0),
         .done(done),
         .fault(fault)
diff --git a/verilog/rtl/sound.v b/verilog/rtl/sound.v
index 2cabe88..cd02616 100644
--- a/verilog/rtl/sound.v
+++ b/verilog/rtl/sound.v
@@ -188,32 +188,25 @@
         end
     end
     
-    // Clocks
-    wire clk_frame; // 512Hz Base Clock
+    // Clock Enables (not clock)
     wire clk_length_ctr; // 256Hz Length Control Clock
     wire clk_vol_env; // 64Hz Volume Enevelope Clock
     wire clk_sweep; // 128Hz Sweep Clock
-    wire clk_freq_div; // 1048576Hz Frequency Division Clock
-    
-    clk_div #(.WIDTH(15), .DIV(8192)) frame_div(
-        .i(clk),
-        .o(clk_frame)
-    );
-    
-    reg [2:0] sequencer_state = 3'b0;
-    always@(posedge clk_frame)
-    begin
-        sequencer_state <= sequencer_state + 1'b1;
-    end
-    
-    assign clk_length_ctr = (sequencer_state[0]) ? 1'b0 : 1'b1;
-    assign clk_vol_env = (sequencer_state == 3'd7) ? 1'b1 : 1'b0;
-    assign clk_sweep = ((sequencer_state == 3'd2) || (sequencer_state == 3'd6)) ? 1'b1 : 1'b0;
+    wire clk_freq_div; // 2097152Hz Frequency Division Clock
 
-    clk_div #(.WIDTH(2), .DIV(2)) freq_div(
-        .i(clk),
-        .o(clk_freq_div)
-    );
+    reg [15:0] clk_div;
+    always @(posedge clk) begin
+        if (rst) begin
+            clk_div <= 0;
+        end
+        else begin
+            clk_div <= clk_div + 1;
+        end
+    end
+    assign clk_length_ctr = clk_div[13:0] == {14{1'b1}};
+    assign clk_vol_env = clk_div[15:0] == {16{1'b1}};
+    assign clk_sweep = clk_div[14:0] == {15{1'b1}};
+    assign clk_freq_div = clk_div[0] == 1'b1;
 
     // Channels
     wire [3:0] ch1;
diff --git a/verilog/rtl/sound_length_ctr.v b/verilog/rtl/sound_length_ctr.v
index 3a1452a..110c546 100644
--- a/verilog/rtl/sound_length_ctr.v
+++ b/verilog/rtl/sound_length_ctr.v
@@ -13,9 +13,10 @@
 // Additional Comments: 
 //   Channel 3 has a different length
 //////////////////////////////////////////////////////////////////////////////////
-module sound_length_ctr(rst, clk_length_ctr, start, single, length, enable);
+module sound_length_ctr(clk, rst, clk_length_ctr, start, single, length, enable);
     parameter WIDTH = 6; // 6bit for Ch124, 8bit for Ch3
-    
+
+    input clk;
     input rst;
     input clk_length_ctr;
     input start;
@@ -26,17 +27,13 @@
     reg [WIDTH-1:0] length_left = {WIDTH{1'b1}}; // Upcounter from length to 255
 
     // Length Control
-    always @(posedge clk_length_ctr, posedge start, posedge rst)
+    always @(posedge clk)
     begin
-        if (rst) begin
-            enable <= 1'b0;
-            length_left <= 0;
-        end
-        else if (start) begin
+        if (start) begin
             enable <= 1'b1;
             length_left <= (length == 0) ? ({WIDTH{1'b1}}) : (length);
         end
-        else begin
+        else if (clk_length_ctr) begin
             if (single) begin
                 if (length_left != {WIDTH{1'b1}})
                     length_left <= length_left + 1'b1;
@@ -44,6 +41,11 @@
                     enable <= 1'b0;
             end
         end
+
+        if (rst) begin
+            enable <= 1'b0;
+            length_left <= 0;
+        end
     end
 
 endmodule
diff --git a/verilog/rtl/sound_noise.v b/verilog/rtl/sound_noise.v
index a836bcf..a496c5b 100644
--- a/verilog/rtl/sound_noise.v
+++ b/verilog/rtl/sound_noise.v
@@ -14,7 +14,7 @@
 //
 //////////////////////////////////////////////////////////////////////////////////
 module sound_noise(
-    input rst, // Async reset
+    input rst, // Sync reset
     input clk, // CPU Clock
     input clk_length_ctr, // Length control clock
     input clk_vol_env, // Volume Envelope clock
@@ -30,34 +30,34 @@
     output [3:0] level,
     output enable
     );
+    wire start_posedge;
+    edgedet start_edgedet (
+        .clk(clk),
+        .i(start),
+        .o(start_posedge)
+    );
     
     // Dividing ratio from 4MHz is (r * 8), for the divier to work, the comparator shoud
     // compare with (dividing_factor / 2 - 1), so it becomes (r * 4 - 1)
-    reg [4:0] adjusted_freq_dividing_ratio;
+    reg [5:0] adjusted_freq_dividing_ratio;
     reg [3:0] latched_shift_clock_freq;
     
     wire [3:0] target_vol;
     
-    reg clk_div = 0;
     wire clk_shift;
     
-    reg [4:0] clk_divider = 5'b0; // First stage
+    reg [5:0] clk_divider = 6'b0; // First stage
+    reg [13:0] clk_shifter = 14'b0; // Second stage
     always @(posedge clk)
     begin
         if (clk_divider == adjusted_freq_dividing_ratio) begin
-            clk_div <= ~clk_div;
+            clk_shifter <= clk_shifter + 1'b1;
             clk_divider <= 0;
         end
         else
             clk_divider <= clk_divider + 1'b1;
     end
     
-    reg [13:0] clk_shifter = 14'b0; // Second stage
-    always @(posedge clk_div)
-    begin
-        clk_shifter <= clk_shifter + 1'b1;
-    end
-    
     assign clk_shift = clk_shifter[latched_shift_clock_freq];
     
     reg [14:0] lfsr = {15{1'b1}};
@@ -67,26 +67,36 @@
         (counter_width == 0) ? ({(lfsr[0] ^ lfsr[1]), lfsr[14:1]}) :
                                ({8'b0, (lfsr[0] ^ lfsr[1]), lfsr[6:1]});
     
-    always@(posedge start)
+    wire clk_shift_posedge;
+    edgedet clk_shift_edgedet (
+        .clk(clk),
+        .i(clk_shift),
+        .o(clk_shift_posedge)
+    );
+
+    always @(posedge clk)
     begin
-        adjusted_freq_dividing_ratio <=
-                (freq_dividing_ratio == 3'b0) ? (5'd1) : ((freq_dividing_ratio * 4) - 1);
-        latched_shift_clock_freq <= shift_clock_freq;
+        if (start_posedge) begin
+            adjusted_freq_dividing_ratio <=
+                    (freq_dividing_ratio == 3'b0) ? (6'd1) : ((freq_dividing_ratio * 8) - 1);
+            latched_shift_clock_freq <= shift_clock_freq;
+        end
     end
     
-    always@(posedge clk_shift, posedge start)
+    always @(posedge clk)
     begin
-        if (start) begin
+        if (start_posedge) begin
             lfsr <= {15{1'b1}};
         end
-        else begin
+        else if (clk_shift_posedge) begin
             lfsr <= lfsr_next;
-        end    
+        end
     end
     
     sound_vol_env sound_vol_env(
+        .clk(clk),
         .clk_vol_env(clk_vol_env),
-        .start(start),
+        .start(start_posedge),
         .initial_volume(initial_volume),
         .envelope_increasing(envelope_increasing),
         .num_envelope_sweeps(num_envelope_sweeps),
@@ -94,9 +104,10 @@
     );
 
     sound_length_ctr #(6) sound_length_ctr(
+        .clk(clk),
         .rst(rst),
         .clk_length_ctr(clk_length_ctr),
-        .start(start),
+        .start(start_posedge),
         .single(single),
         .length(length),
         .enable(enable)
diff --git a/verilog/rtl/sound_square.v b/verilog/rtl/sound_square.v
index 8f85838..2f1660b 100644
--- a/verilog/rtl/sound_square.v
+++ b/verilog/rtl/sound_square.v
@@ -22,7 +22,7 @@
 //   the design I am using here.
 //////////////////////////////////////////////////////////////////////////////////
 module sound_square(
-    input rst, // Async reset
+    input rst, // Sync reset
     input clk, // CPU Clock
     input clk_length_ctr, // Length control clock
     input clk_vol_env, // Volume Envelope clock
@@ -42,6 +42,12 @@
     output [3:0] level, // Sound output
     output enable // Internal enable flag
     );
+    wire start_posedge;
+    edgedet start_edgedet (
+        .clk(clk),
+        .i(start),
+        .o(start_posedge)
+    );
     
     //Sweep: X(t) = X(t-1) +/- X(t-1)/2^n
     
@@ -52,12 +58,12 @@
     wire [3:0] target_vol;
     reg [2:0] sweep_left; // Number of sweeps need to be done
 
-    always @(posedge clk_freq_div, posedge start)
+    always @(posedge clk)
     begin
-        if (start) begin
+        if (start_posedge) begin
             divider <= target_freq;
         end
-        else begin
+        else if (clk_freq_div) begin
             if (divider == 11'd2047) begin
                 octo_freq_out <= ~octo_freq_out;
                 divider <= target_freq;
@@ -82,14 +88,14 @@
            
     // Frequency Sweep
     reg overflow;
-    always @(posedge clk_sweep, posedge start)
+    always @(posedge clk)
     begin
-        if (start) begin
+        if (start_posedge) begin
             target_freq <= frequency;
             sweep_left <= sweep_time;
             overflow <= 0;
         end
-        else begin
+        else if (clk_sweep) begin
             if (sweep_left != 3'b0) begin
                 sweep_left <= sweep_left - 1'b1;
                 if (sweep_decreasing) 
@@ -102,14 +108,11 @@
             end
         end
     end 
-    /*always@(posedge start)
-    begin
-        target_freq <= frequency;
-    end*/
 
     sound_vol_env sound_vol_env(
+        .clk(clk),
         .clk_vol_env(clk_vol_env),
-        .start(start),
+        .start(start_posedge),
         .initial_volume(initial_volume),
         .envelope_increasing(envelope_increasing),
         .num_envelope_sweeps(num_envelope_sweeps),
@@ -119,9 +122,10 @@
     wire enable_length;
 
     sound_length_ctr #(6) sound_length_ctr(
+        .clk(clk),
         .rst(rst),
         .clk_length_ctr(clk_length_ctr),
-        .start(start),
+        .start(start_posedge),
         .single(single),
         .length(length),
         .enable(enable_length)
diff --git a/verilog/rtl/sound_vol_env.v b/verilog/rtl/sound_vol_env.v
index 81cc07f..9aa5ec1 100644
--- a/verilog/rtl/sound_vol_env.v
+++ b/verilog/rtl/sound_vol_env.v
@@ -14,6 +14,7 @@
 //
 //////////////////////////////////////////////////////////////////////////////////
 module sound_vol_env(
+    input clk,
     input clk_vol_env,
     input start,
     input [3:0] initial_volume,
@@ -26,13 +27,13 @@
     wire enve_enabled = (num_envelope_sweeps == 3'd0) ? 0 : 1;
     
     // Volume Envelope
-    always @(posedge clk_vol_env, posedge start)
+    always @(posedge clk)
     begin
         if (start) begin
             target_vol <= initial_volume;
             enve_left <= num_envelope_sweeps;
         end
-        else begin
+        else if (clk_vol_env) begin
             if (enve_left != 3'b0) begin
                 enve_left <= enve_left - 1'b1;
             end
diff --git a/verilog/rtl/sound_wave.v b/verilog/rtl/sound_wave.v
index 22bd632..c8d8afa 100644
--- a/verilog/rtl/sound_wave.v
+++ b/verilog/rtl/sound_wave.v
@@ -29,9 +29,14 @@
     output [3:0] level,
     output enable
     );
-    
+    wire start_posedge;
+    edgedet start_edgedet (
+        .clk(clk),
+        .i(start),
+        .o(start_posedge)
+    );
+
     // Freq = 64kHz / (2048 - frequency)
-    // Why????????
     
     wire [3:0] current_sample;
     
@@ -40,44 +45,29 @@
     assign wave_a[3:0] = current_pointer[4:1];
     assign current_sample[3:0] = (current_pointer[0]) ?
         (wave_d[3:0]) : (wave_d[7:4]);
-    
-    wire clk_wave_base = clk; // base clock
-    /*clk_div #(.WIDTH(6), .DIV(32)) freq_div(
-        .i(clk),
-        .o(clk_wave_base)
-    );*/
-    
-    
-    reg clk_pointer_inc = 1'b0; // Clock for pointer to increment
-    reg [10:0] divider = 11'b0;
-    always @(posedge clk_wave_base, posedge start)
+
+    reg [11:0] divider = 12'b0;
+    always @(posedge clk)
     begin
-        if (start) begin
-            divider <= frequency;
+        if (start_posedge) begin
+            divider <= frequency * 2;
+            current_pointer <= 5'd0;
         end
         else begin
-            if (divider == 11'd2047) begin
-                clk_pointer_inc <= ~clk_pointer_inc;
-                divider <= frequency;
+            if (divider == 12'd4095) begin
+                if (on) begin
+                    current_pointer <= current_pointer + 1'b1;
+                end
+                divider <= frequency * 2;
             end
             else begin
                 divider <= divider + 1'b1;
             end
         end
     end
-        
-    always @(posedge clk_pointer_inc, posedge start)
-    begin
-        if (start) begin
-            current_pointer <= 5'b0;
-        end
-        else begin
-            if (on)
-                current_pointer <= current_pointer + 1'b1;
-        end
-    end
     
     sound_length_ctr #(8) sound_length_ctr(
+        .clk(clk),
         .rst(rst),
         .clk_length_ctr(clk_length_ctr),
         .start(start),