Project

General

Profile

1 markw
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY internalromram IS
3 markw
GENERIC
(
4 markw
internal_rom : integer := 1;
3 markw
internal_ram : integer := 16384
);
1 markw
PORT(
clock : IN STD_LOGIC; --system clock
reset_n : IN STD_LOGIC; --asynchronous reset

ROM_ADDR : in STD_LOGIC_VECTOR(21 downto 0);
803 markw
ROM_WR_ENABLE : in std_logic;
ROM_DATA_IN : in STD_LOGIC_VECTOR(7 downto 0);
1 markw
ROM_REQUEST_COMPLETE : out STD_LOGIC;
ROM_REQUEST : in std_logic;
ROM_DATA : out std_logic_vector(7 downto 0);

RAM_ADDR : in STD_LOGIC_VECTOR(18 downto 0);
RAM_WR_ENABLE : in std_logic;
RAM_DATA_IN : in STD_LOGIC_VECTOR(7 downto 0);
RAM_REQUEST_COMPLETE : out STD_LOGIC;
RAM_REQUEST : in std_logic;
RAM_DATA : out std_logic_vector(7 downto 0)
);
END internalromram;

architecture vhdl of internalromram is
signal rom_request_reg : std_logic;
803 markw
signal rom_request_next : std_logic;
1 markw
signal ram_request_reg : std_logic;
803 markw
signal ram_request_next : std_logic;
1 markw
signal ROM16_DATA : std_logic_vector(7 downto 0);
106 markw
signal ROM8_DATA : std_logic_vector(7 downto 0);
signal ROM2_DATA : std_logic_vector(7 downto 0);
1 markw
signal BASIC_DATA : std_logic_vector(7 downto 0);

321 markw
signal ramwe_temp : std_logic;
803 markw
signal romwe_temp : std_logic;
signal os_romwe_temp : std_logic;
signal basic_romwe_temp : std_logic;
1 markw
begin
process(clock,reset_n)
begin
if (reset_n ='0') then
rom_request_reg <= '0';
ram_request_reg <= '0';
elsif (clock'event and clock='1') then
803 markw
rom_request_reg <= rom_request_next;
ram_request_reg <= ram_request_next;
1 markw
end if;
end process;

178 markw
gen_internal_5200 : if internal_rom=4 generate
-- f000 to ffff (4k)
rom4 : entity work.os_5200
PORT MAP(clock => clock,
address => rom_addr(10 downto 0),
q => ROM_data
);
840 markw
rom_request_next <= rom_request and not(ROM_WR_ENABLE);
178 markw
rom_request_complete <= rom_request_reg;

end generate;

106 markw
gen_internal_os_b : if internal_rom=3 generate
-- d800 to dfff (2k)
rom2 : entity work.os2
PORT MAP(clock => clock,
address => rom_addr(10 downto 0),
q => ROM2_data
);

-- e000 to ffff (8k)
rom10 : entity work.os8
PORT MAP(clock => clock,
address => rom_addr(12 downto 0),
q => ROM8_data
);

process(rom_addr)
begin
case rom_addr(13 downto 11) is
when "011" =>
ROM_DATA <= ROM2_data;
when "100"|"101"|"110"|"111" =>
ROM_DATA <= ROM8_data;
when others=>
ROM_DATA <= x"ff";
end case;
end process;

rom_request_complete <= rom_request_reg;

end generate;

34 markw
gen_internal_os_loop : if internal_rom=2 generate
rom16a : entity work.os16_loop
PORT MAP(clock => clock,
address => rom_addr(13 downto 0),
q => ROM16_data
);

ROM_DATA <= ROM16_DATA;

rom_request_complete <= rom_request_reg;

end generate;

4 markw
gen_internal_os : if internal_rom=1 generate
34 markw
rom16a : entity work.os16
3 markw
PORT MAP(clock => clock,
address => rom_addr(13 downto 0),
803 markw
we => os_romwe_temp,
data => rom_data_in(7 downto 0),
3 markw
q => ROM16_data
);

34 markw
basic1 : entity work.basic
3 markw
PORT MAP(clock => clock,
address => rom_addr(12 downto 0),
803 markw
we => basic_romwe_temp,
data => rom_data_in(7 downto 0),
3 markw
q => BASIC_data
);

803 markw
romwe_temp <= ROM_WR_ENABLE and rom_request;
process(rom16_data,basic_data, rom_addr(15 downto 0),romwe_temp)
1 markw
begin
803 markw
os_romwe_temp <= romwe_temp;
basic_romwe_temp <= '0';

1 markw
ROM_DATA <= ROM16_DATA;
if (rom_addr(15)='1') then
ROM_DATA <= BASIC_DATA;
803 markw
os_romwe_temp <= '0';
basic_romwe_temp <= romwe_temp;
1 markw
end if;
end process;
3 markw
803 markw
rom_request_next <= rom_request and not(ROM_WR_ENABLE);
rom_request_complete <= romwe_temp or rom_request_reg;
1 markw
3 markw
end generate;
273 markw
803 markw
--gen_internal_os_nobasic : if internal_rom=5 generate
-- rom16a : entity work.os16
-- PORT MAP(clock => clock,
-- address => rom_addr(13 downto 0),
-- q => ROM16_data
-- );
--
-- process(rom16_data,basic_data, rom_addr(15 downto 0))
-- begin
-- ROM_DATA <= ROM16_DATA;
-- if (rom_addr(15)='1') then
-- ROM_DATA <= x"FF";
-- end if;
-- end process;
--
-- rom_request_complete <= rom_request_reg;
--
--end generate;
273 markw

4 markw
gen_no_internal_os : if internal_rom=0 generate
3 markw
ROM16_data <= (others=>'0');

4 markw
rom_request_complete <= '0';
3 markw
end generate;
1 markw
4 markw
gen_internal_ram: if internal_ram>0 generate
321 markw
ramwe_temp <= RAM_WR_ENABLE and ram_request;
34 markw
ramint1 : entity work.generic_ram_infer
1 markw
generic map
(
3 markw
ADDRESS_WIDTH => 19,
SPACE => internal_ram,
1 markw
DATA_WIDTH =>8
)
PORT MAP(clock => clock,
3 markw
address => ram_addr,
1 markw
data => ram_data_in(7 downto 0),
321 markw
we => ramwe_temp,
3 markw
q => ram_data
1 markw
);
803 markw
ram_request_next <= ram_request and not(RAM_WR_ENABLE);
ram_request_complete <= ramwe_temp or ram_request_reg;
3 markw
end generate;
4 markw
gen_no_internal_ram : if internal_ram=0 generate
42 markw
ram_request_complete <='1';
3 markw
ram_data <= (others=>'1');
end generate;

1 markw
end vhdl;