OpenCores
URL https://opencores.org/ocsvn/gigabit_udp_mac/gigabit_udp_mac/trunk

Subversion Repositories gigabit_udp_mac

[/] [gigabit_udp_mac/] [trunk/] [LAN/] [GIGABYTE_LAN_Interface.vhd] - Rev 2

Compare with Previous | Blame | View Log

 
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use IEEE.std_logic_unsigned.all;
use IEEE.STD_LOGIC_ARITH.ALL;
library unisim;
use unisim.vcomponents.all;
 
 
 
 
entity GIGABYTE_LAN_Interface is
generic (
			LAN_Lable                          : string:="LAN_0"; 
			IDELAY_GRP_Str                     : string:="Grp_KED";
			IDELAY_GRP_Str_s               		: string:="<Grp_KED_tx>"; 
			c_udp_tx_src_ip                    : std_logic_vector (31 downto 0):= x"AC1E0101"--x"C0A86403";      --172.30.01.01(FPGA IP Adress)
            -- c_udp_tx_src_port                  : std_logic_vector (15 downto 0):= x"0401";          --UDP Src Port(Value For This Constant is not Importanat)										
            -- c_udp_tx_dst_port                  : std_logic_vector (15 downto 0):= x"0FF5"          --UDP Src Port(Value For This Constant is not Importanat);
 
			);
port(
		clk_125                 : in std_logic;
		clk_200                 : in std_logic;
 
		---------------------------------------------------------------
		o_phy_rstn             : out STD_LOGIC;--Reset to PHY
		rx_mac_aclk            : out  STD_LOGIC ;
        i_reset                : in  STD_LOGIC:='0' ;
        gmii_rx_clk            : in  STD_LOGIC ;
        gmii_tx_clk            : out  STD_LOGIC ;
	-- o_Rgmii_txc             : out std_logic;
    -- o_Rgmii_tx_ctrl         : out std_logic;
	-- o_Rgmii_txd             : out std_logic_vector(4 downto 0);
 
    -- i_Rgmii_rxc             : in  std_logic;
    -- i_Rgmii_rx_ctrl         : in  std_logic;
    -- i_Rgmii_rxd             : in  std_logic_vector(4 downto 0);
 
		o_gmii_tx_en            : out std_logic;
		o_gmii_tx_er         	: out std_logic;
		o_gmii_txd             	: out std_logic_vector(7 downto 0);
 
		i_gmii_rx_dv            : in  std_logic;
		i_gmii_rx_er         	: in  std_logic;
		i_gmii_rxd             : in  std_logic_vector(7 downto 0);
 
		o_mac_tx_tready        : out std_logic;
 
		i_udp_rx_src_ip        : in std_logic_vector(31 downto 0);
		o_udp_rx_src_ip        : out std_logic_vector(31 downto 0);
 
 
		o_mdc                  : out std_logic;
		io_mdio                : inout std_logic;
        ---------------------------------------------------------
        --------------- user ------------------------------------
        o_udp_rx_err_out	      : out std_logic_vector(3 downto 0);
        i_fragment_len            : in    std_logic_vector(16 - 1 downto 0):=x"4000";
        LAN_clk                   : out    std_logic;
        LAN_dout_rdy              : out    std_logic;
        LAN_dout_last             : out    std_logic;
        LAN_dout                  : out    std_logic_vector(8 - 1 downto 0);
        LAN_din_rdy               : in    std_logic;
        LAN_din_last              : in    std_logic;
        LAN_din                   : in    std_logic_vector(8 - 1 downto 0)
 
 
);
end GIGABYTE_LAN_Interface;
 
architecture Behavioral of GIGABYTE_LAN_Interface is
 
 
 
--=========================== Reset Generator ==========================================
component reset_gen 
port
(
    i_clk              : in std_logic;
    i_reset            : in std_logic;
    o_global_reset     : out std_logic;
    o_vector_reset     : out std_logic;
    o_phy_rstn         : out std_logic
 
);
end component;
--======================================================================================
 
 
 
--======================================================================================
component sync_fifo2 
port
(
    rst         : IN STD_LOGIC;
    wr_clk      : IN STD_LOGIC; --Maximum 125MHz
    wr_en       : IN STD_LOGIC;   
    din         : IN STD_LOGIC_VECTOR(10-1 DOWNTO 0); --(last & data)
 
	rd_clk      : IN STD_LOGIC; --Tx_Clk(125MHz)
    rd_en       : IN STD_LOGIC;
    dout        : OUT STD_LOGIC_VECTOR(10-1 DOWNTO 0);
	valid       : OUT STD_LOGIC;
    full        : OUT STD_LOGIC;
    empty       : OUT STD_LOGIC
 
);  
end component;
--======================================================================================
 
 
--================================= Constant ===========================================
--Generate Block Conditional Constants
constant c_GENERATE_PING_MODULE             : boolean  := true;                                  --if Ping Block is not Used,Value is False
constant c_GENERATE_ARP_MODULE              : boolean  := true;                                  --if ARP  Block is not Used,Value is False
constant c_DEFAULT_DST_MAC_ADDR             : std_logic_vector (47 downto 0) := x"F46D04962225"; --if ARP Block is not Used,Copy PC MAC Address to This Value 	
 
 
--Application Layer Data Length
constant c_PACKET_LENGTH                    : std_logic_vector (15 downto 0):= x"05c0";          --1472 (Maximum Application Layer Packet Length)
--constant c_udp_tx_src_ip                    : std_logic_vector (31 downto 0):= x"AC1E0101";--x"C0A86403";      --172.30.01.01(FPGA IP Adress)
--constant c_udp_tx_src_port                  : std_logic_vector (15 downto 0):= x"0401";          --UDP Src Port(Value For This Constant is not Importanat)
constant c_udp_tx_dst_ip                    : std_logic_vector (31 downto 0):= x"AC1E0103";--x"C0A86402";      --172.30.01.03(PC IP Address)
constant c_udp_tx_protocol                  : std_logic_vector (7 downto 0) := x"11";            --UDP Protocol
constant c_udp_tx_src_mac                   : std_logic_vector (47 downto 0):= x"112233445566";  --FPGA MAC Address
constant c_udp_tx_checksum                  : std_logic_vector (15 downto 0):= x"0000";          --UDP Checksum(Value For This Constant is not Importanat)
--constant c_udp_tx_dst_port                  : std_logic_vector (15 downto 0):= x"0FF5";          --UDP Dst Port(Value For This Constant is not Importanat)
 
--ARP Constants
constant c_TIME_OUT_LOOKUP_TABLE_ARP        : std_logic_vector (31 downto 0) := x"9502F900";     --20S(Value/125MHz = 20 )	
constant c_TIME_OUT_WAIT_FOR_ARP_REPLY      : std_logic_vector (31 downto 0) := x"07735940";     --1S	(Value/125MHz = 1 )	
constant c_RE_SEND_ARP_REQUEST              : std_logic_vector (3 downto 0)  := x"A";            --10	
 
 
--IP Constants
constant c_IP_TTL                           : std_logic_vector (7 downto 0)  := x"80";           -- IP Packet Time to live
constant c_IP_BC_ADDR                       : std_logic_vector (31 downto 0) := x"ffffffff";     -- Broadcast IP  Address
constant c_MAC_BC_ADDR                      : std_logic_vector (47 downto 0) := x"ffffffffffff"; -- Broadcast
--========================================================================================
 
 
 
--============================== Signals =================================================
signal  s_Reset_tx_for_eth 	     : std_logic:='0';
signal  s_Reset_rx_for_eth 	     : std_logic:='0';
signal  s_Reset_tx         	     : std_logic:='0';
signal  s_Reset_rx         	     : std_logic:='0';
signal  reset_reg         	     : std_logic_vector(9 downto 0):=(others=>'0');
 
 
signal  s_dout                   : std_logic_vector(7 downto 0):=(others=>'0');
signal  s_dout_valid             : std_logic:='0';
signal  s_dout_last              : std_logic:='0';
 
signal  s_dout1                  : std_logic_vector(7 downto 0):=(others=>'0');
signal  s_dout_valid1            : std_logic:='0';
signal  s_dout_last1             : std_logic:='0';
 
 
signal  s_udp_rx_sigs            : std_logic_vector(10-1 downto 0);
signal  s_udp_sigs               : std_logic_vector(10-1 downto 0);
signal  s_udp_sigs_valid         : std_logic:='0';
 
signal  s_sync_fifo_empty        : std_logic:='1';
signal  s_not_sync_fifo_empty    : std_logic:='0';
 
signal  s_udp_data_in            : std_logic_vector(8-1 downto 0):=(others=>'0');
signal  s_udp_valid_in           : std_logic:='0';
signal  s_udp_last_in            : std_logic:='0';
signal  s_udp_last_in_r          : std_logic:='0';
 
signal  s_udp_rx_dout_last_reset : STD_LOGIC:='0';
signal  s_udp_rx_dout_rdy_r  	 : std_logic:='0';
signal  internal_rst			 : std_logic;
signal  vector_rst			     : std_logic;
 
signal  s_udp_tx_data_len        : std_logic_vector (15 downto 0):= c_PACKET_LENGTH;  --1472 (Maximum Application Layer Packet Length)
signal 	s_udp_tx_start           : std_logic:='0';
signal 	s_udp_tx_ready           : std_logic;
signal  s_udp_tx_din	         : std_logic_vector(7 downto 0);
 
signal 	s_udp_rx_dout            : std_logic_vector(7 downto 0);
signal 	s_udp_rx_dout_rdy        : std_logic;
signal 	s_udp_rx_dout_last       : std_logic;
 
signal 	s_udp_rx_src_ip          : std_logic_vector(31 downto 0);
signal  s_udp_rx_src_port        : std_logic_vector(15 downto 0);
signal  s_udp_rx_dst_port        : std_logic_vector(15 downto 0);
signal  s_udp_rx_data_len        : std_logic_vector(15 downto 0);	
signal 	s_udp_rx_err_out_top     : std_logic_vector(3 downto 0);
signal 	s_udp_tx_err_out_top     : std_logic_vector(3 downto 0);
signal 	s_arp_rx_err_out_top     : std_logic_vector(3 downto 0);
signal  s_ip_rx_dst_ip_top       : std_logic_vector(31 downto 0);
signal  s_ip_rx_err_out_top      : std_logic_vector (3 downto 0);
signal  s_ip_tx_err_out_top      : std_logic_vector (3 downto 0);
signal  s_arp_addr_valid         : std_logic:='0';
 
 
signal  s_rx_clk_out             : std_logic;
signal  s_tx_clk_out             : std_logic;
 
signal  s_tx_fragmantation      : std_logic_vector (15 downto 0):=x"4000";
 
 
 
 
 
--========================================================================================
 
begin
 
o_mdc         <= '0';              
io_mdio       <= '0';   
 
 
o_udp_rx_err_out    <=s_udp_rx_err_out_top;
 
 
 
 
inst_reset_gen: reset_gen 
port map
(
    i_clk                     => clk_125,
    i_reset                   => i_reset,    
    o_global_reset            => internal_rst,
    o_vector_reset            => vector_rst,
    o_phy_rstn                => o_phy_rstn 
);
 
--==========================================================================
s_Reset_tx_for_eth <= internal_rst or s_Reset_tx;
s_Reset_rx_for_eth <= internal_rst or s_Reset_rx;
 
 
 
 
--============================ Ethernet_1g =================================
inst_Ethernet_1g: entity work.Ethernet_1g
generic map(
		 LAN_Lable                      => LAN_Lable,
		 IDELAY_GRP_Str                 => IDELAY_GRP_Str,
		 IDELAY_GRP_Str_s               => IDELAY_GRP_Str_s,
		 g_TIME_OUT_LOOKUP_TABLE_ARP    => c_TIME_OUT_LOOKUP_TABLE_ARP,											
		 g_TIME_OUT_WAIT_FOR_ARP_REPLY	=> c_TIME_OUT_WAIT_FOR_ARP_REPLY,				
		 g_RE_SEND_ARP_REQUEST			=> c_RE_SEND_ARP_REQUEST,
         g_GENERATE_PING_MODULE         => c_GENERATE_PING_MODULE,
         g_GENERATE_ARP_MODULE          => c_GENERATE_ARP_MODULE,
         g_DEFAULT_DST_MAC_ADDR         => c_DEFAULT_DST_MAC_ADDR
 
			)
port map
(
 
	i_clk_125              => clk_125,      --125MHz
	refclk                 => clk_200,   --200MHz
	rx_mac_aclk            =>  rx_mac_aclk ,  
    gmii_rx_clk            =>  gmii_rx_clk ,
    gmii_tx_clk            =>  gmii_tx_clk ,
 
	i_global_reset         => internal_rst, --Active High
	i_vector_reset         => vector_rst, --Active High
	i_Reset_tx             => s_Reset_tx_for_eth,
	i_Reset_rx             => s_Reset_rx_for_eth,
	o_tx_clk_out           => open,   --125MHz
	o_rx_clk_out           => s_rx_clk_out,   --125MHz
 
	--================= UDP ============================
	-- UDP & IP Tx header
	i_udp_tx_src_ip         => c_udp_tx_src_ip,  
	i_udp_tx_dst_ip         => i_udp_rx_src_ip,--c_udp_tx_dst_ip,  
	i_udp_tx_data_len       => s_udp_tx_data_len,
	i_udp_tx_protocol       => c_udp_tx_protocol,
	i_udp_tx_src_mac        => c_udp_tx_src_mac,
	i_udp_tx_checksum       => c_udp_tx_checksum,
	i_udp_tx_src_port       => s_udp_rx_dst_port,--c_udp_tx_src_port,
	i_udp_tx_dst_port       => s_udp_rx_src_port,--c_udp_tx_dst_port,--
	i_ip_tx_fragmantation   => s_tx_fragmantation,    
    i_fragment_len          => i_fragment_len,                    
	-- UDP TX Inpus         
	i_udp_tx_start          => s_udp_tx_start,
	o_udp_tx_ready          => s_udp_tx_ready,
	o_mac_tx_tready          => open,--o_mac_tx_tready,--
	i_udp_tx_din	        => s_udp_tx_din,	
 
	-- UDP RX Outputs
	o_udp_rx_dout           => s_udp_rx_dout,     
	o_udp_rx_dout_rdy       => s_udp_rx_dout_rdy, 
	o_udp_rx_dout_last      => s_udp_rx_dout_last,
 
	-- UDP RX Status Outp   
	o_udp_rx_src_ip         => o_udp_rx_src_ip,  
	o_udp_rx_src_port       => s_udp_rx_src_port,
	o_udp_rx_dst_port       => s_udp_rx_dst_port,
	o_udp_rx_data_len       => s_udp_rx_data_len,
	o_udp_rx_err_out	    => s_udp_rx_err_out_top,
	o_udp_tx_err_out        => s_udp_tx_err_out_top,
	o_arp_rx_err_out        => s_arp_rx_err_out_top,
--	o_ip_rx_fragmantation   => open,--o_ip_rx_fragmantation,
	o_arp_addr_valid        => s_arp_addr_valid,
    -- IP Status
    o_ip_rx_dst_ip          => s_ip_rx_dst_ip_top, 
    o_ip_rx_err_out         => s_ip_rx_err_out_top,
    o_ip_tx_err_out         => s_ip_tx_err_out_top,
 
 
	--=============== PHY ==========================
	-- o_Rgmii_txc             => o_Rgmii_txc,
    -- o_Rgmii_tx_ctrl         => o_Rgmii_tx_ctrl,
    -- o_Rgmii_txd             => o_Rgmii_txd,
 
    -- i_Rgmii_rxc             => i_Rgmii_rxc,
    -- i_Rgmii_rx_ctrl         => i_Rgmii_rx_ctrl,
    -- i_Rgmii_rxd             => i_Rgmii_rxd, 
 
	o_gmii_tx_en  			=>	o_gmii_tx_en  ,  
	o_gmii_tx_er            =>	o_gmii_tx_er  , 
	o_gmii_txd              =>	o_gmii_txd    , 
 
	i_gmii_rx_dv            =>	i_gmii_rx_dv  , 
	i_gmii_rx_er            =>	i_gmii_rx_er  , 
	i_gmii_rxd              =>	i_gmii_rxd    , 
 
	 i_gmii_crs             => '0',    
    i_gmii_col              => '0'
); 
 
 
--=================================================
 
 
 
 
----================================================================================
----process(s_rx_clk_out)
----begin
----if rising_edge(s_rx_clk_out) then
----    s_udp_rx_dout_last_reset <= s_udp_rx_dout_last;
----	if (s_udp_rx_dout_last_reset = '1') then
----	    reset_reg <= (others=>'1');
----	else
----       reset_reg <= reset_reg(8 downto 0) & '0';
----    end if;
----end if;
----end process;	
 
----s_Reset_rx <= reset_reg(9);	
----================================================================================
 
 
 
 
----========================== Recieved UDP Data =================================== 
process(s_rx_clk_out)
begin
if rising_edge(s_rx_clk_out) then  
   s_udp_rx_dout_rdy_r <= s_udp_rx_dout_rdy;
   s_udp_rx_sigs       <= s_udp_rx_dout_last & s_udp_rx_dout_rdy & s_udp_rx_dout;
end if;
end process;	
 
 
 
inst_sync_fifo:  sync_fifo2 
port map
(
    rst         => '0',
    wr_clk      => s_rx_clk_out,
    wr_en       => s_udp_rx_dout_rdy_r,
    din         => s_udp_rx_sigs,
 
	rd_clk      => clk_125,
    rd_en       => s_not_sync_fifo_empty,
    empty       => s_sync_fifo_empty,
    dout        => s_udp_sigs,
    valid       => s_udp_sigs_valid,
    full        => open
 
 
);
 
process(clk_125)
begin
if rising_edge(clk_125) then
   s_not_sync_fifo_empty <= not(s_sync_fifo_empty);
 
	if (s_udp_sigs_valid = '1') then
	    s_udp_data_in    <= s_udp_sigs(7 downto 0);
        s_udp_valid_in   <= s_udp_sigs(8);
        s_udp_last_in    <= s_udp_sigs(9);
	else	 
	     s_udp_data_in    <= (others=>'0');
         s_udp_valid_in   <= '0';
         s_udp_last_in    <= '0';
	end if;	 
 
end if;
end process;
 
----==================================================================================
 
 
	--======================= ping_pong fifo ==========================
	inst_ping_pong_fifo2: entity work.ping_pong_fifo2_KED
		generic map(
			g_PACKET_LENGTH			=> c_PACKET_LENGTH)
		port map (
			i_clk           		=> clk_125,
			i_rst           		=> internal_rst,
 
 
		 -- i_din         			=> s_udp_data_in,
		 -- i_din_valid   			=> s_udp_valid_in,
		 -- i_din_last    			=> s_udp_last_in,
 
			i_din         			=> LAN_din,
			i_din_valid   			=> LAN_din_rdy,
			i_din_last    			=> LAN_din_last,
 
 
			--to UDP
			i_rd_en       			=> s_udp_tx_ready,
			o_dout        			=> s_udp_tx_din,
			o_start_out   			=> s_udp_tx_start,
			o_dout_len   			=> s_udp_tx_data_len,
			o_fragment              => s_tx_fragmantation,
 
			fifo_ready         		=> o_mac_tx_tready,--open,--
			full         			=> open,
			o_wr_cnta    			=> open,
			o_wr_cntb    			=> open);
 
 
	LAN_clk        <= clk_125;
	LAN_dout_rdy   <= s_udp_valid_in;
	LAN_dout_last  <= s_udp_last_in;
	LAN_dout       <= s_udp_data_in;
 
--======================= LAN TX Send Data ==========================
 
 
end Behavioral;
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.