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

Subversion Repositories esoc

[/] [esoc/] [trunk/] [Sources/] [logixa/] [esoc_port_processor.vhd] - Rev 42

Go to most recent revision | Compare with Previous | Blame | View Log

--------------------------------------------------------------------------------
----                                                                        ----
---- Ethernet Switch on Configurable Logic IP Core                          ----
----                                                                        ----
---- This file is part of the ESoCL project                                 ----
---- http://www.opencores.org/cores/esoc/                                   ----
----                                                                        ----
---- Description: see design description ESoCL_dd_71022001.pdf              ----
----                                                                        ----
---- To Do: see roadmap description ESoCL_dd_71022001.pdf                   ----
----        and/or release bulleting ESoCL_rb_71022001.pdf                  ----
----                                                                        ----
---- Author(s): L.Maarsen                                                   ----
---- Bert Maarsen, lmaarsen@opencores.org                                   ----
----                                                                        ----
--------------------------------------------------------------------------------
----                                                                        ----
---- Copyright (C) 2009 Authors and OPENCORES.ORG                           ----
----                                                                        ----
---- This source file may be used and distributed without                   ----
---- restriction provided that this copyright statement is not              ----
---- removed from the file and that any derivative work contains            ----
---- the original copyright notice and the associated disclaimer.           ----
----                                                                        ----
---- This source file is free software; you can redistribute it             ----
---- and/or modify it under the terms of the GNU Lesser General             ----
---- Public License as published by the Free Software Foundation;           ----
---- either version 2.1 of the License, or (at your option) any             ----
---- later version.                                                         ----
----                                                                        ----
---- This source is distributed in the hope that it will be                 ----
---- useful, but WITHOUT ANY WARRANTY; without even the implied             ----
---- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR                ----
---- PURPOSE. See the GNU Lesser General Public License for more            ----
---- details.                                                               ----
----                                                                        ----
---- You should have received a copy of the GNU Lesser General              ----
---- Public License along with this source; if not, download it             ----
---- from http://www.opencores.org/lgpl.shtml                               ----
----                                                                        ----
--------------------------------------------------------------------------------
-- Object        : Entity work.esoc_port_processor
-- Last modified : Mon Apr 14 12:49:21 2014.
--------------------------------------------------------------------------------
 
 
 
library ieee, std, work;
use ieee.std_logic_1164.all;
use std.textio.all;
use ieee.numeric_std.all;
use work.package_esoc_configuration.all;
 
entity esoc_port_processor is
  generic(
    esoc_port_nr : integer := 0);
  port(
    clk_control          : in     std_logic;
    clk_data             : in     std_logic;
    clk_search           : in     std_logic;
    ctrl_address         : in     std_logic_vector(15 downto 0);
    ctrl_rd              : in     std_logic;
    ctrl_rddata          : out    std_logic_vector(31 downto 0);
    ctrl_wait            : out    std_logic;
    ctrl_wr              : in     std_logic;
    ctrl_wrdata          : in     std_logic_vector(31 downto 0);
    data                 : inout  std_logic_vector(63 downto 0);
    data_eof             : inout  std_logic;
    data_gnt_rd          : in     std_logic;
    data_gnt_wr          : in     std_logic;
    data_port_sel        : inout  std_logic_vector(esoc_port_count-1 downto 0);
    data_req             : out    std_logic;
    data_sof             : inout  std_logic;
    inbound_data         : in     std_logic_vector(63 downto 0);
    inbound_data_full    : in     std_logic;
    inbound_data_read    : out    std_logic;
    inbound_header       : in     std_logic_vector(111 downto 0);
    inbound_header_empty : in     std_logic;
    inbound_header_read  : out    std_logic;
    inbound_info         : in     std_logic_vector(31 downto 0);
    inbound_info_empty   : in     std_logic;
    inbound_info_read    : out    std_logic;
    outbound_data        : out    std_logic_vector(63 downto 0);
    outbound_data_full   : in     std_logic;
    outbound_data_write  : out    std_logic;
    outbound_info        : out    std_logic_vector(15 downto 0);
    outbound_info_write  : out    std_logic;
    reset                : in     std_logic;
    search_eof           : out    std_logic;
    search_gnt_wr        : in     std_logic;
    search_key           : out    std_logic_vector(63 downto 0);
    search_req           : out    std_logic;
    search_result        : in     std_logic_vector(esoc_port_count-1 downto 0);
    search_result_av     : in     std_logic;
    search_sof           : out    std_logic);
end entity esoc_port_processor;
 
--------------------------------------------------------------------------------
-- Object        : Architecture work.esoc_port_processor.structure
-- Last modified : Mon Apr 14 12:49:21 2014.
--------------------------------------------------------------------------------
 
architecture structure of esoc_port_processor is
 
  signal Net_0               : STD_LOGIC;
  signal Net_1               : STD_LOGIC_VECTOR(15 downto 0);
  signal rdempty             : STD_LOGIC;
  signal Net_2               : STD_LOGIC;
  signal q_a                 : STD_LOGIC_VECTOR(0 downto 0);
  signal outbound_drop_cnt   : std_logic;
  signal outbound_done_cnt   : std_logic;
  signal search_done_cnt     : std_logic;
  signal inbound_done_cnt    : std_logic;
  signal inbound_drop_cnt    : std_logic;
  signal ctrl_vlan_id        : std_logic_vector(11 downto 0);
  signal ctrl_vlan_id_member : std_logic_vector(0 downto 0);
  signal outbound_vlan_id    : STD_LOGIC_VECTOR(11 downto 0);
  signal ctrl_vlan_id_wr     : std_logic;
  signal q_b                 : STD_LOGIC_VECTOR(0 downto 0);
  signal search_data         : STD_LOGIC_VECTOR(15 downto 0);
  signal u4_q_b              : STD_LOGIC_VECTOR(0 downto 0);
  signal search_drop_cnt     : std_logic;
 
  component esoc_port_processor_search
    generic(
      esoc_port_nr : integer := 0);
    port(
      clk_search           : in     std_logic;
      inbound_header       : in     std_logic_vector(111 downto 0);
      inbound_header_empty : in     std_logic;
      inbound_header_read  : out    std_logic;
      inbound_vlan_member  : in     STD_LOGIC_VECTOR(0 downto 0);
      reset                : in     std_logic;
      search_data          : out    STD_LOGIC_VECTOR(15 downto 0);
      search_done_cnt      : out    std_logic;
      search_drop_cnt      : out    std_logic;
      search_eof           : out    std_logic;
      search_gnt_wr        : in     std_logic;
      search_key           : out    std_logic_vector(63 downto 0);
      search_req           : out    std_logic;
      search_result        : in     std_logic_vector(esoc_port_count-1 downto 0);
      search_result_av     : in     std_logic;
      search_sof           : out    std_logic;
      search_write         : out    STD_LOGIC);
  end component esoc_port_processor_search;
 
  component esoc_port_processor_inbound
    generic(
      esoc_port_nr : integer := 0);
    port(
      clk_data           : in     std_logic;
      data               : inout  std_logic_vector(63 downto 0);
      data_eof           : inout  std_logic;
      data_gnt_wr        : in     std_logic;
      data_port_sel      : inout  std_logic_vector(esoc_port_count-1 downto 0);
      data_req           : out    std_logic;
      data_sof           : inout  std_logic;
      inbound_data       : in     std_logic_vector(63 downto 0);
      inbound_data_full  : in     std_logic;
      inbound_data_read  : out    std_logic;
      inbound_done_cnt   : out    std_logic;
      inbound_drop_cnt   : out    std_logic;
      inbound_info       : in     std_logic_vector(31 downto 0);
      inbound_info_empty : in     std_logic;
      inbound_info_read  : out    std_logic;
      reset              : in     std_logic;
      search_data        : in     STD_LOGIC_VECTOR(15 downto 0);
      search_empty       : in     STD_LOGIC;
      search_read        : out    STD_LOGIC);
  end component esoc_port_processor_inbound;
 
  component esoc_port_processor_outbound
    generic(
      esoc_port_nr : integer := 0);
    port(
      clk_data             : in     std_logic;
      data                 : in     std_logic_vector(63 downto 0);
      data_eof             : in     std_logic;
      data_gnt_rd          : in     std_logic;
      data_port_sel        : in     std_logic_vector(esoc_port_count-1 downto 0);
      data_sof             : in     std_logic;
      outbound_data        : out    std_logic_vector(63 downto 0);
      outbound_data_full   : in     std_logic;
      outbound_data_write  : out    std_logic;
      outbound_done_cnt    : out    std_logic;
      outbound_drop_cnt    : out    std_logic;
      outbound_info        : out    std_logic_vector(15 downto 0);
      outbound_info_write  : out    std_logic;
      outbound_vlan_id     : out    STD_LOGIC_VECTOR(11 downto 0);
      outbound_vlan_member : in     STD_LOGIC_VECTOR(0 downto 0);
      reset                : in     std_logic);
  end component esoc_port_processor_outbound;
 
  component esoc_port_processor_control
    generic(
      esoc_port_nr : integer := 0);
    port(
      clk_control             : in     std_logic;
      clk_data                : in     std_logic;
      clk_search              : in     std_logic;
      ctrl_address            : in     std_logic_vector(15 downto 0);
      ctrl_rd                 : in     std_logic;
      ctrl_rddata             : out    std_logic_vector(31 downto 0);
      ctrl_vlan_id            : out    std_logic_vector(11 downto 0);
      ctrl_vlan_id_member_in  : in     std_logic_vector(0 downto 0);
      ctrl_vlan_id_member_out : out    std_logic_vector(0 downto 0);
      ctrl_vlan_id_wr         : out    std_logic;
      ctrl_wait               : out    std_logic;
      ctrl_wr                 : in     std_logic;
      ctrl_wrdata             : in     std_logic_vector(31 downto 0);
      inbound_done_cnt        : in     std_logic;
      inbound_drop_cnt        : in     std_logic;
      outbound_done_cnt       : in     std_logic;
      outbound_drop_cnt       : in     std_logic;
      reset                   : in     STD_LOGIC := '0';
      search_done_cnt         : in     std_logic;
      search_drop_cnt         : in     std_logic);
  end component esoc_port_processor_control;
 
  component esoc_fifo_256x16
    port(
      aclr    : in     STD_LOGIC := '0';
      data    : in     STD_LOGIC_VECTOR(15 downto 0);
      rdclk   : in     STD_LOGIC;
      rdreq   : in     STD_LOGIC;
      wrclk   : in     STD_LOGIC;
      wrreq   : in     STD_LOGIC;
      q       : out    STD_LOGIC_VECTOR(15 downto 0);
      rdempty : out    STD_LOGIC;
      rdusedw : out    STD_LOGIC_VECTOR(7 downto 0);
      wrfull  : out    STD_LOGIC;
      wrusedw : out    STD_LOGIC_VECTOR(7 downto 0));
  end component esoc_fifo_256x16;
 
  component esoc_ram_4kx1
    port(
      address_a : in     STD_LOGIC_VECTOR(11 downto 0);
      address_b : in     STD_LOGIC_VECTOR(11 downto 0);
      clock_a   : in     STD_LOGIC := '1';
      clock_b   : in     STD_LOGIC;
      data_a    : in     STD_LOGIC_VECTOR(0 downto 0);
      data_b    : in     STD_LOGIC_VECTOR(0 downto 0);
      wren_a    : in     STD_LOGIC := '0';
      wren_b    : in     STD_LOGIC := '0';
      q_a       : out    STD_LOGIC_VECTOR(0 downto 0);
      q_b       : out    STD_LOGIC_VECTOR(0 downto 0);
      rden_a    : in     STD_LOGIC := '1';
      rden_b    : in     STD_LOGIC := '1');
  end component esoc_ram_4kx1;
 
begin
  --Search Engine Control
  --Inbound Control - port to switch core
  --Outbound Control - port to switch core
  --Search Result FIFO
  --VLAN Member Table
  --Port Processor Control
  --VLAN Member Table
  u0: esoc_port_processor_search
    generic map(
      esoc_port_nr => esoc_port_nr)
    port map(
      clk_search           => clk_search,
      inbound_header       => inbound_header,
      inbound_header_empty => inbound_header_empty,
      inbound_header_read  => inbound_header_read,
      inbound_vlan_member  => q_a,
      reset                => reset,
      search_data          => search_data,
      search_done_cnt      => search_done_cnt,
      search_drop_cnt      => search_drop_cnt,
      search_eof           => search_eof,
      search_gnt_wr        => search_gnt_wr,
      search_key           => search_key,
      search_req           => search_req,
      search_result        => search_result,
      search_result_av     => search_result_av,
      search_sof           => search_sof,
      search_write         => Net_2);
 
  u1: esoc_port_processor_inbound
    generic map(
      esoc_port_nr => esoc_port_nr)
    port map(
      clk_data           => clk_data,
      data               => data,
      data_eof           => data_eof,
      data_gnt_wr        => data_gnt_wr,
      data_port_sel      => data_port_sel,
      data_req           => data_req,
      data_sof           => data_sof,
      inbound_data       => inbound_data,
      inbound_data_full  => inbound_data_full,
      inbound_data_read  => inbound_data_read,
      inbound_done_cnt   => inbound_done_cnt,
      inbound_drop_cnt   => inbound_drop_cnt,
      inbound_info       => inbound_info,
      inbound_info_empty => inbound_info_empty,
      inbound_info_read  => inbound_info_read,
      reset              => reset,
      search_data        => Net_1,
      search_empty       => rdempty,
      search_read        => Net_0);
 
  u2: esoc_port_processor_outbound
    generic map(
      esoc_port_nr => esoc_port_nr)
    port map(
      clk_data             => clk_data,
      data                 => data,
      data_eof             => data_eof,
      data_gnt_rd          => data_gnt_rd,
      data_port_sel        => data_port_sel,
      data_sof             => data_sof,
      outbound_data        => outbound_data,
      outbound_data_full   => outbound_data_full,
      outbound_data_write  => outbound_data_write,
      outbound_done_cnt    => outbound_done_cnt,
      outbound_drop_cnt    => outbound_drop_cnt,
      outbound_info        => outbound_info,
      outbound_info_write  => outbound_info_write,
      outbound_vlan_id     => outbound_vlan_id,
      outbound_vlan_member => u4_q_b,
      reset                => reset);
 
  u3: esoc_port_processor_control
    generic map(
      esoc_port_nr => esoc_port_nr)
    port map(
      clk_control             => clk_control,
      clk_data                => clk_data,
      clk_search              => clk_search,
      ctrl_address            => ctrl_address,
      ctrl_rd                 => ctrl_rd,
      ctrl_rddata             => ctrl_rddata,
      ctrl_vlan_id            => ctrl_vlan_id,
      ctrl_vlan_id_member_in  => q_b,
      ctrl_vlan_id_member_out => ctrl_vlan_id_member,
      ctrl_vlan_id_wr         => ctrl_vlan_id_wr,
      ctrl_wait               => ctrl_wait,
      ctrl_wr                 => ctrl_wr,
      ctrl_wrdata             => ctrl_wrdata,
      inbound_done_cnt        => inbound_done_cnt,
      inbound_drop_cnt        => inbound_drop_cnt,
      outbound_done_cnt       => outbound_done_cnt,
      outbound_drop_cnt       => outbound_drop_cnt,
      reset                   => reset,
      search_done_cnt         => search_done_cnt,
      search_drop_cnt         => search_drop_cnt);
 
  u5: esoc_fifo_256x16
    port map(
      aclr    => reset,
      data    => search_data,
      rdclk   => clk_data,
      rdreq   => Net_0,
      wrclk   => clk_search,
      wrreq   => Net_2,
      q       => Net_1,
      rdempty => rdempty,
      rdusedw => open,
      wrfull  => open,
      wrusedw => open);
 
  u6: esoc_ram_4kx1
    port map(
      address_a => inbound_header(esoc_inbound_header_vlan+11 downto esoc_inbound_header_vlan),
      address_b => ctrl_vlan_id,
      clock_a   => clk_search,
      clock_b   => clk_control,
      data_a    => (others => '0'),
      data_b    => ctrl_vlan_id_member,
      wren_a    => '0',
      wren_b    => ctrl_vlan_id_wr,
      q_a       => q_a,
      q_b       => q_b,
      rden_a    => '1',
      rden_b    => '1');
 
  u4: esoc_ram_4kx1
    port map(
      address_a => ctrl_vlan_id,
      address_b => outbound_vlan_id,
      clock_a   => clk_control,
      clock_b   => clk_data,
      data_a    => ctrl_vlan_id_member,
      data_b    => (others => '0'),
      wren_a    => ctrl_vlan_id_wr,
      wren_b    => '0',
      q_a       => open,
      q_b       => u4_q_b,
      rden_a    => '1',
      rden_b    => '1');
 
end architecture structure ; -- of esoc_port_processor
 
 

Go to most recent revision | 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.