Skip to content

Commit 27e546b

Browse files
committed
rtl: use single clock for sound
1 parent 904424c commit 27e546b

File tree

7 files changed

+124
-96
lines changed

7 files changed

+124
-96
lines changed

rtl/edgedet.v

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer: Wenting Zhang
5+
//
6+
// Create Date: 21:19:04 04/08/2018
7+
// Module Name: edgedet
8+
// Project Name: VerilogBoy
9+
// Description:
10+
//
11+
// Dependencies:
12+
//
13+
// Additional Comments:
14+
//
15+
//////////////////////////////////////////////////////////////////////////////////
16+
module edgedet(
17+
input wire clk,
18+
input wire i,
19+
output wire o
20+
);
21+
22+
reg last_i;
23+
always @(posedge clk)
24+
last_i <= i;
25+
assign o = (!last_i) && i;
26+
27+
endmodule

rtl/sound.v

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -188,32 +188,25 @@ module sound(
188188
end
189189
end
190190

191-
// Clocks
192-
wire clk_frame; // 512Hz Base Clock
191+
// Clock Enables (not clock)
193192
wire clk_length_ctr; // 256Hz Length Control Clock
194193
wire clk_vol_env; // 64Hz Volume Enevelope Clock
195194
wire clk_sweep; // 128Hz Sweep Clock
196-
wire clk_freq_div; // 1048576Hz Frequency Division Clock
197-
198-
clk_div #(.WIDTH(15), .DIV(8192)) frame_div(
199-
.i(clk),
200-
.o(clk_frame)
201-
);
202-
203-
reg [2:0] sequencer_state = 3'b0;
204-
always@(posedge clk_frame)
205-
begin
206-
sequencer_state <= sequencer_state + 1'b1;
207-
end
208-
209-
assign clk_length_ctr = (sequencer_state[0]) ? 1'b0 : 1'b1;
210-
assign clk_vol_env = (sequencer_state == 3'd7) ? 1'b1 : 1'b0;
211-
assign clk_sweep = ((sequencer_state == 3'd2) || (sequencer_state == 3'd6)) ? 1'b1 : 1'b0;
195+
wire clk_freq_div; // 2097152Hz Frequency Division Clock
212196

213-
clk_div #(.WIDTH(2), .DIV(2)) freq_div(
214-
.i(clk),
215-
.o(clk_freq_div)
216-
);
197+
reg [15:0] clk_div;
198+
always @(posedge clk) begin
199+
if (rst) begin
200+
clk_div <= 0;
201+
end
202+
else begin
203+
clk_div <= clk_div + 1;
204+
end
205+
end
206+
assign clk_length_ctr = clk_div[13:0] == {14{1'b1}};
207+
assign clk_vol_env = clk_div[15:0] == {16{1'b1}};
208+
assign clk_sweep = clk_div[14:0] == {15{1'b1}};
209+
assign clk_freq_div = clk_div[0] == 1'b1;
217210

218211
// Channels
219212
wire [3:0] ch1;

rtl/sound_length_ctr.v

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
// Additional Comments:
1414
// Channel 3 has a different length
1515
//////////////////////////////////////////////////////////////////////////////////
16-
module sound_length_ctr(rst, clk_length_ctr, start, single, length, enable);
16+
module sound_length_ctr(clk, rst, clk_length_ctr, start, single, length, enable);
1717
parameter WIDTH = 6; // 6bit for Ch124, 8bit for Ch3
18-
18+
19+
input clk;
1920
input rst;
2021
input clk_length_ctr;
2122
input start;
@@ -26,24 +27,25 @@ module sound_length_ctr(rst, clk_length_ctr, start, single, length, enable);
2627
reg [WIDTH-1:0] length_left = {WIDTH{1'b1}}; // Upcounter from length to 255
2728

2829
// Length Control
29-
always @(posedge clk_length_ctr, posedge start, posedge rst)
30+
always @(posedge clk)
3031
begin
31-
if (rst) begin
32-
enable <= 1'b0;
33-
length_left <= 0;
34-
end
35-
else if (start) begin
32+
if (start) begin
3633
enable <= 1'b1;
3734
length_left <= (length == 0) ? ({WIDTH{1'b1}}) : (length);
3835
end
39-
else begin
36+
else if (clk_length_ctr) begin
4037
if (single) begin
4138
if (length_left != {WIDTH{1'b1}})
4239
length_left <= length_left + 1'b1;
4340
else
4441
enable <= 1'b0;
4542
end
4643
end
44+
45+
if (rst) begin
46+
enable <= 1'b0;
47+
length_left <= 0;
48+
end
4749
end
4850

4951
endmodule

rtl/sound_noise.v

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
//
1515
//////////////////////////////////////////////////////////////////////////////////
1616
module sound_noise(
17-
input rst, // Async reset
17+
input rst, // Sync reset
1818
input clk, // CPU Clock
1919
input clk_length_ctr, // Length control clock
2020
input clk_vol_env, // Volume Envelope clock
@@ -30,34 +30,34 @@ module sound_noise(
3030
output [3:0] level,
3131
output enable
3232
);
33+
wire start_posedge;
34+
edgedet start_edgedet (
35+
.clk(clk),
36+
.i(start),
37+
.o(start_posedge)
38+
);
3339

3440
// Dividing ratio from 4MHz is (r * 8), for the divier to work, the comparator shoud
3541
// compare with (dividing_factor / 2 - 1), so it becomes (r * 4 - 1)
36-
reg [4:0] adjusted_freq_dividing_ratio;
42+
reg [5:0] adjusted_freq_dividing_ratio;
3743
reg [3:0] latched_shift_clock_freq;
3844

3945
wire [3:0] target_vol;
4046

41-
reg clk_div = 0;
4247
wire clk_shift;
4348

44-
reg [4:0] clk_divider = 5'b0; // First stage
49+
reg [5:0] clk_divider = 6'b0; // First stage
50+
reg [13:0] clk_shifter = 14'b0; // Second stage
4551
always @(posedge clk)
4652
begin
4753
if (clk_divider == adjusted_freq_dividing_ratio) begin
48-
clk_div <= ~clk_div;
54+
clk_shifter <= clk_shifter + 1'b1;
4955
clk_divider <= 0;
5056
end
5157
else
5258
clk_divider <= clk_divider + 1'b1;
5359
end
5460

55-
reg [13:0] clk_shifter = 14'b0; // Second stage
56-
always @(posedge clk_div)
57-
begin
58-
clk_shifter <= clk_shifter + 1'b1;
59-
end
60-
6161
assign clk_shift = clk_shifter[latched_shift_clock_freq];
6262

6363
reg [14:0] lfsr = {15{1'b1}};
@@ -67,36 +67,47 @@ module sound_noise(
6767
(counter_width == 0) ? ({(lfsr[0] ^ lfsr[1]), lfsr[14:1]}) :
6868
({8'b0, (lfsr[0] ^ lfsr[1]), lfsr[6:1]});
6969

70-
always@(posedge start)
70+
wire clk_shift_posedge;
71+
edgedet clk_shift_edgedet (
72+
.clk(clk),
73+
.i(clk_shift),
74+
.o(clk_shift_posedge)
75+
);
76+
77+
always @(posedge clk)
7178
begin
72-
adjusted_freq_dividing_ratio <=
73-
(freq_dividing_ratio == 3'b0) ? (5'd1) : ((freq_dividing_ratio * 4) - 1);
74-
latched_shift_clock_freq <= shift_clock_freq;
79+
if (start_posedge) begin
80+
adjusted_freq_dividing_ratio <=
81+
(freq_dividing_ratio == 3'b0) ? (6'd1) : ((freq_dividing_ratio * 8) - 1);
82+
latched_shift_clock_freq <= shift_clock_freq;
83+
end
7584
end
7685

77-
always@(posedge clk_shift, posedge start)
86+
always @(posedge clk)
7887
begin
79-
if (start) begin
88+
if (start_posedge) begin
8089
lfsr <= {15{1'b1}};
8190
end
82-
else begin
91+
else if (clk_shift_posedge) begin
8392
lfsr <= lfsr_next;
84-
end
93+
end
8594
end
8695

8796
sound_vol_env sound_vol_env(
97+
.clk(clk),
8898
.clk_vol_env(clk_vol_env),
89-
.start(start),
99+
.start(start_posedge),
90100
.initial_volume(initial_volume),
91101
.envelope_increasing(envelope_increasing),
92102
.num_envelope_sweeps(num_envelope_sweeps),
93103
.target_vol(target_vol)
94104
);
95105

96106
sound_length_ctr #(6) sound_length_ctr(
107+
.clk(clk),
97108
.rst(rst),
98109
.clk_length_ctr(clk_length_ctr),
99-
.start(start),
110+
.start(start_posedge),
100111
.single(single),
101112
.length(length),
102113
.enable(enable)

rtl/sound_square.v

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
// the design I am using here.
2323
//////////////////////////////////////////////////////////////////////////////////
2424
module sound_square(
25-
input rst, // Async reset
25+
input rst, // Sync reset
2626
input clk, // CPU Clock
2727
input clk_length_ctr, // Length control clock
2828
input clk_vol_env, // Volume Envelope clock
@@ -42,6 +42,12 @@ module sound_square(
4242
output [3:0] level, // Sound output
4343
output enable // Internal enable flag
4444
);
45+
wire start_posedge;
46+
edgedet start_edgedet (
47+
.clk(clk),
48+
.i(start),
49+
.o(start_posedge)
50+
);
4551

4652
//Sweep: X(t) = X(t-1) +/- X(t-1)/2^n
4753

@@ -52,12 +58,12 @@ module sound_square(
5258
wire [3:0] target_vol;
5359
reg [2:0] sweep_left; // Number of sweeps need to be done
5460

55-
always @(posedge clk_freq_div, posedge start)
61+
always @(posedge clk)
5662
begin
57-
if (start) begin
63+
if (start_posedge) begin
5864
divider <= target_freq;
5965
end
60-
else begin
66+
else if (clk_freq_div) begin
6167
if (divider == 11'd2047) begin
6268
octo_freq_out <= ~octo_freq_out;
6369
divider <= target_freq;
@@ -82,14 +88,14 @@ module sound_square(
8288

8389
// Frequency Sweep
8490
reg overflow;
85-
always @(posedge clk_sweep, posedge start)
91+
always @(posedge clk)
8692
begin
87-
if (start) begin
93+
if (start_posedge) begin
8894
target_freq <= frequency;
8995
sweep_left <= sweep_time;
9096
overflow <= 0;
9197
end
92-
else begin
98+
else if (clk_sweep) begin
9399
if (sweep_left != 3'b0) begin
94100
sweep_left <= sweep_left - 1'b1;
95101
if (sweep_decreasing)
@@ -102,14 +108,11 @@ module sound_square(
102108
end
103109
end
104110
end
105-
/*always@(posedge start)
106-
begin
107-
target_freq <= frequency;
108-
end*/
109111

110112
sound_vol_env sound_vol_env(
113+
.clk(clk),
111114
.clk_vol_env(clk_vol_env),
112-
.start(start),
115+
.start(start_posedge),
113116
.initial_volume(initial_volume),
114117
.envelope_increasing(envelope_increasing),
115118
.num_envelope_sweeps(num_envelope_sweeps),
@@ -119,9 +122,10 @@ module sound_square(
119122
wire enable_length;
120123

121124
sound_length_ctr #(6) sound_length_ctr(
125+
.clk(clk),
122126
.rst(rst),
123127
.clk_length_ctr(clk_length_ctr),
124-
.start(start),
128+
.start(start_posedge),
125129
.single(single),
126130
.length(length),
127131
.enable(enable_length)

rtl/sound_vol_env.v

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//
1515
//////////////////////////////////////////////////////////////////////////////////
1616
module sound_vol_env(
17+
input clk,
1718
input clk_vol_env,
1819
input start,
1920
input [3:0] initial_volume,
@@ -26,13 +27,13 @@ module sound_vol_env(
2627
wire enve_enabled = (num_envelope_sweeps == 3'd0) ? 0 : 1;
2728

2829
// Volume Envelope
29-
always @(posedge clk_vol_env, posedge start)
30+
always @(posedge clk)
3031
begin
3132
if (start) begin
3233
target_vol <= initial_volume;
3334
enve_left <= num_envelope_sweeps;
3435
end
35-
else begin
36+
else if (clk_vol_env) begin
3637
if (enve_left != 3'b0) begin
3738
enve_left <= enve_left - 1'b1;
3839
end

0 commit comments

Comments
 (0)