Refactor depacketizer: enhance state machine logic, improve signal handling, and streamline data processing for better functionality

This commit is contained in:
2025-04-24 13:07:26 +02:00
parent 75fb66e531
commit a5b23940de
2 changed files with 42 additions and 48 deletions

View File

@@ -21,89 +21,83 @@ ENTITY depacketizer IS
m_axis_tready : IN STD_LOGIC;
m_axis_tlast : OUT STD_LOGIC
);
END ENTITY depacketizer;
ARCHITECTURE rtl OF depacketizer IS
TYPE state_type IS (WAITING_HEADER, RECEIVING);
TYPE state_type IS (WAITING_HEADER, RECEIVING, SEND);
SIGNAL state : state_type := WAITING_HEADER;
SIGNAL data_buffer : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL s_axis_tready_int : STD_LOGIC := '1';
SIGNAL m_axis_tvalid_int : STD_LOGIC := '0';
SIGNAL m_axis_tdata_int : STD_LOGIC_VECTOR(7 DOWNTO 0) := (OTHERS => '0');
SIGNAL m_axis_tlast_int : STD_LOGIC := '0';
SIGNAL s_axis_tready_int : STD_LOGIC;
SIGNAL m_axis_tvalid_int : STD_LOGIC;
SIGNAL trigger : STD_LOGIC := '0';
SIGNAL data_buffer : STD_LOGIC_VECTOR(7 DOWNTO 0) := (OTHERS => '0');
SIGNAL data_ready : STD_LOGIC := '0';
BEGIN
s_axis_tready <= s_axis_tready_int;
m_axis_tvalid <= m_axis_tvalid_int;
m_axis_tdata <= m_axis_tdata_int;
m_axis_tlast <= m_axis_tlast_int;
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
IF aresetn = '0' THEN
state <= WAITING_HEADER;
data_buffer <= (OTHERS => '0');
m_axis_tdata <= (OTHERS => '0');
m_axis_tlast <= '0';
s_axis_tready_int <= '0';
m_axis_tdata_int <= (OTHERS => '0');
m_axis_tlast_int <= '0';
s_axis_tready_int <= '1';
m_axis_tvalid_int <= '0';
data_buffer <= (OTHERS => '0');
data_ready <= '0';
ELSE
m_axis_tlast_int <= '0';
-- Default values
m_axis_tlast <= '0';
-- Input data - slave
s_axis_tready_int <= m_axis_tready;
IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
data_buffer <= s_axis_tdata;
END IF;
-- Output data - master
IF m_axis_tready = '1' THEN
m_axis_tvalid_int <= '0';
END IF;
IF trigger = '1' AND (m_axis_tvalid_int = '0' OR m_axis_tready = '1') THEN
m_axis_tvalid_int <= '1';
m_axis_tdata <= data_buffer;
trigger <= '0';
END IF;
-- State machine for depacketization
CASE state IS
WHEN WAITING_HEADER =>
s_axis_tready_int <= '1';
m_axis_tvalid_int <= '0';
data_ready <= '0';
IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
IF data_buffer = STD_LOGIC_VECTOR(to_unsigned(HEADER, 8)) THEN
trigger <= '1';
IF s_axis_tdata = STD_LOGIC_VECTOR(to_unsigned(HEADER, 8)) THEN
state <= RECEIVING;
END IF;
END IF;
WHEN RECEIVING =>
IF s_axis_tvalid = '1' AND s_axis_tready_int = '1' THEN
IF s_axis_tdata = STD_LOGIC_VECTOR(to_unsigned(FOOTER, 8)) THEN
m_axis_tlast <= '1';
state <= WAITING_HEADER;
ELSE
trigger <= '1';
IF data_ready = '1' THEN
m_axis_tdata_int <= data_buffer;
m_axis_tvalid_int <= '1';
IF s_axis_tdata = STD_LOGIC_VECTOR(to_unsigned(FOOTER, 8)) THEN
m_axis_tlast_int <= '1';
state <= WAITING_HEADER;
s_axis_tready_int <= '0';
data_ready <= '0';
ELSE
state <= SEND;
s_axis_tready_int <= '0';
END IF;
END IF;
data_buffer <= s_axis_tdata;
data_ready <= '1';
END IF;
WHEN SEND =>
IF m_axis_tvalid_int = '1' AND m_axis_tready = '1' THEN
m_axis_tvalid_int <= '0';
s_axis_tready_int <= '1';
state <= RECEIVING;
END IF;
END CASE;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE;