Top secrets sources NedoPC ngs

Rev

Rev 3 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

// part of NeoGS project (c) 2007-2008 NedoPC
//
// interrupt controller for Z80

module interrupts(

        clk_24mhz,
        clk_z80,

        m1_n,
        iorq_n,

        int_n
);

        parameter MAX_INT_LEN = 100;

        input clk_24mhz;
        input clk_z80;

        input m1_n;
        input iorq_n;

        output reg int_n;



        reg [9:0] ctr640;
        reg int_24;

        reg int_sync1,int_sync2,int_sync3;

        reg int_ack_sync,int_ack;

        reg int_gen;


        // generate int signal

        always @(posedge clk_24mhz)
        begin

                if( ctr640 == 10'd639 )
                        ctr640 <= 10'd0;
                else
                        ctr640 <= ctr640 + 10'd1;


                if( ctr640 == 10'd0 )
                        int_24 <= 1'b1;
                else if( ctr640 == MAX_INT_LEN )
                        int_24 <= 1'b0;

        end



        // generate interrupt signal in clk_z80 domain
        always @(negedge clk_z80)
        begin
                int_sync3 <= int_sync2;
                int_sync2 <= int_sync1;
                int_sync1 <= int_24;    // sync in from 24mhz, allow for edge detection (int_sync3!=int_sync2)

                int_ack_sync <= ~(m1_n | iorq_n);
                int_ack <= int_ack_sync;          // interrupt acknowledge from Z80

                // control interrupt generation signal
                if( int_ack || ( int_sync3 && (!int_sync2) ) )
                        int_gen <= 1'b0;
                else if( (!int_sync3) && int_sync2 )
                        int_gen <= 1'b1;
        end

        always @(posedge clk_z80)
        begin
                int_n <= ~int_gen;
        end

endmodule