diff --git a/trashernet/trashernet_mac.vhd b/trashernet/trashernet_mac.vhd index 1807d03..d3b4b35 100644 --- a/trashernet/trashernet_mac.vhd +++ b/trashernet/trashernet_mac.vhd @@ -166,6 +166,7 @@ begin ); tx_main : process(clk, rst) is + variable more_data : std_logic; begin if rst then mac_out.tx_mac_data_ack <= '0'; @@ -176,6 +177,7 @@ begin elsif rising_edge(clk) then mac_out.tx_mac_data_ack <= '0'; crc_valid <= '0'; + more_data := more_data and mac_in.tx_mac_data_en; -- Latch a short low-pulse on tx_en if phy_out.tx_data_ack then sr <= sr(sr'low + 1 to sr'high) & x"00"; @@ -190,6 +192,7 @@ begin case tx_state is when IDLE => -- Idle + prepare sync header if not phy_out.tx_active and mac_in.tx_mac_data_en then + more_data := '1'; sr(0 to 7) <= byte_vector'(0 to 6 => x"55", 7 => x"D5"); sr_cnt <= 7; tx_state <= HEADER; @@ -206,7 +209,7 @@ begin when DATA => -- Wait for MAC header + transmit payload until tx_mac_data_en goes away if (phy_out.tx_data_ack = '1') and (sr_cnt = 0) then -- MAC Header TX complete - if mac_in.tx_mac_data_en then + if more_data then sr(0) <= mac_in.tx_mac_data; mac_out.tx_mac_data_ack <= '1'; else diff --git a/trashernet/trashernet_phy.vhd b/trashernet/trashernet_phy.vhd index 91ad10b..ab76eea 100644 --- a/trashernet/trashernet_phy.vhd +++ b/trashernet/trashernet_phy.vhd @@ -293,9 +293,8 @@ begin tx_state <= IPG; tx_mode <= OFF; - bit_cnt <= BIT_CNT_MAX_IPG; - bit_stage <= '0'; - phy_out.tx_data_ack <= '1'; -- Notify that the end-of-packet has been accepted + bit_cnt <= BIT_CNT_MAX_IPG; + bit_stage <= '0'; end procedure transmit_ipg; procedure transmit_nlp is @@ -315,6 +314,7 @@ begin variable tx_stb : std_logic; -- Strobe every 50 ns (20 MHz) + variable more_data : std_logic; -- tx_data_en low-latched begin if rst then phy_out.tx_data_ack <= '0'; @@ -326,6 +326,7 @@ begin elsif rising_edge(clk) then phy_out.tx_data_ack <= '0'; + more_data := more_data and phy_in.tx_data_en; -- Latch a short low-pulse on tx_en if tx_stb_cnt = 0 then tx_stb_cnt <= TX_STB_CNT_MAX; @@ -347,6 +348,7 @@ begin when IDLE => if phy_in.tx_data_en then -- New packet to TX transmit_byte; + more_data := '1'; bit_stage <= '1'; tx_stb_cnt <= TX_STB_CNT_MAX; -- resync @@ -366,7 +368,7 @@ begin if (bit_stage = '1') then sr <= '0' & sr(sr'high downto sr'low + 1); if bit_cnt = 0 then - if phy_in.tx_data_en then + if more_data then transmit_byte; else transmit_ipg;