Subversion Repositories pentevo

Rev

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

  1. // PentEvo project (c) NedoPC 2008-2010
  2. //
  3. // Z80 clocking module, also contains some wait-stating when 14MHz
  4. //
  5. // IDEAL:
  6. // fclk    _/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\_/`\
  7. //          |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  8. // zclk     /```\___/```\___/```\___/```````\_______/```````\_______/```````````````\_______________/```````````````\_______________/`
  9. //          |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  10. // zpos     `\___/```\___/```\___/```\___________/```\___________/```\___________________________/```\___________________________/```\
  11. //          |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  12. // zneg     _/```\___/```\___/```\_______/```\___________/```\___________________/```\___________________________/```\________________
  13.  
  14. // clock phasing:
  15. // cend must be zpos for 7mhz, therefore post_cbeg - zneg
  16. // for 3.5 mhz, cend is both zpos and zneg (alternating)
  17.  
  18.  
  19. //    FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  20. // CURRENTLY ONLY 3.5 and 7 MHz!!!! FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  21. //    FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
  22.  
  23. `include "../include/tune.v"
  24.  
  25. module zclock(
  26.  
  27.         input fclk,
  28.         input rst_n,
  29.  
  30.         input zclk, // Z80 clock, buffered via act04 and returned back to the FPGA
  31.  
  32.         input rfsh_n, // switch turbo modes in RFSH part of m1
  33.  
  34.  
  35.         output reg zclk_out, // generated Z80 clock - passed through inverter externally!
  36.  
  37.         output reg zpos,
  38.         output reg zneg,
  39.  
  40.  
  41.         input  wire zclk_stall,
  42.  
  43.  
  44.  
  45.  
  46.         input [1:0] turbo, // 2'b00 -  3.5 MHz
  47.                            // 2'b01 -  7.0 MHz
  48.                            // 2'b1x - 14.0 MHz
  49.  
  50.  
  51.         input cbeg,
  52.         input pre_cend // syncing signals, taken from arbiter.v and dram.v
  53. );
  54.  
  55.  
  56.         reg precend_cnt;
  57.         wire h_precend_1; // to take every other pulse of pre_cend
  58.         wire h_precend_2; // to take every other pulse of pre_cend
  59.  
  60.         reg [2:0] zcount; // counter for generating 3.5 and 7 MHz z80 clocks
  61.         reg [1:0] int_turbo; // internal turbo, controlling muxes
  62.  
  63.  
  64.         reg old_rfsh_n;
  65.  
  66.  
  67.  
  68.         wire pre_zpos,pre_zneg;
  69.  
  70.  
  71. `ifdef SIMULATE
  72.         initial // simulation...
  73.         begin
  74.                 precend_cnt = 1'b0;
  75.                 int_turbo   = 2'b00;
  76.                 old_rfsh_n  = 1'b1;
  77.         end
  78. `endif
  79.  
  80.         // switch between 3.5 and 7 only at predefined time
  81.         always @(posedge fclk) if(zpos)
  82.         begin
  83.                 old_rfsh_n <= rfsh_n;
  84.  
  85.                 if( old_rfsh_n && !rfsh_n )
  86.                         int_turbo <= turbo;
  87.         end
  88.  
  89.  
  90.  
  91.         // take every other pulse of pre_cend (make half pre_cend)
  92.         always @(posedge fclk) if( pre_cend )
  93.                 precend_cnt <= ~precend_cnt;
  94.  
  95.         assign h_precend_1 =  precend_cnt && pre_cend;
  96.         assign h_precend_2 = !precend_cnt && pre_cend;
  97.  
  98.  
  99.  
  100.         assign pre_zpos = (pre_cend && int_turbo[0]) || (h_precend_2 && !int_turbo[0]);
  101.         assign pre_zneg = (cbeg && int_turbo[0]) || (h_precend_1 && !int_turbo[0]);
  102.  
  103.  
  104.         always @(posedge fclk)
  105.         begin
  106.                 zpos <= (~zclk_stall) & pre_zpos;
  107.         end
  108.  
  109.         always @(posedge fclk)
  110.         begin
  111.                 zneg <= (~zclk_stall) & pre_zneg;
  112.         end
  113.  
  114.  
  115.  
  116.  
  117.         // make Z80 clock: account for external inversion and make some leading of clock
  118.         // 9.5 ns propagation delay: from fclk posedge to zclk returned back any edge
  119.         // (1/28)/2=17.9ns half a clock lead
  120.         // 2.6ns lag because of non-output register emitting of zclk_out
  121.         // total: 5.8 ns lead of any edge of zclk relative to posedge of fclk => ACCOUNT FOR THIS WHEN DOING INTER-CLOCK DATA TRANSFERS
  122.         //
  123.  
  124.         always @(negedge fclk)
  125.         begin
  126.                 if( zpos )
  127.                         zclk_out <= 1'b0;
  128.  
  129.                 if( zneg )
  130.                         zclk_out <= 1'b1;
  131.         end
  132.  
  133.  
  134. endmodule
  135.  
  136.