Subversion Repositories tsfmpro

Rev

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

  1. // TurboFMpro project
  2. // (C) 2018-2022 NedoPC
  3.  
  4. // top level:
  5. //  pins, connections
  6.  
  7. module top
  8. (
  9.         //global clock 56Mhz
  10.         input fclk,
  11.        
  12.         // speccy databus from AY slot
  13.         inout  wire [7:0] ayd,
  14.        
  15.         // local databus to YM/SAA
  16.         inout  wire [7:0] d,
  17.        
  18.         // controls (from speccy AY slot)
  19.         input  wire       ayres_n,
  20.         input  wire       aybc1,
  21.         input  wire       aybc2,
  22.         input  wire       aybdir,
  23.         input  wire       aya8,
  24.         input  wire       aya9_n,
  25.  
  26.         // modes (from jumpers)
  27.         input  wire       mode0, // {mode1,mode0}: 00 - single AY, 01 - turbo AY,
  28.         input  wire       mode1, //                10 - turbo FM,  11 - turbo FM + SAA
  29.        
  30.         // control YM2203
  31.         output wire       ymclk,   //3.5Mhz
  32.         output wire       ymcs1_n, //select first chip
  33.         output wire       ymcs2_n, //select second chip
  34.         output wire       ymrd_n,  //write
  35.         output wire       ymwr_n,  //read
  36.         output wire       yma0,
  37.         input  wire       ymop1, //dac data from first chip
  38.         input  wire       ymop2, //dac data from second chip
  39.         output wire       ymop1d, //to first dac
  40.         output wire       ymop2d, //to second dac
  41.  
  42.         // control SAA
  43.         output wire       saaclk, //8Mhz
  44.         output wire       saacs_n, //chip select
  45.         output wire       saawr_n, //chip write
  46.         output wire       saaa0, //register/adress select
  47.  
  48.         // PLL control
  49.         output wire [1:0] pll
  50. );
  51.        
  52.         wire wr_port; // write Fx config port strobe
  53.  
  54.         // config signals
  55.         wire ym_sel;  // 0 -- YM #0 selected, 1 -- YM #1
  56.         wire ym_stat; // 1 -- read YM status reg
  57.         wire saa_sel; // 1 -- saa selected, 0 -- YM selected
  58.  
  59.         wire fm_dac_ena;
  60.        
  61.         reg saa_clk_ena;
  62.  
  63.  
  64.  
  65.         // set up PLL rate to x4
  66.         assign pll[1:0] = 2'b00;
  67.  
  68.  
  69.  
  70.  
  71.         // saa clock control (stop clock on reset)
  72.         always @(posedge fclk, negedge ayres_n)
  73.         if( !ayres_n )
  74.                 saa_clk_ena <= 1'b0;
  75.         else if( saa_sel )
  76.                 saa_clk_ena <= 1'b1;
  77.  
  78.  
  79.  
  80.         // reset resync
  81.         reg [1:0] rst_n_r;
  82.         wire rst_n = rst_n_r[1];
  83.         //
  84.         always @(posedge fclk, negedge ayres_n)
  85.         if( !ayres_n )
  86.                 rst_n_r[1:0] <= 2'b00;
  87.         else
  88.                 rst_n_r[1:0] <= {rst_n_r[0], 1'b1};
  89.  
  90.  
  91.  
  92.  
  93.  
  94.         // clocks generator
  95.         clocks clocks
  96.         (
  97.                 .fclk(fclk),
  98.  
  99.                 .saa_enabled(saa_clk_ena),
  100.  
  101.                 .ymclk (ymclk ),
  102.                 .saaclk(saaclk)
  103.         );
  104.  
  105.  
  106.  
  107.  
  108.         // bus controller
  109.         bus bus
  110.         (
  111.                 .clk(fclk),
  112.  
  113.                 .rst_n(rst_n),
  114.  
  115.                 .aybc1 (aybc1 ),
  116.                 .aybc2 (aybc2 ),
  117.                 .aybdir(aybdir),
  118.                 .aya8  (aya8  ),
  119.                 .aya9_n(aya9_n),
  120.  
  121.                 .ayd(ayd),
  122.                 .d  (d  ),
  123.  
  124.                 .wr_port(wr_port),
  125.                
  126.                 .yma0   (yma0   ),
  127.                 .ymcs0_n(ymcs1_n),
  128.                 .ymcs1_n(ymcs2_n),
  129.                 .ymrd_n (ymrd_n ),
  130.                 .ymwr_n (ymwr_n ),
  131.  
  132.                 .saaa0  (saaa0  ),
  133.                 .saacs_n(saacs_n),
  134.                 .saawr_n(saawr_n),
  135.        
  136.                 .ym_sel (ym_sel ),
  137.                 .ym_stat(ym_stat),
  138.                 .saa_sel(saa_sel)
  139.         );
  140.  
  141.  
  142.  
  143.  
  144.         // configurator
  145.         cfg cfg
  146.         (
  147.                 .clk  (fclk ),
  148.                 .rst_n(rst_n),
  149.  
  150.                 .d(ayd),
  151.  
  152.                 .wrstb(wr_port),
  153.  
  154.                 .mode({mode1,mode0}),
  155.  
  156.                 .ym_sel (ym_sel ),
  157.                 .ym_stat(ym_stat),
  158.                 .saa_sel(saa_sel),
  159.  
  160.                 .fm_dac_ena(fm_dac_ena)
  161.         );
  162.  
  163.  
  164.  
  165.  
  166.         // FM dac enable
  167.         assign ymop1d = ymop1 & fm_dac_ena;
  168.         assign ymop2d = ymop2 & fm_dac_ena;
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175. endmodule
  176.  
  177.