Project

General

Profile

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use ieee.std_logic_textio.all;

library std_developerskit ; -- used for to_string
-- use std_developerskit.std_iopak.all;

entity atari800xl_tb is
end;

architecture rtl of atari800xl_tb is

constant CLK_A_PERIOD : time := 1 us / (1.79*32);

signal reset_n : std_logic;
signal clk_a : std_logic;

-- VIDEO OUT - PAL/NTSC, original Atari timings approx (may be higher res)
SIGNAL VIDEO_VS : STD_LOGIC;
SIGNAL VIDEO_HS : STD_LOGIC;
SIGNAL VIDEO_CS : STD_LOGIC;
SIGNAL VIDEO_COLOUR : STD_LOGIC_VECTOR(7 DOWNTO 0);
-- These ones are probably only needed for e.g. svideo
SIGNAL VIDEO_BLANK : std_logic;
SIGNAL VIDEO_BURST : std_logic;
SIGNAL VIDEO_START_OF_FIELD : std_logic;
SIGNAL VIDEO_ODD_LINE : std_logic;

-- AUDIO - Pokey/GTIA 1-bit and Covox all mixed
-- TODO - choose stereo/mono pokey
SIGNAL AUDIO_L : std_logic_vector(15 downto 0);
SIGNAL AUDIO_R : std_logic_vector(15 downto 0);

-- JOYSTICK
SIGNAL JOY1_n : std_logic_vector(4 downto 0); -- FRLDU, 0=pressed
SIGNAL JOY2_n : std_logic_vector(4 downto 0); -- FRLDU, 0=pressed

-- Pokey keyboard matrix
-- Standard component available to connect this to PS2
SIGNAL KEYBOARD_RESPONSE : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL KEYBOARD_SCAN : STD_LOGIC_VECTOR(5 DOWNTO 0);

-- SIO
SIGNAL SIO_COMMAND : std_logic;
SIGNAL SIO_RXD : std_logic;
SIGNAL SIO_TXD : std_logic;

-- PIA
SIGNAL CA1_IN : STD_LOGIC;
SIGNAL CB1_IN: STD_LOGIC;
SIGNAL CA2_OUT : STD_LOGIC;
SIGNAL CA2_DIR_OUT: STD_LOGIC;
SIGNAL CB2_OUT : STD_LOGIC;
SIGNAL CB2_DIR_OUT: STD_LOGIC;
SIGNAL CA2_IN: STD_LOGIC;
SIGNAL CB2_IN: STD_LOGIC;
SIGNAL PORTA_IN : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL PORTA_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL PORTA_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL PORTB_IN : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL PORTB_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
--SIGNAL PORTB_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
-- GTIA
signal GTIA_TRIG : std_logic_vector(3 downto 0);
-- ANTIC
signal ANTIC_LIGHTPEN : std_logic;
-- CARTRIDGE ACCESS
SIGNAL CART_RD4 : STD_LOGIC;
SIGNAL CART_RD5 : STD_LOGIC;
-- PBI
SIGNAL PBI_WRITE_DATA : std_logic_vector(31 downto 0);
-- INTERNAL ROM/RAM
SIGNAL RAM_ADDR : STD_LOGIC_VECTOR(18 DOWNTO 0);
SIGNAL RAM_DO : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL RAM_REQUEST : STD_LOGIC;
SIGNAL RAM_REQUEST_COMPLETE : STD_LOGIC;
SIGNAL RAM_WRITE_ENABLE : STD_LOGIC;
SIGNAL ROM_ADDR : STD_LOGIC_VECTOR(21 DOWNTO 0);
SIGNAL ROM_DO : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ROM_REQUEST : STD_LOGIC;
SIGNAL ROM_REQUEST_COMPLETE : STD_LOGIC;
-- CONFIG
SIGNAL ROM_IN_RAM : STD_LOGIC;

-- POTS
SIGNAL POT_RESET : STD_LOGIC;
SIGNAL POT_IN : STD_LOGIC_VECTOR(7 downto 0);

SIGNAL CONSOL_OPTION : STD_LOGIC;
SIGNAL CONSOL_SELECT : STD_LOGIC;
SIGNAL CONSOL_START: STD_LOGIC;

begin
p_clk_gen_a : process
begin
clk_a <= '1';
wait for CLK_A_PERIOD/2;
clk_a <= '0';
wait for CLK_A_PERIOD - (CLK_A_PERIOD/2 );
end process;

reset_n <= '0', '1' after 1000ns;

JOY1_N <= (others=>'1');
JOY2_N <= (others=>'1');
KEYBOARD_RESPONSE <= "11";
CONSOL_OPTION <= '1';
CONSOL_SELECT <= '1';
CONSOL_OPTION <= '1';

-- 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);
PORTB_IN <= PORTB_OUT;

-- ANTIC lightpen
ANTIC_LIGHTPEN <= JOY2_n(4) and JOY1_n(4);

-- GTIA triggers
GTIA_TRIG <= "11"&JOY2_n(4)&JOY1_n(4);

-- Cartridge not inserted
CART_RD4 <= '0';
CART_RD5 <= '0';

POT_IN(7 downto 4) <= (others=>'0');

atari800xlinst : entity work.atari800xl
PORT MAP
(
CLK => CLK_A,
RESET_N => RESET_N,

VIDEO_VS => VIDEO_VS,
VIDEO_HS => VIDEO_HS,
VIDEO_CS => VIDEO_CS,
COLOUR => VIDEO_COLOUR,
VIDEO_BLANK => VIDEO_BLANK,
VIDEO_BURST => VIDEO_BURST,
VIDEO_START_OF_FIELD => VIDEO_START_OF_FIELD,
VIDEO_ODD_LINE => VIDEO_ODD_LINE,

AUDIO_L => AUDIO_L,
AUDIO_R => AUDIO_R,
SIO_AUDIO => "00000000",

CA1_IN => CA1_IN,
CB1_IN => CB1_IN,
CA2_IN => CA2_IN,
CA2_OUT => CA2_OUT,
CA2_DIR_OUT => CA2_DIR_OUT,
CB2_IN => CB2_IN,
CB2_OUT => CB2_OUT,
CB2_DIR_OUT => CB2_DIR_OUT,
PORTA_IN => PORTA_IN,
PORTA_DIR_OUT => PORTA_DIR_OUT,
PORTA_OUT => PORTA_OUT,
PORTB_IN => PORTB_IN,
PORTB_DIR_OUT => open,--PORTB_DIR_OUT,
PORTB_OUT => PORTB_OUT,

KEYBOARD_RESPONSE => KEYBOARD_RESPONSE,
KEYBOARD_SCAN => KEYBOARD_SCAN,

POT_IN => POT_IN,
POT_RESET => POT_RESET,
-- PBI
CART_RD4 => CART_RD4,
CART_RD5 => CART_RD5,
CART_S4_n => open,
CART_S5_N => open,
CART_CCTL_N => open,

PBI_MPD_N => '1',
PBI_REF_N_IN => '1',
PBI_EXTSEL_N => '1',

SIO_RXD => SIO_RXD,
SIO_TXD => SIO_TXD,

CONSOL_OPTION => CONSOL_OPTION,
CONSOL_SELECT => CONSOL_SELECT,
CONSOL_START=> CONSOL_START,
GTIA_TRIG => GTIA_TRIG,
ANTIC_LIGHTPEN => ANTIC_LIGHTPEN,
ANTIC_REFRESH => open
);

end rtl;
    (1-1/1)