diff --git a/trashernet/trashernet_phy.vhd b/trashernet/trashernet_phy.vhd index 694c261..de00ed1 100644 --- a/trashernet/trashernet_phy.vhd +++ b/trashernet/trashernet_phy.vhd @@ -128,7 +128,9 @@ begin -- Bit recovery type demanchestization_state_t is (SYNC, DATA, ERROR); - signal demanchestization_state : demanchestization_state_t; + signal demanchestization_state : demanchestization_state_t; + constant DEMANCHESTIZATION_MIN_SYNC_CNT_MAX : integer := (4 * 8) - 1; -- 4 good sync bytes + signal demanchestization_min_sync_cnt : integer range 0 to DEMANCHESTIZATION_MIN_SYNC_CNT_MAX; begin -- Detects spacing of transitions transition_detector : process(clk, rst) is @@ -200,21 +202,30 @@ begin bit_recovery : process(clk, rst) is begin if rst then - demanchestization_state <= SYNC; - bit_stb <= '0'; - phy_out.rx_active <= '0'; - phy_out.rx_error <= '0'; + demanchestization_state <= SYNC; + bit_stb <= '0'; + phy_out.rx_active <= '0'; + phy_out.rx_error <= '0'; + demanchestization_min_sync_cnt <= DEMANCHESTIZATION_MIN_SYNC_CNT_MAX; elsif rising_edge(clk) then bit_stb <= '0'; phy_out.rx_error <= '0'; + if (bit_ev = TOGGLE) and (demanchestization_min_sync_cnt /= 0) then + demanchestization_min_sync_cnt <= demanchestization_min_sync_cnt - 1; + elsif (bit_ev = KEEP) or (bit_ev = ERROR) then + demanchestization_min_sync_cnt <= DEMANCHESTIZATION_MIN_SYNC_CNT_MAX; + end if; + if (bit_ev /= NONE) then case demanchestization_state is when SYNC => if (bit_ev = KEEP) then - bit_value <= '1'; - demanchestization_state <= DATA; - phy_out.rx_active <= '1'; + if demanchestization_min_sync_cnt = 0 then + bit_value <= '1'; + demanchestization_state <= DATA; + phy_out.rx_active <= '1'; + end if; end if; when DATA => -- @suppress: Condition outside of case allows to exit this state bit_value <= not bit_value when bit_ev = TOGGLE else bit_value; @@ -225,7 +236,7 @@ begin end if; if (bit_ev = ERROR) then - phy_out.rx_error <= '1'; + phy_out.rx_error <= '1' when (demanchestization_state = DATA) else '0'; demanchestization_state <= ERROR; end if;