Project

General

Profile

---------------------------------------------------------------------------
-- (c) 2013 mark watson
-- I am happy for anyone to use this for non-commercial use.
-- If my vhdl files are used commercially or otherwise sold,
-- please contact me for explicit permission at scrameta (gmail).
-- This applies for source and binary form and derived works.
---------------------------------------------------------------------------

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;

LIBRARY work;

ENTITY atari800core_de1 IS
GENERIC
(
TV : integer; -- 1 = PAL, 0=NTSC
GPIO : integer -- 1 = OLD GPIO LAYOUT, 2=NEW GPIO LAYOUT (WIP)
);
PORT
(
CLOCK_50 : IN STD_LOGIC;
CLOCK_27 : IN STD_LOGIC_VECTOR(1 downto 0);

AUD_BCLK : IN STD_LOGIC;
AUD_DACLRCK : IN STD_LOGIC;
I2C_SCLK : INOUT STD_LOGIC;
I2C_SDAT : INOUT STD_LOGIC;

PS2_CLK : IN STD_LOGIC;
PS2_DAT : IN STD_LOGIC;

UART_RXD : IN STD_LOGIC;
UART_TXD : OUT STD_LOGIC;

GPIO_0 : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0);
GPIO_1 : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0);

KEY : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
SW : IN STD_LOGIC_VECTOR(9 DOWNTO 0);

AUD_XCK : OUT STD_LOGIC;
AUD_DACDAT : OUT STD_LOGIC;

FL_OE_N : OUT STD_LOGIC;
FL_WE_N : OUT STD_LOGIC;
FL_RST_N : OUT STD_LOGIC;
FL_ADDR : OUT STD_LOGIC_VECTOR(21 DOWNTO 0);
FL_DQ : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

SRAM_CE_N : OUT STD_LOGIC;
SRAM_OE_N : OUT STD_LOGIC;
SRAM_WE_N : OUT STD_LOGIC;
SRAM_LB_N : OUT STD_LOGIC;
SRAM_UB_N : OUT STD_LOGIC;
SRAM_ADDR : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);
SRAM_DQ : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);

DRAM_BA_0 : OUT STD_LOGIC;
DRAM_BA_1 : OUT STD_LOGIC;
DRAM_CS_N : OUT STD_LOGIC;
DRAM_RAS_N : OUT STD_LOGIC;
DRAM_CAS_N : OUT STD_LOGIC;
DRAM_WE_N : OUT STD_LOGIC;
DRAM_LDQM : OUT STD_LOGIC;
DRAM_UDQM : OUT STD_LOGIC;
DRAM_CLK : OUT STD_LOGIC;
DRAM_CKE : OUT STD_LOGIC;
DRAM_ADDR : OUT STD_LOGIC_VECTOR(11 DOWNTO 0);
DRAM_DQ : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);

SD_CLK : OUT STD_LOGIC;
SD_CMD : OUT STD_LOGIC;
SD_THREE : OUT STD_LOGIC;
SD_DATA : IN STD_LOGIC;

HEX0 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HEX1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HEX2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HEX3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);

LEDG : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
LEDR : OUT STD_LOGIC_VECTOR(9 DOWNTO 0);

VGA_VS : OUT STD_LOGIC;
VGA_HS : OUT STD_LOGIC;
VGA_B : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
VGA_G : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
VGA_R : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END atari800core_de1;

ARCHITECTURE vhdl OF atari800core_de1 IS
-- SYSTEM
SIGNAL CLK : STD_LOGIC;
SIGNAL CLK_SDRAM : STD_LOGIC;
SIGNAL RESET_N : STD_LOGIC;
signal SDRAM_RESET_N : std_logic;
SIGNAL PLL_LOCKED : 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;
SIGNAL CART_S4_n : STD_LOGIC;
SIGNAL CART_S5_n : STD_LOGIC;
SIGNAL CART_CCTL_n : STD_LOGIC;
-- PBI
SIGNAL PBI_WRITE_DATA : std_logic_vector(31 downto 0);
SIGNAL PBI_WIDTH_32BIT_ACCESS : std_logic;
SIGNAL PBI_WIDTH_16BIT_ACCESS : std_logic;
SIGNAL PBI_WIDTH_8BIT_ACCESS : std_logic;
-- 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;

-- SDRAM
signal SDRAM_REQUEST : std_logic;
signal SDRAM_REQUEST_COMPLETE : std_logic;
signal SDRAM_READ_ENABLE : STD_LOGIC;
signal SDRAM_WRITE_ENABLE : std_logic;
signal SDRAM_ADDR : STD_LOGIC_VECTOR(22 DOWNTO 0);
signal SDRAM_DO : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal SDRAM_REFRESH : std_logic;
-- pokey keyboard
SIGNAL KEYBOARD_SCAN : std_logic_vector(5 downto 0);
SIGNAL KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
-- gtia consol keys
SIGNAL CONSOL_START : std_logic;
SIGNAL CONSOL_SELECT : std_logic;
SIGNAL CONSOL_OPTION : std_logic;
-- SIO
SIGNAL SIO_RXD : std_logic;
SIGNAL SIO_COMMAND : std_logic;
SIGNAL SIO_TXD : std_logic;

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;
signal VGA_CS_RAW : std_logic;

-- AUDIO
signal AUDIO_LEFT : std_logic_vector(15 downto 0);
signal AUDIO_RIGHT : std_logic_vector(15 downto 0);

-- dma/virtual drive
signal DMA_ADDR_FETCH : std_logic_vector(23 downto 0);
signal DMA_WRITE_DATA : std_logic_vector(31 downto 0);
signal DMA_FETCH : std_logic;
signal DMA_32BIT_WRITE_ENABLE : std_logic;
signal DMA_16BIT_WRITE_ENABLE : std_logic;
signal DMA_8BIT_WRITE_ENABLE : std_logic;
signal DMA_READ_ENABLE : std_logic;
signal DMA_MEMORY_READY : std_logic;
signal DMA_MEMORY_DATA : std_logic_vector(31 downto 0);

signal ZPU_ADDR_ROM : std_logic_vector(15 downto 0);
signal ZPU_ROM_DATA : std_logic_vector(31 downto 0);

signal ZPU_OUT1 : std_logic_vector(31 downto 0);
signal ZPU_OUT2 : std_logic_vector(31 downto 0);
signal ZPU_OUT3 : std_logic_vector(31 downto 0);
signal ZPU_OUT4 : std_logic_vector(31 downto 0);

signal zpu_pokey_enable : std_logic;
signal zpu_sio_txd : std_logic;
signal zpu_sio_rxd : std_logic;
signal zpu_sio_command : std_logic;

SIGNAL FKEYS : std_logic_vector(11 downto 0);

-- system control from zpu
signal ram_select : std_logic_vector(2 downto 0);
signal reset_atari : std_logic;
signal pause_atari : std_logic;
SIGNAL speed_6502 : std_logic_vector(5 downto 0);
signal emulated_cartridge_select: std_logic_vector(5 downto 0);

-- GPIO
signal GPIO_0_DIR_OUT : std_logic_vector(35 downto 0);
signal GPIO_0_OUT : std_logic_vector(35 downto 0);
signal GPIO_1_DIR_OUT : std_logic_vector(35 downto 0);
signal GPIO_1_OUT : std_logic_vector(35 downto 0);
signal TRIGGERS : std_logic_vector(3 downto 0);

signal POT_RESET : std_logic;
signal POT_IN : std_logic_vector(7 downto 0);

signal GPIO_KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
signal PS2_KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);

signal PBI_WRITE_ENABLE : std_logic;
signal PBI_ADDRESS : std_logic_vector(15 downto 0);

signal cart_request : std_logic;
signal cart_request_complete : std_logic;
signal cart_data : std_logic_vector(7 downto 0);

signal pbi_addr : std_logic_vector(15 downto 0);

signal enable_179_early : std_logic;

-- scandoubler
signal half_scandouble_enable_reg : std_logic;
signal half_scandouble_enable_next : std_logic;
signal VIDEO_B : std_logic_vector(7 downto 0);

signal freezer_enable : std_logic;
signal freezer_activate: std_logic;

signal freezer_state: std_logic_vector(2 downto 0);

signal pbi_enable: std_logic;

signal pal : std_logic;

signal PS2_KEYS : STD_LOGIC_VECTOR(511 downto 0);
signal PS2_KEYS_NEXT : STD_LOGIC_VECTOR(511 downto 0);
BEGIN

pbi_enable <= SW(4);
PAL <= SW(8);

-- ANYTHING NOT CONNECTED...
--GPIO_0(0) <= 'Z';
--GPIO_0(35 downto 2) <= (others=>'Z');
--GPIO_1(35 downto 0) <= (others=>'Z');

FL_OE_N <= '1';
FL_WE_N <= '1';
FL_RST_N <= '1';
FL_ADDR <= (others=>'0');

process(freezer_enable, freezer_activate, freezer_state)
begin
LEDG <= (others=>'1');
LEDR <= (others=>'1');
LEDG(0) <= freezer_enable;
LEDG(1) <= freezer_activate;
LEDG(4 downto 2) <= freezer_state;
end process;

-- TODO FUJI? Or Program counter or...
hexdecoder0 : entity work.hexdecoder
PORT MAP(CLK => CLK,
NUMBER => X"A",
DIGIT => HEX0);


hexdecoder1 : entity work.hexdecoder
PORT MAP(CLK => CLK,
NUMBER => X"8",
DIGIT => HEX1);


hexdecoder2 : entity work.hexdecoder
PORT MAP(CLK => CLK,
NUMBER => X"0",
DIGIT => HEX2);


hexdecoder3 : entity work.hexdecoder
PORT MAP(CLK => CLK,
NUMBER => X"0",
DIGIT => HEX3);

sram1 : entity work.sram
PORT MAP(WREN => RAM_WRITE_ENABLE,
clk => CLK,
reset_n => RESET_N,
request => RAM_REQUEST,
width_16bit => PBI_WIDTH_16BIT_ACCESS,
ADDRESS => RAM_ADDR,
DIN => PBI_WRITE_DATA(15 DOWNTO 0),
SRAM_DQ => SRAM_DQ,
SRAM_CE_N => SRAM_CE_N,
SRAM_OE_N => SRAM_OE_N,
SRAM_WE_N => SRAM_WE_N,
SRAM_LB_N => SRAM_LB_N,
SRAM_UB_N => SRAM_UB_N,
complete => RAM_REQUEST_COMPLETE,
DOUT => RAM_DO,
SRAM_ADDR => SRAM_ADDR);

sdram_adaptor : entity work.sdram_statemachine
GENERIC MAP(ADDRESS_WIDTH => 22,
AP_BIT => 10,
COLUMN_WIDTH => 8,
ROW_WIDTH => 12
)
PORT MAP(CLK_SYSTEM => CLK,
CLK_SDRAM => CLK_SDRAM,
RESET_N => RESET_N,
READ_EN => SDRAM_READ_ENABLE,
WRITE_EN => SDRAM_WRITE_ENABLE,
REQUEST => SDRAM_REQUEST,
BYTE_ACCESS => PBI_WIDTH_8BIT_ACCESS,
WORD_ACCESS => PBI_WIDTH_16BIT_ACCESS,
LONGWORD_ACCESS => PBI_WIDTH_32BIT_ACCESS,
REFRESH => SDRAM_REFRESH,
ADDRESS_IN => SDRAM_ADDR,
DATA_IN => PBI_WRITE_DATA(31 downto 0),
SDRAM_DQ => DRAM_DQ,
COMPLETE => SDRAM_REQUEST_COMPLETE,
SDRAM_BA0 => DRAM_BA_0,
SDRAM_BA1 => DRAM_BA_1,
SDRAM_CKE => DRAM_CKE,
SDRAM_CS_N => DRAM_CS_N,
SDRAM_RAS_N => DRAM_RAS_N,
SDRAM_CAS_N => DRAM_CAS_N,
SDRAM_WE_N => DRAM_WE_N,
SDRAM_ldqm => DRAM_LDQM,
SDRAM_udqm => DRAM_UDQM,
DATA_OUT => SDRAM_DO,
SDRAM_ADDR => DRAM_ADDR(11 downto 0),
reset_client_n => SDRAM_RESET_N
);

-- PIA mapping
-- emulate pull-up on command line
SIO_COMMAND <= 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);
PORTB_IN <= PORTB_OUT;

-- GTIA triggers
--GTIA_TRIG <= CART_RD5&"1"&JOY2_n(4)&JOY1_n(4);
GTIA_TRIG <= "11"&TRIGGERS(1 downto 0);

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

-- Internal rom/ram
internalromram1 : entity work.internalromram
GENERIC MAP
(
internal_rom => 0,
internal_ram => 0
)
PORT MAP (
clock => CLK,
reset_n => RESET_N,

ROM_ADDR => ROM_ADDR,
ROM_REQUEST_COMPLETE => ROM_REQUEST_COMPLETE,
ROM_REQUEST => ROM_REQUEST,
ROM_DATA => ROM_DO,
RAM_ADDR => RAM_ADDR,
RAM_WR_ENABLE => RAM_WRITE_ENABLE,
RAM_DATA_IN => PBI_WRITE_DATA(7 downto 0),
RAM_REQUEST_COMPLETE => open,
RAM_REQUEST => RAM_REQUEST,
RAM_DATA => open
);

--sync_switches1 : entity work.sync_switches
--PORT MAP(CLK => CLK,
-- KEY => KEY,
-- SW => SW,
-- SYNC_KEYS => SYNC_KEYS,
-- SYNC_SWITCHES => SYNC_SWITCHES);

gpio0_gen:
for I in 0 to 35 generate
gpio_0(I) <= gpio_0_out(I) when gpio_0_dir_out(I)='1' else 'Z';
end generate gpio0_gen;

gpio1_gen:
for I in 0 to 35 generate
gpio_1(I) <= gpio_1_out(I) when gpio_1_dir_out(I)='1' else 'Z';
end generate gpio1_gen;

gen_old_gpio : if gpio=1 generate
gpio1 : entity work.gpio
GENERIC MAP(
cartridge_cycle_length => 26
)
PORT MAP(clk => CLK,
reset_n => reset_n,
gpio_enable => pbi_enable,
pot_reset => pot_reset,
pbi_write_enable => pbi_write_enable,
enable_179_early => enable_179_early,
cart_request => cart_request,
cart_complete => cart_request_complete,
cart_data_read => cart_data,
s4_n => cart_s4_n,
s5_n => cart_s5_n,
cctl_n => cart_cctl_n,
cart_data_write => pbi_write_data(7 downto 0),
GPIO_0_IN => GPIO_0,
GPIO_0_OUT => GPIO_0_OUT,
GPIO_0_DIR_OUT => GPIO_0_DIR_OUT,
GPIO_1_IN => GPIO_1,
GPIO_1_OUT => GPIO_1_OUT,
GPIO_1_DIR_OUT => GPIO_1_DIR_OUT,
keyboard_scan => KEYBOARD_SCAN,
pbi_addr_out => pbi_addr,
porta_out => PORTA_OUT,
porta_output => PORTA_DIR_OUT,
lightpen => ANTIC_LIGHTPEN,
rd4 => CART_RD4,
rd5 => CART_RD5,
keyboard_response => GPIO_KEYBOARD_RESPONSE,
porta_in => PORTA_IN,
pot_in => pot_in,
trig_in => TRIGGERS,
CA2_DIR_OUT => CA2_DIR_OUT,
CA2_OUT => CA2_OUT,
CA2_IN => open,
CB2_DIR_OUT => CB2_DIR_OUT,
CB2_OUT => CB2_OUT,
CB2_IN => open,
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
gpio2 : entity work.gpiov2
GENERIC MAP(
cartridge_cycle_length => 26
)
PORT MAP(clk => CLK,
reset_n => reset_n,
gpio_enable => pbi_enable,
pot_reset => pot_reset,
pbi_write_enable => pbi_write_enable,
enable_179_early => enable_179_early,
cart_request => cart_request,
cart_complete => cart_request_complete,
cart_data_read => cart_data,
s4_n => cart_s4_n,
s5_n => cart_s5_n,
cctl_n => cart_cctl_n,
cart_data_write => pbi_write_data(7 downto 0),
GPIO_0_IN => GPIO_0,
GPIO_0_OUT => GPIO_0_OUT,
GPIO_0_DIR_OUT => GPIO_0_DIR_OUT,
GPIO_1_IN => GPIO_1,
GPIO_1_OUT => GPIO_1_OUT,
GPIO_1_DIR_OUT => GPIO_1_DIR_OUT,
keyboard_scan => KEYBOARD_SCAN,
pbi_addr_out => pbi_addr,
porta_out => PORTA_OUT,
porta_output => PORTA_DIR_OUT,
lightpen => ANTIC_LIGHTPEN,
rd4 => CART_RD4,
rd5 => CART_RD5,
keyboard_response => GPIO_KEYBOARD_RESPONSE,
porta_in => PORTA_IN,
pot_in => pot_in,
trig_in => TRIGGERS,
CA2_DIR_OUT => CA2_DIR_OUT,
CA2_OUT => CA2_OUT,
CA2_IN => CA2_IN,
CB2_DIR_OUT => CB2_DIR_OUT,
CB2_OUT => CB2_OUT,
CB2_IN => CB2_IN,
SIO_IN => GPIO_SIO_RXD,
SIO_OUT => SIO_TXD,
SIO_CLOCKIN => SIO_CLOCKIN,
SIO_CLOCKOUT => SIO_CLOCKOUT
);
end generate gen_new_gpio;

process(clk,RESET_N,SDRAM_RESET_N,reset_atari)
begin
if ((RESET_N and SDRAM_RESET_N and not(reset_atari))='0') then
half_scandouble_enable_reg <= '0';
elsif (clk'event and clk='1') then
half_scandouble_enable_reg <= half_scandouble_enable_next;
end if;
end process;

half_scandouble_enable_next <= not(half_scandouble_enable_reg);

scandoubler : entity work.scandoubler
GENERIC MAP
(
video_bits=>4
)
PORT MAP(CLK => CLK,
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
VGA => SW(7),
COMPOSITE_ON_HSYNC => SW(6),
colour_enable => half_scandouble_enable_reg,
doubled_enable => '1',
scanlines_on => SW(5),
vsync_in => VGA_VS_RAW,
hsync_in => VGA_HS_RAW,
csync_in => VGA_CS_RAW,
pal => PAL,
colour_in => VIDEO_B,
VSYNC => VGA_VS,
HSYNC => VGA_HS,
B => VGA_B,
G => VGA_G,
R => VGA_R);

audio_codec_config_over_i2c : entity work.i2c_loader
GENERIC MAP(device_address => 26,
log2_divider => 6,
num_retries => 0
)
PORT MAP(CLK => CLK,
nRESET => RESET_N,
I2C_SCL => I2C_SCLK,
I2C_SDA => I2C_SDAT);

audio_codec_data : entity work.i2sslave
PORT MAP(CLK => CLK,
BCLK => AUD_BCLK,
DACLRC => AUD_DACLRCK,
LEFT_IN => AUDIO_LEFT,
RIGHT_IN => AUDIO_RIGHT,
MCLK_2 => AUD_XCK,
DACDAT => AUD_DACDAT);

--gen_ntsc_pll : if tv=0 generate
--pll : entity work.pll_ntsc
--PORT MAP(inclk0 => CLOCK_27(0),
-- c0 => CLK_SDRAM,
-- c1 => CLK,
-- c2 => DRAM_CLK,
-- locked => PLL_LOCKED);
--end generate;
--
--gen_pal_pll : if tv=1 generate
--pll : entity work.pll_pal
--PORT MAP(inclk0 => CLOCK_27(0),
-- c0 => CLK_SDRAM,
-- c1 => CLK,
-- c2 => DRAM_CLK,
-- locked => PLL_LOCKED);
--end generate;
--
--gen_old_pll : if tv=2 generate
pll : entity work.pll
PORT MAP(inclk0 => CLOCK_50,
c0 => CLK_SDRAM,
c1 => CLK,
c2 => DRAM_CLK,
locked => PLL_LOCKED);
--end generate;

RESET_N <= PLL_LOCKED;

-- PS2 to pokey
keyboard_map1 : entity work.ps2_to_atari800
PORT MAP
(
CLK => clk,
RESET_N => reset_n,
PS2_CLK => ps2_clk,
PS2_DAT => ps2_dat,
KEYBOARD_SCAN => KEYBOARD_SCAN,
KEYBOARD_RESPONSE => PS2_KEYBOARD_RESPONSE,

CONSOL_START => CONSOL_START,
CONSOL_SELECT => CONSOL_SELECT,
CONSOL_OPTION => CONSOL_OPTION,
FKEYS => FKEYS,
FREEZER_ACTIVATE => freezer_activate,

PS2_KEYS_NEXT_OUT => ps2_keys_next,
PS2_KEYS => ps2_keys
);

KEYBOARD_RESPONSE <= PS2_KEYBOARD_RESPONSE and GPIO_KEYBOARD_RESPONSE;

-- SIO
-- TODO combine
--SIO_RXD <= UART_RXD;
UART_TXD <= SIO_TXD;
--GPIO_0(1) <= SIO_COMMAND;

zpu_sio_command <= SIO_COMMAND;
zpu_sio_rxd <= SIO_TXD;
SIO_RXD <= zpu_sio_txd and UART_RXD and GPIO_SIO_RXD;

-- VIDEO
--VGA_HS <= not(VGA_HS_RAW xor VGA_VS_RAW);
--VGA_VS <= not(VGA_VS_RAW);

atari800 : entity work.atari800core
GENERIC MAP
(
cycle_length => 32,
video_bits => 8,
palette => 0
)
PORT MAP
(
CLK => CLK,
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),

VIDEO_VS => VGA_VS_RAW,
VIDEO_HS => VGA_HS_RAW,
VIDEO_CS => VGA_CS_RAW,
VIDEO_B => VIDEO_B,
VIDEO_G => open,
VIDEO_R => open,

AUDIO_L => AUDIO_LEFT,
AUDIO_R => AUDIO_RIGHT,

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 and not("0000"&ps2_keys(16#174#)&ps2_keys(16#16B#)&ps2_keys(16#172#)&ps2_keys(16#175#)),
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,
ENABLE_179_EARLY => ENABLE_179_EARLY,
PBI_ADDR => PBI_ADDR,
PBI_WRITE_ENABLE => PBI_WRITE_ENABLE,
PBI_SNOOP_DATA => open,
PBI_WRITE_DATA => PBI_WRITE_DATA,
PBI_WIDTH_8bit_ACCESS => PBI_WIDTH_8bit_ACCESS,
PBI_WIDTH_16bit_ACCESS => PBI_WIDTH_16bit_ACCESS,
PBI_WIDTH_32bit_ACCESS => PBI_WIDTH_32bit_ACCESS,

PBI_ROM_DO => CART_DATA,
PBI_REQUEST => CART_REQUEST,
PBI_REQUEST_COMPLETE => CART_REQUEST_COMPLETE,

CART_RD4 => CART_RD4,
CART_RD5 => CART_RD5,
CART_S4_n => CART_S4_n,
CART_S5_N => CART_S5_n,
CART_CCTL_N => CART_CCTL_n,

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,
GTIA_TRIG => GTIA_TRIG and not("000"&ps2_keys(16#127#)),
ANTIC_LIGHTPEN => ANTIC_LIGHTPEN,

SDRAM_REQUEST => SDRAM_REQUEST,
SDRAM_REQUEST_COMPLETE => SDRAM_REQUEST_COMPLETE,
SDRAM_READ_ENABLE => SDRAM_READ_ENABLE,
SDRAM_WRITE_ENABLE => SDRAM_WRITE_ENABLE,
SDRAM_ADDR => SDRAM_ADDR,
SDRAM_DO => SDRAM_DO,

ANTIC_REFRESH => SDRAM_REFRESH,

RAM_ADDR => RAM_ADDR,
RAM_DO => RAM_DO,
RAM_REQUEST => RAM_REQUEST,
RAM_REQUEST_COMPLETE => RAM_REQUEST_COMPLETE,
RAM_WRITE_ENABLE => RAM_WRITE_ENABLE,
ROM_ADDR => ROM_ADDR,
ROM_DO => ROM_DO,
ROM_REQUEST => ROM_REQUEST,
ROM_REQUEST_COMPLETE => ROM_REQUEST_COMPLETE,

DMA_FETCH => dma_fetch,
DMA_READ_ENABLE => dma_read_enable,
DMA_32BIT_WRITE_ENABLE => dma_32bit_write_enable,
DMA_16BIT_WRITE_ENABLE => dma_16bit_write_enable,
DMA_8BIT_WRITE_ENABLE => dma_8bit_write_enable,
DMA_ADDR => dma_addr_fetch,
DMA_WRITE_DATA => dma_write_data,
MEMORY_READY_DMA => dma_memory_ready,
--DMA_MEMORY_DATA => dma_memory_data,
PBI_SNOOP_DATA => DMA_MEMORY_DATA,

RAM_SELECT => ram_select,
CART_EMULATION_SELECT => emulated_cartridge_select,
PAL => PAL,
USE_SDRAM => SW(9),
ROM_IN_RAM => '1',
THROTTLE_COUNT_6502 => speed_6502,
HALT => pause_atari,

freezer_enable => freezer_enable,
freezer_activate => freezer_activate,
freezer_state_out => freezer_state,

pbi_enable => pbi_enable
);


zpu: entity work.zpucore
GENERIC MAP
(
platform => 1,
spi_clock_div => 1 -- 28MHz/2. Max for SD cards is 25MHz...
)
PORT MAP
(
-- standard...
CLK => CLK,
RESET_N => RESET_N and sdram_reset_n,

-- dma bus master (with many waitstates...)
ZPU_ADDR_FETCH => dma_addr_fetch,
ZPU_DATA_OUT => dma_write_data,
ZPU_FETCH => dma_fetch,
ZPU_32BIT_WRITE_ENABLE => dma_32bit_write_enable,
ZPU_16BIT_WRITE_ENABLE => dma_16bit_write_enable,
ZPU_8BIT_WRITE_ENABLE => dma_8bit_write_enable,
ZPU_READ_ENABLE => dma_read_enable,
ZPU_MEMORY_READY => dma_memory_ready,
ZPU_MEMORY_DATA => dma_memory_data,

-- rom bus master
-- data on next cycle after addr
ZPU_ADDR_ROM => zpu_addr_rom,
ZPU_ROM_DATA => zpu_rom_data,

-- spi master
-- Too painful to bit bang spi from zpu, so we have a hardware master in here
ZPU_SD_DAT0 => sd_data,
ZPU_SD_CLK => sd_clk,
ZPU_SD_CMD => sd_cmd,
ZPU_SD_DAT3 => sd_three,

-- SIO
-- Ditto for speaking to Atari, we have a built in Pokey
ZPU_POKEY_ENABLE => zpu_pokey_enable,
ZPU_SIO_TXD => zpu_sio_txd,
ZPU_SIO_RXD => zpu_sio_rxd,
ZPU_SIO_COMMAND => zpu_sio_command,

-- external control
-- switches etc. sector DMA blah blah.
ZPU_IN1 => X"000"&
"00"&ps2_keys(16#76#)&ps2_keys(16#5A#)&ps2_keys(16#174#)&ps2_keys(16#16B#)&ps2_keys(16#172#)&ps2_keys(16#175#)& -- (esc)FLRDU
FKEYS,
ZPU_IN2 => X"00000000",
ZPU_IN3 => X"00000000",
ZPU_IN4 => X"00000000",

-- ouputs - e.g. Atari system control, halt, throttle, rom select
ZPU_OUT1 => zpu_out1,
ZPU_OUT2 => zpu_out2,
ZPU_OUT3 => zpu_out3,
ZPU_OUT4 => zpu_out4
);

pause_atari <= zpu_out1(0);
reset_atari <= zpu_out1(1);
speed_6502 <= zpu_out1(7 downto 2);
ram_select <= zpu_out1(10 downto 8);
emulated_cartridge_select <= zpu_out1(22 downto 17);

freezer_enable <= zpu_out1(25);

zpu_rom1: entity work.zpu_rom
port map(
clock => clk,
address => zpu_addr_rom(13 downto 2),
q => zpu_rom_data
);

enable_179_clock_div_zpu_pokey : entity work.enable_divider
generic map (COUNT=>32) -- cycle_length
port map(clk=>clk,reset_n=>reset_n,enable_in=>'1',enable_out=>zpu_pokey_enable);

END vhdl;
(5-5/27)