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;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

LIBRARY work;

ENTITY atari800core_eclaireXLproto IS
GENERIC
(
hdmiOnGPIO : integer := 0;
internal_rom : integer := 1; -- if 0 expects it in sdram,is 1:16k os+basic, is 2:... TODO
internal_ram : integer := 16384 -- at start of memory map
);
PORT
(
CLOCK_5 : IN STD_LOGIC;

PS2CLK : IN STD_LOGIC;
PS2DAT : IN STD_LOGIC;

GPIOA : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0);
GPIOB : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0);
GPIOC: INOUT STD_LOGIC_VECTOR(35 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(12 DOWNTO 0);
DRAM_DQ : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);

SD_WRITEPROTECT : IN STD_LOGIC;
SD_DETECT : IN STD_LOGIC;
SD_DAT1 : OUT STD_LOGIC;
SD_DAT0 : IN STD_LOGIC;
SD_CLK : OUT STD_LOGIC;
SD_CMD : OUT STD_LOGIC;
SD_DAT3 : OUT STD_LOGIC;
SD_DAT2 : OUT STD_LOGIC;

VGA_VS : OUT STD_LOGIC;
VGA_HS : OUT STD_LOGIC;
VGA_B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
VGA_G : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
VGA_R : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

VGA_BLANK_N : OUT STD_LOGIC;
VGA_CLK : OUT STD_LOGIC;
AUDIO_LEFT : OUT STD_LOGIC;
AUDIO_RIGHT : OUT STD_LOGIC;

USB2DM: INOUT STD_LOGIC;
USB2DP: INOUT STD_LOGIC;
USB1DM: INOUT STD_LOGIC;
USB1DP: INOUT STD_LOGIC;
ADC_SDA: INOUT STD_LOGIC;
ADC_SCL: INOUT STD_LOGIC
);
END atari800core_eclaireXLproto;

ARCHITECTURE vhdl OF atari800core_eclaireXLproto IS

component pll_gclk
port (
refclk : in std_logic := '0'; -- refclk.clk
rst : in std_logic := '0'; -- reset.reset
outclk_0 : out std_logic -- outclk0.clk
);
end component;
signal ADAPTCLOCK_50 : std_logic;

signal POTRESET : std_logic;

signal TRIG : std_logic_vector(1 downto 0);
signal POTIN : std_logic_vector(3 downto 0);

signal VGA_Rint : std_logic_vector(7 downto 0);
signal VGA_Bint : std_logic_vector(7 downto 0);

BEGIN
newboard : work.atari800core_eclaireXL
GENERIC MAP
(
internal_rom => internal_rom,
internal_ram => internal_ram
)
PORT MAP
(
CLOCK_50 => ADAPTCLOCK_50,

GPIOA => open,
EXP => open,

PBI_A(15) => GPIOB(31),
PBI_A(14) => GPIOB(30),
PBI_A(13) => GPIOB(29),
PBI_A(12) => GPIOB(11),
PBI_A(11) => GPIOB(5),
PBI_A(10) => GPIOB(4),
PBI_A(9) => GPIOB(13),
PBI_A(8) => GPIOB(15),
PBI_A(7) => GPIOB(17),
PBI_A(6) => GPIOB(19),
PBI_A(5) => GPIOB(21),
PBI_A(4) => GPIOB(23),
PBI_A(3) => GPIOB(25),
PBI_A(2) => GPIOB(24),
PBI_A(1) => GPIOB(22),
PBI_A(0) => GPIOB(20),
PBI_D(7) => GPIOB(7),
PBI_D(6) => GPIOB(8),
PBI_D(5) => GPIOB(16),
PBI_D(4) => GPIOB(18),
PBI_D(3) => GPIOB(9),
PBI_D(2) => GPIOB(14),
PBI_D(1) => GPIOB(12),
PBI_D(0) => GPIOB(10),
PBI_CLK => GPIOB(1),
PBI_RW_N => GPIOB(3),
PBI_EXTSEL_N => GPIOB(28),
PBI_MPD_N => GPIOB(32),
PBI_REF_N => GPIOB(33),
PBI_IRQ_N => GPIOB(34),
PBI_RST_N => GPIOB(35),

CART_S4_N => GPIOB(27),
CART_S5_N => GPIOB(6),
CART_RD4 => GPIOB(26),
CART_RD5 => GPIOB(2),
CART_CCTL_N => GPIOB(0),

SIO_CLOCKIN => GPIOA(7),
SIO_CLOCKOUT => GPIOA(6),
SIO_IN => GPIOA(5),
SIO_IRQ => GPIOA(0),
SIO_OUT => GPIOA(4),
SIO_COMMAND => GPIOA(1),
SIO_PROCEED => GPIOA(2),
SIO_MOTOR_RAW => GPIOA(3),

SER_CMD => open,
SER_TX => open,
SER_RX => '1',

PORTA(7) => GPIOA(8),
PORTA(6) => GPIOA(9),
PORTA(5) => GPIOA(10),
PORTA(4) => GPIOA(11),
PORTA(3) => GPIOA(17),
PORTA(2) => GPIOA(18),
PORTA(1) => GPIOA(19),
PORTA(0) => GPIOA(20),
TRIG => TRIG,
POTIN => POTIN,
POTRESET => POTRESET,

DRAM_BA_0 => DRAM_BA_0,
DRAM_BA_1 => DRAM_BA_1,
DRAM_CS_N => DRAM_CS_N,
DRAM_RAS_N => DRAM_RAS_N,
DRAM_CAS_N => DRAM_CAS_N,
DRAM_WE_N => DRAM_WE_N,
DRAM_LDQM => DRAM_LDQM,
DRAM_UDQM => DRAM_UDQM,
DRAM_CLK => DRAM_CLK,
DRAM_CKE => DRAM_CKE,
DRAM_ADDR => DRAM_ADDR,
DRAM_DQ => DRAM_DQ,

SD_WRITEPROTECT => SD_WRITEPROTECT,
SD_DETECT => SD_DETECT,
SD_DAT1 => SD_DAT1,
SD_DAT0 => SD_DAT0,
SD_CLK => SD_CLK,
SD_CMD => SD_CMD,
SD_DAT3 => SD_DAT3,
SD_DAT2 => SD_DAT2,

VGA_VS => VGA_VS,
VGA_HS => VGA_HS,
VGA_B => VGA_Bint,
VGA_G => VGA_G,
VGA_R => VGA_Rint,

VGA_BLANK_N => VGA_BLANK_N,
VGA_CLK => VGA_CLK,
AUDIO_LEFT => AUDIO_LEFT,
AUDIO_RIGHT => AUDIO_RIGHT,

USB2DM => USB2DM,
USB2DP => USB2DP,
USB1DM => USB1DM,
USB1DP => USB1DP,
ADC_SDA => open,
ADC_SCL => open
);


TRIG <= GPIOA(12)&GPIOA(21);
GPIOA(12) <= 'Z';
GPIOA(21) <= 'Z';
POTIN <= GPIOA(13)&GPIOA(14)&GPIOA(15)&GPIOA(16);
GPIOA(16 downto 13) <= "0000" when POTRESET='1' else "ZZZZ";

gen_no_hdmi : if hdmiOnGPIO=0 generate
VGA_R <= VGA_Rint;
VGA_B <= VGA_Bint;
end generate gen_no_hdmi;

gen_hdmi : if hdmiOnGPIO=1 generate
VGA_R(7) <= VGA_Rint(7);
VGA_R(6) <= VGA_Rint(6);
VGA_R(5) <= VGA_Rint(5);
--VGA_R(4) <= VGA_Rint(4);
--VGA_R(3) <= VGA_Rint(3);
VGA_R(2) <= VGA_Rint(2);
--VGA_R(1) <= VGA_Rint(1);
--VGA_R(0) <= VGA_Rint(0);

VGA_B(7) <= VGA_Bint(7);
--VGA_B(6) <= VGA_Bint(6);
--VGA_B(5) <= VGA_Bint(5);
--VGA_B(4) <= VGA_Bint(4);
VGA_B(3) <= VGA_Bint(3);
VGA_B(2) <= VGA_Bint(2);
--VGA_B(1) <= VGA_Bint(1);
VGA_B(0) <= VGA_Bint(0);

GPIOC(1) <= VGA_Rint(0); -- D2P
GPIOC(2) <= VGA_Rint(1); -- D2N
GPIOC(3) <= VGA_Rint(4); -- D1P
GPIOC(4) <= VGA_Rint(3); -- D1N
GPIOC(12) <= VGA_Bint(1); -- D0N
GPIOC(13) <= VGA_Bint(4); -- D0P
GPIOC(14) <= VGA_Bint(5); -- C N
GPIOC(15) <= VGA_Bint(6); -- C P

end generate gen_hdmi;

pll_gclk_inst : pll_gclk -- upscale clock from 5 to 50MHz and put on global clock line - so we can use more plls and fractional features!
PORT MAP(refclk => CLOCK_5,
outclk_0 => ADAPTCLOCK_50);


END vhdl;

(20-20/139)