Project

General

Profile

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

ENTITY veronica IS
PORT (
CLK: in std_logic;
LED: out std_logic_vector(0 downto 0);
CART_ADDR: in std_logic_vector(12 downto 0);
CART_DATA: inout std_logic_vector(7 downto 0);
CART_RD5: out std_logic;
CART_RD4: out std_logic;
CART_S5: in std_logic;
CART_S4: in std_logic;
CART_PHI2: in std_logic;
CART_CTL: in std_logic;
CART_RW: in std_logic;
SD_CARD_cs: out std_logic;
SD_CARD_sclk: out std_logic;
SD_CARD_mosi: out std_logic;
SD_CARD_miso: in std_logic;
EXT_SRAM_ADDR: out std_logic_vector(19 downto 0);
EXT_SRAM_DATA: inout std_logic_vector(7 downto 0);
EXT_SRAM_CE: out std_logic;
EXT_SRAM_OE: out std_logic;
EXT_SRAM_WE: out std_logic
);
END veronica;

ARCHITECTURE vhdl OF veronica IS

component FT816 is
port(
rst : in std_logic;
clk : in std_logic;

-- Various clock outputs - perhaps useful for memory layer?
clko : out std_logic;
cyc : out std_logic_vector(4 downto 0);
phi11 : out std_logic;
phi12 : out std_logic;
phi81 : out std_logic;
phi82 : out std_logic;

nmi : in std_logic; -- active low
irq : in std_logic; -- active low

rdy : in std_logic; -- good old rdy!

-- Some unknown inputs
abort : in std_logic; -- another interrupt (active low)
be : in std_logic; -- bus enable (active high)
err_i : in std_logic; -- set to 1 in example
rty_i : in std_logic; -- set to 1 in example

-- Some unknown outputs
vpa : out std_logic; -- valid program address
vda : out std_logic; -- valid data address (both high for op code??)
mlb : out std_logic; -- memory busy
vpb : out std_logic; -- ?
e : out std_logic; -- !m816 (emulation pin)
mx : out std_logic; -- status bits? m_bit when clk high, x_bit when clk low

-- data and address bus
ad : out std_logic_vector(23 downto 0);
rw : out std_logic;
db : in std_logic_vector(7 downto 0);
dw : out std_logic_Vector(7 downto 0)
);
end component;

signal clk_adj : std_logic;
signal clk_adj7x : std_logic;
signal reset_n : std_logic;
signal veronica_reset : std_logic;

-- 65816 bus
signal veronica_address : std_logic_vector(23 downto 0);
signal veronica_read_data : std_logic_vector(7 downto 0);
signal veronica_write_data : std_logic_vector(7 downto 0);
signal veronica_w_n : std_logic;
signal veronica_config_w_n : std_logic;
-- 6502 bus
signal atari_bus_request : std_logic;
signal atari_address : std_logic_vector(12 downto 0);
signal atari_data_bus : std_logic_vector(7 downto 0);
signal atari_read_data : std_logic_vector(7 downto 0);
signal atari_write_data : std_logic_vector(7 downto 0);
signal atari_w_n : std_logic;
signal atari_config_w_n : std_logic;
signal atari_s4_n : std_logic;
signal atari_s5_n : std_logic;
signal atari_ctl_n : std_logic;
-- address decode
signal veronica_config_select : std_logic;
signal veronica_sram_select : std_logic;
signal veronica_sram_address: std_logic_vector(16 downto 0);
signal atari_config_select : std_logic;
signal atari_sram_select : std_logic;
signal atari_sram_address: std_logic_vector(16 downto 0);

-- veronica config
signal veronica_window_address : std_logic;
signal veronica_bank_half_select : std_logic;
signal veronica_config_data : std_logic_vector(7 downto 0);
-- atari config
signal atari_banka_enable : std_logic;
signal atari_bank8_enable : std_logic;
signal atari_bank_half_select : std_logic;
signal atari_config_data : std_logic_vector(7 downto 0);

-- common config
signal common_bank_select : std_logic;
-- semaphora
signal common_sem : std_logic;
signal veronica_sem_write : std_logic;
signal veronica_sem_value : std_logic;
-- cart driving
signal cart_bus_data_out : std_logic_vector(7 downto 0);
signal cart_bus_drive : std_logic;
-- sram driving
signal sram_write_data : std_logic_vector(7 downto 0);
signal sram_drive_data : std_logic;
signal sram_read_data : std_logic_vector(7 downto 0);
begin

pll1:entity work.pll_veronica
PORT map
(
inclk0 => clk,
c0 => clk_adj, -- 14MHz (>70ns/cycle)
c1 => clk_adj7x, -- 98MHz
locked => reset_n
);

cpu_65816_rob:FT816
port map (
rst => reset_n and veronica_reset,
clk => clk_adj,
nmi => '1',
irq => '1',
rdy => not(atari_bus_request), -- 6502 priority for sram access!
abort => '1',
be => '1',
err_i => '0',
rty_i => '0',
ad => veronica_address,
rw => veronica_w_n,
dw => veronica_write_data,
db => veronica_read_data
);
SD_CARD_cs <= 'Z';
SD_CARD_sclk <= 'Z';
LED(0) <= '1';

veronica_config_w_n <= veronica_w_n or not(veronica_config_select);
glue1: entity work.config_regs_veronica
port map
(
clk => clk_adj,
reset_n => reset_n and veronica_reset,
sem_in => common_sem,
window_address => veronica_window_address,
bank_half_select => veronica_bank_half_select,
sem_write => veronica_sem_write,
sem_value => veronica_sem_value,
data_in => veronica_write_data,
data_out => veronica_config_data,
rw_n => veronica_config_w_n
);
atari_config_w_n <= atari_w_n or not(atari_config_select);
glue2: entity work.config_regs_6502
port map
(
clk => clk_adj,
reset_n => reset_n,
sem_out => common_sem,
banka_enable => atari_banka_enable,
bank8_enable => atari_bank8_enable,
bank_half_select => atari_bank_half_select,
bank_select => common_bank_select,
enable_65816 => veronica_reset,
sem_write_65816 => veronica_sem_write,
sem_value_65816 => veronica_sem_value,
data_in => atari_write_data,
data_out => atari_config_data,
rw_n => atari_config_w_n
);
glue3: entity work.slave_timing_6502
port map
(
clk => clk_adj,
clk7x => clk_adj7x,
reset_n => reset_n,
phi2 => CART_PHI2,
bus_addr => CART_ADDR,
bus_data => CART_DATA,
bus_ctl_n => CART_CTL,
bus_rw_n => CART_RW,
bus_s4_n => CART_S4,
bus_s5_n => CART_S5,
bus_data_out => cart_bus_data_out,
bus_drive => cart_bus_drive,
s4_n => atari_s4_n,
s5_n => atari_s5_n,
ctl_n => atari_ctl_n,
addr_in => atari_address,
data_in => atari_write_data,
rw_n => atari_w_n,

bus_request => atari_bus_request,
data_out => atari_read_data
);
CART_DATA <= cart_bus_data_out when cart_bus_drive='1' else (others=>'Z');

glue4: entity work.atari_address_decoder
port map
(
s4_n => atari_s4_n,
s5_n => atari_s5_n,
ctl_n => atari_ctl_n,
addr_in => atari_address,
bus_request => atari_bus_request,
bank_half_select => atari_bank_half_select,
bank_select => common_bank_select,
config_select => atari_config_select,
sram_select => atari_sram_select,
sram_address => atari_sram_address
);

glue5: entity work.veronica_address_decoder
port map
(
addr_in => veronica_address(15 downto 0),
window_address => veronica_window_address,
bank_half_select => veronica_bank_half_select,
bank_select => common_bank_select,
config_select => veronica_config_select,
sram_select => veronica_sram_select,
sram_address => veronica_sram_address
);

glue6: entity work.sram_mux
port map
(
clk => clk_adj,
clk7x => clk_adj7x,
reset_n => reset_n,
sram_addr => EXT_SRAM_ADDR,
sram_data_out => sram_write_data,
sram_drive_data => sram_drive_data,
sram_we_n => EXT_SRAM_WE,

atari_bus_request => atari_bus_request,
atari_sram_select => atari_sram_select,
atari_address => atari_sram_address,
atari_w_n => atari_w_n,
atari_write_data => atari_write_data,
veronica_address => veronica_sram_address,
veronica_sram_select => veronica_sram_select,
veronica_w_n => veronica_w_n,
veronica_write_data => veronica_write_data
);
EXT_SRAM_DATA <= sram_write_data when sram_drive_data='1' else (others=>'Z');
EXT_SRAM_OE <= '0';
sram_read_data <= EXT_SRAM_DATA;
glue7: entity work.output_mux
port map
(
config_select => atari_config_select,
sram_select => atari_sram_select,
config_data => atari_config_data,
sram_data => sram_read_data,
read_data => atari_read_data
);
glue8: entity work.output_mux
port map
(
config_select => veronica_config_select,
sram_select => veronica_sram_select,
config_data => veronica_config_data,
sram_data => sram_read_data,
read_data => veronica_read_data
);
EXT_SRAM_CE <= '1';
cart_rd4 <= '1' when atari_bank8_enable='1' else 'Z';
cart_rd5 <= '1' when atari_banka_enable='1' else 'Z';
sd_card_mosi <= 'Z';

-- DONE:Instantiate 65816 (review 2 changes needed - one in particular deleted something, still needed?)

-- SRAM adaptor for 6502 and 65816 (55ns SRAM)

-- veronica reg
-- 64KB - 65816
-- 32KB - bank1 (either 6502 or 65816)
-- 32KB - bank2 (either 6502 or 65816)

-- 65816 memory map:
-- 0x0000-0xffff - first 64k (-below...)
-- 0x0200-0x020f - control reg
-- 7-semaphore
-- 6-window at 0xc0000-0xffff(0) or 0x4000-7fff
-- 5-0=half A,1=half B
-- 4-0 res (read as 1)
-- 6502 memory map:
-- in cart space...

-- How to mux ram access? 1/8 6502 and 7/8 65816?

end vhdl;
(46-46/48)