Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 3 | lvd | 1 | // part of NeoGS project (c) 2007-2008 NedoPC |
| 2 | // |
||
| 3 | // interrupt controller for Z80 |
||
| 4 | |||
| 5 | module interrupts( |
||
| 6 | |||
| 7 | clk_24mhz, |
||
| 8 | clk_z80, |
||
| 9 | |||
| 10 | m1_n, |
||
| 11 | iorq_n, |
||
| 12 | |||
| 13 | int_n |
||
| 14 | ); |
||
| 15 | |||
| 16 | parameter MAX_INT_LEN = 100; |
||
| 17 | |||
| 18 | input clk_24mhz; |
||
| 19 | input clk_z80; |
||
| 20 | |||
| 21 | input m1_n; |
||
| 22 | input iorq_n; |
||
| 23 | |||
| 24 | output reg int_n; |
||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | reg [9:0] ctr640; |
||
| 29 | reg int_24; |
||
| 30 | |||
| 31 | reg int_sync1,int_sync2,int_sync3; |
||
| 32 | |||
| 33 | reg int_ack_sync,int_ack; |
||
| 34 | |||
| 35 | reg int_gen; |
||
| 36 | |||
| 37 | |||
| 38 | // generate int signal |
||
| 39 | |||
| 40 | always @(posedge clk_24mhz) |
||
| 41 | begin |
||
| 42 | |||
| 43 | if( ctr640 == 10'd639 ) |
||
| 44 | ctr640 <= 10'd0; |
||
| 45 | else |
||
| 46 | ctr640 <= ctr640 + 10'd1; |
||
| 47 | |||
| 48 | |||
| 49 | if( ctr640 == 10'd0 ) |
||
| 50 | int_24 <= 1'b1; |
||
| 51 | else if( ctr640 == MAX_INT_LEN ) |
||
| 52 | int_24 <= 1'b0; |
||
| 53 | |||
| 54 | end |
||
| 55 | |||
| 56 | |||
| 57 | |||
| 58 | // generate interrupt signal in clk_z80 domain |
||
| 59 | always @(negedge clk_z80) |
||
| 60 | begin |
||
| 61 | int_sync3 <= int_sync2; |
||
| 62 | int_sync2 <= int_sync1; |
||
| 63 | int_sync1 <= int_24; // sync in from 24mhz, allow for edge detection (int_sync3!=int_sync2) |
||
| 64 | |||
| 65 | int_ack_sync <= ~(m1_n | iorq_n); |
||
| 66 | int_ack <= int_ack_sync; // interrupt acknowledge from Z80 |
||
| 67 | |||
| 68 | // control interrupt generation signal |
||
| 69 | if( int_ack || ( int_sync3 && (!int_sync2) ) ) |
||
| 70 | int_gen <= 1'b0; |
||
| 71 | else if( (!int_sync3) && int_sync2 ) |
||
| 72 | int_gen <= 1'b1; |
||
| 73 | end |
||
| 74 | |||
| 75 | always @(posedge clk_z80) |
||
| 76 | begin |
||
| 77 | int_n <= ~int_gen; |
||
| 78 | end |
||
| 79 | |||
| 80 | endmodule |
||
| 81 |