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),