Add Avalon MemoryMapped Interface Wrapper

Add Entity that connects an input and output FWFT_FIFO to a Avalon MM
Interface.
NOTE: The Implementation has no sync process. It relies on all FIFO
Signals being synchronous. (May affect timing closure)
This commit is contained in:
Greek 2021-11-27 17:28:45 +01:00
parent 6e20b8958d
commit 4b194f09c9

83
src/Avalon_MM_wrapper.vhd Normal file
View File

@ -0,0 +1,83 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Avalon_MM_wrapper is
generic (
DATA_WIDTH : integer := 32
);
port (
-- SYSTEM
clk : in std_logic;
reset : in std_logic;
-- AVALON MM INTERFACE
address : in std_logic_vector(1 downto 0);
read : in std_logic;
write : in std_logic;
readdata : out std_logic_vector(DATA_WIDTH-1 downto 0);
writedata : in std_logic_vector(DATA_WIDTH-1 downto 0);
waitrequest : out std_logic;
-- RTPS INPUT
full_ri : in std_logic;
write_ri : out std_logic;
data_ri : out std_logic_vector(DATA_WIDTH-1 downto 0);
-- RTPS OUTPUT
empty_ro : in std_logic;
read_ro : out std_logic;
data_ro : in std_logic_vector(DATA_WIDTH-1 downto 0)
);
end entity;
architecture arch of Avalon_MM_wrapper is
--*****SIGNAl DECLARATION*****
begin
main_prc : process(all)
begin
-- DEFAULT
waitrequest <= '0';
write_ri <= '0';
read_ro <= '0';
readdata <= (others => '0');
data_ri <= (others => '0');
if (reset = '1') then
-- NOTE: To avoid system lockup, an agent device should assert waitrequest when in reset.
waitrequest <= '1';
else
if (write = '1') then
case (to_integer(unsigned(address))) is
when 2 =>
data_ri <= writedata;
if (full_ri = '1') then
-- Stall Avalon MM
waitrequest <= '1';
else
write_ri <= '1';
end if;
when others =>
null;
end case;
elsif (read = '1') then
case (to_integer(unsigned(address))) is
when 0 =>
readdata(0) <= not empty_ro;
when 1 =>
readdata <= data_ro;
if (empty_ro = '1') then
-- Stall Avalon MM
waitrequest <= '1';
else
read_ro <= '1';
end if;
when others =>
null;
end case;
end if;
end if;
end process;
end architecture;