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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.interface/] [eth_lan91c111_ctrl/] [1.0/] [vhd/] [lan91c111_controller.vhd] - Rev 145

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------
-- Title      : LAN91C111 controller
-- Project    : 
-------------------------------------------------------------------------------
-- File       : Originally: DM9kA_controller.vhd
-- Author     : Antti Alhonen
-- Company    : 
-- Last update: 2011-11-08
-- Platform   : 
-------------------------------------------------------------------------------
-- Description: Top level
-------------------------------------------------------------------------------
-- Revisions  :
-- Date        Version  Author  Description
-- 2009/08/24  1.0      niemin95	Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use work.lan91c111_ctrl_pkg.all;
 
 
entity lan91c111_controller is
  generic (
    enable_tx_g  : std_logic := '1';
    enable_rx_g  : std_logic := '1';
    interface_width_g : integer := 16   -- 16 or 32.
    );
 
  port (
    clk               : in    std_logic;
    rst_n             : in    std_logic;
 
    -- interface to LAN91C111
    eth_data_inout    : inout std_logic_vector( lan91_data_width_c-1 downto 0 );
    eth_addr_out      : out   std_logic_vector( lan91_addr_width_c-1 downto 0 );
    eth_interrupt_in  : in    std_logic;
    eth_read_out      : out   std_logic;
    eth_write_out     : out   std_logic;
    eth_nADS_out      : out   std_logic;
    eth_nAEN_out      : out   std_logic;
    eth_nBE_out       : out   std_logic_vector(3 downto 0);
 
    tx_data_in        : in    std_logic_vector( interface_width_g-1 downto 0 );
    tx_data_valid_in  : in    std_logic;
    tx_re_out         : out   std_logic;
    rx_re_in          : in    std_logic;
    rx_data_out       : out   std_logic_vector( interface_width_g-1 downto 0 );
    rx_data_valid_out : out   std_logic;
    target_MAC_in     : in    std_logic_vector( 47 downto 0 );
    new_tx_in         : in    std_logic;
    tx_len_in         : in    std_logic_vector( tx_len_w_c-1 downto 0 );
    tx_frame_type_in  : in    std_logic_vector( 15 downto 0 );
    new_rx_out        : out   std_logic;
    rx_len_out        : out   std_logic_vector( tx_len_w_c-1 downto 0 );
    rx_frame_type_out : out   std_logic_vector( 15 downto 0 );
    rx_erroneous_out  : out   std_logic;
    ready_out         : out   std_logic;
    fatal_error_out   : out   std_logic
    );
 
end lan91c111_controller;
 
 
architecture structural of lan91c111_controller is
 
  signal register_addrs : std_logic_vector( (submodules_c+1) * real_addr_width_c - 1 downto 0 );
  signal config_datas : std_logic_vector( (submodules_c+1) * lan91_data_width_c - 1 downto 0 );
  signal config_nBEs : std_logic_vector( (submodules_c+1) * 4 - 1 downto 0);
  signal read_not_writes : std_logic_vector( submodules_c downto 0 );
  signal configs_valid : std_logic_vector( submodules_c downto 0 );
  signal data_to_submodules : std_logic_vector( lan91_data_width_c-1 downto 0 );
  signal data_to_sb_valid : std_logic;
  signal busy_to_submodules : std_logic;
 
  signal comm_reqs : std_logic_vector( submodules_c-1 downto 0 );
  signal comm_grants : std_logic_vector( submodules_c-1 downto 0 );
 
  signal init_ready : std_logic;
  signal interrupt : std_logic;
 
  signal tx_data_send_comm : std_logic_vector( lan91_data_width_c-1 downto 0 );
  signal tx_data_valid_send_comm : std_logic;
  signal tx_re_comm_send : std_logic;
 
  signal rx_data_comm_read : std_logic_vector( lan91_data_width_c-1 downto 0 );
  signal rx_data_valid_comm_read : std_logic;
  signal rx_re_read_comm : std_logic;
  signal tx_ready_int_send : std_logic;
  signal rx_waiting_int_read : std_logic;
 
  signal rx_data_tmp : std_logic_vector(lan91_data_width_c-1 downto 0);
 
 
-------------------------------------------------------------------------------
begin  -- structural
-------------------------------------------------------------------------------
 
  assert enable_rx_g = '1' or enable_tx_g = '1' report "You probably want to enable at least either tx or rx..." severity failure;
  assert interface_width_g = 32 or interface_width_g = 16 report "Data interface width has to be 32 or 16" severity failure;
 
  comm_module: entity work.lan91c111_comm_module
    port map (
        clk                    => clk,
        rst_n                  => rst_n,
        comm_requests_in       => comm_reqs,
        comm_grants_out        => comm_grants,
        interrupt_out          => interrupt,
        init_ready_in          => init_ready,
        register_addrs_in      => register_addrs,
        config_datas_in        => config_datas,
        config_nBEs_in         => config_nBEs,
        read_not_write_in      => read_not_writes,
        configs_valid_in       => configs_valid,
        data_to_submodules_out => data_to_submodules,
        data_to_sb_valid_out   => data_to_sb_valid,
        busy_to_submodules_out => busy_to_submodules,
        eth_data_inout         => eth_data_inout,
        eth_addr_out           => eth_addr_out,
        eth_interrupt_in       => eth_interrupt_in,
        eth_read_out           => eth_read_out,
        eth_write_out          => eth_write_out,
        eth_nADS_out           => eth_nADS_out,
        eth_nAEN_out           => eth_nAEN_out,
        eth_nBE_out            => eth_nBE_out
        );
 
  init_module: entity work.lan91c111_init_module
    generic map (
      enable_tx_g => enable_tx_g,
      enable_rx_g => enable_rx_g)
    port map (
        clk                     => clk,
        rst_n                   => rst_n,
        ready_out               => init_ready,
        reg_addr_out            => register_addrs( (submodules_c+1)*real_addr_width_c - 1 downto submodules_c*real_addr_width_c ),
        config_data_out         => config_datas( (submodules_c+1)*lan91_data_width_c - 1 downto submodules_c*lan91_data_width_c ),
        nBE_out                 => config_nBEs( (submodules_c+1)*4 - 1 downto submodules_c*4 ),
        read_not_write_out      => read_not_writes( submodules_c ),
        config_valid_out        => configs_valid( submodules_c ),
        data_from_comm_in       => data_to_submodules,
        data_from_comm_valid_in => data_to_sb_valid,
        comm_busy_in            => busy_to_submodules
        );
 
  ready_out <= init_ready;
 
 
  enable_tx: if enable_tx_g = '1' generate
 
    tx_if_32bit: if interface_width_g = 32 generate
      send_module: entity work.lan91c111_send_module
        generic map (
          mode_16bit_g => 0)
        port map (
          clk                     => clk,
          rst_n                   => rst_n,
          tx_completed_in         => tx_ready_int_send,
          comm_req_out            => comm_reqs(2),
          comm_grant_in           => comm_grants(2),
          reg_addr_out            => register_addrs( 3*real_addr_width_c-1 downto 2*real_addr_width_c ),
          config_data_out         => config_datas( 3*lan91_data_width_c-1 downto 2*lan91_data_width_c ),
          config_nBE_out          => config_nBEs( 3*4-1 downto 2*4 ),
          read_not_write_out      => read_not_writes(2),
          config_valid_out        => configs_valid(2),
          data_from_comm_in       => data_to_submodules,
          data_from_comm_valid_in => data_to_sb_valid,
          comm_busy_in            => busy_to_submodules,
          tx_data_in              => tx_data_in,
          tx_data_valid_in        => tx_data_valid_in,
          tx_re_out               => tx_re_out,
          tx_MAC_addr_in          => target_MAC_in,
          new_tx_in               => new_tx_in,
          tx_len_in               => tx_len_in,
          tx_frame_type_in        => tx_frame_type_in
          );           
    end generate tx_if_32bit;
 
    tx_if_16bit: if interface_width_g = 16 generate
      send_module: entity work.lan91c111_send_module
        generic map (
          mode_16bit_g => 1)
        port map (
          clk                     => clk,
          rst_n                   => rst_n,
          tx_completed_in         => tx_ready_int_send,
          comm_req_out            => comm_reqs(2),
          comm_grant_in           => comm_grants(2),
          reg_addr_out            => register_addrs( 3*real_addr_width_c-1 downto 2*real_addr_width_c ),
          config_data_out         => config_datas( 3*lan91_data_width_c-1 downto 2*lan91_data_width_c ),
          config_nBE_out          => config_nBEs( 3*4-1 downto 2*4 ),
          read_not_write_out      => read_not_writes(2),
          config_valid_out        => configs_valid(2),
          data_from_comm_in       => data_to_submodules,
          data_from_comm_valid_in => data_to_sb_valid,
          comm_busy_in            => busy_to_submodules,
          tx_data_in              => x"0000" & tx_data_in,
          tx_data_valid_in        => tx_data_valid_in,
          tx_re_out               => tx_re_out,
          tx_MAC_addr_in          => target_MAC_in,
          new_tx_in               => new_tx_in,
          tx_len_in               => tx_len_in,
          tx_frame_type_in        => tx_frame_type_in
          );           
    end generate tx_if_16bit;
 
 
  end generate enable_tx;
 
  disable_tx: if enable_tx_g = '0' generate
    comm_reqs(2) <= '0';
  end generate disable_tx;
 
  int_handler_module: entity work.lan91c111_interrupt_handler
    port map (
        clk                     => clk,
        rst_n                   => rst_n,
        interrupt_in            => eth_interrupt_in,
        comm_req_out            => comm_reqs(0),
        comm_grant_in           => comm_grants(0),
        rx_waiting_out          => rx_waiting_int_read,
        tx_ready_out            => tx_ready_int_send,
        reg_addr_out            => register_addrs( real_addr_width_c-1 downto 0 ),
        config_data_out         => config_datas( lan91_data_width_c-1 downto 0 ),
        config_nBE_out          => config_nBEs( 3 downto 0 ),
        read_not_write_out      => read_not_writes(0),
        config_valid_out        => configs_valid(0),
        data_from_comm_in       => data_to_submodules,
        data_from_comm_valid_in => data_to_sb_valid,
        comm_busy_in            => busy_to_submodules
        );
 
  enable_rx: if enable_rx_g = '1' generate
 
    rx_if_32bit: if interface_width_g = 32 generate
      read_module: entity work.lan91c111_read_module
        generic map (
          mode_16bit_g => 0)
        port map (
          clk                     => clk,
          rst_n                   => rst_n,
          rx_waiting_in           => rx_waiting_int_read,
          reg_addr_out            => register_addrs( 2*real_addr_width_c-1 downto real_addr_width_c ),
          config_data_out         => config_datas( 2*lan91_data_width_c-1 downto lan91_data_width_c ),
          nBE_out                 => config_nBEs( 2*4-1 downto 4),
          read_not_write_out      => read_not_writes(1),
          config_valid_out        => configs_valid(1),
          data_from_comm_in       => data_to_submodules,
          data_from_comm_valid_in => data_to_sb_valid,
          comm_busy_in            => busy_to_submodules,
          comm_req_out            => comm_reqs(1),
          comm_grant_in           => comm_grants(1),
          rx_data_out             => rx_data_out,
          rx_data_valid_out       => rx_data_valid_out,
          rx_re_in                => rx_re_in,
          new_rx_out              => new_rx_out,
          rx_len_out              => rx_len_out,
          frame_type_out          => rx_frame_type_out,
          rx_erroneous_out        => rx_erroneous_out,
          fatal_error_out         => fatal_error_out
          );     
    end generate rx_if_32bit;
 
    rx_if_16bit: if interface_width_g = 16 generate
      read_module: entity work.lan91c111_read_module
        generic map (
          mode_16bit_g => 1)
        port map (
          clk                     => clk,
          rst_n                   => rst_n,
          rx_waiting_in           => rx_waiting_int_read,
          reg_addr_out            => register_addrs( 2*real_addr_width_c-1 downto real_addr_width_c ),
          config_data_out         => config_datas( 2*lan91_data_width_c-1 downto lan91_data_width_c ),
          nBE_out                 => config_nBEs( 2*4-1 downto 4),
          read_not_write_out      => read_not_writes(1),
          config_valid_out        => configs_valid(1),
          data_from_comm_in       => data_to_submodules,
          data_from_comm_valid_in => data_to_sb_valid,
          comm_busy_in            => busy_to_submodules,
          comm_req_out            => comm_reqs(1),
          comm_grant_in           => comm_grants(1),
          rx_data_out             => rx_data_tmp,
          rx_data_valid_out       => rx_data_valid_out,
          rx_re_in                => rx_re_in,
          new_rx_out              => new_rx_out,
          rx_len_out              => rx_len_out,
          frame_type_out          => rx_frame_type_out,
          rx_erroneous_out        => rx_erroneous_out,
          fatal_error_out         => fatal_error_out
          );
          rx_data_out <= rx_data_tmp(15 downto 0);
    end generate rx_if_16bit;
 
  end generate enable_rx;
 
  disable_rx: if enable_rx_g = '0' generate
    comm_reqs(1) <= '0';
  end generate disable_rx;
 
end structural;
 

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.