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 |