Subversion Repositories pentevo

Rev

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