Files
es-abschlussprojekt/Archiv/Hardware/axi3_slave_verif.vhd
T
2025-01-31 17:47:31 +01:00

137 lines
5.3 KiB
VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity axi3_slave_verif is
generic (
DWIDTH : positive := 32;
IDWIDTH : positive := 1;
MAX_BURSTLEN : positive := 16
);
port (
CLK : in std_logic;
RESETN : in std_logic;
-- AXI Read Address Channel
S_AXI_ARVALID : in std_logic;
S_AXI_ARREADY : out std_logic := '0';
S_AXI_ARADDR : in std_logic_vector(31 downto 0);
S_AXI_ARID : in std_logic_vector(IDWIDTH-1 downto 0);
S_AXI_ARLEN : in std_logic_vector( 3 downto 0);
S_AXI_ARSIZE : in std_logic_vector( 2 downto 0);
S_AXI_ARBURST : in std_logic_vector( 1 downto 0);
-- AXI Read Data Channel
S_AXI_RVALID : out std_logic := '0';
S_AXI_RREADY : in std_logic;
S_AXI_RDATA : out std_logic_vector(DWIDTH-1 downto 0);
S_AXI_RRESP : out std_logic_vector( 1 downto 0);
S_AXI_RID : out std_logic_vector(IDWIDTH-1 downto 0);
S_AXI_RLAST : out std_logic := '0';
-- AXI Write Address Channel
S_AXI_AWVALID : in std_logic;
S_AXI_AWREADY : out std_logic := '0';
S_AXI_AWADDR : in std_logic_vector(31 downto 0);
S_AXI_AWLEN : in std_logic_vector( 3 downto 0);
S_AXI_AWSIZE : in std_logic_vector( 2 downto 0);
S_AXI_AWBURST : in std_logic_vector( 1 downto 0);
-- AXI Write Data Channel
S_AXI_WVALID : in std_logic;
S_AXI_WREADY : out std_logic := '0';
S_AXI_WDATA : in std_logic_vector(DWIDTH-1 downto 0);
S_AXI_WSTRB : in std_logic_vector(DWIDTH/8-1 downto 0);
S_AXI_WLAST : in std_logic;
-- AXI Write Response Channel
S_AXI_BVALID : out std_logic := '0';
S_AXI_BREADY : in std_logic;
S_AXI_BRESP : out std_logic_vector( 1 downto 0)
);
end axi3_slave_verif;
architecture Behavioral of axi3_slave_verif is
type state_type is (IDLE, READ_RESP, WRITE_WAIT, WRITE_RESP_1, WRITE_RESP_2);
signal state : state_type := IDLE;
signal read_addr : std_logic_vector(31 downto 0);
signal write_addr : std_logic_vector(31 downto 0);
begin
process(CLK)
variable burst_count : integer range 0 to MAX_BURSTLEN := 0;
begin
if rising_edge(CLK) then
if RESETN = '0' then
-- Reset aller Signale
state <= IDLE;
S_AXI_ARREADY <= '0';
S_AXI_RVALID <= '0';
S_AXI_AWREADY <= '0';
S_AXI_WREADY <= '0';
S_AXI_BVALID <= '0';
else
case state is
-- IDLE: Warten auf Read oder Write Request
when IDLE =>
S_AXI_ARREADY <= '1';
S_AXI_AWREADY <= '1';
burst_count := to_integer(unsigned(S_AXI_ARLEN)) + 1;
if S_AXI_ARVALID = '1' then
read_addr <= S_AXI_ARADDR;
state <= READ_RESP;
S_AXI_ARREADY <= '0';
elsif S_AXI_AWVALID = '1' then
write_addr <= S_AXI_AWADDR;
state <= WRITE_WAIT;
S_AXI_AWREADY <= '0';
end if;
-- READ RESPONSE Phase
when READ_RESP =>
S_AXI_RVALID <= '1';
S_AXI_RDATA <= std_logic_vector(to_unsigned(burst_count, DWIDTH)); -- Dummy Daten
S_AXI_RRESP <= "00"; -- OKAY response
if S_AXI_RREADY = '1' then
if burst_count > 0 then
if burst_count = 1 then
S_AXI_RLAST <= '1';
end if;
burst_count := burst_count - 1;
else
S_AXI_RVALID <= '0';
S_AXI_RLAST <= '0';
state <= IDLE;
end if;
end if;
-- WRITE WAIT Phase: Daten empfangen
when WRITE_WAIT =>
S_AXI_WREADY <= '1';
if S_AXI_WVALID = '1' then
if S_AXI_WLAST = '1' then
S_AXI_WREADY <= '0';
state <= WRITE_RESP_1;
end if;
end if;
-- WRITE RESPONSE Phase
when WRITE_RESP_1 =>
S_AXI_BVALID <= '1';
S_AXI_BRESP <= "00"; -- OKAY response
state <= WRITE_RESP_2;
when WRITE_RESP_2 =>
if S_AXI_BREADY = '1' then
S_AXI_BVALID <= '0';
state <= IDLE;
end if;
end case;
end if;
end if;
end process;
end Behavioral;