diff --git a/libraries/io/nw_10GbE/src/vhdl/nw_arp_request.vhd b/libraries/io/nw_10GbE/src/vhdl/nw_arp_request.vhd index 0b1cf79bcdf78a9c2d1a00407bad000069b48014..1aeeb57d843fad84551b8e868d140a2b48a327aa 100644 --- a/libraries/io/nw_10GbE/src/vhdl/nw_arp_request.vhd +++ b/libraries/io/nw_10GbE/src/vhdl/nw_arp_request.vhd @@ -75,8 +75,12 @@ ARCHITECTURE rtl of nw_arp_request IS CONSTANT c_dp_field_blk_snk_data_w : NATURAL := field_slv_len(c_hdr_field_arr); CONSTANT c_dp_field_blk_src_data_w : NATURAL := c_data_w; - SIGNAL pps_cnt : NATURAL := 0; - SIGNAL trigger : BOOLEAN := FALSE; + SIGNAL valid_sha : STD_LOGIC := '0'; + SIGNAL valid_spa : STD_LOGIC := '0'; + SIGNAL valid_tpa : STD_LOGIC := '0'; + SIGNAL valid_arp : STD_LOGIC := '0'; + SIGNAL pps_cnt : NATURAL := 0; + SIGNAL trigger : BOOLEAN := FALSE; SIGNAL dp_field_blk_snk_in : t_dp_sosi := c_dp_sosi_rst; SIGNAL nxt_dp_field_blk_snk_in : t_dp_sosi := c_dp_sosi_rst; @@ -96,33 +100,46 @@ BEGIN nxt_dp_field_blk_snk_in.data(field_hi(c_hdr_field_arr, "arp_spa") DOWNTO field_lo(c_hdr_field_arr, "arp_spa")) <= arp_spa; nxt_dp_field_blk_snk_in.data(field_hi(c_hdr_field_arr, "arp_tpa") DOWNTO field_lo(c_hdr_field_arr, "arp_tpa")) <= arp_tpa; END PROCESS; - + -- pps counter process setting sop, eop and valid p_dp_pps : PROCESS (dp_clk, dp_rst) BEGIN IF dp_rst = '1' THEN + valid_sha <= '0'; + valid_spa <= '0'; + valid_tpa <= '0'; + valid_arp <= '0'; trigger <= FALSE; pps_cnt <= 0; dp_field_blk_snk_in <= c_dp_sosi_rst; ELSIF RISING_EDGE(dp_clk) THEN + -- Use signal to indicate if ARP can be enabled. + valid_sha <= vector_or(arp_sha); + valid_spa <= vector_or(arp_spa); + valid_tpa <= vector_or(arp_tpa); + valid_arp <= valid_sha AND valid_spa AND valid_tpa; + IF valid_arp = '1' THEN + dp_field_blk_snk_in <= nxt_dp_field_blk_snk_in; + IF trigger AND dp_field_blk_snk_out.ready = '1' AND dp_field_blk_snk_out.xon = '1' THEN + trigger <= FALSE; + dp_field_blk_snk_in.sop <= '1'; + dp_field_blk_snk_in.eop <= '1'; + dp_field_blk_snk_in.valid <= '1'; + END IF; - dp_field_blk_snk_in <= nxt_dp_field_blk_snk_in; - IF trigger AND dp_field_blk_snk_out.ready = '1' AND dp_field_blk_snk_out.xon = '1' THEN - trigger <= FALSE; - dp_field_blk_snk_in.sop <= '1'; - dp_field_blk_snk_in.eop <= '1'; - dp_field_blk_snk_in.valid <= '1'; - END IF; - - IF dp_pps = '1' THEN - IF pps_cnt < g_period_s-1 THEN - pps_cnt <= pps_cnt + 1; - ELSE - pps_cnt <= 0; - trigger <= TRUE; + IF dp_pps = '1' THEN + IF pps_cnt < g_period_s-1 THEN + pps_cnt <= pps_cnt + 1; + ELSE + pps_cnt <= 0; + trigger <= TRUE; + END IF; END IF; + ELSE + trigger <= FALSE; + pps_cnt <= 0; + dp_field_blk_snk_in <= c_dp_sosi_rst; END IF; - END IF; END PROCESS;