Project

General

Profile

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;