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;