Subversion Repositories pentevo

Rev

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

  1. // Pentevo project (c) NedoPC 2011
  2. //
  3. // NMI generation
  4.  
  5. `include "../include/tune.v"
  6.  
  7. module znmi
  8. (
  9.         input  wire       rst_n,
  10.         input  wire       fclk,
  11.  
  12.         input  wire       zpos,
  13.         input  wire       zneg,
  14.  
  15.         input  wire       int_start, // when INT starts
  16.         input  wire [1:0] set_nmi,   // NMI request from slavespi
  17.  
  18.         input  wire       clr_nmi, // clear nmi: from zports, pulsed at out to #xxBE
  19.  
  20.  
  21.         input  wire       rfsh_n,
  22.  
  23.  
  24.         output reg        in_nmi, // when 1, there must be last ram page in 0000-3FFF
  25.  
  26.         output wire       gen_nmi // NMI generator: when 1, NMI_N=0, otherwise NMI_N=Z
  27. );
  28.  
  29.         reg  [1:0] set_nmi_r;
  30.         wire       set_nmi_now;
  31.  
  32.         reg pending_nmi;
  33.  
  34.  
  35.         reg [4:0] nmi_count;
  36.  
  37.         reg [1:0] clr_count;
  38.  
  39.         reg pending_clr;
  40.  
  41.  
  42.         always @(posedge fclk)
  43.                 set_nmi_r <= set_nmi;
  44.         //
  45.         assign set_nmi_now = (set_nmi_r[0] && (!set_nmi[0])) ||
  46.                              (set_nmi_r[1] && (!set_nmi[1])) ;
  47.  
  48.  
  49.         always @(posedge fclk, negedge rst_n)
  50.         if( !rst_n )
  51.                 pending_nmi <= 1'b0;
  52.         else // posedge clk
  53.         begin
  54.                 if( int_start )
  55.                         pending_nmi <= 1'b0;
  56.                 else if( set_nmi_now )
  57.                         pending_nmi <= 1'b1;
  58.         end
  59.  
  60.  
  61.  
  62.  
  63.         always @(posedge fclk)
  64.         if( clr_nmi )
  65.                 clr_count <= 2'd3;
  66.         else if( zpos && (!rfsh_n) && (clr_count>2'd0) )
  67.                 clr_count <= clr_count - 2'd1;
  68.  
  69.         always @(posedge fclk)
  70.         if( clr_nmi )
  71.                 pending_clr <= 1'b1;
  72.         else if( clr_count==2'd0 )
  73.                 pending_clr <= 1'b0;
  74.  
  75.  
  76.  
  77.         always @(posedge fclk, negedge rst_n)
  78.         if( !rst_n )
  79.                 in_nmi <= 1'b0;
  80.         else // posedge clk
  81.         begin
  82.                 if( pending_clr && (clr_count==2'd0) )
  83.                         in_nmi <= 1'b0;
  84.                 else if( pending_nmi && int_start && (!in_nmi) )
  85.                         in_nmi <= 1'b1;
  86.         end
  87.  
  88.  
  89.         always @(posedge fclk, negedge rst_n)
  90.         if( !rst_n )
  91.                 nmi_count <= 5'b00000;
  92.         else if( pending_nmi && int_start && (!in_nmi) )
  93.                 nmi_count <= 5'b11111;
  94.         else if( nmi_count[4] )
  95.                 nmi_count <= nmi_count - 5'd1;
  96.  
  97.  
  98.         assign gen_nmi = nmi_count[4];
  99.  
  100.  
  101. endmodule
  102.  
  103.