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"
66 wire W_CPU_HRDWR_RESETn;
73 output psTXD,psCLK,psSEL;
90 wire W_RESETn = |(~I_PSW[8:5]);
91 //------ CLOCK GEN ---------------------------
94 wire W_CLK_12M,WB_CLK_12M;
95 wire W_CLK_6M,WB_CLK_6M;
100 .CLKIN_IN(I_CLK_125M),
102 .CLKFX_OUT(W_CLK_36M)
105 //------ H&V COUNTER -------------------------
114 //------ CPU RAM ----------------------------
115 wire [7:0]W_CPU_RAM_DO;
117 //------ ADDRESS DECDER ----------------------
139 wire W_VID_RDn = W_OBJ_RAM_RDn & W_VID_RAM_RDn ;
140 wire W_SW_OEn = W_SW0_OEn & W_SW1_OEn & W_DIP_OEn ;
141 //------- INPORT -----------------------------
143 //------- VIDEO -----------------------------
145 //--------------------------------------------
149 .I_CLK_36M(W_CLK_36M),
150 .O_CLK_18M(W_CLK_18M),
151 .O_CLK_12M(WB_CLK_12M),
152 .O_CLK_06M(WB_CLK_6M),
153 .O_CLK_06Mn(W_CLK_6Mn)
157 assign W_CLK_12M = WB_CLK_12M;
158 assign W_CLK_6M = WB_CLK_6M;
159 //--- DATA I/F -------------------------------------
160 reg [7:0]W_CPU_ROM_DO;
161 wire [7:0]W_CPU_ROM_DOB = W_CPU_ROM_CSn ? 8'h00: W_CPU_ROM_DO ;
163 wire [7:0]W_BDO = W_SW_DO | W_VID_DO | W_CPU_RAM_DO | W_CPU_ROM_DOB ;
166 //--- CPU I/F -------------------------------------
168 always@(posedge W_H_CNT[0] or negedge W_RESETn)
170 if(! W_RESETn) rst_count <= 0;
173 rst_count <= rst_count;
175 rst_count <= rst_count+1;
179 assign W_CPU_RESETn = W_RESETn;
180 assign W_CPU_CLK = W_H_CNT[0];
185 .RESET_N(W_CPU_RESETn),
192 .MREQ_N(W_CPU_MREQn),
196 .WAIT_N(W_CPU_WAITn),
198 .RFSH_N(W_CPU_RFSHn),
203 wire W_CPU_RAM_CLK = W_CLK_12M & ~W_CPU_RAM_CSn;
205 mc_cpu_ram MC_CPU_RAM(
207 .I_CLK(W_CPU_RAM_CLK),
211 .I_OE(~W_CPU_RAM_RDn ),
219 .I_CLK_12M(W_CLK_12M),
221 .I_CPU_CLK(W_H_CNT[0]),
226 .I_MREQn(W_CPU_MREQn),
227 .I_RFSHn(W_CPU_RFSHn),
233 .O_WAITn(W_CPU_WAITn),
235 .O_CPU_ROM_CSn(W_CPU_ROM_CSn),
236 .O_CPU_RAM_RDn(W_CPU_RAM_RDn),
237 .O_CPU_RAM_WRn(W_CPU_RAM_WRn),
238 .O_CPU_RAM_CSn(W_CPU_RAM_CSn),
239 .O_OBJ_RAM_RDn(W_OBJ_RAM_RDn),
240 .O_OBJ_RAM_WRn(W_OBJ_RAM_WRn),
241 .O_OBJ_RAM_RQn(W_OBJ_RAM_RQn),
242 .O_VID_RAM_RDn(W_VID_RAM_RDn),
243 .O_VID_RAM_WRn(W_VID_RAM_WRn),
244 .O_SW0_OEn(W_SW0_OEn),
245 .O_SW1_OEn(W_SW1_OEn),
246 .O_DIP_OEn(W_DIP_OEn),
247 .O_WDR_OEn(W_WDR_OEn),
248 .O_LAMP_WEn(W_LAMP_WEn),
249 .O_SOUND_WEn(W_SOUND_WEn),
254 .O_STARS_ON(W_STARS_ON)
258 //-------- SOUND I/F -----------------------------
259 //--- Parts 9L ---------
261 always@(posedge W_CLK_12M or negedge W_RESETn)
263 if(W_RESETn == 1'b0)begin
267 if(W_SOUND_WEn == 1'b0)begin
269 3'h0 : W_9L_Q[0] <= W_BDI[0];
270 3'h1 : W_9L_Q[1] <= W_BDI[0];
271 3'h2 : W_9L_Q[2] <= W_BDI[0];
272 3'h3 : W_9L_Q[3] <= W_BDI[0];
273 3'h4 : W_9L_Q[4] <= W_BDI[0];
274 3'h5 : W_9L_Q[5] <= W_BDI[0];
275 3'h6 : W_9L_Q[6] <= W_BDI[0];
276 3'h7 : W_9L_Q[7] <= W_BDI[0];
281 wire W_VOL1 = W_9L_Q[6];
282 wire W_VOL2 = W_9L_Q[7];
283 wire W_FIRE = W_9L_Q[5];
284 wire W_HIT = W_9L_Q[3];
285 wire W_FS3 = W_9L_Q[2];
286 wire W_FS2 = W_9L_Q[1];
287 wire W_FS1 = W_9L_Q[0];
288 //---------------------------------------------------
289 //---- CPU DATA WATCH -------------------------------
290 wire ZMWR = W_CPU_MREQn | W_CPU_WRn ;
293 always @(posedge W_CPU_CLK)
296 if(W_A == 16'h4007)begin
302 if(W_A == 16'h4005)begin
303 if(W_BDI == 8'h03 || W_BDI == 8'h04 )
313 always @(posedge W_CPU_CLK)
316 if(W_A == 16'h4206)begin
324 //---- PS_PAD Interface -----------------------------
326 wire VIB_SW = died & (&on_game[1:0]);
328 fpga_arcade_if pspad(
330 .CLK_18M432(W_CLK_18M),
341 //---- SW Interface ---------------------------------
343 wire L1 = I_PSW[2] & ps_PSW[2];
344 wire R1 = I_PSW[3] & ps_PSW[3];
347 wire J1 = I_PSW[4] & ps_PSW[8];
349 wire S1 = (U1|J1) & ps_PSW[6];
350 wire S2 = (D1|J1) & ps_PSW[7];
352 wire C1 = (L1|R1|U1|~D1) & ps_PSW[4];
354 wire L1 = ! I_PSW[2];
355 wire R1 = ! I_PSW[3];
356 wire U1 = ! I_PSW[0];
357 wire D1 = ! I_PSW[1];
358 wire J1 = ! I_PSW[4];
360 wire S1 = ! I_PSW[5];
361 wire S2 = ! I_PSW[7];
363 wire C1 = ! I_PSW[6];
365 wire C2 = ! I_PSW[8];
375 .I_COIN1(~C1), // ACTIVE HI
376 .I_COIN2(~C2), // ACTIVE HI
377 .I_1P_LE(~L1), // ACTIVE HI
378 .I_1P_RI(~R1), // ACTIVE HI
379 .I_1P_SH(~J1), // ACTIVE HI
380 .I_2P_LE(~L2), // ACTIVE HI
381 .I_2P_RI(~R2), // ACTIVE HI
382 .I_2P_SH(~J2), // ACTIVE HI
383 .I_1P_START(~S1), // ACTIVE HI
384 .I_2P_START(~S2), // ACTIVE HI
386 .I_SW0_OEn(W_SW0_OEn),
387 .I_SW1_OEn(W_SW1_OEn),
388 .I_DIP_OEn(W_DIP_OEn),
394 //-----------------------------------------------------------------------------
395 //------- ROM -------------------------------------------------------
398 wire [18:0]W_WAV_A0,W_WAV_A1,W_WAV_A2;
399 reg [7:0]W_WAV_D0,W_WAV_D1,W_WAV_D2;
404 .I_ROM_CLK(W_CLK_12M),
405 .I_ADDR({3'h0,W_A[15:0]}),
409 always@(posedge W_CLK_12M)
411 W_CPU_ROM_DO <= ROM_D;
414 //-----------------------------------------------------------------------------
434 //------ VIDEO -----------------------------
445 .I_CLK_18M(W_CLK_18M),
446 .I_CLK_12M(W_CLK_12M),
448 .I_CLK_6Mn(W_CLK_6Mn),
457 .I_OBJ_SUB_A(3'b000),
459 .I_OBJ_RAM_RQn(W_OBJ_RAM_RQn),
460 .I_OBJ_RAM_RDn(W_OBJ_RAM_RDn),
461 .I_OBJ_RAM_WRn(W_OBJ_RAM_WRn),
462 .I_VID_RAM_RDn(W_VID_RAM_RDn),
463 .I_VID_RAM_WRn(W_VID_RAM_WRn),
469 .O_MISSILEn(W_MISSILEn),
483 mc_col_pal MC_COL_PAL(
485 .I_CLK_12M(W_CLK_12M),
492 .O_STARS_OFFn(W_STARS_OFFn),
505 .I_CLK_18M(W_CLK_18M),
506 `ifdef DEVICE_CYCLONE
507 .I_CLK_6M(~WB_CLK_6M),
509 `ifdef DEVICE_SPARTAN2E
510 .I_CLK_6M(WB_CLK_6M),
518 .I_STARS_ON(W_STARS_ON),
519 .I_STARS_OFFn(W_STARS_OFFn),
541 .I_C_BLnXX(~W_C_BLX),
542 .I_C_BLX(W_C_BLX | ~W_V_BL2n),
543 .I_MISSILEn(W_MISSILEn),
571 .O_H_SYNCn(O_VGA_H_SYNCn),
572 .O_V_SYNCn(O_VGA_V_SYNCn)
578 assign W_VGA_R[2:0] = W_R;
580 assign W_VGA_G[2:0] = W_G;
582 assign W_VGA_B[1:0] = W_B;
584 //assign O_VGA_H_SYNCn = W_H_SYNC | W_V_SYNC ; // AKIDUKI LCD USED
585 assign O_VGA_H_SYNCn = ~W_H_SYNC ;
586 assign O_VGA_V_SYNCn = ~W_V_SYNC ;
590 assign O_VGA_R[3:0] = {W_VGA_R[0], W_VGA_R[1], W_VGA_R[2], 1'b0};
592 assign O_VGA_G[3:0] = {W_VGA_G[0], W_VGA_G[1], W_VGA_G[2], 1'b0};
594 assign O_VGA_B[3:0] = {W_VGA_B[0], W_VGA_B[1], 2'b0};
598 mc_sound_a MC_SOUND_A(
600 .I_CLK_12M(W_CLK_12M),
602 .I_H_CNT1(W_H_CNT[1]),
615 mc_sound_b MC_SOUND_B(
619 .I_RSTn(rst_count[3]),
620 .I_SW({&on_game[1:0],W_HIT,W_FIRE}),
636 assign O_SOUND_OUT_L = W_DAC_A;
637 assign O_SOUND_OUT_R = W_DAC_B;