library ieee; use ieee.std_logic_1164.all; entity startstop_condition_detector is port ( clk_i : in std_logic; sda_i : in std_logic; scl_i : in std_logic; start_o : out std_logic; stop_o : out std_logic); end entity startstop_condition_detector; architecture a1 of startstop_condition_detector is -- signal curr_start, curr_stop : std_logic; -- signal next_start, next_stop : std_logic; signal curr_prev_sda, curr_prev_scl : std_logic; signal next_prev_sda, next_prev_scl : std_logic; begin -- architecture a1 -- start_o <= curr_start; -- stop_o <= curr_stop; next_prev_sda <= sda_i; next_prev_scl <= scl_i; start_o <= -- '0' when curr_start = '1' else '1' when curr_prev_sda = '1' and sda_i = '0' and curr_prev_scl = '1' and scl_i = '1' else '0'; stop_o <= -- '0' when curr_stop = '1' else '1' when curr_prev_sda = '0' and sda_i = '1' and curr_prev_scl = '1' and scl_i = '1' else '0'; set_next: process (clk_i) is begin -- process set_next if rising_edge(clk_i) then -- rising clock edge curr_prev_sda <= next_prev_sda; curr_prev_scl <= next_prev_scl; -- curr_start <= next_start; -- curr_stop <= next_stop; end if; end process set_next; end architecture a1;