repo2/common/a8core/internalromram.vhd
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;
|