Subversion Repositories ngs

Rev

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

Rev Author Line No. Line
87 lvd 1
// part of NeoGS project (c) 2007-2008 NedoPC
2
//
3
// interrupt controller for Z80
4
 
5
module timer(
6
 
7
        input  wire clk_24mhz,
8
        input  wire clk_z80,
9
 
10
        input  wire [2:0] rate,     // z80 clocked
11
        // 3'b000 -- 37500/1
12
        // 3'b001 -- 37500/2
13
        // 3'b010 -- 37500/4
14
        // 3'b011 -- 37500/8
15
        // 3'b100 -- 37500/16
16
        // 3'b101 -- 37500/64
17
        // 3'b110 -- 37500/256
18
        // 3'b111 -- 37500/1024
19
 
20
        output reg  int_stb
21
);
22
        reg [ 2:0] ctr5;
23
        reg [16:0] ctr128k;
24
 
25
        reg ctrsel;
26
 
27
 
28
 
29
        reg int_sync1,int_sync2,int_sync3;
30
 
31
 
32
 
33
        always @(posedge clk_24mhz)
34
        begin
35
                if( !ctr5[2] )
36
                        ctr5 <= ctr5 + 3'd1;
37
                else
38
                        ctr5 <= 3'd0;
39
        end
40
        //
91 lvd 41
        initial
42
                ctr128k = 'd0;
87 lvd 43
        always @(posedge clk_24mhz)
44
        begin
45
                if( ctr5[2] )
46
                        ctr128k <= ctr128k + 17'd1;
47
        end
48
 
49
 
50
        always @*
51
        case( rate )
52
                3'b000: ctrsel = ctr128k[6];
53
                3'b001: ctrsel = ctr128k[7];
54
                3'b010: ctrsel = ctr128k[8];
55
                3'b011: ctrsel = ctr128k[9];
56
                3'b100: ctrsel = ctr128k[10];
57
                3'b101: ctrsel = ctr128k[12];
58
                3'b110: ctrsel = ctr128k[14];
59
                3'b111: ctrsel = ctr128k[16];
60
        endcase
61
 
62
 
63
 
64
 
65
 
66
        // generate interrupt signal in clk_z80 domain
67
        always @(posedge clk_z80)
68
        begin
69
                int_sync3 <= int_sync2;
70
                int_sync2 <= int_sync1;
71
                int_sync1 <= ctrsel;
72
        end
73
 
74
        always @(posedge clk_z80)
75
        if( !int_sync2 && int_sync3 )
76
                int_stb <= 1'b1;
77
        else
78
                int_stb <= 1'b0;
79
 
80
endmodule
81