Subversion Repositories tsfmpro

Rev

Rev 114 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
104 lvd 1
// TurboFMpro project
2
// (C) 2018 NedoPC
3
 
4
// clock generation for YM2203 and SAA1099 
5
 
6
module clocks
7
(
8
        input  wire fclk, // 56 MHz master clock
9
 
10
        input  wire saa_enabled, // whether SAA clock is enabled
11
 
12
        output wire ymclk, // 3.5 MHz
13
        output wire saaclk // 8 MHz
14
);
15
 
16
        reg [3:0] ym_cnt;
17
        reg [2:0] saa_cnt;
18
 
114 chrv 19
        reg main_clk;
104 lvd 20
 
114 chrv 21
        reg add_clk;
22
        reg add_clk_neg;
23
 
104 lvd 24
        // make ym clock (div by 16)
25
        initial ym_cnt = 4'd0; // for simulation
26
        //
27
        always @(posedge fclk)
28
                ym_cnt <= ym_cnt + 4'd1;
29
        //
30
        assign ymclk = ym_cnt[3];
31
 
32
 
33
        // make saa clock (div by 7)
34
        //
35
        // saacnt:    1     2     3     4     5     6     0     1     2     3     4     5 
36
        //         |     |     |     |     |     |     |     |     |     |     |     |     | 
37
        // fclk:  _/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\
38
        //         |     |     |     |     |     |     |     |     |     |     |     |     | 
39
        // saaclk:_/````````````````````\____________________/````````````````````\____________
40
        //
41
        //
42
        //
43
        initial saa_cnt <= 3'd0;
44
        //
406 chrv 45
        always @(posedge fclk, negedge saa_enabled)
46
        if( !saa_enabled )
47
                saa_cnt <= 3'd0;
48
        else if( saa_cnt[2:1]==2'b11 )
104 lvd 49
                saa_cnt <= 3'd0;
50
        else
51
                saa_cnt <= saa_cnt + 3'd1;
114 chrv 52
 
53
 
54
 
104 lvd 55
        always @(posedge fclk)
114 chrv 56
                main_clk <= ~saa_cnt[2];
57
 
58
        always @(posedge fclk)
59
                add_clk <= !(saa_cnt==3'd3 || saa_cnt==3'd4);
60
        always @*
61
        if( !fclk )
62
                add_clk_neg <= add_clk;
104 lvd 63
 
114 chrv 64
 
65
        assign saaclk = main_clk & add_clk_neg;
66
 
104 lvd 67
endmodule
68