Revision 4
Added by markw over 11 years ago
common/a8core/atari800core.vhd | ||
---|---|---|
CONSOL_OPTION : IN STD_LOGIC;
|
||
CONSOL_SELECT : IN STD_LOGIC;
|
||
CONSOL_START : IN STD_LOGIC;
|
||
GTIA_TRIG : IN STD_LOGIC_VECTOR(3 downto 0);
|
||
|
||
-----------------------
|
||
-- After here all FPGA implementation specific
|
||
... | ... | |
-- TODO - review/explain what all these are for
|
||
SIGNAL CPU_SHARED_ENABLE : STD_LOGIC;
|
||
SIGNAL ENABLE_179_MEMWAIT : STD_LOGIC;
|
||
SIGNAL PAUSE_6502 : STD_LOGIC;
|
||
SIGNAL HALT_OR_PAUSE_6502 : STD_LOGIC;
|
||
SIGNAL POKEY_ENABLE_179 : STD_LOGIC;
|
||
SIGNAL ANTIC_ENABLE_179 : STD_LOGIC;
|
||
SIGNAL SCANDOUBLER_SHARED_ENABLE_HIGH : STD_LOGIC;
|
||
... | ... | |
SIGNAL PIA_IRQB : STD_LOGIC;
|
||
SIGNAL PIA_READ_ENABLE : STD_LOGIC;
|
||
SIGNAL PIA_WRITE_ENABLE : STD_LOGIC;
|
||
SIGNAL PORTB_OUT_INT : STD_LOGIC_VECTOR(7 downto 0);
|
||
|
||
-- PBI
|
||
SIGNAL PBI_ADDR_INT : std_logic_vector(15 downto 0);
|
||
|
||
BEGIN
|
||
|
||
PBI_WIDTH_8bit_ACCESS <= WIDTH_8bit_access;
|
||
... | ... | |
PBI_WRITE_DATA <= WRITE_DATA;
|
||
PBI_SNOOP_DATA <= MEMORY_DATA;
|
||
|
||
HALT_OR_PAUSE_6502 <= HALT or PAUSE_6502;
|
||
|
||
enables : entity work.shared_enable
|
||
GENERIC MAP(cycle_length => cycle_length)
|
||
PORT MAP(CLK => CLK,
|
||
RESET_N => RESET_N,
|
||
MEMORY_READY_CPU => MEMORY_READY_CPU,
|
||
MEMORY_READY_ANTIC => MEMORY_READY_ANTIC,
|
||
PAUSE_6502 => HALT_OR_PAUSE_6502,
|
||
PAUSE_6502 => HALT,
|
||
THROTTLE_COUNT_6502 => THROTTLE_COUNT_6502,
|
||
POKEY_ENABLE_179 => POKEY_ENABLE_179,
|
||
ANTIC_ENABLE_179 => ANTIC_ENABLE_179,
|
||
... | ... | |
SCANDOUBLER_ENABLE_HIGH => SCANDOUBLER_SHARED_ENABLE_HIGH);
|
||
|
||
|
||
CPU_6502_RESET <= NOT(RESET_N); -- TODO, allow external reset
|
||
cpu6502 : entity work.cpu
|
||
PORT MAP(CLK => CLK,
|
||
RESET => CPU_6502_RESET,
|
||
... | ... | |
ANTIC_ENABLE_179 => ANTIC_ENABLE_179,
|
||
PAL => PAL,
|
||
lightpen => LIGHTPEN,
|
||
ADDR => PBI_ADDR(3 DOWNTO 0),
|
||
ADDR => PBI_ADDR_INT(3 DOWNTO 0),
|
||
CPU_DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
MEMORY_DATA_IN => MEMORY_DATA(7 DOWNTO 0),
|
||
NMI_N_OUT => NMI_n,
|
||
... | ... | |
ANTIC_MEMORY_READY => MEMORY_READY_ANTIC,
|
||
WR_EN => POKEY2_WRITE_ENABLE,
|
||
RESET_N => RESET_N,
|
||
ADDR => PBI_ADDR(3 DOWNTO 0),
|
||
ADDR => PBI_ADDR_INT(3 DOWNTO 0),
|
||
DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
CHANNEL_0_OUT => POKEY2_CHANNEL0,
|
||
CHANNEL_1_OUT => POKEY2_CHANNEL1,
|
||
... | ... | |
CB2_DIR_OUT => CB2_DIR_OUT,
|
||
CB2_IN => CB2_IN,
|
||
CB2_OUT => CB2_OUT,
|
||
ADDR => PBI_ADDR(1 DOWNTO 0),
|
||
ADDR => PBI_ADDR_INT(1 DOWNTO 0),
|
||
CPU_DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
IRQA_N => PIA_IRQA,
|
||
IRQB_N => PIA_IRQB,
|
||
... | ... | |
PORTA_OUT => PORTA_OUT,
|
||
PORTB_IN => PORTB_IN,
|
||
PORTB_DIR_OUT => PORTB_DIR_OUT,
|
||
PORTB_OUT => PORTB_OUT);
|
||
PORTB_OUT => PORTB_OUT_INT);
|
||
|
||
mmu1 : entity work.address_decoder
|
||
PORT MAP(CLK => CLK,
|
||
... | ... | |
CACHE_POKEY2_DATA => CACHE_POKEY2_DO,
|
||
POKEY_DATA => POKEY_DO,
|
||
CACHE_POKEY_DATA => CACHE_POKEY_DO,
|
||
PORTB => PORTB_OUT,
|
||
PORTB => PORTB_OUT_INT,
|
||
RAM_DATA => RAM_DO,
|
||
ram_select => RAM_SELECT(2 downto 0),
|
||
ROM_DATA => ROM_DO,
|
||
rom_select => ROM_SELECT,
|
||
SDRAM_DATA => SDRAM_DO,
|
||
DMA_ADDR => DMA_ADDR_FETCH,
|
||
DMA_WRITE_DATA => DMA_DO,
|
||
DMA_ADDR => DMA_ADDR,
|
||
DMA_WRITE_DATA => DMA_WRITE_DATA,
|
||
MEMORY_READY_ANTIC => MEMORY_READY_ANTIC,
|
||
MEMORY_READY_DMA => MEMORY_READY_DMA,
|
||
MEMORY_READY_CPU => MEMORY_READY_CPU,
|
||
... | ... | |
SDRAM_REQUEST => SDRAM_REQUEST,
|
||
SDRAM_REFRESH => SDRAM_REFRESH,
|
||
MEMORY_DATA => MEMORY_DATA,
|
||
PBI_ADDR => PBI_ADDR,
|
||
PBI_ADDR => PBI_ADDR_INT,
|
||
RAM_ADDR => RAM_ADDR,
|
||
ROM_ADDR => ROM_ADDR,
|
||
SDRAM_ADDR => SDRAM_ADDR,
|
||
... | ... | |
SIO_IN1 => SIO_RXD,
|
||
SIO_IN2 => '1',
|
||
SIO_IN3 => '1',
|
||
ADDR => PBI_ADDR(3 DOWNTO 0),
|
||
ADDR => PBI_ADDR_INT(3 DOWNTO 0),
|
||
DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
keyboard_response => KEYBOARD_RESPONSE,
|
||
POT_IN => POT_IN,
|
||
... | ... | |
CONSOL_START => CONSOL_START,
|
||
CONSOL_SELECT => CONSOL_SELECT,
|
||
CONSOL_OPTION => CONSOL_OPTION,
|
||
TRIG0 => joy2_n(4), -- TODO - joystick trigger too
|
||
TRIG1 => joy1_n(4),
|
||
--TRIG0 => VIRTUAL_TRIGGERS(0) and joy2_n(4), -- TODO - joystick trigger too
|
||
--TRIG1 => VIRTUAL_TRIGGERS(1) and joy1_n(4),
|
||
--TRIG0 => VIRTUAL_TRIGGERS(0),
|
||
--TRIG1 => VIRTUAL_TRIGGERS(1),
|
||
TRIG2 => VIRTUAL_TRIGGERS(2),
|
||
TRIG3 => VIRTUAL_TRIGGERS(3),
|
||
ADDR => PBI_ADDR(4 DOWNTO 0),
|
||
TRIG0 => GTIA_TRIG(0),
|
||
TRIG1 => GTIA_TRIG(1),
|
||
TRIG2 => GTIA_TRIG(2),
|
||
TRIG3 => GTIA_TRIG(3),
|
||
ADDR => PBI_ADDR_INT(4 DOWNTO 0),
|
||
AN => ANTIC_AN,
|
||
CPU_DATA_IN => WRITE_DATA(7 DOWNTO 0),
|
||
MEMORY_DATA_IN => MEMORY_DATA(7 DOWNTO 0),
|
||
... | ... | |
generic map(BYTES=>16,WIDTH=>4)
|
||
port map(
|
||
CLK => CLK,
|
||
ADDR => PBI_ADDR(3 downto 0),
|
||
ADDR => PBI_ADDR_INT(3 downto 0),
|
||
DATA_IN => WRITE_DATA(7 downto 0),
|
||
WR_EN => POKEY_WRITE_ENABLE,
|
||
DATA_OUT => CACHE_POKEY_DO
|
||
... | ... | |
generic map(BYTES=>16,WIDTH=>4)
|
||
port map(
|
||
CLK => CLK,
|
||
ADDR => PBI_ADDR(3 downto 0),
|
||
ADDR => PBI_ADDR_INT(3 downto 0),
|
||
DATA_IN => WRITE_DATA(7 downto 0),
|
||
WR_EN => POKEY2_WRITE_ENABLE,
|
||
DATA_OUT => CACHE_POKEY2_DO
|
||
... | ... | |
generic map(BYTES=>32,WIDTH=>5)
|
||
port map(
|
||
CLK => CLK,
|
||
ADDR => PBI_ADDR(4 downto 0),
|
||
ADDR => PBI_ADDR_INT(4 downto 0),
|
||
DATA_IN => WRITE_DATA(7 downto 0),
|
||
WR_EN => GTIA_WRITE_ENABLE,
|
||
DATA_OUT => CACHE_GTIA_DO
|
||
... | ... | |
generic map(BYTES=>16,WIDTH=>4)
|
||
port map(
|
||
CLK => CLK,
|
||
ADDR => PBI_ADDR(3 downto 0),
|
||
ADDR => PBI_ADDR_INT(3 downto 0),
|
||
DATA_IN => WRITE_DATA(7 downto 0),
|
||
WR_EN => ANTIC_WRITE_ENABLE,
|
||
DATA_OUT => CACHE_ANTIC_DO
|
||
... | ... | |
PORT map
|
||
(
|
||
clk => clk,
|
||
addr => pbi_addr(1 downto 0),
|
||
addr => pbi_addr_int(1 downto 0),
|
||
data_in => WRITE_DATA(7 DOWNTO 0),
|
||
wr_en => covox_write_enable,
|
||
covox_channel0 => covox_channel0,
|
||
... | ... | |
covox_channel3 => covox_channel3
|
||
);
|
||
|
||
-- outputs
|
||
PBI_ADDR <= PBI_ADDR_INT;
|
||
PORTB_OUT <= PORTB_OUT_INT;
|
||
|
||
END bdf_type;
|
common/a8core/atari800core_helloworld.vhd | ||
---|---|---|
---------------------------------------------------------------------------
|
||
-- (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.STD_LOGIC_MISC.all;
|
||
use ieee.numeric_std.all;
|
||
|
||
LIBRARY work;
|
||
-- Simple version that:
|
||
-- i) needs: CLK(58 or 28MHZ) joystick,PS2 keyboard
|
||
-- ii) provides: VIDEO,AUDIO,ROM,RAM
|
||
... | ... | |
(
|
||
-- use CLK of 1.79*cycle_length
|
||
-- I've tested 16 and 32 only, but 4 and 8 might work...
|
||
cycle_length : integer := 16 -- or 32...
|
||
cycle_length : integer := 16; -- or 32...
|
||
|
||
internal_ram : integer := 16384 -- at start of memory map
|
||
);
|
||
... | ... | |
|
||
-- video standard
|
||
PAL : in STD_LOGIC
|
||
);
|
||
end atari800core_helloworld;
|
||
|
||
ARCHITECTURE vhdl OF atari800core_helloworld IS
|
||
... | ... | |
SIGNAL CONSOL_START : std_logic;
|
||
SIGNAL CONSOL_SELECT : std_logic;
|
||
SIGNAL CONSOL_OPTION : std_logic;
|
||
|
||
-- 6502 throttling
|
||
SIGNAL THROTTLE_COUNT_6502 : std_logic_vector(5 downto 0);
|
||
|
||
BEGIN
|
||
|
||
-- PS2 to pokey
|
||
keyboard_map1 : ps2_to_atari800 IS
|
||
keyboard_map1 : entity work.ps2_to_atari800
|
||
PORT MAP
|
||
(
|
||
CLK => clk,
|
||
... | ... | |
);
|
||
|
||
-- THROTTLE
|
||
THROTTLE_COUNT_6502 <= to_unsigned(cycle_length-1,6);
|
||
THROTTLE_COUNT_6502 <= std_logic_vector(to_unsigned(cycle_length-1,6));
|
||
|
||
atarixl_simplesdram1 : entity work.atari800_simplesdram
|
||
atarixl_simple_sdram1 : entity work.atari800core_simple_sdram
|
||
GENERIC MAP
|
||
(
|
||
cycle_length => cycle_length,
|
||
internal_rom => 1,
|
||
internal_ram =>internal_ram
|
||
);
|
||
PORT
|
||
)
|
||
PORT MAP
|
||
(
|
||
CLK => CLK,
|
||
RESET_N => RESET_N,
|
||
... | ... | |
|
||
CONSOL_OPTION => CONSOL_OPTION,
|
||
CONSOL_SELECT => CONSOL_SELECT,
|
||
CONSOL_START => CONSOL_START
|
||
CONSOL_START => CONSOL_START,
|
||
|
||
SDRAM_REQUEST => open,
|
||
SDRAM_REQUEST_COMPLETE => '1',
|
common/a8core/atari800core_simple_sdram.vhd | ||
---|---|---|
---------------------------------------------------------------------------
|
||
-- (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.STD_LOGIC_MISC.all;
|
||
use ieee.numeric_std.all;
|
||
|
||
LIBRARY work;
|
||
-- Simple version that:
|
||
-- i) needs: CLK(58 or 28MHZ) SDRAM,joystick,keyboard
|
||
-- ii) provides: VIDEO,AUDIO
|
||
... | ... | |
|
||
-- THIS SHOULD DO FOR ALL PLATFORMS EXCEPT THOSE USING GPIO FOR PBI etc
|
||
|
||
ENTITY atari800core_simplesdram is
|
||
ENTITY atari800core_simple_sdram is
|
||
GENERIC
|
||
(
|
||
-- use CLK of 1.79*cycle_length
|
||
-- I've tested 16 and 32 only, but 4 and 8 might work...
|
||
cycle_length : integer := 16 -- or 32...
|
||
cycle_length : integer := 16; -- or 32...
|
||
|
||
-- For initial port may help to have no
|
||
internal_rom : integer := 1 -- if 0 expects it in sdram,is 1:16k os+basic, is 2:... TODO
|
||
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
|
||
... | ... | |
RAM_SELECT : in std_logic_vector(2 downto 0); -- 64K,128K,320KB Compy, 320KB Rambo, 576K Compy, 576K Rambo, 1088K, 4MB
|
||
ROM_SELECT : in std_logic_vector(5 downto 0); -- 16KB ROM Bank - 0 is illegal (slot used for BASIC!)
|
||
PAL : in STD_LOGIC;
|
||
HALT : in std_logic
|
||
THROTTLE_COUNT_6502 : in std_logic_vector(5 downto 0); -- standard speed is cycle_length-1
|
||
end atari800core_simplesdram;
|
||
HALT : in std_logic;
|
||
THROTTLE_COUNT_6502 : in std_logic_vector(5 downto 0) -- standard speed is cycle_length-1
|
||
);
|
||
end atari800core_simple_sdram;
|
||
|
||
ARCHITECTURE vhdl OF atari800core_simplesdram IS
|
||
ARCHITECTURE vhdl OF atari800core_simple_sdram IS
|
||
-- PIA
|
||
SIGNAL CA1_IN : STD_LOGIC;
|
||
SIGNAL CA2_IN: STD_LOGIC;
|
||
SIGNAL CB1_IN: STD_LOGIC;
|
||
SIGNAL CA2_OUT : STD_LOGIC;
|
||
SIGNAL CA2_DIR_OUT: STD_LOGIC;
|
||
SIGNAL CB2_OUT : STD_LOGIC;
|
||
... | ... | |
SIGNAL CA2_IN: STD_LOGIC;
|
||
SIGNAL CB2_IN: STD_LOGIC;
|
||
SIGNAL PORTA_IN : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
SIGNAL PORTA_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
SIGNAL PORTA_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
SIGNAL PORTB_IN : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
SIGNAL PORTB_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
SIGNAL PORTB_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
|
||
-- GTIA
|
||
signal GTIA_TRIG : std_logic_vector(3 downto 0);
|
||
|
||
-- CARTRIDGE ACCESS
|
||
SIGNAL CART_RD4 : STD_LOGIC;
|
||
SIGNAL CART_RD5 : STD_LOGIC;
|
||
... | ... | |
SIGNAL ROM_REQUEST : STD_LOGIC;
|
||
SIGNAL ROM_REQUEST_COMPLETE : STD_LOGIC;
|
||
|
||
-- CONFIG
|
||
SIGNAL USE_SDRAM : STD_LOGIC;
|
||
SIGNAL ROM_IN_RAM : STD_LOGIC;
|
||
|
||
BEGIN
|
||
|
||
-- PIA mapping
|
||
... | ... | |
PORTA_IN <= ((JOY1_n(3)&JOY1_n(2)&JOY1_n(1)&JOY1_n(0)&JOY2_n(3)&JOY2_n(2)&JOY2_n(1)&JOY2_n(0)) and not (porta_dir_out)) or (porta_dir_out and porta_out);
|
||
PORTB_IN <= PORTB_OUT;
|
||
|
||
-- GTIA triggers
|
||
GTIA_TRIG <= CART_RD5&"1"&JOY1_n(4)&JOY2_n(4);
|
||
|
||
-- Cartridge not inserted
|
||
CART_RD4 <= '0';
|
||
CART_RD5 <= '0';
|
||
... | ... | |
GENERIC MAP
|
||
(
|
||
internal_rom => internal_rom,
|
||
internal_ram => internal_ram,
|
||
);
|
||
internal_ram => internal_ram
|
||
)
|
||
PORT MAP (
|
||
clock => CLK,
|
||
reset_n => RESET_N,
|
||
|
||
ROM_ADDR => ROM_ADDR,
|
||
ROM_REQUEST_COMPLETE => ROM_ADDR_COMPLETE,
|
||
ROM_REQUEST_COMPLETE => ROM_REQUEST_COMPLETE,
|
||
ROM_REQUEST => ROM_REQUEST,
|
||
ROM_DATA => ROM_DO,
|
||
|
||
RAM_ADDR => RAM_ADDR,
|
||
RAM_WR_ENABLE => RAM_WR_ENABLE,
|
||
RAM_WR_ENABLE => RAM_WRITE_ENABLE,
|
||
RAM_DATA_IN => PBI_WRITE_DATA(7 downto 0),
|
||
RAM_REQUEST_COMPLETE => RAM_REQUEST_COMPLETE,
|
||
RAM_REQUEST => RAM_REQUEST,
|
||
RAM_DATA => RAM_DO
|
||
RAM_DATA => RAM_DO(7 downto 0)
|
||
);
|
||
END internalromram;
|
||
|
||
USE_SDRAM <= '1' when internal_ram=0 else '0';
|
||
ROM_IN_RAM <= '1' when internal_rom=0 else '0';
|
||
|
||
atari800xl : entity work.atari800core
|
||
GENERIC MAP
|
||
(
|
||
cycle_length => cycle_length
|
||
);
|
||
)
|
||
PORT MAP
|
||
(
|
||
CLK => CLK,
|
||
RESET_N => RESET_N
|
||
RESET_N => RESET_N,
|
||
|
||
VGA_VS => VGA_VS,
|
||
VGA_HS => VGA_HS,
|
||
... | ... | |
CONSOL_OPTION => CONSOL_OPTION,
|
||
CONSOL_SELECT => CONSOL_SELECT,
|
||
CONSOL_START=> CONSOL_START,
|
||
GTIA_TRIG => GTIA_TRIG,
|
||
|
||
SDRAM_REQUEST => SDRAM_REQUEST,
|
||
SDRAM_REQUEST_COMPLETE => SDRAM_REQUEST_COMPLETE,
|
common/a8core/cpu_65xx_a.vhd | ||
---|---|---|
ninebits := rmwBits;
|
||
end case;
|
||
|
||
if (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then
|
||
if (to_01(opcInfo(aluMode1From to aluMode1To)) = aluModeFlg) then
|
||
varZ := rmwBits(1);
|
||
elsif ninebits(7 downto 0) = X"00" then
|
||
elsif to_01(ninebits(7 downto 0)) = X"00" then
|
||
varZ := '1';
|
||
else
|
||
varZ := '0';
|
||
... | ... | |
null;
|
||
end case;
|
||
|
||
if (opcInfo(aluMode1From to aluMode1To) = aluModeBit)
|
||
or (opcInfo(aluMode1From to aluMode1To) = aluModeFlg) then
|
||
if (to_01(opcInfo(aluMode1From to aluMode1To)) = aluModeBit)
|
||
or (to_01(opcInfo(aluMode1From to aluMode1To)) = aluModeFlg) then
|
||
varN := rmwBits(7);
|
||
else
|
||
varN := nineBits(7);
|
||
end if;
|
||
varC := ninebits(8);
|
||
if opcInfo(aluMode2From to aluMode2To) = aluModeArr then
|
||
if to_01(opcInfo(aluMode2From to aluMode2To)) = aluModeArr then
|
||
varC := aluInput(7);
|
||
varV := aluInput(7) xor aluInput(6);
|
||
end if;
|
||
... | ... | |
nextOpcode <= myNextOpcode;
|
||
end process;
|
||
|
||
nextOpcInfo <= opcodeInfoTable(to_integer(nextOpcode));
|
||
nextOpcInfo <= opcodeInfoTable(to_integer(to_01(nextOpcode)));
|
||
process(clk)
|
||
begin
|
||
if rising_edge(clk) then
|
common/a8core/generic_ram_infer.vhdl | ||
---|---|---|
BEGIN
|
||
IF (clock'event AND clock = '1') THEN
|
||
q<= (others=>'1');
|
||
IF (to_integer(unsigned(address)) < space) THEN
|
||
IF (to_integer(to_01(unsigned(address))) < space) THEN
|
||
IF (we = '1') THEN
|
||
ram_block(to_integer(unsigned(address))) <= data;
|
||
ram_block(to_integer(to_01(unsigned(address)))) <= data;
|
||
END IF;
|
||
q <= ram_block(to_integer(unsigned(address)));
|
||
q <= ram_block(to_integer(to_01(unsigned(address))));
|
||
END IF;
|
||
END IF;
|
||
END PROCESS;
|
common/a8core/internalromram.vhd | ||
---|---|---|
ENTITY internalromram IS
|
||
GENERIC
|
||
(
|
||
internal_rom : integer := 1
|
||
internal_rom : integer := 1;
|
||
internal_ram : integer := 16384
|
||
);
|
||
PORT(
|
||
... | ... | |
end if;
|
||
end process;
|
||
|
||
gen_internal_os : if internal_os==1 generate
|
||
gen_internal_os : if internal_rom=1 generate
|
||
rom16a : os16
|
||
PORT MAP(clock => clock,
|
||
address => rom_addr(13 downto 0),
|
||
... | ... | |
rom_request_complete <= rom_request_reg;
|
||
|
||
end generate;
|
||
gen_no_internal_os : if internal_rom==0 generate
|
||
gen_no_internal_os : if internal_rom=0 generate
|
||
ROM16_data <= (others=>'0');
|
||
|
||
rom_request_compelte <= '0';
|
||
rom_request_complete <= '0';
|
||
end generate;
|
||
|
||
gen_internal_ram: if space>0 generate
|
||
gen_internal_ram: if internal_ram>0 generate
|
||
ramint1 : generic_ram_infer
|
||
generic map
|
||
(
|
||
... | ... | |
);
|
||
ram_request_complete <= ram_request_reg;
|
||
end generate;
|
||
gen_no_internal_ram : if space==0 generate
|
||
gen_no_internal_ram : if internal_ram=0 generate
|
||
ram_request_complete <='0';
|
||
ram_data <= (others=>'1');
|
||
end generate;
|
common/a8core/ps2_to_atari800.vhdl | ||
---|---|---|
KEYBOARD_SCAN : IN STD_LOGIC_VECTOR(5 downto 0);
|
||
KEYBOARD_RESPONSE : OUT STD_LOGIC_VECTOR(1 downto 0);
|
||
|
||
CONSOL_START : STD_LOGIC;
|
||
CONSOL_SELECT : STD_LOGIC;
|
||
CONSOL_OPTION : STD_LOGIC
|
||
CONSOL_START : OUT STD_LOGIC;
|
||
CONSOL_SELECT : OUT STD_LOGIC;
|
||
CONSOL_OPTION : OUT STD_LOGIC
|
||
);
|
||
END ps2_keyboard;
|
||
END ps2_to_atari800;
|
||
|
||
ARCHITECTURE vhdl OF ps2_keyboard IS
|
||
ARCHITECTURE vhdl OF ps2_to_atari800 IS
|
||
signal ps2_keys_next : std_logic_vector(255 downto 0);
|
||
signal ps2_keys_reg : std_logic_vector(255 downto 0);
|
||
|
||
signal key_event : std_logic;
|
||
signal key_value : std_logic_vector(7 downto 0);
|
||
signal key_extended : std_logic;
|
||
signal key_up : std_logic;
|
||
|
||
signal CONSOL_START_INT : std_logic;
|
||
signal CONSOL_SELECT_INT : std_logic;
|
||
signal CONSOL_OPTION_INT : std_logic;
|
||
|
||
signal atari_keyboard : std_logic_vector(63 downto 0);
|
||
SIGNAL SHIFT_PRESSED : STD_LOGIC;
|
||
SIGNAL BREAK_PRESSED : STD_LOGIC;
|
||
SIGNAL CONTROL_PRESSED : STD_LOGIC;
|
||
BEGIN
|
||
keyboard1: ps2_keyboard
|
||
keyboard1: entity work.ps2_keyboard
|
||
PORT MAP
|
||
(
|
||
CLK => CLK,
|
||
... | ... | |
end process;
|
||
|
||
-- map to atari key code
|
||
process(keyboard)
|
||
process(ps2_keys_reg)
|
||
begin
|
||
atari_keyboard <= (others=>'0');
|
||
|
||
shift_pressed <= '0';
|
||
control_pressed <= '0';
|
||
break_pressed <= '0';
|
||
consol_start <= '0';
|
||
consol_select <= '0';
|
||
consol_option <= '0';
|
||
consol_start_int <= '0';
|
||
consol_select_int <= '0';
|
||
consol_option_int <= '0';
|
||
|
||
atari_keyboard(63)<=ps2_keys_regs(X"1C");
|
||
atari_keyboard(21)<=ps2_keys_regs(X"32");
|
||
atari_keyboard(18)<=ps2_keys_regs(X"21");
|
||
atari_keyboard(58)<=ps2_keys_regs(X"23");
|
||
atari_keyboard(42)<=ps2_keys_regs(X"24");
|
||
atari_keyboard(56)<=ps2_keys_regs(X"2B");
|
||
atari_keyboard(61)<=ps2_keys_regs(X"34");
|
||
atari_keyboard(57)<=ps2_keys_regs(X"33");
|
||
atari_keyboard(13)<=ps2_keys_regs(X"43");
|
||
atari_keyboard(1)<=ps2_keys_regs(X"3B");
|
||
atari_keyboard(5)<=ps2_keys_regs(X"42");
|
||
atari_keyboard(0)<=ps2_keys_regs(X"4B");
|
||
atari_keyboard(37)<=ps2_keys_regs(X"3A");
|
||
atari_keyboard(35)<=ps2_keys_regs(X"31");
|
||
atari_keyboard(8)<=ps2_keys_regs(X"44");
|
||
atari_keyboard(10)<=ps2_keys_regs(X"4D");
|
||
atari_keyboard(47)<=ps2_keys_regs(X"15");
|
||
atari_keyboard(40)<=ps2_keys_regs(X"2D");
|
||
atari_keyboard(62)<=ps2_keys_regs(X"1B");
|
||
atari_keyboard(45)<=ps2_keys_regs(X"2C");
|
||
atari_keyboard(11)<=ps2_keys_regs(X"3C");
|
||
atari_keyboard(16)<=ps2_keys_regs(X"2A");
|
||
atari_keyboard(46)<=ps2_keys_regs(X"1D");
|
||
atari_keyboard(22)<=ps2_keys_regs(X"22");
|
||
atari_keyboard(43)<=ps2_keys_regs(X"35");
|
||
atari_keyboard(23)<=ps2_keys_regs(X"1A");
|
||
atari_keyboard(50)<=ps2_keys_regs(X"45");
|
||
atari_keyboard(31)<=ps2_keys_regs(X"16");
|
||
atari_keyboard(30)<=ps2_keys_regs(X"1E");
|
||
atari_keyboard(26)<=ps2_keys_regs(X"26");
|
||
atari_keyboard(24)<=ps2_keys_regs(X"25");
|
||
atari_keyboard(29)<=ps2_keys_regs(X"2E");
|
||
atari_keyboard(27)<=ps2_keys_regs(X"36");
|
||
atari_keyboard(51)<=ps2_keys_regs(X"3D");
|
||
atari_keyboard(53)<=ps2_keys_regs(X"3E");
|
||
atari_keyboard(48)<=ps2_keys_regs(X"46");
|
||
atari_keyboard(17)<=ps2_keys_regs(X"ec");
|
||
atari_keyboard(52)<=ps2_keys_regs(X"66");
|
||
atari_keyboard(28)<=ps2_keys_regs(X"76");
|
||
atari_keyboard(39)<=ps2_keys_regs(X"91");
|
||
atari_keyboard(60)<=ps2_keys_regs(X"58");
|
||
atari_keyboard(44)<=ps2_keys_regs(X"0D");
|
||
atari_keyboard(12)<=ps2_keys_regs(X"5A");
|
||
atari_keyboard(33)<=ps2_keys_regs(X"29");
|
||
atari_keyboard(54)<=ps2_keys_regs(X"4E");
|
||
atari_keyboard(55)<=ps2_keys_regs(X"55");
|
||
atari_keyboard(15)<=ps2_keys_regs(X"5B");
|
||
atari_keyboard(14)<=ps2_keys_regs(X"54");
|
||
atari_keyboard(6)<=ps2_keys_regs(X"52");
|
||
atari_keyboard(7)<=ps2_keys_regs(X"5D");
|
||
atari_keyboard(38)<=ps2_keys_regs(X"4A");
|
||
atari_keyboard(2)<=ps2_keys_regs(X"4C");
|
||
atari_keyboard(32)<=ps2_keys_regs(X"41");
|
||
atari_keyboard(34)<=ps2_keys_regs(X"49");
|
||
atari_keyboard(63)<=ps2_keys_reg(16#1C#);
|
||
atari_keyboard(21)<=ps2_keys_reg(16#32#);
|
||
atari_keyboard(18)<=ps2_keys_reg(16#21#);
|
||
atari_keyboard(58)<=ps2_keys_reg(16#23#);
|
||
atari_keyboard(42)<=ps2_keys_reg(16#24#);
|
||
atari_keyboard(56)<=ps2_keys_reg(16#2B#);
|
||
atari_keyboard(61)<=ps2_keys_reg(16#34#);
|
||
atari_keyboard(57)<=ps2_keys_reg(16#33#);
|
||
atari_keyboard(13)<=ps2_keys_reg(16#43#);
|
||
atari_keyboard(1)<=ps2_keys_reg(16#3B#);
|
||
atari_keyboard(5)<=ps2_keys_reg(16#42#);
|
||
atari_keyboard(0)<=ps2_keys_reg(16#4B#);
|
||
atari_keyboard(37)<=ps2_keys_reg(16#3A#);
|
||
atari_keyboard(35)<=ps2_keys_reg(16#31#);
|
||
atari_keyboard(8)<=ps2_keys_reg(16#44#);
|
||
atari_keyboard(10)<=ps2_keys_reg(16#4D#);
|
||
atari_keyboard(47)<=ps2_keys_reg(16#15#);
|
||
atari_keyboard(40)<=ps2_keys_reg(16#2D#);
|
||
atari_keyboard(62)<=ps2_keys_reg(16#1B#);
|
||
atari_keyboard(45)<=ps2_keys_reg(16#2C#);
|
||
atari_keyboard(11)<=ps2_keys_reg(16#3C#);
|
||
atari_keyboard(16)<=ps2_keys_reg(16#2A#);
|
||
atari_keyboard(46)<=ps2_keys_reg(16#1D#);
|
||
atari_keyboard(22)<=ps2_keys_reg(16#22#);
|
||
atari_keyboard(43)<=ps2_keys_reg(16#35#);
|
||
atari_keyboard(23)<=ps2_keys_reg(16#1A#);
|
||
atari_keyboard(50)<=ps2_keys_reg(16#45#);
|
||
atari_keyboard(31)<=ps2_keys_reg(16#16#);
|
||
atari_keyboard(30)<=ps2_keys_reg(16#1E#);
|
||
atari_keyboard(26)<=ps2_keys_reg(16#26#);
|
||
atari_keyboard(24)<=ps2_keys_reg(16#25#);
|
||
atari_keyboard(29)<=ps2_keys_reg(16#2E#);
|
||
atari_keyboard(27)<=ps2_keys_reg(16#36#);
|
||
atari_keyboard(51)<=ps2_keys_reg(16#3D#);
|
||
atari_keyboard(53)<=ps2_keys_reg(16#3E#);
|
||
atari_keyboard(48)<=ps2_keys_reg(16#46#);
|
||
atari_keyboard(17)<=ps2_keys_reg(16#ec#);
|
||
atari_keyboard(52)<=ps2_keys_reg(16#66#);
|
||
atari_keyboard(28)<=ps2_keys_reg(16#76#);
|
||
atari_keyboard(39)<=ps2_keys_reg(16#91#);
|
||
atari_keyboard(60)<=ps2_keys_reg(16#58#);
|
||
atari_keyboard(44)<=ps2_keys_reg(16#0D#);
|
||
atari_keyboard(12)<=ps2_keys_reg(16#5A#);
|
||
atari_keyboard(33)<=ps2_keys_reg(16#29#);
|
||
atari_keyboard(54)<=ps2_keys_reg(16#4E#);
|
||
atari_keyboard(55)<=ps2_keys_reg(16#55#);
|
||
atari_keyboard(15)<=ps2_keys_reg(16#5B#);
|
||
atari_keyboard(14)<=ps2_keys_reg(16#54#);
|
||
atari_keyboard(6)<=ps2_keys_reg(16#52#);
|
||
atari_keyboard(7)<=ps2_keys_reg(16#5D#);
|
||
atari_keyboard(38)<=ps2_keys_reg(16#4A#);
|
||
atari_keyboard(2)<=ps2_keys_reg(16#4C#);
|
||
atari_keyboard(32)<=ps2_keys_reg(16#41#);
|
||
atari_keyboard(34)<=ps2_keys_reg(16#49#);
|
||
|
||
consol_start<=ps2_keys_regs(X"06");
|
||
consol_select<=ps2_keys_regs(X"04");
|
||
consol_option<=ps2_keys_regs(X"0C");
|
||
shift_pressed<=ps2_keys_regs(X"12") or ps2_keys_regs(X"59");
|
||
control_pressed<=ps2_keys_regs(X"14") or ps2_keys_regs(X"94");
|
||
break_pressed<=ps2_keys_reg(X"77");
|
||
consol_start_int<=ps2_keys_reg(16#06#);
|
||
consol_select_int<=ps2_keys_reg(16#04#);
|
||
consol_option_int<=ps2_keys_reg(16#0C#);
|
||
shift_pressed<=ps2_keys_reg(16#12#) or ps2_keys_reg(16#59#);
|
||
control_pressed<=ps2_keys_reg(16#14#) or ps2_keys_reg(16#94#);
|
||
break_pressed<=ps2_keys_reg(16#77#);
|
||
end process;
|
||
|
||
-- provide results as if we were a grid to pokey...
|
||
... | ... | |
keyboard_response(1) <= '0';
|
||
end if;
|
||
end process;
|
||
|
||
-- outputs
|
||
CONSOL_START <= CONSOL_START_INT;
|
||
CONSOL_SELECT <= CONSOL_SELECT_INT;
|
||
CONSOL_OPTION <= CONSOL_OPTION_INT;
|
||
END vhdl;
|
||
|
common/atari800core_helloworld.cmd | ||
---|---|---|
#onerror {resume}
|
||
# GAME
|
||
#=====================
|
||
#run 18871970 ns
|
||
#isim force add {/replay_tb/uut/tpp2/cpu/dd_s} 11111111 -radix bin -cancel 250 ns
|
||
#run 200 ms
|
common/atari800core_helloworld.wcfg | ||
---|---|---|
<?xml version="1.0" encoding="UTF-8"?>
|
||
<wave_config>
|
||
<wave_state>
|
||
</wave_state>
|
||
<db_ref_list>
|
||
<db_ref path="atari800core_helloworld.wdb" id="1" type="auto">
|
||
<top_modules>
|
||
<top_module name="atari800core_helloworld_tb" />
|
||
<top_module name="attributes" />
|
||
<top_module name="math_real" />
|
||
<top_module name="numeric_std" />
|
||
<top_module name="std_logic_1164" />
|
||
<top_module name="std_logic_arith" />
|
||
<top_module name="std_logic_misc" />
|
||
<top_module name="std_logic_textio" />
|
||
<top_module name="std_logic_unsigned" />
|
||
<top_module name="textio" />
|
||
</top_modules>
|
||
</db_ref>
|
||
</db_ref_list>
|
||
<WVObjectSize size="20" />
|
||
<wvobject fp_name="/atari800core_helloworld_tb/clk_a" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">clk_a</obj_property>
|
||
<obj_property name="ObjectShortName">clk_a</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/cpu6502/di" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">di[7:0]</obj_property>
|
||
<obj_property name="ObjectShortName">di[7:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/cpu6502/a" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">a[15:0]</obj_property>
|
||
<obj_property name="ObjectShortName">a[15:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/cpu6502/reset" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">reset</obj_property>
|
||
<obj_property name="ObjectShortName">reset</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/cpu6502/cpu_enable" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">cpu_enable</obj_property>
|
||
<obj_property name="ObjectShortName">cpu_enable</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/oldcpu_enable" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">oldcpu_enable</obj_property>
|
||
<obj_property name="ObjectShortName">oldcpu_enable</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/cpu_enable_out" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">cpu_enable_out</obj_property>
|
||
<obj_property name="ObjectShortName">cpu_enable_out</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/antic_enable_179" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">antic_enable_179</obj_property>
|
||
<obj_property name="ObjectShortName">antic_enable_179</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/pokey_enable_179" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">pokey_enable_179</obj_property>
|
||
<obj_property name="ObjectShortName">pokey_enable_179</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/pokey1/enable_179" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">enable_179</obj_property>
|
||
<obj_property name="ObjectShortName">enable_179</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/throttle_count_6502" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">throttle_count_6502[5:0]</obj_property>
|
||
<obj_property name="ObjectShortName">throttle_count_6502[5:0]</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/throttle_count_reg" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">throttle_count_reg[5:0]</obj_property>
|
||
<obj_property name="ObjectShortName">throttle_count_reg[5:0]</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/atari800xl/enables/pause_6502" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">pause_6502</obj_property>
|
||
<obj_property name="ObjectShortName">pause_6502</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/reset_n" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">reset_n</obj_property>
|
||
<obj_property name="ObjectShortName">reset_n</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/rom_data" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">rom_data[7:0]</obj_property>
|
||
<obj_property name="ObjectShortName">rom_data[7:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/rom_addr" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">rom_addr[21:0]</obj_property>
|
||
<obj_property name="ObjectShortName">rom_addr[21:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/ram_data_in" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">ram_data_in[7:0]</obj_property>
|
||
<obj_property name="ObjectShortName">ram_data_in[7:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/ram_data" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">ram_data[7:0]</obj_property>
|
||
<obj_property name="ObjectShortName">ram_data[7:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/ram_addr" type="array" db_ref_id="1">
|
||
<obj_property name="ElementShortName">ram_addr[18:0]</obj_property>
|
||
<obj_property name="ObjectShortName">ram_addr[18:0]</obj_property>
|
||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||
</wvobject>
|
||
<wvobject fp_name="/atari800core_helloworld_tb/atari800xl/atarixl_simple_sdram1/internalromram1/ram_wr_enable" type="logic" db_ref_id="1">
|
||
<obj_property name="ElementShortName">ram_wr_enable</obj_property>
|
||
<obj_property name="ObjectShortName">ram_wr_enable</obj_property>
|
||
</wvobject>
|
||
</wave_config>
|
common/simulate.sh | ||
---|---|---|
#!/bin/bash
|
||
|
||
echo "---------------------------------------------------------"
|
||
echo "Use 'simulate -run' to skip compilation stage."
|
||
echo "Use 'simulate -view' to show previous simulation results."
|
||
echo "---------------------------------------------------------"
|
||
|
||
name=atari800core_helloworld
|
||
|
||
|
||
|
||
. /home/markw/fpga/xilinx/14.7/ISE_DS/settings64.sh
|
||
|
||
mkdir -p sim
|
||
pushd sim
|
||
|
||
# if we have a WDB file, we can view it if requested (otherwise we remove it)
|
||
if [ ! -e $name.wdb -o "$1" != "-view" ]; then
|
||
|
||
rm -f $name.wdb
|
||
|
||
# if we have a EXE, we can run it if requested (otherwise we remove it)
|
||
if [ ! -e $name.exe -o "$1" != "-run" ]; then
|
||
|
||
rm -f $name.exe
|
||
|
||
# copy testbench files
|
||
cp -p ../tb/* .
|
||
|
||
# copy source files
|
||
cp `find ../a8core/ -iname "*.vhd"` .
|
||
cp `find ../a8core/ -iname "*.vhdl"` .
|
||
cp `find ../components/ -iname "*.vhd"` .
|
||
cp `find ../components/ -iname "*.vhdl"` .
|
||
|
||
# set up project definition file
|
||
ls *.vhd* | perl -e 'while (<>){s/(.*)/vhdl work $1/;print $_;}' | cat > $name.prj
|
||
echo NumericStdNoWarnings = 1 >> xilinxsim.ini
|
||
|
||
# verbose & no multthreading - fallback in case of problems
|
||
# fuse -v 1 -mt off -incremental -prj %name%.prj -o %name%.exe -t %name%
|
||
|
||
fuse -timeprecision_vhdl 1fs -incremental -prj $name.prj -o $name.exe -t ${name}_tb || exit 1
|
||
# fuse --mt off -prj %name%.prj -o %name%.exe -t %name%_tb
|
||
|
||
# Check for the EXE again, independent of the errorlevel of fuse...
|
||
[ -e $name.exe ] || echo "No simulation executable created"
|
||
|
||
|
||
fi
|
||
|
||
# Open the iSIM GUI and run the simulation
|
||
./$name.exe -gui -f ../$name.cmd -wdb $name.wdb -log $name.log -view ../$name.wcfg || exit 1
|
||
#strace ./$name.exe -gui -f ../$name.cmd -wdb $name.wdb -log $name.log -view ../$name.wcfg >& out
|
||
#./$name.exe -h -log $name.log
|
||
|
||
|
||
else
|
||
|
||
# Only start the viewer on an existing wave configuration (from an old simulation)
|
||
isimgui -view ../$name.wcfg || exit 1
|
||
|
||
fi
|
||
|
||
popd
|
||
common/tb/atari800core_helloworld_tb.vhd | ||
---|---|---|
library ieee;
|
||
use ieee.std_logic_1164.all;
|
||
use ieee.std_logic_unsigned.all;
|
||
use ieee.numeric_std.all;
|
||
use ieee.std_logic_textio.all;
|
||
|
||
library std_developerskit ; -- used for to_string
|
||
-- use std_developerskit.std_iopak.all;
|
||
|
||
entity atari800core_helloworld_tb is
|
||
end;
|
||
|
||
architecture rtl of atari800core_helloworld_tb is
|
||
|
||
constant CLK_A_PERIOD : time := 1 us / (1.79*32);
|
||
|
||
signal VGA_VS : std_logic;
|
||
signal VGA_HS : std_logic;
|
||
|
||
signal VGA_G : std_logic_vector(7 downto 0);
|
||
signal VGA_B : std_logic_vector(7 downto 0);
|
||
signal VGA_R : std_logic_vector(7 downto 0);
|
||
|
||
signal AUDIO_L : std_logic_vector(15 downto 0);
|
||
signal AUDIO_R : std_logic_vector(15 downto 0);
|
||
|
||
signal JOY1_n : std_logic_vector(4 downto 0);
|
||
signal JOY2_n : std_logic_vector(4 downto 0);
|
||
|
||
signal PS2_CLK : std_logic;
|
||
signal PS2_DAT : std_logic;
|
||
|
||
signal CLK_A : std_logic;
|
||
|
||
signal reset_n : std_logic;
|
||
|
||
begin
|
||
p_clk_gen_a : process
|
||
begin
|
||
clk_a <= '1';
|
||
wait for CLK_A_PERIOD/2;
|
||
clk_a <= '0';
|
||
wait for CLK_A_PERIOD - (CLK_A_PERIOD/2 );
|
||
end process;
|
||
|
||
reset_n <= '0', '1' after 1000ns;
|
||
|
||
JOY1_n <= (others=>'1');
|
||
JOY2_n <= (others=>'1');
|
||
|
||
PS2_CLK <= '1';
|
||
PS2_DAT <= '1';
|
||
|
||
atari800xl : entity work.atari800core_helloworld
|
||
GENERIC MAP
|
||
(
|
||
cycle_length => 32,
|
||
internal_ram => 16384
|
||
)
|
||
PORT MAP
|
||
(
|
||
CLK => clk_a,
|
||
RESET_N => reset_n,
|
||
|
||
VGA_VS => vga_vs,
|
||
VGA_HS => vga_hs,
|
||
VGA_B => vga_b,
|
||
VGA_G => vga_g,
|
||
VGA_R => vga_r,
|
||
|
||
AUDIO_L => audio_l,
|
||
AUDIO_R => audio_r,
|
||
|
||
JOY1_n => joy1_n,
|
||
JOY2_n => joy2_n,
|
||
|
||
PS2_CLK => ps2_clk,
|
||
PS2_DAT => ps2_dat,
|
||
|
||
PAL => '1'
|
||
);
|
||
|
||
end rtl;
|
||
|
Also available in: Unified diff
Compiled/ran helloworld in sim. Appears fine...