----------------------------------------------------------------------------------
-- Company: 
-- Engineer:    Jason M Blevins
-- 
-- Create Date: 01/05/2026 11:59:12 AM
-- Design Name: 
-- Module Name: eth_flowctrl_rx - behavioral
-- Project Name: 
-- Target Devices: 
-- Tool Versions: 
-- Description: 
-- 
-- Dependencies: 
-- 
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- 
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
--library UNISIM;
--use UNISIM.VComponents.all;

entity eth_flowctrl_rx is
  Port (
    clk                 : in STD_LOGIC;
    resetn              : in STD_LOGIC;
    rx_pause            : in STD_LOGIC;
    rx_pause_quanta8    : in STD_LOGIC_VECTOR(15 downto 0);
    rx_pause_cnt        : out std_logic_vector(31 downto 0);
    pause               : out STD_LOGIC
    );
end eth_flowctrl_rx;

architecture behavioral of eth_flowctrl_rx is

  signal pause_r          : std_logic := '0';
  signal cnt_r            : unsigned(15 downto 0) := (others => '0');
  signal rx_pause_cnt_r   : unsigned(31 downto 0) := (others => '0');

begin

  pause         <= pause_r;
  rx_pause_cnt  <= std_logic_vector(rx_pause_cnt_r);

  process(clk)
  begin
    if(rising_edge(clk))then 
      if(resetn = '0')then
        cnt_r           <= (others => '0');
        pause_r         <= '0';
        rx_pause_cnt_r  <= (others => '0');
      else
        if(rx_pause = '1')then
          rx_pause_cnt_r  <= rx_pause_cnt_r +1;
          cnt_r           <= unsigned(rx_pause_quanta8);
          if(unsigned(rx_pause_quanta8) = 0)then
            pause_r <= '0';
          else
            pause_r <= '1';
          end if;
        else
          if(cnt_r > 0)then
            cnt_r <= cnt_r -1;
          end if;
          if(cnt_r = 1)then
            pause_r <= '0';
          end if;
        end if;         
      end if;
    end if;
  end process;


end behavioral;
