Subversion Repositories tsfmpro

Rev

Rev 114 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // TurboFMpro project
  2. // (C) 2018 NedoPC
  3.  
  4. // clock generation for YM2203 and SAA1099
  5.  
  6. module clocks
  7. (
  8.         input  wire fclk, // 56 MHz master clock
  9.  
  10.         input  wire saa_enabled, // whether SAA clock is enabled
  11.  
  12.         output wire ymclk, // 3.5 MHz
  13.         output wire saaclk // 8 MHz
  14. );
  15.  
  16.         reg [3:0] ym_cnt;
  17.         reg [2:0] saa_cnt;
  18.  
  19.         reg main_clk;
  20.  
  21.         reg add_clk;
  22.         reg add_clk_neg;
  23.  
  24.         // make ym clock (div by 16)
  25.         initial ym_cnt = 4'd0; // for simulation
  26.         //
  27.         always @(posedge fclk)
  28.                 ym_cnt <= ym_cnt + 4'd1;
  29.         //
  30.         assign ymclk = ym_cnt[3];
  31.  
  32.  
  33.         // make saa clock (div by 7)
  34.         //
  35.         // saacnt:    1     2     3     4     5     6     0     1     2     3     4     5
  36.         //         |     |     |     |     |     |     |     |     |     |     |     |     |
  37.         // fclk:  _/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\__/``\
  38.         //         |     |     |     |     |     |     |     |     |     |     |     |     |
  39.         // saaclk:_/````````````````````\____________________/````````````````````\____________
  40.         //
  41.         //
  42.         //
  43.         initial saa_cnt <= 3'd0;
  44.         //
  45.         always @(posedge fclk, negedge saa_enabled)
  46.         if( !saa_enabled )
  47.                 saa_cnt <= 3'd0;
  48.         else if( saa_cnt[2:1]==2'b11 )
  49.                 saa_cnt <= 3'd0;
  50.         else
  51.                 saa_cnt <= saa_cnt + 3'd1;
  52.  
  53.  
  54.  
  55.         always @(posedge fclk)
  56.                 main_clk <= ~saa_cnt[2];
  57.  
  58.         always @(posedge fclk)
  59.                 add_clk <= !(saa_cnt==3'd3 || saa_cnt==3'd4);
  60.         always @*
  61.         if( !fclk )
  62.                 add_clk_neg <= add_clk;
  63.  
  64.  
  65.         assign saaclk = main_clk & add_clk_neg;
  66.  
  67. endmodule
  68.  
  69.