Subversion Repositories pentevo

Rev

Rev 405 | Rev 515 | 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 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  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 != set_nmi);
  46.  
  47.  
  48.         always @(posedge fclk, negedge rst_n)
  49.         if( !rst_n )
  50.                 pending_nmi <= 1'b0;
  51.         else // posedge clk
  52.         begin
  53.                 if( int_start )
  54.                         pending_nmi <= 1'b0;
  55.                 else if( set_nmi_now )
  56.                         pending_nmi <= 1'b1;
  57.         end
  58.  
  59.  
  60.  
  61.  
  62.         always @(posedge fclk)
  63.         if( clr_nmi )
  64.                 clr_count <= 2'd3;
  65.         else if( zpos && (!rfsh_n) && (clr_count>2'd0) )
  66.                 clr_count <= clr_count - 2'd1;
  67.  
  68.         always @(posedge fclk)
  69.         if( clr_nmi )
  70.                 pending_clr <= 1'b1;
  71.         else if( clr_count==2'd0 )
  72.                 pending_clr <= 1'b0;
  73.  
  74.  
  75.  
  76.         always @(posedge fclk, negedge rst_n)
  77.         if( !rst_n )
  78.                 in_nmi <= 1'b0;
  79.         else // posedge clk
  80.         begin
  81.                 if( pending_clr && (clr_count==2'd0) )
  82.                         in_nmi <= 1'b0;
  83.                 else if( pending_nmi && int_start && (!in_nmi) )
  84.                         in_nmi <= 1'b1;
  85.         end
  86.  
  87.  
  88.         always @(posedge fclk, negedge rst_n)
  89.         if( !rst_n )
  90.                 nmi_count <= 5'b00000;
  91.         else if( pending_nmi && int_start && (!in_nmi) )
  92.                 nmi_count <= 5'b11111;
  93.         else if( nmi_count[4] )
  94.                 nmi_count <= nmi_count - 5'd1;
  95.  
  96.  
  97.         assign gen_nmi = nmi_count[4];
  98.  
  99.  
  100. endmodule
  101.  
  102.