diff --git a/lib/emac/src/emac_rx.vhd b/lib/emac/src/emac_rx.vhd index 80bb0e9..a988f8a 100644 --- a/lib/emac/src/emac_rx.vhd +++ b/lib/emac/src/emac_rx.vhd @@ -54,27 +54,19 @@ ARCHITECTURE behavior OF emac_rx IS signal flush_en : std_logic; signal fill_ptr : word_ptr_t; - signal fill_ptr_set : std_logic; - signal fill_ptr_adv : std_logic; signal commit_en : std_logic; - signal uncommit_en : std_logic; signal xfer_ram_limit : word_ptr_t; signal xfer_ram_full : std_logic; signal xfer_base : word_ptr_t; signal xfer_size : word_ptr_t; signal xfer_ptr : word_ptr_t; - signal xfer_cnt : word_ptr_t; signal xfer_ptr_set : std_logic; signal xfer_ptr_adv : std_logic; signal xfer_cnt_set : std_logic; signal xfer_cnt_adv : std_logic; signal xfer_rdy : std_logic; - signal xfer_tag : unsigned(3 downto 0); - signal xfer_remain : unsigned(1 downto 0); - signal xfer_odd : std_logic; - signal xfer_remain_en : std_logic; signal ram_en_a : std_logic; signal ram_we_a : std_logic; @@ -111,10 +103,10 @@ ARCHITECTURE behavior OF emac_rx IS signal word_count_ack : std_logic; signal word_count_vld : std_logic; - type host_state_t is (host_init, host_flush, host_idle, host_setup, host_arm, host_fill, host_uncommit); + type host_state_t is (host_init, host_flush, host_idle); signal host_s, host_sn : host_state_t; - type xfer_state_t is (xfer_init, xfer_idle, xfer_setup, xfer_wait, xfer_active, xfer_free); + type xfer_state_t is (xfer_init, xfer_idle, xfer_setup, xfer_active, xfer_drop, xfer_free); signal xfer_s, xfer_sn : xfer_state_t; begin @@ -122,7 +114,6 @@ begin ctrl_out.rx_size <= cmd_fifo_dout(31 downto 16); ctrl_out.pkt_avail <= not cmd_fifo_empty; ctrl_out.rx_er <= mii_rx_er; - ctrl_out.pkt_lost <= xfer_ram_full; dout <= ram_dout_a; @@ -137,7 +128,7 @@ begin ram_en_b <= '1'; ram_din_b <= mii_fifo_dout(31 downto 0); ram_addr_b <= xfer_ptr; - ram_we_b <= xfer_cnt_adv; + ram_we_b <= xfer_ptr_adv; cmd_fifo_we <= commit_en; cmd_fifo_re <= ctrl_in.pkt_free_en; @@ -157,12 +148,10 @@ host_state_next: end process; host_state: - process(host_s, cmd_fifo_empty, ctrl_in.pkt_read_en, ctrl_in.pkt_req_en) + process(host_s) begin flush_en <= '0'; - fill_ptr_set <= '0'; - fill_ptr_adv <= '0'; host_sn <= host_s; @@ -177,25 +166,6 @@ host_state: host_sn <= host_idle; when host_idle => - if cmd_fifo_empty = '0' then - host_sn <= host_setup; - end if; - - when host_setup => - fill_ptr_set <= '1'; - host_sn <= host_arm; - - when host_arm => - host_sn <= host_fill; - - when host_fill => - fill_ptr_adv <= ctrl_in.pkt_read_en; - if ctrl_in.pkt_req_en = '1' then - host_sn <= host_uncommit; - end if; - - when host_uncommit => - host_sn <= host_idle; when others => host_sn <= host_idle; @@ -261,23 +231,29 @@ xfer_state: when xfer_setup => xfer_cnt_set <= '1'; xfer_ptr_set <= '1'; - xfer_sn <= xfer_wait; - - when xfer_wait => xfer_sn <= xfer_active; - + when xfer_active => mii_fifo_re <= '1'; xfer_cnt_adv <= not mii_fifo_empty; xfer_ptr_adv <= not mii_fifo_empty; if xfer_ram_full = '1' then - xfer_sn <= xfer_free; + xfer_sn <= xfer_drop; elsif xfer_rdy = '1' then if mii_fifo_empty = '1' then xfer_sn <= xfer_free; end if; end if; + when xfer_drop => + mii_fifo_re <= '1'; + xfer_cnt_adv <= not mii_fifo_empty; + if xfer_rdy = '1' then + if mii_fifo_empty = '1' then + xfer_sn <= xfer_free; + end if; + end if; + when xfer_free => word_count_ack <= '1'; commit_en <= not xfer_ram_full; @@ -290,6 +266,21 @@ xfer_state: end process; ------------------------------------------------------------------ +pkt_lost_register: + process(clk) + begin + if rising_edge(clk) then + if flush_en = '1' then + ctrl_out.pkt_lost <= '0'; + elsif word_count_ack = '1' and xfer_ram_full = '1' then + ctrl_out.pkt_lost <= '1'; + elsif ctrl_in.pkt_free_en = '1' then + ctrl_out.pkt_lost <= '0'; + end if; + end if; + + end process; + xfer_limit_register: process(clk) begin