Subversion Repositories ngs

Rev

Rev 88 | 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 timer(
  6.  
  7.         input  wire clk_24mhz,
  8.         input  wire clk_z80,
  9.  
  10.         input  wire [2:0] rate,     // z80 clocked
  11.         // 3'b000 -- 37500/1
  12.         // 3'b001 -- 37500/2
  13.         // 3'b010 -- 37500/4
  14.         // 3'b011 -- 37500/8
  15.         // 3'b100 -- 37500/16
  16.         // 3'b101 -- 37500/64
  17.         // 3'b110 -- 37500/256
  18.         // 3'b111 -- 37500/1024
  19.        
  20.         output reg  int_stb
  21. );
  22.         reg [ 2:0] ctr5;
  23.         reg [16:0] ctr128k;
  24.  
  25.         reg ctrsel;
  26.  
  27.  
  28.  
  29.         reg int_sync1,int_sync2,int_sync3;
  30.  
  31.  
  32.  
  33.         always @(posedge clk_24mhz)
  34.         begin
  35.                 if( !ctr5[2] )
  36.                         ctr5 <= ctr5 + 3'd1;
  37.                 else
  38.                         ctr5 <= 3'd0;
  39.         end
  40.         //
  41.         initial
  42.                 ctr128k = 'd0;
  43.         always @(posedge clk_24mhz)
  44.         begin
  45.                 if( ctr5[2] )
  46.                         ctr128k <= ctr128k + 17'd1;
  47.         end
  48.  
  49.  
  50.         always @*
  51.         case( rate )
  52.                 3'b000: ctrsel = ctr128k[6];
  53.                 3'b001: ctrsel = ctr128k[7];
  54.                 3'b010: ctrsel = ctr128k[8];
  55.                 3'b011: ctrsel = ctr128k[9];
  56.                 3'b100: ctrsel = ctr128k[10];
  57.                 3'b101: ctrsel = ctr128k[12];
  58.                 3'b110: ctrsel = ctr128k[14];
  59.                 3'b111: ctrsel = ctr128k[16];
  60.         endcase
  61.  
  62.  
  63.  
  64.  
  65.  
  66.         // generate interrupt signal in clk_z80 domain
  67.         always @(posedge clk_z80)
  68.         begin
  69.                 int_sync3 <= int_sync2;
  70.                 int_sync2 <= int_sync1;
  71.                 int_sync1 <= ctrsel;
  72.         end
  73.  
  74.         always @(posedge clk_z80)
  75.         if( !int_sync2 && int_sync3 )
  76.                 int_stb <= 1'b1;
  77.         else
  78.                 int_stb <= 1'b0;
  79.  
  80. endmodule
  81.  
  82.