Revision 359
Added by markw over 10 years ago
common/a8core/atari800core.vhd | ||
---|---|---|
-- SIO
|
||
SIO_RXD : in std_logic;
|
||
SIO_TXD : out std_logic;
|
||
SIO_CLOCKIN : in std_logic :='1';
|
||
SIO_CLOCKOUT : out std_logic;
|
||
-- SIO_COMMAND_TX - see PIA PB2
|
||
-- TODO CLOCK IN/CLOCK OUT (unused almost everywhere...)
|
||
|
||
... | ... | |
SIO_IN1 => SIO_RXD,
|
||
SIO_IN2 => '1',
|
||
SIO_IN3 => '1',
|
||
SIO_CLOCKIN => SIO_CLOCKIN,
|
||
ADDR => PBI_ADDR_INT(3 DOWNTO 0),
|
||
DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
keyboard_response => KEYBOARD_RESPONSE,
|
||
... | ... | |
SIO_OUT1 => SIO_TXD,
|
||
SIO_OUT2 => open,
|
||
SIO_OUT3 => open,
|
||
SIO_CLOCKOUT => SIO_CLOCKOUT,
|
||
POT_RESET => POT_RESET,
|
||
CHANNEL_0_OUT => POKEY1_CHANNEL0,
|
||
CHANNEL_1_OUT => POKEY1_CHANNEL1,
|
common/a8core/pokey.vhdl | ||
---|---|---|
SIO_OUT2 : OUT std_logic;
|
||
SIO_OUT3 : OUT std_logic;
|
||
|
||
SIO_CLOCK : INOUT std_logic; -- TODO, should not use internally
|
||
SIO_CLOCKIN : IN std_logic := '1';
|
||
SIO_CLOCKOUT : OUT std_logic;
|
||
|
||
POT_RESET : out std_logic
|
||
);
|
||
... | ... | |
end process;
|
||
|
||
-- serial clocks
|
||
process(sio_clock,skctl_reg,clock_reg,clock_sync_reg,audf1_pulse,audf2_pulse,audf3_pulse)
|
||
process(sio_clockin,skctl_reg,clock_reg,clock_sync_reg,audf1_pulse,audf2_pulse,audf3_pulse)
|
||
begin
|
||
clock_next <= sio_clock;
|
||
clock_next <= sio_clockin;
|
||
clock_sync_next <= clock_reg;
|
||
|
||
serout_enable <= '0';
|
||
... | ... | |
sio_out2 <= sio_out_reg;
|
||
sio_out3 <= sio_out_reg;
|
||
|
||
sio_clock <= audf3_pulse when clock_input='0' else 'Z';
|
||
sio_clockout <= audf3_pulse when clock_input='0' else 'Z';
|
||
|
||
pot_reset <= pot_reset_reg;
|
||
|
de1/atari800core_de1.vhd | ||
---|---|---|
|
||
SIGNAL GPIO_SIO_RXD : std_logic;
|
||
|
||
SIGNAL SIO_CLOCKOUT : std_logic;
|
||
SIGNAL SIO_CLOCKIN : std_logic;
|
||
|
||
-- VIDEO
|
||
signal VGA_VS_RAW : std_logic;
|
||
signal VGA_HS_RAW : std_logic;
|
||
... | ... | |
);
|
||
|
||
-- PIA mapping
|
||
CA1_IN <= '1';
|
||
CB1_IN <= '1';
|
||
CA2_IN <= CA2_OUT when CA2_DIR_OUT='1' else '1';
|
||
CB2_IN <= CB2_OUT when CB2_DIR_OUT='1' else '1';
|
||
SIO_COMMAND <= CB2_OUT;
|
||
--PORTA_IN <= ((JOY2_n(3)&JOY2_n(2)&JOY2_n(1)&JOY2_n(0)&JOY1_n(3)&JOY1_n(2)&JOY1_n(1)&JOY1_n(0)) and not (porta_dir_out)) or (porta_dir_out and porta_out);
|
||
--PORTA_IN <= (not (porta_dir_out)) or (porta_dir_out and porta_out);
|
||
... | ... | |
SIO_IN => GPIO_SIO_RXD,
|
||
SIO_OUT => SIO_TXD
|
||
);
|
||
|
||
CA1_IN <= '1';
|
||
CB1_IN <= '1';
|
||
CA2_IN <= CA2_OUT when CA2_DIR_OUT='1' else '1';
|
||
CB2_IN <= CB2_OUT when CB2_DIR_OUT='1' else '1';
|
||
end generate gen_old_gpio;
|
||
|
||
gen_new_gpio : if gpio=2 generate
|
||
... | ... | |
trig_in => TRIGGERS,
|
||
CA2_DIR_OUT => CA2_DIR_OUT,
|
||
CA2_OUT => CA2_OUT,
|
||
CA2_IN => open,
|
||
CA2_IN => CA2_IN,
|
||
CB2_DIR_OUT => CB2_DIR_OUT,
|
||
CB2_OUT => CB2_OUT,
|
||
CB2_IN => open,
|
||
CB2_IN => CB2_IN,
|
||
SIO_IN => GPIO_SIO_RXD,
|
||
SIO_OUT => SIO_TXD
|
||
SIO_OUT => SIO_TXD,
|
||
SIO_CLOCKIN => SIO_CLOCKIN,
|
||
SIO_CLOCKOUT => SIO_CLOCKOUT
|
||
);
|
||
end generate gen_new_gpio;
|
||
|
||
... | ... | |
|
||
zpu_sio_command <= SIO_COMMAND;
|
||
zpu_sio_rxd <= SIO_TXD;
|
||
SIO_RXD <= zpu_sio_txd and UART_RXD;
|
||
SIO_RXD <= zpu_sio_txd and UART_RXD and GPIO_SIO_RXD;
|
||
|
||
-- VIDEO
|
||
--VGA_HS <= not(VGA_HS_RAW xor VGA_VS_RAW);
|
||
... | ... | |
SIO_RXD => SIO_RXD,
|
||
SIO_TXD => SIO_TXD,
|
||
|
||
SIO_CLOCKIN => SIO_CLOCKIN,
|
||
SIO_CLOCKOUT => SIO_CLOCKOUT,
|
||
|
||
CONSOL_OPTION => CONSOL_OPTION,
|
||
CONSOL_SELECT => CONSOL_SELECT,
|
||
CONSOL_START=> CONSOL_START,
|
de1/gpiov2.vhd | ||
---|---|---|
porta_in : out std_logic_vector(7 downto 0);
|
||
porta_out : in std_logic_vector(7 downto 0);
|
||
porta_output : in std_logic_vector(7 downto 0);
|
||
CA1_IN : OUT STD_LOGIC;
|
||
CA2_DIR_OUT : IN std_logic;
|
||
CA2_OUT : IN std_logic;
|
||
CA2_IN : OUT STD_LOGIC;
|
||
CB1_IN : OUT STD_LOGIC;
|
||
CB2_DIR_OUT : IN std_logic;
|
||
CB2_OUT : IN std_logic;
|
||
CB2_IN : OUT STD_LOGIC;
|
||
... | ... | |
keyboard_response : out std_logic_vector(1 downto 0);
|
||
SIO_IN : OUT STD_LOGIC;
|
||
SIO_OUT : IN STD_LOGIC;
|
||
SIO_CLOCKIN : OUT STD_LOGIC;
|
||
SIO_CLOCKOUT : IN STD_LOGIC;
|
||
|
||
-- cartridge
|
||
enable_179_early : in std_logic;
|
||
... | ... | |
begin
|
||
-- OUTPUTS TO GPIO
|
||
-- unused
|
||
GPIO_0_DIR_OUT(35 downto 4) <= (others=>'0');
|
||
GPIO_0_OUT(35 downto 4) <= (others=>'0');
|
||
--GPIO_0_DIR_OUT(35 downto 4) <= (others=>'0');
|
||
GPIO_0_OUT(35 downto 0) <= (others=>'0');
|
||
|
||
-- sio
|
||
GPIO_0_DIR_OUT(0) <= CA2_dir_out;
|
||
GPIO_0_OUT(0) <= CA2_out;
|
||
GPIO_0_DIR_OUT(1) <= CB2_dir_out;
|
||
GPIO_0_OUT(1) <= CB2_out;
|
||
GPIO_0_DIR_OUT(2) <= '1';
|
||
GPIO_0_OUT(2) <= SIO_OUT;
|
||
GPIO_0_DIR_OUT(3) <= '0';
|
||
GPIO_0_OUT(3) <= '0';
|
||
--CB1=SIO_IRQ
|
||
--CB2=SIO_COMMAND
|
||
--CA1=SIO_PROCEED
|
||
--CA2=SIO_MOTOR_RAW
|
||
|
||
GPIO_0_DIR_OUT(0) <= '0';
|
||
GPIO_0_DIR_OUT(1) <= CB2_dir_out and not(CB2_OUT) and gpio_enable;
|
||
GPIO_0_DIR_OUT(2) <= '0';
|
||
GPIO_0_DIR_OUT(3) <= CA2_dir_out and not(CA2_OUT) and gpio_enable;
|
||
GPIO_0_DIR_OUT(4) <= not(SIO_OUT) and gpio_enable;
|
||
GPIO_0_DIR_OUT(5) <= '0';
|
||
GPIO_0_DIR_OUT(6) <= not(SIO_CLOCKOUT) and gpio_enable;
|
||
GPIO_0_DIR_OUT(7) <= '0';
|
||
|
||
GPIO_0_DIR_OUT(4) <= 'Z';
|
||
GPIO_0_OUT(4) <= '0'; -- zpu output for logic analyzer
|
||
|
||
CA2_in <= GPIO_0_IN(0);
|
||
CB1_in <= GPIO_0_IN(0);
|
||
CB2_in <= GPIO_0_IN(1);
|
||
SIO_IN <= GPIO_0_IN(3);
|
||
CA1_in <= GPIO_0_IN(2);
|
||
CA2_in <= GPIO_0_IN(3);
|
||
SIO_IN <= GPIO_0_IN(5);
|
||
SIO_CLOCKIN <= GPIO_0_IN(7);
|
||
|
||
-- sticks
|
||
--GPIO_0_OUT(35 downto 19) <= (others=>'0');
|
||
--GPIO_0_DIR_OUT(35) <= '0'; -- trig 0
|
||
--GPIO_0_DIR_OUT(34) <= gpio_enable and porta_output(0) and not(porta_out(0)); -- stick 0
|
||
--GPIO_0_DIR_OUT(33) <= '0';
|
||
--GPIO_0_DIR_OUT(32) <= gpio_enable and porta_output(1) and not(porta_out(1)); -- stick 0
|
||
--GPIO_0_DIR_OUT(31) <= '0';
|
||
--GPIO_0_DIR_OUT(30) <= gpio_enable and porta_output(2) and not(porta_out(2)); -- stick 0
|
||
--GPIO_0_DIR_OUT(29) <= gpio_enable and pot_reset;
|
||
--GPIO_0_DIR_OUT(28) <= gpio_enable and porta_output(3) and not(porta_out(3)); -- stick 0
|
||
--GPIO_0_DIR_OUT(27) <= gpio_enable and pot_reset;
|
||
--GPIO_0_DIR_OUT(26) <= gpio_enable and pot_reset;
|
||
--GPIO_0_DIR_OUT(25) <= '0'; -- trig 1
|
||
--GPIO_0_DIR_OUT(24) <= gpio_enable and porta_output(4) and not(porta_out(4)); -- stick 1
|
||
--GPIO_0_DIR_OUT(23) <= gpio_enable and porta_output(7) and not(porta_out(7)); -- stick 1
|
||
--GPIO_0_DIR_OUT(22) <= gpio_enable and porta_output(5) and not(porta_out(5)); -- stick 1
|
||
--GPIO_0_DIR_OUT(21) <= gpio_enable and pot_reset;
|
||
--GPIO_0_DIR_OUT(20) <= gpio_enable and porta_output(6) and not(porta_out(6)); -- stick 1
|
||
--GPIO_0_DIR_OUT(19 downto 8) <= (others=>'0');
|
||
-- PORTA7,6,5,4,TRIG1,POT3,2,1,0,PORTA3,2,1,0,TRIG0
|
||
GPIO_0_DIR_OUT(8) <= gpio_enable and porta_output(7) and not(porta_out(7)); -- stick
|
||
GPIO_0_DIR_OUT(9) <= gpio_enable and porta_output(6) and not(porta_out(6)); -- stick
|
||
GPIO_0_DIR_OUT(10) <= gpio_enable and porta_output(5) and not(porta_out(5)); -- stick
|
||
GPIO_0_DIR_OUT(11) <= gpio_enable and porta_output(4) and not(porta_out(4)); -- stick
|
||
GPIO_0_DIR_OUT(17) <= gpio_enable and porta_output(3) and not(porta_out(3)); -- stick
|
||
GPIO_0_DIR_OUT(18) <= gpio_enable and porta_output(2) and not(porta_out(2)); -- stick
|
||
GPIO_0_DIR_OUT(19) <= gpio_enable and porta_output(1) and not(porta_out(1)); -- stick
|
||
GPIO_0_DIR_OUT(20) <= gpio_enable and porta_output(0) and not(porta_out(0)); -- stick
|
||
|
||
GPIO_0_DIR_OUT(12) <= '0'; -- trig
|
||
GPIO_0_DIR_OUT(21) <= '0'; -- trig
|
||
|
||
GPIO_0_DIR_OUT(13) <= gpio_enable and pot_reset;
|
||
GPIO_0_DIR_OUT(14) <= gpio_enable and pot_reset;
|
||
GPIO_0_DIR_OUT(15) <= gpio_enable and pot_reset;
|
||
GPIO_0_DIR_OUT(16) <= gpio_enable and pot_reset;
|
||
|
||
-- ext
|
||
GPIO_0_DIR_OUT(22) <= '0';
|
||
GPIO_0_DIR_OUT(23) <= '0';
|
||
GPIO_0_DIR_OUT(24) <= '0';
|
||
GPIO_0_DIR_OUT(25) <= '0';
|
||
GPIO_0_DIR_OUT(26) <= '0';
|
||
GPIO_0_DIR_OUT(27) <= '0';
|
||
|
||
-- keyboard
|
||
--GPIO_0_OUT(7 downto 0) <= (others=>'0');
|
||
--GPIO_0_DIR_OUT(7) <= '0'; -- keyboard response 2
|
||
--GPIO_0_DIR_OUT(6) <= '0'; -- keyboard response 1
|
||
--GPIO_0_DIR_OUT(5) <= gpio_enable and not(keyboard_scan(5)); -- keyboard scan 5
|
||
--GPIO_0_DIR_OUT(4) <= gpio_enable and not(keyboard_scan(4)); -- keyboard scan 4
|
||
--GPIO_0_DIR_OUT(3) <= gpio_enable and not(keyboard_scan(3)); -- keyboard scan 3
|
||
--GPIO_0_DIR_OUT(2) <= gpio_enable and not(keyboard_scan(2)); -- keyboard scan 2
|
||
--GPIO_0_DIR_OUT(1) <= gpio_enable and not(keyboard_scan(1)); -- keyboard scan 1
|
||
--GPIO_0_DIR_OUT(0) <= gpio_enable and not(keyboard_scan(0)); -- keyboard scan 0
|
||
GPIO_0_DIR_OUT(28) <= gpio_enable and not(keyboard_scan(2)); -- keyboard scan 2
|
||
GPIO_0_DIR_OUT(29) <= gpio_enable and not(keyboard_scan(1)); -- keyboard scan 1
|
||
GPIO_0_DIR_OUT(30) <= gpio_enable and not(keyboard_scan(0)); -- keyboard scan 0
|
||
GPIO_0_DIR_OUT(31) <= '0'; -- keyboard response 1
|
||
GPIO_0_DIR_OUT(32) <= gpio_enable and not(keyboard_scan(5)); -- keyboard scan 5
|
||
GPIO_0_DIR_OUT(33) <= gpio_enable and not(keyboard_scan(4)); -- keyboard scan 4
|
||
GPIO_0_DIR_OUT(34) <= gpio_enable and not(keyboard_scan(3)); -- keyboard scan 3
|
||
GPIO_0_DIR_OUT(35) <= '0'; -- keyboard response 2
|
||
|
||
-- cart
|
||
GPIO_1_DIR_OUT(0) <= gpio_enable and bus_control_oe; -- cart control
|
||
... | ... | |
|
||
-- INPUTS FROM GPIO
|
||
-- sticks
|
||
-- pot_in_async <=
|
||
-- gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable and
|
||
-- ("0000"&
|
||
-- GPIO_1_IN(27)&GPIO_1_IN(21)& -- 32/24
|
||
-- GPIO_1_IN(26)&GPIO_1_IN(29)); -- 31/34
|
||
-- pot_in0_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(0), sync=>pot_in(0));
|
||
-- pot_in1_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(1), sync=>pot_in(1));
|
||
-- pot_in2_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(2), sync=>pot_in(2));
|
||
-- pot_in3_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(3), sync=>pot_in(3));
|
||
-- pot_in4_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(4), sync=>pot_in(4));
|
||
-- pot_in5_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(5), sync=>pot_in(5));
|
||
-- pot_in6_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(6), sync=>pot_in(6));
|
||
-- pot_in7_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>pot_in_async(7), sync=>pot_in(7));
|
||
pot_in(7 downto 0) <= (others=>'0');
|
||
pot_in_async <=
|
||
gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable&gpio_enable and
|
||
("0000"&
|
||
GPIO_0_IN(13)&GPIO_0_IN(14)&
|
||
GPIO_0_IN(15)&GPIO_0_IN(16));
|
||
pot_in0_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(0), sync=>pot_in(0));
|
||
pot_in1_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(1), sync=>pot_in(1));
|
||
pot_in2_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(2), sync=>pot_in(2));
|
||
pot_in3_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(3), sync=>pot_in(3));
|
||
pot_in4_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(4), sync=>pot_in(4));
|
||
pot_in5_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(5), sync=>pot_in(5));
|
||
pot_in6_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(6), sync=>pot_in(6));
|
||
pot_in7_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>pot_in_async(7), sync=>pot_in(7));
|
||
porta_in_async <=
|
||
GPIO_0_IN(8)&GPIO_0_IN(9)&GPIO_0_IN(10)&GPIO_0_IN(11)&
|
||
GPIO_0_IN(17)&GPIO_0_IN(18)&GPIO_0_IN(19)&GPIO_0_IN(20);
|
||
porta_in0_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(0), sync=>porta_in_gpio(0));
|
||
porta_in1_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(1), sync=>porta_in_gpio(1));
|
||
porta_in2_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(2), sync=>porta_in_gpio(2));
|
||
porta_in3_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(3), sync=>porta_in_gpio(3));
|
||
porta_in4_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(4), sync=>porta_in_gpio(4));
|
||
porta_in5_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(5), sync=>porta_in_gpio(5));
|
||
porta_in6_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(6), sync=>porta_in_gpio(6));
|
||
porta_in7_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>porta_in_async(7), sync=>porta_in_gpio(7));
|
||
|
||
-- porta_in_async <=
|
||
-- GPIO_1_IN(23)&GPIO_1_IN(20)&GPIO_1_IN(22)&GPIO_1_IN(24)& -- 27/25/23/26
|
||
-- GPIO_1_IN(28)&GPIO_1_IN(30)&GPIO_1_IN(32)&GPIO_1_IN(34); -- 39/37/35/33
|
||
-- porta_in0_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(0), sync=>porta_in_gpio(0));
|
||
-- porta_in1_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(1), sync=>porta_in_gpio(1));
|
||
-- porta_in2_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(2), sync=>porta_in_gpio(2));
|
||
-- porta_in3_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(3), sync=>porta_in_gpio(3));
|
||
-- porta_in4_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(4), sync=>porta_in_gpio(4));
|
||
-- porta_in5_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(5), sync=>porta_in_gpio(5));
|
||
-- porta_in6_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(6), sync=>porta_in_gpio(6));
|
||
-- porta_in7_synchronizer : synchronizer
|
||
-- port map (clk=>clk, raw=>porta_in_async(7), sync=>porta_in_gpio(7));
|
||
--
|
||
-- porta_in(7 downto 4) <= porta_in_gpio(7 downto 4);
|
||
-- porta_in(3 downto 0) <= porta_in_gpio(3 downto 0);
|
||
porta_in(7 downto 0) <= (others=>'1');
|
||
porta_in(7 downto 0) <= porta_in_gpio(7 downto 0);
|
||
|
||
-- trig_in_async <= (not(gpio_enable&gpio_enable&"11") or (rd5_async&"1"&GPIO_1_IN(25)&GPIO_1_IN(35))); -- 28/40
|
||
trig_in_async <= (not(gpio_enable&gpio_enable&"11") or (rd5_async&"111"));
|
||
trig_in_async <= (not(gpio_enable&gpio_enable&"11") or (rd5_async&"1"&GPIO_0_IN(12)&GPIO_0_IN(21)));
|
||
trig_in0_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>trig_in_async(0), sync=>trig_in_sync(0));
|
||
trig_in1_synchronizer : synchronizer
|
||
... | ... | |
lightpen <= trig_in_sync(0) and trig_in_sync(1); -- either joystick button
|
||
|
||
-- keyboard
|
||
--keyboard_response_async <= not(gpio_enable&gpio_enable) or (GPIO_1_IN(7)& GPIO_1_IN(6));
|
||
keyboard_response_async <= "11";
|
||
keyboard_response_async <= not(gpio_enable&gpio_enable) or (GPIO_0_IN(35)& GPIO_0_IN(31));
|
||
keyboard_response1_synchronizer : synchronizer
|
||
port map (clk=>clk, raw=>keyboard_response_async(0), sync=>keyboard_response_gpio(0));
|
||
keyboard_response2_synchronizer : synchronizer
|
Also available in: Unified diff
Add breakout board support. Pass clockin/clockout to pokey (untested).