Rev 473 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
668 | lvd | 1 | // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014 |
360 | lvd | 2 | // |
3 | // integrates sound features: tapeout, beeper and covox |
||
4 | |||
668 | lvd | 5 | /* |
6 | This file is part of ZX-Evo Base Configuration firmware. |
||
7 | |||
8 | ZX-Evo Base Configuration firmware is free software: |
||
9 | you can redistribute it and/or modify it under the terms of |
||
10 | the GNU General Public License as published by |
||
11 | the Free Software Foundation, either version 3 of the License, or |
||
12 | (at your option) any later version. |
||
13 | |||
14 | ZX-Evo Base Configuration firmware is distributed in the hope that |
||
15 | it will be useful, but WITHOUT ANY WARRANTY; without even |
||
16 | the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
17 | See the GNU General Public License for more details. |
||
18 | |||
19 | You should have received a copy of the GNU General Public License |
||
20 | along with ZX-Evo Base Configuration firmware. |
||
21 | If not, see <http://www.gnu.org/licenses/>. |
||
22 | */ |
||
23 | |||
24 | `include "../include/tune.v" |
||
25 | |||
360 | lvd | 26 | module sound( |
27 | |||
28 | input wire clk, |
||
29 | |||
30 | input wire [7:0] din, |
||
31 | |||
32 | |||
33 | input wire beeper_wr, |
||
34 | input wire covox_wr, |
||
35 | |||
36 | input wire beeper_mux, // output either tape_out or beeper |
||
37 | |||
38 | |||
39 | output wire sound_bit |
||
40 | ); |
||
41 | |||
42 | reg [6:0] ctr; |
||
43 | reg [7:0] val; |
||
44 | |||
45 | reg mx_beep_n_covox; |
||
46 | |||
47 | reg beep_bit; |
||
473 | chrv | 48 | reg beep_bit_old; |
360 | lvd | 49 | |
50 | wire covox_bit; |
||
51 | |||
52 | |||
53 | |||
54 | |||
55 | always @(posedge clk) |
||
56 | begin |
||
473 | chrv | 57 | /* if( beeper_wr ) */ |
58 | if( beeper_wr && (beep_bit!=beep_bit_old) ) |
||
360 | lvd | 59 | mx_beep_n_covox <= 1'b1; |
60 | else if( covox_wr ) |
||
61 | mx_beep_n_covox <= 1'b0; |
||
62 | end |
||
63 | |||
473 | chrv | 64 | always @(posedge clk) if( beeper_wr ) beep_bit_old <= beep_bit; |
360 | lvd | 65 | |
66 | always @(posedge clk) |
||
67 | if( beeper_wr ) |
||
68 | beep_bit <= beeper_mux ? din[3] /*tapeout*/ : din[4] /*beeper*/; |
||
69 | |||
70 | |||
71 | always @(posedge clk) |
||
72 | if( covox_wr ) |
||
73 | val <= din; |
||
74 | |||
75 | always @(negedge clk) |
||
76 | ctr <= ctr + 6'd1; |
||
77 | |||
78 | assign covox_bit = ( {ctr,clk} < val ); |
||
79 | |||
80 | |||
81 | bothedge trigger |
||
82 | ( |
||
83 | .clk( clk ), |
||
84 | |||
85 | .d( mx_beep_n_covox ? beep_bit : covox_bit ), |
||
86 | |||
87 | .q( sound_bit ) |
||
88 | ); |
||
89 | |||
90 | |||
91 | |||
92 | endmodule |
||
93 | |||
94 | |||
95 | |||
96 | |||
97 | // both-edge trigger emulator |
||
98 | module bothedge( |
||
99 | |||
100 | input wire clk, |
||
101 | |||
102 | input wire d, |
||
103 | |||
104 | output wire q |
||
105 | |||
106 | ); |
||
107 | reg trgp, trgn; |
||
108 | |||
109 | assign q = trgp ^ trgn; |
||
110 | |||
111 | always @(posedge clk) |
||
112 | if( d!=q ) |
||
113 | trgp <= ~trgp; |
||
114 | |||
115 | always @(negedge clk) |
||
116 | if( d!=q ) |
||
117 | trgn <= ~trgn; |
||
118 | |||
119 | endmodule |
||
120 |