137 lines
5.3 KiB
VHDL
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;
|