repo2/atari_chips/sally/sallymax.vhd
701 | markw | ---------------------------------------------------------------------------
|
|
-- (c) 2018 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;
|
|||
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
|
|||
LIBRARY work;
|
|||
793 | markw | ENTITY sallymax IS
|
|
701 | markw | PORT
|
|
(
|
|||
809 | markw | PHI0 : IN STD_LOGIC; -- need to sync to this! TODO
|
|
RST_N : IN STD_LOGIC; -- connect me TODO
|
|||
793 | markw | ||
701 | markw | CLK_OUT : OUT STD_LOGIC; -- Use PHI2 and internal oscillator to create a clock, feed out here
|
|
CLK_SLOW : IN STD_LOGIC; -- ... and back in here, then to pll!
|
|||
D : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
|
|||
793 | markw | A : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
W_N : OUT STD_LOGIC;
|
|||
714 | markw | ||
793 | markw | RDY : IN STD_LOGIC;
|
|
812 | markw | HALT_N : IN STD_LOGIC; -- TODO, wire this up!
|
|
793 | markw | NMI_N : IN STD_LOGIC;
|
|
IRQ_N : IN STD_LOGIC;
|
|||
S0 : IN STD_LOGIC; -- not implemented yet!
|
|||
SYNC : OUT STD_LOGIC;
|
|||
PHI1 : OUT STD_LOGIC;
|
|||
809 | markw | PHI2 : OUT STD_LOGIC;
|
|
NC : INOUT STD_LOGIC_VECTOR(8 downto 0)
|
|||
701 | markw | );
|
|
793 | markw | END sallymax;
|
|
701 | markw | ||
793 | markw | ARCHITECTURE vhdl OF sallymax IS
|
|
701 | markw | component int_osc is
|
|
port (
|
|||
clkout : out std_logic; -- clkout.clk
|
|||
oscena : in std_logic := '0' -- oscena.oscena
|
|||
);
|
|||
end component;
|
|||
714 | markw | ||
component pll
|
|||
port (
|
|||
inclk0 : in std_logic := '0';
|
|||
c0 : out std_logic;
|
|||
locked : out std_logic
|
|||
);
|
|||
end component;
|
|||
signal OSC_CLK : std_logic;
|
|||
signal PHI2_6X : std_logic;
|
|||
signal CLK : std_logic;
|
|||
signal RESET_N : std_logic;
|
|||
793 | markw | signal CPU_REQUEST : std_logic;
|
|
signal CPU_REQUEST_COMPLETE : std_logic;
|
|||
signal CPU_ADDR : std_logic_vector(15 downto 0);
|
|||
signal CPU_WRITE_DATA : std_logic_vector(7 downto 0);
|
|||
signal CPU_READ_DATA : std_logic_vector(7 downto 0);
|
|||
signal CPU_WRITE_N : std_logic;
|
|||
714 | markw | ||
812 | markw | signal CPU_NMI_N : std_logic;
|
|
signal CPU_IRQ_N : std_logic;
|
|||
1406 | markw | signal CPU_RDY : std_logic;
|
|
793 | markw | signal BUS_ADDR : std_logic_vector(15 downto 0);
|
|
signal BUS_ADDR_OE : std_logic;
|
|||
716 | markw | signal BUS_DATA : std_logic_vector(7 downto 0);
|
|
793 | markw | signal BUS_DATA_OE : std_logic;
|
|
809 | markw | signal BUS_WRITE_N : std_logic;
|
|
810 | markw | signal BUS_WRITE_OE : std_logic;
|
|
809 | markw | ||
signal PLLRESET_N : std_logic;
|
|||
701 | markw | BEGIN
|
|
809 | markw | NC <= (others=>'Z');
|
|
701 | markw | oscillator : int_osc
|
|
port map
|
|||
(
|
|||
714 | markw | clkout => OSC_CLK,
|
|
701 | markw | oscena => '1'
|
|
);
|
|||
714 | markw | ||
730 | markw | --phi_multiplier : entity work.phi_mult
|
|
--port map
|
|||
--(
|
|||
-- clkin => OSC_CLK,
|
|||
-- phi2 => PHI2,
|
|||
-- clkout => PHI2_6X -- 6x phi2, aligned!
|
|||
--);
|
|||
PHI2_6X <= OSC_CLK;
|
|||
714 | markw | ||
pll_inst : pll
|
|||
PORT MAP(inclk0 => CLK_SLOW,
|
|||
c0 => CLK, -- 27MHz
|
|||
809 | markw | locked => PLLRESET_N);
|
|
RESET_N <= PLLRESET_N and RST_N;
|
|||
714 | markw | ||
793 | markw | bus_adapt : entity work.timing6502
|
|
716 | markw | PORT MAP
|
|
(
|
|||
CLK => CLK,
|
|||
RESET_N => RESET_N,
|
|||
809 | markw | ||
PHI0 => PHI0,
|
|||
HALT_N => HALT_N,
|
|||
812 | markw | NMI_N => NMI_N,
|
|
IRQ_N => IRQ_N,
|
|||
716 | markw | ||
793 | markw | -- FGPA side
|
|
ADDR_IN => CPU_ADDR,
|
|||
DATA_IN => CPU_WRITE_DATA,
|
|||
WRITE_IN => not(CPU_WRITE_N),
|
|||
717 | markw | ||
793 | markw | DATA_OUT => CPU_READ_DATA,
|
|
809 | markw | ||
CPU_REQUEST => CPU_REQUEST,
|
|||
CPU_REQUEST_COMPLETE => CPU_REQUEST_COMPLETE,
|
|||
812 | markw | CPU_NMI_N => CPU_NMI_N,
|
|
CPU_IRQ_N => CPU_IRQ_N,
|
|||
1406 | markw | CPU_RDY => CPU_RDY,
|
|
714 | markw | ||
793 | markw | -- bus side
|
|
809 | markw | BUS_DATA_IN => D,
|
|
793 | markw | BUS_PHI1 => PHI1,
|
|
BUS_PHI2 => PHI2,
|
|||
BUS_SUBCYCLE => open,
|
|||
BUS_ADDR_OUT => BUS_ADDR,
|
|||
BUS_ADDR_OE => BUS_ADDR_OE,
|
|||
BUS_DATA_OUT => BUS_DATA,
|
|||
BUS_DATA_OE => BUS_DATA_OE,
|
|||
809 | markw | BUS_WRITE_N => BUS_WRITE_N,
|
|
1406 | markw | BUS_WRITE_OE => BUS_WRITE_OE,
|
|
BUS_RDY => RDY
|
|||
809 | markw | );
|
|
793 | markw | cpu6502 : entity work.cpu
|
|
PORT MAP(CLK => CLK,
|
|||
RESET => NOT(RESET_N),
|
|||
ENABLE => RESET_N,
|
|||
812 | markw | IRQ_n => CPU_IRQ_N,
|
|
NMI_n => CPU_NMI_N,
|
|||
793 | markw | MEMORY_READY => CPU_REQUEST_COMPLETE,
|
|
809 | markw | THROTTLE => CPU_REQUEST,
|
|
1406 | markw | RDY => CPU_RDY,
|
|
793 | markw | DI => CPU_READ_DATA,
|
|
R_W_n => CPU_WRITE_N,
|
|||
809 | markw | CPU_FETCH => open,
|
|
793 | markw | A => CPU_ADDR,
|
|
DO => CPU_WRITE_DATA);
|
|||
725 | markw | ||
714 | markw | -- Wire up pins
|
|
CLK_OUT <= PHI2_6X;
|
|||
810 | markw | D <= BUS_DATA when (BUS_DATA_OE='1') else (others=>'Z');
|
|
A <= BUS_ADDR when (BUS_ADDR_OE='1') else (others=>'Z');
|
|||
W_N <= BUS_WRITE_N when (BUS_WRITE_OE='1') else 'Z';
|
|||
714 | markw | ||
793 | markw | SYNC <= 'Z'; -- Not implemented yet
|
|
714 | markw | ||
701 | markw | END vhdl;
|