Files
lt16lab/soc/mem/memwrapper.vhd
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

150 lines
3.3 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.lt16x32_internal.all;
use work.lt16x32_global.all;
use work.wishbone.all;
use work.config.all;
entity memwrapper is
generic(
memaddr : generic_addr_type := CFG_BADR_MEM;
addrmask : generic_mask_type := CFG_MADR_MEM;
filename : string := "program.ram";
size : integer := IMEMSZ
);
port(
clk : in std_logic;
rst : in std_logic;
in_imem : in core_imem;
out_imem : out imem_core;
fault : out std_logic;
--out_byte : out std_logic_vector(7 downto 0);
-- wb master port
wslvi : in wb_slv_in_type;
wslvo : out wb_slv_out_type
);
end entity memwrapper;
architecture RTL of memwrapper is
--//////////////////////////////////////////////////////
-- component
--//////////////////////////////////////////////////////
component memdiv
generic(
filename : in string := "program.ram";
size : in integer := IMEMSZ;
imem_latency : in time := 5 ns;
dmem_latency : in time := 5 ns
);
port(
clk : in std_logic;
rst : in std_logic;
in_dmem : in core_dmem;
out_dmem : out dmem_core;
in_imem : in core_imem;
out_imem : out imem_core;
fault : out std_logic
);
end component;
component mem2wb
generic(
memaddr : generic_addr_type := CFG_BADR_MEM;
addrmask : generic_mask_type := CFG_MADR_MEM
);
port(
clk : in std_logic;
rst : in std_logic;
in_dmem : out core_dmem;
out_dmem : in dmem_core;
wslvi : in wb_slv_in_type;
wslvo : out wb_slv_out_type
);
end component;
--//////////////////////////////////////////////////////
-- signal
--//////////////////////////////////////////////////////
signal outimem : imem_core;
signal in_dmem : core_dmem;
signal out_dmem : dmem_core;
begin
--//////////////////////////////////////////////////////
-- Instantiate
--//////////////////////////////////////////////////////
mem_inst: memdiv
generic map(
filename => filename,
size => size,
imem_latency => 1 ns,
dmem_latency => 1 ns
)
port map(
clk => clk,
rst => rst,
in_dmem => in_dmem,
out_dmem => out_dmem,
in_imem => in_imem,
out_imem => outimem,
fault => fault
);
------------------------------------
-- wb_slv coversion (dmem)
------------------------------------
mem2wb_inst: mem2wb
generic map(
memaddr => memaddr,
addrmask => addrmask
)
port map(
clk => clk,
rst => rst,
in_dmem => in_dmem,
out_dmem => out_dmem,
wslvi => wslvi,
wslvo => wslvo
);
------------------------------------
-- mem ctrl block
out_imem.read_data <= outimem.read_data;
memctrl_reg:process(clk)
begin
if rst = '1' then
out_imem.ready <= '0';
elsif(rising_edge(clk)) then
-- TODO: dmem is going to access in imem data portion : how about write ??, can slv overwrite ins (Read only ) ?
if (in_dmem.read_en = '1' and (to_integer(unsigned(in_dmem.read_addr )) <= IMEMSZ)) or
(in_dmem.write_en = '1' and (to_integer(unsigned(in_dmem.write_addr)) <= IMEMSZ))
then
out_imem.ready <= '0';
else
out_imem.ready <= outimem.ready;
end if;
end if;
end process;
------------------------------------
-- E N D mem ctrl block
------------------------------------
end architecture RTL;