1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-22 18:31:06 +00:00

Phoenix HW: clocking fixes (Blending looks good now), common inputs

This commit is contained in:
Gyorgy Szombathelyi 2020-01-07 19:26:42 +01:00
parent 1dfea98b61
commit fd0561ae0e
10 changed files with 251 additions and 293 deletions

View File

@ -34,10 +34,14 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"T6,Reset;",
"T0,Reset;",
"V,v1.21.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
assign LED = 1;
assign AUDIO_R = AUDIO_L;
@ -58,21 +62,24 @@ wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
reg [11:0] audio;
wire hb1, hb2, vb;
wire hb1, hb2, vb;
wire blankn = ~((hb1 & hb2) | vb);
wire hs, vs;
wire hs, vs;
wire [1:0] r,g,b;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
phoenix phoenix(
.clk(clk_sys),
.reset(status[0] | status[6] | buttons[1]),
.reset(status[0] | buttons[1]),
.dip_switch(8'b00001111),
.btn_coin(btn_coin),
.btn_player_start({btn_two_players,btn_one_player}),
.btn_coin(m_coin1 | m_coin2),
.btn_player_start({m_two_players,m_one_player}),
.btn_left(m_left),
.btn_right(m_right),
.btn_barrier(m_bomb),
.btn_fire(m_fire),
.btn_barrier(m_fireB),
.btn_fire(m_fireA),
.video_r(r),
.video_g(g),
.video_b(b),
@ -85,7 +92,7 @@ phoenix phoenix(
.audio(audio)
);
mist_video #(.COLOR_DEPTH(2)) mist_video(
mist_video #(.COLOR_DEPTH(2), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys(clk_22),
.SPI_SCK(SPI_SCK),
.SPI_SS3(SPI_SS3),
@ -100,18 +107,18 @@ mist_video #(.COLOR_DEPTH(2)) mist_video(
.VGA_B(VGA_B),
.VGA_VS(VGA_VS),
.VGA_HS(VGA_HS),
.ce_divider(0),
.blend(status[5]),
.rotate({1'b1,status[2]}),
.ce_divider(1'b1),
.blend(blend),
.rotate({1'b1,rotate}),
.scandoubler_disable(scandoublerD),
.scanlines(scandoublerD ? 2'b00 : status[4:3]),
.scanlines(scanlines),
.ypbpr(ypbpr)
);
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_22 ),
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
@ -133,48 +140,30 @@ user_io(
dac #(
.C_bits(15))
dac(
.clk_i(clk_22),
.clk_i(clk_sys),
.res_n_i(1),
.dac_i({audio, 3'b000}),
.dac_o(AUDIO_L)
);
// Rotated Normal
//wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3];
//wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2];
wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1];
wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0];
wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5];
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
reg btn_one_player = 0;
reg btn_two_players = 0;
reg btn_left = 0;
reg btn_right = 0;
reg btn_down = 0;
reg btn_up = 0;
reg btn_fire1 = 0;
reg btn_fire2 = 0;
reg btn_coin = 0;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
arcade_inputs inputs (
.clk ( clk_sys ),
.key_strobe ( key_strobe ),
.key_pressed ( key_pressed ),
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( 2'b11 ),
.joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
always @(posedge clk_22) begin
if(key_strobe) begin
case(key_code)
'h75: btn_up <= key_pressed; // up
'h72: btn_down <= key_pressed; // down
'h6B: btn_left <= key_pressed; // left
'h74: btn_right <= key_pressed; // right
'h76: btn_coin <= key_pressed; // ESC
'h05: btn_one_player <= key_pressed; // F1
'h06: btn_two_players <= key_pressed; // F2
'h29: btn_fire1 <= key_pressed; // Space
'h11: btn_fire2 <= key_pressed; // Alt
endcase
end
end
endmodule
endmodule

View File

@ -60,6 +60,7 @@ architecture struct of phoenix is
signal hblank_frgrd : std_logic;
signal ce_pix1 : std_logic;
signal cpu_ce : std_logic;
signal cpu_adr : std_logic_vector(15 downto 0);
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
@ -173,7 +174,14 @@ end generate;
);
reset_n <= not reset;
ce_pix <= ce_pix1;
process(clk)
begin
if rising_edge(clk) then
cpu_ce <= not cpu_ce;
end if;
end process;
-- microprocessor 8085
cpu8085 : entity work.T8080se
generic map
@ -184,7 +192,7 @@ generic map
port map(
RESET_n => reset_n,
CLK => clk,
CLKEN => '1', -- fixme: use it to make 5.5 MHz clock average
CLKEN => cpu_ce,
READY => rdy,
HOLD => '1',
INT => '1',

View File

@ -34,10 +34,14 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"T6,Reset;",
"T0,Reset;",
"V,v1.21.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
assign LED = 1;
assign AUDIO_R = AUDIO_L;
@ -58,21 +62,25 @@ wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
reg [11:0] audio;
wire hb1, hb2, vb;
wire hb1, hb2, vb;
wire blankn = ~((hb1 & hb2) | vb);
wire hs, vs;
wire hs, vs;
wire [1:0] r,g,b;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
phoenix phoenix(
.clk(clk_sys),
.reset(status[0] | status[6] | buttons[1]),
.reset(status[0] | buttons[1]),
.dip_switch(8'b00001111),
.btn_coin(btn_coin),
.btn_player_start({btn_two_players,btn_one_player}),
.btn_coin(m_coin1 | m_coin2),
.btn_player_start({m_two_players,m_one_player}),
.btn_left(m_left),
.btn_right(m_right),
.btn_barrier(m_bomb),
.btn_fire(m_fire),
.btn_barrier(m_fireB),
.btn_fire(m_fireA),
.video_r(r),
.video_g(g),
.video_b(b),
@ -85,7 +93,7 @@ phoenix phoenix(
.audio(audio)
);
mist_video #(.COLOR_DEPTH(2)) mist_video(
mist_video #(.COLOR_DEPTH(2), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys(clk_22),
.SPI_SCK(SPI_SCK),
.SPI_SS3(SPI_SS3),
@ -100,18 +108,18 @@ mist_video #(.COLOR_DEPTH(2)) mist_video(
.VGA_B(VGA_B),
.VGA_VS(VGA_VS),
.VGA_HS(VGA_HS),
.ce_divider(0),
.blend(status[5]),
.rotate({1'b1,status[2]}),
.ce_divider(1'b1),
.blend(blend),
.rotate({1'b1,rotate}),
.scandoubler_disable(scandoublerD),
.scanlines(scandoublerD ? 2'b00 : status[4:3]),
.scanlines(scanlines),
.ypbpr(ypbpr)
);
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_22 ),
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
@ -137,43 +145,25 @@ dac(
.dac_i({audio, 4'b000}),
.dac_o(AUDIO_L)
);
// Rotated Normal
//wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3];
//wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2];
wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1];
wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0];
wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5];
reg btn_one_player = 0;
reg btn_two_players = 0;
reg btn_left = 0;
reg btn_right = 0;
reg btn_down = 0;
reg btn_up = 0;
reg btn_fire1 = 0;
reg btn_fire2 = 0;
reg btn_coin = 0;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs (
.clk ( clk_sys ),
.key_strobe ( key_strobe ),
.key_pressed ( key_pressed ),
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( 2'b11 ),
.joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
always @(posedge clk_sys) begin
if(key_strobe) begin
case(key_code)
'h75: btn_up <= key_pressed; // up
'h72: btn_down <= key_pressed; // down
'h6B: btn_left <= key_pressed; // left
'h74: btn_right <= key_pressed; // right
'h76: btn_coin <= key_pressed; // ESC
'h05: btn_one_player <= key_pressed; // F1
'h06: btn_two_players <= key_pressed; // F2
'h29: btn_fire1 <= key_pressed; // Space
'h11: btn_fire2 <= key_pressed; // Alt
endcase
end
end
endmodule
endmodule

View File

@ -61,6 +61,7 @@ architecture struct of phoenix is
signal ce_pix1 : std_logic;
signal cpu_adr : std_logic_vector(15 downto 0);
signal cpu_ce : std_logic;
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
signal cpu_wr_n : std_logic;
@ -173,7 +174,14 @@ end generate;
);
reset_n <= not reset;
ce_pix <= ce_pix1;
process(clk)
begin
if rising_edge(clk) then
cpu_ce <= not cpu_ce;
end if;
end process;
-- microprocessor 8085
cpu8085 : entity work.T8080se
generic map
@ -184,7 +192,7 @@ generic map
port map(
RESET_n => reset_n,
CLK => clk,
CLKEN => '1', -- fixme: use it to make 5.5 MHz clock average
CLKEN => cpu_ce,
READY => rdy,
HOLD => '1',
INT => '1',

View File

@ -34,10 +34,14 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"T6,Reset;",
"T0,Reset;",
"V,v1.21.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
assign LED = 1;
assign AUDIO_R = AUDIO_L;
@ -57,22 +61,25 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
reg [11:0] audio;
wire hb1, hb2, vb;
wire [11:0] audio;
wire hb1, hb2, vb;
wire blankn = ~((hb1 & hb2) | vb);
wire hs, vs;
wire hs, vs;
wire [1:0] r,g,b;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
phoenix phoenix(
.clk(clk_sys),
.reset(status[0] | status[6] | buttons[1]),
.reset(status[0] | buttons[1]),
.dip_switch(8'b00001111),
.btn_coin(btn_coin),
.btn_player_start({btn_two_players,btn_one_player}),
.btn_coin(m_coin1 | m_coin2),
.btn_player_start({m_two_players,m_one_player}),
.btn_left(m_left),
.btn_right(m_right),
.btn_barrier(m_bomb),
.btn_fire(m_fire),
.btn_barrier(m_fireB),
.btn_fire(m_fireA),
.video_r(r),
.video_g(g),
.video_b(b),
@ -85,7 +92,7 @@ phoenix phoenix(
.audio(audio)
);
mist_video #(.COLOR_DEPTH(2)) mist_video(
mist_video #(.COLOR_DEPTH(2), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys(clk_22),
.SPI_SCK(SPI_SCK),
.SPI_SS3(SPI_SS3),
@ -100,18 +107,18 @@ mist_video #(.COLOR_DEPTH(2)) mist_video(
.VGA_B(VGA_B),
.VGA_VS(VGA_VS),
.VGA_HS(VGA_HS),
.ce_divider(0),
.blend(status[5]),
.rotate({1'b1,status[2]}),
.ce_divider(1'b1),
.blend(blend),
.rotate({1'b1,rotate}),
.scandoubler_disable(scandoublerD),
.scanlines(scandoublerD ? 2'b00 : status[4:3]),
.scanlines(scanlines),
.ypbpr(ypbpr)
);
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_22 ),
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
@ -133,48 +140,30 @@ user_io(
dac #(
.C_bits(15))
dac(
.clk_i(clk_22),
.clk_i(clk_sys),
.res_n_i(1),
.dac_i({audio, 3'b000}),
.dac_o(AUDIO_L)
);
// Rotated Normal
//wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3];
//wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2];
wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1];
wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0];
wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5];
reg btn_one_player = 0;
reg btn_two_players = 0;
reg btn_left = 0;
reg btn_right = 0;
reg btn_down = 0;
reg btn_up = 0;
reg btn_fire1 = 0;
reg btn_fire2 = 0;
reg btn_coin = 0;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
always @(posedge clk_22) begin
if(key_strobe) begin
case(key_code)
'h75: btn_up <= key_pressed; // up
'h72: btn_down <= key_pressed; // down
'h6B: btn_left <= key_pressed; // left
'h74: btn_right <= key_pressed; // right
'h76: btn_coin <= key_pressed; // ESC
'h05: btn_one_player <= key_pressed; // F1
'h06: btn_two_players <= key_pressed; // F2
'h29: btn_fire1 <= key_pressed; // Space
'h11: btn_fire2 <= key_pressed; // Alt
endcase
end
end
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs (
.clk ( clk_sys ),
.key_strobe ( key_strobe ),
.key_pressed ( key_pressed ),
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( 2'b11 ),
.joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
endmodule

View File

@ -60,6 +60,7 @@ architecture struct of phoenix is
signal hblank_frgrd : std_logic;
signal ce_pix1 : std_logic;
signal cpu_ce : std_logic;
signal cpu_adr : std_logic_vector(15 downto 0);
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
@ -173,7 +174,14 @@ end generate;
);
reset_n <= not reset;
ce_pix <= ce_pix1;
process(clk)
begin
if rising_edge(clk) then
cpu_ce <= not cpu_ce;
end if;
end process;
-- microprocessor 8085
cpu8085 : entity work.T8080se
generic map
@ -184,7 +192,7 @@ generic map
port map(
RESET_n => reset_n,
CLK => clk,
CLKEN => '1', -- fixme: use it to make 5.5 MHz clock average
CLKEN => cpu_ce, -- fixme: use it to make 5.5 MHz clock average
READY => rdy,
HOLD => '1',
INT => '1',

View File

@ -34,21 +34,24 @@ localparam CONF_STR = {
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"T6,Reset;",
"T0,Reset;",
"V,v1.20.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
assign LED = 1;
assign AUDIO_R = AUDIO_L;
wire clk_sys, clk_28, clk_ay;
wire clk_sys, clk_22;
wire pll_locked;
pll pll(
.inclk0(CLOCK_27),
.areset(0),
.c0(clk_sys),//11
.c1(clk_28),//28
.c2(clk_ay)//2.75
.c1(clk_22)//22
);
wire [31:0] status;
@ -58,28 +61,28 @@ wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire [10:0] ps2_key;
reg [7:0] audio;
wire hb1, hb2, vb;
wire [7:0] audio;
wire hb1, hb2, vb;
wire blankn = ~((hb1 & hb2) | vb);
wire ce_pix;
wire hs, vs;
wire ce_pix;
wire hs, vs;
wire [1:0] r,g,b;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
phoenix phoenix(
.clk(clk_sys),
.clk_28(clk_28),
.clk_ay(clk_ay),
.reset(status[0] | status[6] | buttons[1]),
.reset(status[0] | buttons[1]),
.dip_switch(8'b00001111),
.btn_coin(btn_coin),
.btn_player_start1(~btn_coin),
.btn_player_start2(~btn_coin),
.btn_fire(~m_fire),
.btn_le(~m_left),
.btn_ri(~m_right),
.btn_up(~m_up),
.btn_dw(~m_down),
.btn_coin(m_coin1 | m_coin2),
.btn_player_start1(m_one_player),
.btn_player_start2(m_two_players),
.btn_fire(m_fireA),
.btn_le(m_left),
.btn_ri(m_right),
.btn_up(m_up),
.btn_dw(m_down),
.video_r(r),
.video_g(g),
.video_b(b),
@ -91,8 +94,8 @@ phoenix phoenix(
.audio(audio)
);
mist_video #(.COLOR_DEPTH(2)) mist_video(
.clk_sys(clk_28),
mist_video #(.COLOR_DEPTH(2), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys(clk_22),
.SPI_SCK(SPI_SCK),
.SPI_SS3(SPI_SS3),
.SPI_DI(SPI_DI),
@ -106,18 +109,18 @@ mist_video #(.COLOR_DEPTH(2)) mist_video(
.VGA_B(VGA_B),
.VGA_VS(VGA_VS),
.VGA_HS(VGA_HS),
.ce_divider(0),
.blend(status[5]),
.rotate({1'b1,status[2]}),
.ce_divider(1'b1),
.blend(blend),
.rotate({1'b1,rotate}),
.scandoubler_disable(scandoublerD),
.scanlines(scandoublerD ? 2'b00 : status[4:3]),
.scanlines(scanlines),
.ypbpr(ypbpr)
);
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_28 ),
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
@ -138,48 +141,30 @@ user_io(
dac #(
.C_bits(16))
dac(
.clk_i(clk_28),
.clk_i(clk_sys),
.res_n_i(1),
.dac_i({audio,audio}),
.dac_o(AUDIO_L)
);
// Rotated Normal
wire m_up = ~status[2] ? btn_left | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[2] | joystick_1[2];
wire m_down = ~status[2] ? btn_right | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[3] | joystick_1[3];
wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1];
wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0];
wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5];
reg btn_one_player = 0;
reg btn_two_players = 0;
reg btn_left = 0;
reg btn_right = 0;
reg btn_down = 0;
reg btn_up = 0;
reg btn_fire1 = 0;
reg btn_fire2 = 0;
reg btn_coin = 0;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
always @(posedge clk_28) begin
if(key_strobe) begin
case(key_code)
'h75: btn_up <= key_pressed; // up
'h72: btn_down <= key_pressed; // down
'h6B: btn_left <= key_pressed; // left
'h74: btn_right <= key_pressed; // right
'h76: btn_coin <= key_pressed; // ESC
'h05: btn_one_player <= key_pressed; // F1
'h06: btn_two_players <= key_pressed; // F2
'h29: btn_fire1 <= key_pressed; // Space
'h11: btn_fire2 <= key_pressed; // Alt
endcase
end
end
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs (
.clk ( clk_sys ),
.key_strobe ( key_strobe ),
.key_pressed ( key_pressed ),
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( 2'b11 ),
.joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
endmodule

View File

@ -19,8 +19,6 @@ generic (
);
port(
clk : in std_logic; -- 11 MHz for TV, 25 MHz for VGA
clk_28 : in std_logic;
clk_ay : in std_logic;
reset : in std_logic;
ce_pix : out std_logic;
dip_switch : in std_logic_vector(7 downto 0);
@ -56,6 +54,7 @@ architecture struct of phoenix is
signal hblank_frgrd : std_logic;
signal ce_pix1 : std_logic;
signal cpu_ce : std_logic;
signal cpu_adr : std_logic_vector(15 downto 0);
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
@ -120,12 +119,12 @@ architecture struct of phoenix is
signal mixed : std_logic_vector(11 downto 0) := (others =>'0');
signal sound_string : std_logic_vector(31 downto 0);
signal coin : std_logic;
signal player_start : std_logic_vector(1 downto 0);
signal buttons : std_logic_vector(3 downto 0);
signal R_autofire : std_logic_vector(21 downto 0);
signal psg_cs : std_logic;
signal ay_ena_cnt: std_logic_vector(1 downto 0);
signal ay_ena : std_logic;
signal ay_do : std_logic_vector( 7 downto 0) := (others =>'0');
signal ay_iob_do : std_logic_vector(7 downto 0);
@ -153,7 +152,19 @@ begin
);
reset_n <= not reset;
ce_pix <= ce_pix1;
process(clk,reset)
begin
if reset = '1' then
cpu_ce <= '0';
ay_ena_cnt <= "00";
elsif rising_edge(clk) then
ay_ena_cnt <= ay_ena_cnt + 1;
cpu_ce <= not cpu_ce;
end if;
end process;
ay_ena <= '1' when ay_ena_cnt = "11" else '0';
-- microprocessor 8085
cpu8085 : entity work.T8080se
generic map
@ -164,7 +175,7 @@ generic map
port map(
RESET_n => reset_n,
CLK => clk,
CLKEN => '1', -- fixme: use it to make 5.5 MHz clock average
CLKEN => cpu_ce,
READY => rdy,
HOLD => '1',
INT => '1',
@ -183,8 +194,8 @@ port map(
cpu_di <= prog_do when cpu_adr(14) = '0' else
frgnd_ram_do when cpu_adr(13 downto 10) = 2#00_00# else
bkgnd_ram_do when cpu_adr(13 downto 10) = 2#00_10# else
ay_do when cpu_adr(13 downto 10) = 2#01_00# else
btn_dw & btn_le & btn_ri & btn_up & btn_fire & btn_player_start2 & btn_player_start1 & coin when cpu_adr(13 downto 10) = 2#11_00# else
ay_do when psg_cs = '1' else
not (btn_dw & btn_le & btn_ri & btn_up & btn_fire & btn_player_start2 & btn_player_start1 & btn_coin) when cpu_adr(13 downto 10) = 2#11_00# else
not vblank & dip_switch(6 downto 0) when cpu_adr(13 downto 10) = 2#11_10# else
prog_do;
@ -387,25 +398,27 @@ port map(
-- 1 0 : Write
-- 1 1 : Address
--ay_ioa_di <= not sw2(to_integer(unsigned(ay_iob_do(3 downto 1)))) & "000" & not sw1;
--0x6800-68ff - address write
--0x6900-69ff - data read/write
ay_bdir <= not cpu_wr_n;
ay_bc1 <= not (cpu_wr_n xor cpu_adr(8));
psg_cs <= '1' when cpu_adr(15 downto 9) = "0110100" else '0';
ay_bdir <= '1' when cpu_wr_n = '0' else '0';
ay_bc1 <= '1' when ((cpu_wr_n = '1' and cpu_adr(0) = '0')) else '0';
psg_cs <= '1' when cpu_adr(15 downto 10) = "110100" else '0';--110100000000000
ym2149 : entity work.ym2149 --110100100000000
ym2149 : entity work.ym2149
port map (
-- data bus
I_DA => cpu_do, --: in std_logic_vector(7 downto 0);
O_DA => ay_do, --: out std_logic_vector(7 downto 0);
O_DA_OE_L => open, --: out std_logic;
-- control
I_A9_L => '1', --: in std_logic;
I_A8 => '1', --: in std_logic;
I_A9_L => '0', --: in std_logic;
I_A8 => psg_cs, --: in std_logic;
I_BDIR => ay_bdir, --: in std_logic;
I_BC2 => '1', --: in std_logic;
I_BC1 => ay_bc1, --: in std_logic;
I_SEL_L => '1', --: in std_logic;
-- audio
O_AUDIO => audio, --: out std_logic_vector(7 downto 0);
O_AUDIO => audio, --: out std_logic_vector(7 downto 0);
-- port a
I_IOA => ay_ioa_di, --: in std_logic_vector(7 downto 0);
O_IOA => open, --: out std_logic_vector(7 downto 0);
@ -415,9 +428,9 @@ port map (
O_IOB => ay_iob_do, --: out std_logic_vector(7 downto 0);
O_IOB_OE_L => open, --: out std_logic;
ENA => '1', --: in std_logic; -- clock enable for higher speed operation
RESET_L => '1', --: in std_logic;
CLK => clk_ay
ENA => ay_ena, --: in std_logic; -- clock enable for higher speed operation
RESET_L => not reset, --: in std_logic;
CLK => clk
);
end struct;

View File

@ -14,11 +14,11 @@
-- ************************************************************
-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
--
-- 13.1.0 Build 162 10/23/2013 SJ Web Edition
-- 13.1.4 Build 182 03/12/2014 Patches 4.26 SJ Web Edition
-- ************************************************************
--Copyright (C) 1991-2013 Altera Corporation
--Copyright (C) 1991-2014 Altera Corporation
--Your use of Altera Corporation's design tools, logic functions
--and other software and tools, and its AMPP partner logic
--functions, and any output files from any of the foregoing
@ -46,7 +46,6 @@ ENTITY pll IS
inclk0 : IN STD_LOGIC := '0';
c0 : OUT STD_LOGIC ;
c1 : OUT STD_LOGIC ;
c2 : OUT STD_LOGIC ;
c3 : OUT STD_LOGIC
);
END pll;
@ -59,10 +58,9 @@ ARCHITECTURE SYN OF pll IS
SIGNAL sub_wire2 : STD_LOGIC ;
SIGNAL sub_wire3 : STD_LOGIC ;
SIGNAL sub_wire4 : STD_LOGIC ;
SIGNAL sub_wire5 : STD_LOGIC ;
SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0);
SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0);
SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0);
SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0);
@ -77,10 +75,6 @@ ARCHITECTURE SYN OF pll IS
clk1_duty_cycle : NATURAL;
clk1_multiply_by : NATURAL;
clk1_phase_shift : STRING;
clk2_divide_by : NATURAL;
clk2_duty_cycle : NATURAL;
clk2_multiply_by : NATURAL;
clk2_phase_shift : STRING;
clk3_divide_by : NATURAL;
clk3_duty_cycle : NATURAL;
clk3_multiply_by : NATURAL;
@ -143,18 +137,16 @@ ARCHITECTURE SYN OF pll IS
END COMPONENT;
BEGIN
sub_wire7_bv(0 DOWNTO 0) <= "0";
sub_wire7 <= To_stdlogicvector(sub_wire7_bv);
sub_wire4 <= sub_wire0(2);
sub_wire6_bv(0 DOWNTO 0) <= "0";
sub_wire6 <= To_stdlogicvector(sub_wire6_bv);
sub_wire3 <= sub_wire0(0);
sub_wire2 <= sub_wire0(3);
sub_wire1 <= sub_wire0(1);
c1 <= sub_wire1;
c3 <= sub_wire2;
c0 <= sub_wire3;
c2 <= sub_wire4;
sub_wire5 <= inclk0;
sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5;
sub_wire4 <= inclk0;
sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4;
altpll_component : altpll
GENERIC MAP (
@ -163,14 +155,10 @@ BEGIN
clk0_duty_cycle => 50,
clk0_multiply_by => 57,
clk0_phase_shift => "0",
clk1_divide_by => 55,
clk1_divide_by => 70,
clk1_duty_cycle => 50,
clk1_multiply_by => 57,
clk1_phase_shift => "0",
clk2_divide_by => 560,
clk2_duty_cycle => 50,
clk2_multiply_by => 57,
clk2_phase_shift => "0",
clk3_divide_by => 35,
clk3_duty_cycle => 50,
clk3_multiply_by => 57,
@ -209,7 +197,7 @@ BEGIN
port_scanwrite => "PORT_UNUSED",
port_clk0 => "PORT_USED",
port_clk1 => "PORT_USED",
port_clk2 => "PORT_USED",
port_clk2 => "PORT_UNUSED",
port_clk3 => "PORT_USED",
port_clk4 => "PORT_UNUSED",
port_clk5 => "PORT_UNUSED",
@ -227,7 +215,7 @@ BEGIN
)
PORT MAP (
areset => areset,
inclk => sub_wire6,
inclk => sub_wire5,
clk => sub_wire0
);
@ -255,16 +243,13 @@ END SYN;
-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0"
-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8"
-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "140"
-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "55"
-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "560"
-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "70"
-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "35"
-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "10.992857"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "27.981817"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "2.748214"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "21.985714"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "43.971428"
-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
@ -287,40 +272,32 @@ END SYN;
-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0"
-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg"
-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps"
-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps"
-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 STRING "ps"
-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any"
-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0"
-- Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0"
-- Retrieval info: PRIVATE: MIRROR_CLK3 STRING "0"
-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "57"
-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "57"
-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "57"
-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "57"
-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "11.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "28.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "2.75000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "44.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT3 STRING "MHz"
-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1"
-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0"
-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000"
-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000"
-- Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000"
-- Retrieval info: PRIVATE: PHASE_SHIFT3 STRING "0.00000000"
-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0"
-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg"
-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg"
-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg"
-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 STRING "deg"
-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1"
@ -345,18 +322,15 @@ END SYN;
-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0"
-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1"
-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1"
-- Retrieval info: PRIVATE: STICKY_CLK2 STRING "1"
-- Retrieval info: PRIVATE: STICKY_CLK3 STRING "1"
-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1"
-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
-- Retrieval info: PRIVATE: USE_CLK0 STRING "1"
-- Retrieval info: PRIVATE: USE_CLK1 STRING "1"
-- Retrieval info: PRIVATE: USE_CLK2 STRING "1"
-- Retrieval info: PRIVATE: USE_CLK3 STRING "1"
-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
-- Retrieval info: PRIVATE: USE_CLKENA2 STRING "0"
-- Retrieval info: PRIVATE: USE_CLKENA3 STRING "0"
-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0"
-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
@ -366,14 +340,10 @@ END SYN;
-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "57"
-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "55"
-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "70"
-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "57"
-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "560"
-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "57"
-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "35"
-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "57"
@ -411,7 +381,7 @@ END SYN;
-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED"
@ -431,7 +401,6 @@ END SYN;
-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset"
-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
-- Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2"
-- Retrieval info: USED_PORT: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3"
-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0
@ -439,7 +408,6 @@ END SYN;
-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1
-- Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2
-- Retrieval info: CONNECT: c3 0 0 0 0 @clk 0 0 1 3
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE