Subversion Repositories ngs

Rev

Rev 87 | Rev 93 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. // part of NeoGS project (c) 2007-2008 NedoPC
  2. //
  3. // interrupt controller for Z80
  4.  
  5. module interrupts
  6. (
  7.         input  wire clk,
  8.         input  wire rst_n,
  9.  
  10.         input  wire m1_n,
  11.         input  wire iorq_n,
  12.  
  13.         output reg int_n,
  14.  
  15.  
  16.         input  wire [7:0] din,
  17.         output wire [7:0] req_rd,
  18.  
  19.         output wire [2:0] int_vector,
  20.  
  21.  
  22.         input  wire ena_wr,
  23.         input  wire req_wr,
  24.  
  25.         input  wire [2:0] int_stbs
  26. );
  27.        
  28.         reg m1_r, m1_rr;
  29.         wire m1_beg;
  30.  
  31.         reg iorq_r, iorq_rr;
  32.         wire iorq_beg;
  33.  
  34.         reg [2:0] ena;
  35.         reg [2:0] req;
  36.  
  37.         reg [2:0] pri_req;
  38.  
  39.  
  40.  
  41.  
  42.         // M1 signal beginning
  43.         always @(posedge clk)
  44.                 {m1_rr, m1_r} <= {m1_r, m1_n};
  45.         //
  46.         assign m1_beg = !m1_r && m1_rr;
  47.  
  48.         // IORQ
  49.         always @(negedge clk)
  50.                 {iorq_rr, iorq_r} <= {iorq_r, iorq_n};
  51.         //
  52.         assign iorq_beg = !iorq_r && iorq_rr;
  53.  
  54.  
  55.         // enables
  56.         always @(posedge clk, negedge rst_n)
  57.         if( !rst_n )
  58.                 ena <= 3'b001;
  59.         else if( ena_wr )
  60.         begin
  61.                 if( din[0] ) ena[0] <= din[7];
  62.                 if( din[1] ) ena[1] <= din[7];
  63.                 if( din[2] ) ena[2] <= din[7];
  64.         end
  65.  
  66.  
  67.  
  68.         // requests
  69.         always @(posedge clk, negedge rst_n)
  70.         if( !rst_n )
  71.                 req <= 3'b000;
  72.         else
  73.         begin : req_control
  74.  
  75.                 integer i;
  76.  
  77.                 for(i=0;i<3;i=i+1)
  78.                 begin
  79.                         if( int_stbs[i] )
  80.                                 req[i] <= 1'b1;
  81.                         else if( !m1_rr && iorq_beg && pri_req[i] )
  82.                                 req[i] <= 1'b0;
  83.                         else if( req_wr && din[i] )
  84.                                 req[i] <= din[7];
  85.                 end
  86.         end
  87.  
  88.         // readback requests
  89.         assign req_rd = { 5'd0, req[2:0] };
  90.  
  91.  
  92.  
  93.         // make prioritized request position
  94.         always @(posedge clk)
  95.         if( m1_beg )
  96.         begin
  97.                 pri_req[0] <=  req[0] ;
  98.                 pri_req[1] <= !req[0] &&  req[1] ;
  99.                 pri_req[2] <= !req[0] && !req[1] && req[2];
  100.         end
  101.         //
  102.         assign int_vector = { 1'b1, ~pri_req[2], ~pri_req[1] }; // for 3 requests only
  103.  
  104.  
  105.         // gen interrupt
  106.         always @(posedge clk)
  107.                 int_n <= !( req & ena );
  108.  
  109.  
  110. endmodule
  111.  
  112.