1 //===============================================================================
 
   6 // Copyright(c) 2004 Katsumi Degawa , All rights reserved
 
  10 // This program is freeware for non-commercial use. 
 
  11 // An author does no guarantee about this program.
 
  12 // You can use this under your own risk.
 
  14 // 2004- 4-30  galaxian modify by K.DEGAWA
 
  15 // 2004- 5- 6  first release.
 
  16 // 2004- 8-23  Improvement with T80-IP.
 
  17 // 2004- 9-18  The description of ALTERA(CYCLONE) and XILINX(SPARTAN2E) was made one.
 
  18 // 2004- 9-22  The problem which missile didn't sometimes come out from was improved.
 
  19 //================================================================================
 
  21 `include "src/mc_conf.v"             
 
  73 wire   W_CPU_HRDWR_RESETn;
 
  80 output  psTXD,psCLK,psSEL;
 
  84 //output [18:0]O_ROM_AB;
 
  85 //input  [7:0]I_ROM_DB;
 
 101 output O_VGA_H_SYNCn;
 
 102 output O_VGA_V_SYNCn;
 
 104 wire   W_RESETn = |(~I_PSW[8:5]);
 
 105 //------ CLOCK GEN ---------------------------
 
 107 wire   W_CLK_12M,WB_CLK_12M;
 
 108 wire   W_CLK_6M,WB_CLK_6M;
 
 112 .CLKIN_IN(I_CLK_125M),
 
 114 .CLKFX_OUT(I_CLK_18432M)
 
 117 //------ H&V COUNTER -------------------------
 
 126 //------ CPU RAM  ----------------------------
 
 127 wire   [7:0]W_CPU_RAM_DO;
 
 129 //------ ADDRESS DECDER ----------------------
 
 151 wire   W_VID_RDn = W_OBJ_RAM_RDn & W_VID_RAM_RDn ;
 
 152 wire   W_SW_OEn = W_SW0_OEn & W_SW1_OEn & W_DIP_OEn ;
 
 153 //------- INPORT -----------------------------
 
 155 //------- VIDEO  -----------------------------
 
 157 //--------------------------------------------
 
 161 .I_CLK_18M(I_CLK_18432M),
 
 162 .O_CLK_12M(WB_CLK_12M),
 
 163 .O_CLK_06M(WB_CLK_6M)
 
 167 `ifdef DEVICE_CYCLONE
 
 168 assign W_CLK_12M = WB_CLK_12M;
 
 169 assign W_CLK_6M  = WB_CLK_6M;
 
 171 `ifdef DEVICE_SPARTAN2E
 
 172 BUFG    BUFG_12MHz( .I(WB_CLK_12M),.O(W_CLK_12M) );
 
 173 BUFG    BUFG_6MHz ( .I(WB_CLK_6M ),.O(W_CLK_6M ) );
 
 175 //---  DATA I/F -------------------------------------
 
 176 reg    [7:0]W_CPU_ROM_DO;
 
 177 wire   [7:0]W_CPU_ROM_DOB = W_CPU_ROM_CSn ? 8'h00: W_CPU_ROM_DO ;
 
 179 wire   [7:0]W_BDO = W_SW_DO | W_VID_DO | W_CPU_RAM_DO | W_CPU_ROM_DOB ;
 
 182 //---  CPU I/F  -------------------------------------
 
 184 always@(posedge W_H_CNT[0] or negedge W_RESETn)
 
 186    if(! W_RESETn) rst_count <= 0;
 
 189          rst_count <= rst_count;
 
 191          rst_count <= rst_count+1;
 
 195 assign W_CPU_RESETn = W_RESETn;
 
 196 assign W_CPU_CLK = W_H_CNT[0];
 
 201 .RESET_N(W_CPU_RESETn),
 
 208 .MREQ_N(W_CPU_MREQn),
 
 212 .WAIT_N(W_CPU_WAITn),
 
 214 .RFSH_N(W_CPU_RFSHn),
 
 219 wire   W_CPU_RAM_CLK = W_CLK_12M & ~W_CPU_RAM_CSn;
 
 221 mc_cpu_ram MC_CPU_RAM(
 
 223 .I_CLK(W_CPU_RAM_CLK),
 
 227 .I_OE(~W_CPU_RAM_RDn ),
 
 235 .I_CLK_12M(W_CLK_12M),
 
 237 .I_CPU_CLK(W_H_CNT[0]),
 
 242 .I_MREQn(W_CPU_MREQn),
 
 243 .I_RFSHn(W_CPU_RFSHn),
 
 249 .O_WAITn(W_CPU_WAITn),
 
 251 .O_CPU_ROM_CSn(W_CPU_ROM_CSn),
 
 252 .O_CPU_RAM_RDn(W_CPU_RAM_RDn),
 
 253 .O_CPU_RAM_WRn(W_CPU_RAM_WRn),
 
 254 .O_CPU_RAM_CSn(W_CPU_RAM_CSn),
 
 255 .O_OBJ_RAM_RDn(W_OBJ_RAM_RDn),
 
 256 .O_OBJ_RAM_WRn(W_OBJ_RAM_WRn),
 
 257 .O_OBJ_RAM_RQn(W_OBJ_RAM_RQn),
 
 258 .O_VID_RAM_RDn(W_VID_RAM_RDn),
 
 259 .O_VID_RAM_WRn(W_VID_RAM_WRn),
 
 260 .O_SW0_OEn(W_SW0_OEn),
 
 261 .O_SW1_OEn(W_SW1_OEn),
 
 262 .O_DIP_OEn(W_DIP_OEn),
 
 263 .O_WDR_OEn(W_WDR_OEn),
 
 264 .O_LAMP_WEn(W_LAMP_WEn),
 
 265 .O_SOUND_WEn(W_SOUND_WEn),
 
 270 .O_STARS_ON(W_STARS_ON)
 
 274 //-------- SOUND I/F -----------------------------
 
 275 //---  Parts 9L ---------
 
 277 always@(posedge W_CLK_12M or negedge W_RESETn)
 
 279    if(W_RESETn == 1'b0)begin
 
 283       if(W_SOUND_WEn == 1'b0)begin
 
 285             3'h0 : W_9L_Q[0] <= W_BDI[0];
 
 286             3'h1 : W_9L_Q[1] <= W_BDI[0];
 
 287             3'h2 : W_9L_Q[2] <= W_BDI[0];
 
 288             3'h3 : W_9L_Q[3] <= W_BDI[0];
 
 289             3'h4 : W_9L_Q[4] <= W_BDI[0];
 
 290             3'h5 : W_9L_Q[5] <= W_BDI[0];
 
 291             3'h6 : W_9L_Q[6] <= W_BDI[0];
 
 292             3'h7 : W_9L_Q[7] <= W_BDI[0];
 
 297 wire   W_VOL1 = W_9L_Q[6];
 
 298 wire   W_VOL2 = W_9L_Q[7];
 
 299 wire   W_FIRE = W_9L_Q[5];
 
 300 wire   W_HIT  = W_9L_Q[3];
 
 301 wire   W_FS3  = W_9L_Q[2];
 
 302 wire   W_FS2  = W_9L_Q[1];
 
 303 wire   W_FS1  = W_9L_Q[0];
 
 304 //---------------------------------------------------
 
 305 //---- CPU DATA WATCH -------------------------------
 
 306 wire   ZMWR = W_CPU_MREQn | W_CPU_WRn ;
 
 309 always @(posedge W_CPU_CLK)
 
 312       if(W_A == 16'h4007)begin
 
 318       if(W_A == 16'h4005)begin
 
 319          if(W_BDI == 8'h03 || W_BDI == 8'h04 ) 
 
 329 always @(posedge W_CPU_CLK)
 
 332       if(W_A == 16'h4206)begin
 
 340 //---- PS_PAD Interface -----------------------------
 
 342 wire    VIB_SW = died & (&on_game[1:0]);
 
 344 fpga_arcade_if pspad(
 
 346 .CLK_18M432(I_CLK_18432M),
 
 357 //---- SW Interface ---------------------------------
 
 359 wire   L1 = I_PSW[2] & ps_PSW[2];
 
 360 wire   R1 = I_PSW[3] & ps_PSW[3];
 
 363 wire   J1 = I_PSW[4] & ps_PSW[8];
 
 365 wire   S1 = (U1|J1)  & ps_PSW[6];
 
 366 wire   S2 = (D1|J1)  & ps_PSW[7];
 
 368 wire   C1 = (L1|R1|U1|~D1) & ps_PSW[4];
 
 370 wire   L1 = ! I_PSW[2];
 
 371 wire   R1 = ! I_PSW[3];
 
 372 wire   U1 = ! I_PSW[0];
 
 373 wire   D1 = ! I_PSW[1];
 
 374 wire   J1 = ! I_PSW[4];
 
 376 wire   S1 = ! I_PSW[5];
 
 377 wire   S2 = ! I_PSW[7];
 
 379 wire   C1 = ! I_PSW[6];
 
 381 wire   C2 = ! I_PSW[8];
 
 391 .I_COIN1(~C1),      //  ACTIVE HI
 
 392 .I_COIN2(~C2),      //  ACTIVE HI
 
 393 .I_1P_LE(~L1),      //  ACTIVE HI
 
 394 .I_1P_RI(~R1),      //  ACTIVE HI
 
 395 .I_1P_SH(~J1),      //  ACTIVE HI
 
 396 .I_2P_LE(~L2),      //  ACTIVE HI
 
 397 .I_2P_RI(~R2),      //  ACTIVE HI
 
 398 .I_2P_SH(~J2),      //  ACTIVE HI
 
 399 .I_1P_START(~S1),   //  ACTIVE HI
 
 400 .I_2P_START(~S2),   //  ACTIVE HI
 
 402 .I_SW0_OEn(W_SW0_OEn),
 
 403 .I_SW1_OEn(W_SW1_OEn),
 
 404 .I_DIP_OEn(W_DIP_OEn),
 
 410 //-----------------------------------------------------------------------------
 
 411 //------- ROM           -------------------------------------------------------
 
 413 wire   [10:0]W_OBJ_ROM_A;
 
 414 reg    [7:0]W_OBJ_ROM_A_D;
 
 415 reg    [7:0]W_OBJ_ROM_B_D;
 
 417 wire   [18:0]W_WAV_A0,W_WAV_A1,W_WAV_A2;
 
 418 reg    [7:0]W_WAV_D0,W_WAV_D1,W_WAV_D2;
 
 420 wire   [7:0]ROM_D; // = I_ROM_DB;
 
 421 //assign O_ROM_AB  = ROM_A;
 
 423 //assign O_ROM_OEn = 1'b0;
 
 424 //assign O_ROM_CSn = 1'b0;
 
 425 //assign O_ROM_WEn = 1'b1;
 
 428 .I_CLK_12M(WB_CLK_12M),
 
 436 always @(posedge I_CLK_18432M)
 
 438   // 24 phase generator
 
 439    clk_d[0] <= W_H_CNT[0] & W_H_CNT[1] & W_H_CNT[2];
 
 440    clk_d[1] <= clk_d[0];
 
 441    seq <= (~clk_d[1] & clk_d[0]) ? 0 : seq+1;
 
 446         W_CPU_ROM_DO <= ROM_D;
 
 455         ROM_A <= {3'h0,W_A[15:0]};
 
 461         W_CPU_ROM_DO <= ROM_D;
 
 463       8:W_WAV_D2 <= ROM_D; //sound
 
 464      10:ROM_A <= {3'h0,W_A[15:0]};
 
 465      12:W_CPU_ROM_DO <= ROM_D;
 
 466      16:ROM_A <= {3'h0,W_A[15:0]};
 
 468         ROM_A <= {3'h0,4'h4,1'b0,W_OBJ_ROM_A};
 
 469         W_CPU_ROM_DO <= ROM_D;
 
 472         ROM_A <= {3'h0,4'h5,1'b0,W_OBJ_ROM_A};
 
 473         W_OBJ_ROM_A_D <= ROM_D;
 
 476         ROM_A <= {3'h0,W_A[15:0]};
 
 477         W_OBJ_ROM_B_D <= ROM_D;
 
 482 //-----------------------------------------------------------------------------
 
 502 //------ VIDEO  -----------------------------
 
 513 .I_CLK_18M(I_CLK_18432M),
 
 514 .I_CLK_12M(W_CLK_12M),
 
 524 .I_OBJ_SUB_A(3'b000),
 
 526 .I_OBJ_RAM_RQn(W_OBJ_RAM_RQn),
 
 527 .I_OBJ_RAM_RDn(W_OBJ_RAM_RDn),
 
 528 .I_OBJ_RAM_WRn(W_OBJ_RAM_WRn),
 
 529 .I_VID_RAM_RDn(W_VID_RAM_RDn),
 
 530 .I_VID_RAM_WRn(W_VID_RAM_WRn),
 
 532 .O_OBJ_ROM_A(W_OBJ_ROM_A),
 
 533 .I_OBJ_ROM_A_D(W_OBJ_ROM_A_D),
 
 534 .I_OBJ_ROM_B_D(W_OBJ_ROM_B_D),
 
 540 .O_MISSILEn(W_MISSILEn),
 
 554 mc_col_pal MC_COL_PAL(
 
 556 .I_CLK_12M(W_CLK_12M),
 
 563 .O_STARS_OFFn(W_STARS_OFFn),
 
 576 .I_CLK_18M(I_CLK_18432M),
 
 577 `ifdef DEVICE_CYCLONE
 
 578 .I_CLK_6M(~WB_CLK_6M),
 
 580 `ifdef DEVICE_SPARTAN2E 
 
 581 .I_CLK_6M(WB_CLK_6M),   
 
 589 .I_STARS_ON(W_STARS_ON),
 
 590 .I_STARS_OFFn(W_STARS_OFFn),
 
 612 .I_C_BLnXX(~W_C_BLX),
 
 613 .I_C_BLX(W_C_BLX | ~W_V_BL2n),
 
 614 .I_MISSILEn(W_MISSILEn),
 
 638 .O_H_SYNCn(O_VGA_H_SYNCn),
 
 639 .O_V_SYNCn(O_VGA_V_SYNCn)
 
 645 assign O_VGA_R[2:0] = W_R;
 
 647 assign O_VGA_G[2:0] = W_G;
 
 649 assign O_VGA_B[1:0] = W_B;
 
 651 //assign O_VGA_H_SYNCn = W_H_SYNC | W_V_SYNC ;  //  AKIDUKI LCD USED
 
 652 assign O_VGA_H_SYNCn = ~W_H_SYNC ;
 
 653 assign O_VGA_V_SYNCn = ~W_V_SYNC ;
 
 659 mc_sound_a MC_SOUND_A(
 
 661 .I_CLK_12M(W_CLK_12M),
 
 663 .I_H_CNT1(W_H_CNT[1]),
 
 676 mc_sound_b MC_SOUND_B(
 
 678 .I_CLK1(I_CLK_18432M),
 
 680 .I_RSTn(rst_count[3]),
 
 681 .I_SW({&on_game[1:0],W_HIT,W_FIRE}),
 
 697 assign  O_SOUND_OUT_L = W_DAC_A;
 
 698 assign  O_SOUND_OUT_R = W_DAC_B;