Subversion Repositories pentevo

Rev

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

  1. // PentEvo project (c) NedoPC 2008-2009
  2. //
  3. // Z80 clocking module, also contains some wait-stating when 14MHz
  4. //
  5. //
  6.  
  7.  
  8.  
  9.  
  10. //    FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  11. // CURRENTLY ONLY 3.5 and 7 MHz!!!! FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  12. //    FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  13.  
  14. `include "../include/tune.v"
  15.  
  16. module zclock(
  17.  
  18.         input fclk,
  19.         input rst_n,
  20.  
  21.         input zclk, // Z80 clock, buffered via act04 and returned back to the FPGA
  22.  
  23.         output reg zclk_out, // generated Z80 clock - passed through inverter externally!
  24.  
  25.         input [1:0] turbo, // 2'b00 -  3.5 MHz
  26.                            // 2'b01 -  7.0 MHz
  27.                            // 2'b1x - 14.0 MHz
  28.  
  29.  
  30.         input pre_cend // syncing signal, taken from arbiter.v module
  31. );
  32.  
  33.  
  34.         reg precend_cnt;
  35.         wire half_precend; // to take every other pulse of pre_cend
  36.  
  37.         reg [2:0] zcount; // counter for generating 3.5 and 7 MHz z80 clocks
  38.         reg [1:0] int_turbo; // internal turbo, controlling muxes
  39.  
  40.  
  41.         initial // simulation...
  42.         begin
  43.                 precend_cnt = 1'b0;
  44.         end
  45.  
  46.  
  47.         // take every other pulse of pre_cend (make half pre_cend)
  48.         always @(posedge fclk) if( pre_cend )
  49.                 precend_cnt <= ~precend_cnt;
  50.  
  51.         assign half_precend = precend_cnt && pre_cend;
  52.  
  53.         // phase zcount to take from it proper 3.5 or 7 MHz clock
  54.         always @(posedge fclk)
  55.         begin
  56.                 if( half_precend )
  57.                         zcount <= 3'd7;
  58.                 else
  59.                         zcount <= zcount - 3'd1;
  60.         end
  61.  
  62.         // switch between 3.5 and 7 only at predefined times
  63.         always @(posedge fclk) if( half_precend )
  64.                 int_turbo <= turbo;
  65.  
  66.  
  67.         // make Z80 clock: account for external inversion and make some leading of clock
  68.         // 9.5 ns propagation delay: from fclk posedge to zclk returned back any edge
  69.         // (1/28)/2=17.9ns half a clock lead
  70.         // 2.6ns lag because of non-output register emitting of zclk_out
  71.         // total: 5.8 ns lead of any edge of zclk relative to posedge of fclk => ACCOUNT FOR THIS WHEN DOING INTER-CLOCK DATA TRANSFERS
  72.         //
  73.         always @(negedge fclk)
  74.                 if( int_turbo[0] ) // 7 MHz
  75.                         zclk_out <= ~zcount[1];
  76.                 else // 3.5 MHz
  77.                         zclk_out <= ~zcount[2];
  78.  
  79.  
  80.  
  81. endmodule
  82.  
  83.