diff --git a/lib/emac/src/pkt_gen.vhd b/lib/emac/src/pkt_gen.vhd index 70e606f..8b8ee60 100644 --- a/lib/emac/src/pkt_gen.vhd +++ b/lib/emac/src/pkt_gen.vhd @@ -69,12 +69,13 @@ ARCHITECTURE behavior OF pkt_gen IS signal piso_dout : unsigned(7 downto 0); signal piso_dout_vld : std_logic; signal piso_10mbps_din_rdy : std_logic; + signal tx_en : std_logic; subtype inter_frame_gap_cnt_t is natural; signal inter_frame_gap_cnt : inter_frame_gap_cnt_t; signal inter_frame_gap_rdy : std_logic; - 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_wait, xfer_active, xfer_uncommit, xfer_free); signal xfer_s, xfer_sn : xfer_state_t; type piso_byte_mask_array_t is array (0 to 3) of unsigned (3 downto 0); @@ -157,13 +158,18 @@ xfer_state: xfer_cnt_adv <= '0'; xfer_ptr_adv <= '0'; if mii_fifo_full = '0' then - xfer_sn <= xfer_free; + xfer_sn <= xfer_uncommit; end if; end if; - when xfer_free => + when xfer_uncommit => commit_en <= '1'; - xfer_sn <= xfer_idle; + xfer_sn <= xfer_free; + + when xfer_free => + if inter_frame_gap_rdy = '0' then + xfer_sn <= xfer_idle; + end if; when others => xfer_sn <= xfer_idle; @@ -192,7 +198,7 @@ pkt_params: elsif commit_en = '1' then uniform(seed1, seed2, krand); size := to_unsigned(PKT_SIZE_MIN + natural(real(PKT_SIZE_MAX-PKT_SIZE_MIN)*krand), word_ptr_t'length); - delay := natural(PKT_DLY_MIN + real(PKT_DLY_MAX-PKT_DLY_MIN)*1.0E6*f_sysclk*krand); + delay := natural(1.0E6*f_sysclk*(PKT_DLY_MIN + (PKT_DLY_MAX-PKT_DLY_MIN)*krand)); tx_packets <= tx_packets + 1; tx_bytes <= tx_bytes + to_integer(pkt_nbytes); end if; @@ -208,16 +214,15 @@ pkt_params: ------------------------------------------------------------------ interframe_gap_counter: - process(clk) + process(mii_tx_clk) begin - if rising_edge(clk) then + if rising_edge(mii_tx_clk) then if rst = '1' then inter_frame_gap_rdy <= '1'; - elsif mii_fifo_empty = '0' then + elsif tx_en = '1' then inter_frame_gap_rdy <= '0'; inter_frame_gap_cnt <= pkt_delay; - end if; - if inter_frame_gap_cnt /= 0 then + elsif inter_frame_gap_cnt /= 0 then inter_frame_gap_cnt <= inter_frame_gap_cnt - 1; else inter_frame_gap_rdy <= '1'; @@ -343,12 +348,12 @@ inst_piso_10mbps : entity work.piso din_rdy => piso_10mbps_din_rdy, din_be => "11", din => piso_dout, - dout_vld => mii_tx_en, + dout_vld => tx_en, dout_en => '1', dout => mii_tx(3 downto 0) ); - + mii_tx_en <= tx_en; mii_tx(7 downto 4) <= "0000"; end behavior;