Subversion Repositories ngs

Rev

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

  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 iack_r, iack_rr;
  32.         wire iack_end;
  33.  
  34.         reg [2:0] ena;
  35.         reg [2:0] req;
  36.  
  37.         reg [2:0] pri_req;
  38.  
  39.  
  40.         wire [2:0] enareq;
  41.  
  42.  
  43.  
  44.         // M1 signal beginning
  45.         always @(posedge clk)
  46.                 {m1_rr, m1_r} <= {m1_r, m1_n};
  47.         //
  48.         assign m1_beg = !m1_r && m1_rr;
  49.  
  50.         // int ack
  51.         always @(negedge clk)
  52.                 {iack_rr, iack_r} <= {iack_r, (iorq_n | m1_n) };
  53.         //
  54.         assign iack_end = iack_r && !iack_rr;
  55.  
  56.  
  57.         // enables
  58.         always @(posedge clk, negedge rst_n)
  59.         if( !rst_n )
  60.                 ena <= 3'b001;
  61.         else if( ena_wr )
  62.         begin
  63.                 if( din[0] ) ena[0] <= din[7];
  64.                 if( din[1] ) ena[1] <= din[7];
  65.                 if( din[2] ) ena[2] <= din[7];
  66.         end
  67.  
  68.  
  69.  
  70.         // requests
  71.         always @(posedge clk, negedge rst_n)
  72.         if( !rst_n )
  73.                 req <= 3'b000;
  74.         else
  75.         begin : req_control
  76.  
  77.                 integer i;
  78.  
  79.                 for(i=0;i<3;i=i+1)
  80.                 begin
  81.                         if( int_stbs[i] )
  82.                                 req[i] <= 1'b1;
  83.                         else if( iack_end && pri_req[i] )
  84.                                 req[i] <= 1'b0;
  85.                         else if( req_wr && din[i] )
  86.                                 req[i] <= din[7];
  87.                 end
  88.         end
  89.  
  90.         // readback requests
  91.         assign req_rd = { 5'd0, req[2:0] };
  92.  
  93.  
  94.  
  95.         assign enareq = req & ena;
  96.  
  97.  
  98.         // make prioritized request position
  99.         always @(posedge clk)
  100.         if( m1_beg )
  101.         begin
  102.                 pri_req[0] <=  enareq[0] ;
  103.                 pri_req[1] <= !enareq[0] &&  enareq[1] ;
  104.                 pri_req[2] <= !enareq[0] && !enareq[1] && enareq[2];
  105.         end
  106.         //
  107.         assign int_vector = { 1'b1, ~pri_req[2], ~pri_req[1] }; // for 3 requests only
  108.  
  109.  
  110.         // gen interrupt
  111.         always @(posedge clk)
  112.                 int_n <= !enareq;
  113.  
  114.  
  115. endmodule
  116.  
  117.