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

Subversion Repositories loadbalancer

[/] [loadbalancer/] [trunk/] [TABLE/] [table.vhd.bak] - Rev 2

Compare with Previous | Blame | View Log


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;


entity table is
                generic (
                                ADDR_WIDTH :integer := 10);
        port (
                                                SIGNAL  clk                     :       IN std_logic;
                                                SIGNAL  reset           :       IN STD_LOGIC;
                                                SIGNAL  in_mac          :       IN std_logic_VECTOR(47 downto 0);
                                                SIGNAL  in_weight       :       IN std_logic_VECTOR(7 downto 0);
                                                SIGNAL  in_port         :       IN std_logic_VECTOR(7 downto 0);
                                                SIGNAL  in_wr           :       IN std_logic;   
                                                SIGNAL  in_rd           :       IN std_logic;
                                                SIGNAL  in_key : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
--                                              SIGNAL  add             :       out std_logic_vector(11 downto 0);
--                                              SIGNAL  entry           :       OUT std_logic_VECTOR( 63 downto 0);     
--                                              SIGNAL  rdy             :       out std_logic;
--                                              SIGNAL  check           :       out std_logic;
                                                SIGNAL  out_mac         :       OUT std_logic_VECTOR(47 downto 0);
                                                SIGNAL  out_port        :       OUT std_logic_VECTOR(7 downto 0);
                                                SIGNAL  out_rd_rdy      :       OUT std_logic   
        );
end table ;

architecture Behavioral of table is
        TYPE state_type IS(IDLE, START, LATCH_MAC_LOOKUP, CHECK_MAC_MATCH, UPDATE_ENTRY, ADD_ENTRY);
        SIGNAL state, state_next : state_type;

-------COMPONENET SMALL FIFO
        COMPONENT  small_fifo IS
                GENERIC(WIDTH                           :       INTEGER := 64;
                                MAX_DEPTH_BITS          :       INTEGER := 5);
                PORT(
                                         SIGNAL din             :       IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);--input 
                                         SIGNAL wr_en           :       IN STD_LOGIC;--input          
                                         SIGNAL rd_en           :       IN STD_LOGIC;--input          
                                         SIGNAL dout            :       OUT STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0);--output 
                                         SIGNAL full            :       OUT STD_LOGIC;--output         
                                         SIGNAL nearly_full :   OUT STD_LOGIC;--output         
                                         SIGNAL empty           :       OUT STD_LOGIC;--output         
                                         SIGNAL reset           :       IN STD_LOGIC;
                                         SIGNAL clk             :       IN STD_LOGIC

                );
        END COMPONENT;
-------COMPONENET SMALL FIFO
                COMPONENT  mac_ram_table is
                generic (
                                ADDR_WIDTH :integer := ADDR_WIDTH
                                );
                        port (
                                        SIGNAL          clk: IN std_logic;
                                        SIGNAL          reset : IN STD_LOGIC;
                                        SIGNAL          in_mac_no_prt: IN std_logic_VECTOR(63 downto 0);--MAC NUMBER internal port
                                        SIGNAL          in_address   : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
                                        SIGNAL          in_wr: IN std_logic;
                                        SIGNAL          in_check : IN STD_LOGIC;
                                        SIGNAL          match_address : OUT STD_LOGIC_VECTOR(9 DOWNTO 0);
                                        SIGNAL          match:  OUT STD_LOGIC;
                                        SIGNAL          unmatch:  OUT STD_LOGIC;
                                        SIGNAL          in_rd : IN STD_LOGIC;
                                        SIGNAL          in_key : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
                                        SIGNAL          last_address : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
                                        SIGNAL          out_rd_rdy : OUT std_logic;
                                        SIGNAL          out_port : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
                                        SIGNAL          out_mac : OUT STD_LOGIC_VECTOR(47 DOWNTO 0)
                        );
                end COMPONENT mac_ram_table;
------------------------------------
        
        SIGNAL          ram_in_mac                      :       std_logic_VECTOR(63 downto 0);
        SIGNAL          ram_in_address          :       STD_LOGIC_VECTOR(ADDR_WIDTH-1 DOWNTO 0);
        SIGNAL          ram_in_wr                       :       std_logic;
        SIGNAL          ram_out_mac             :       STD_LOGIC_VECTOR(47 DOWNTO 0);  
        SIGNAL          ram_in_rd                       :       STD_LOGIC;
        SIGNAL          ram_in_check            :       STD_LOGIC;
        SIGNAL          ram_out_rd_rdy          :       STD_LOGIC;
        SIGNAL          ram_match_address       :       STD_LOGIC_VECTOR(ADDR_WIDTH-1 DOWNTO 0);
        SIGNAL          ram_match                       :       STD_LOGIC;
        SIGNAL          ram_unmatch                     :       STD_LOGIC;
        
        SIGNAL          ram_in_wr_i             :       std_logic;
        SIGNAL          ram_in_address_e1_i :   std_logic;
        SIGNAL          ram_in_address_e2_i :   std_logic;
        SIGNAL          ram_in_check_i          :       std_logic;
        SIGNAL          ram_in_address_i        :       STD_LOGIC_VECTOR(ADDR_WIDTH-1 DOWNTO 0);
        SIGNAL          ram_in_mac_i            :       STD_LOGIC_VECTOR(63 DOWNTO 0);
        
        SIGNAL          fifo_rd                         :       STD_LOGIC ; 
    SIGNAL              fifo_in                         :       STD_LOGIC_VECTOR(63 DOWNTO 0) ; 
    SIGNAL              fifo_out                        :       STD_LOGIC_VECTOR(63 DOWNTO 0) ;
    SIGNAL              fifo_full                       :       STD_LOGIC;
    SIGNAL              fifo_nearly_fulL        :       STD_LOGIC;
    SIGNAL              fifo_empty                      :       STD_LOGIC;
        
 
        
        SUBTYPE         last_type IS  INTEGER RANGE 0 TO 2**ADDR_WIDTH-1;
    SIGNAL              last                            : last_type;
        SIGNAL          last_std                        : STD_LOGIC_VECTOR(ADDR_WIDTH-1 DOWNTO 0);
        SIGNAL          weight_i                        :       INTEGER RANGE 0 TO 255;
        SIGNAL          weight_up                       :       STD_LOGIC;
        SIGNAL          weight_restart          :       STD_LOGIC;
begin
                -------PORT MAP SMALL FIFO DATA
                
                
                fifo_in <=in_mac & in_weight & in_port ;
                small_fifo_Inst :  small_fifo 
                        GENERIC MAP(WIDTH                       => 64,
                                                MAX_DEPTH_BITS  => 8)
                        PORT MAP(
                                                din                             =>      fifo_in,    
                                                wr_en                   =>      in_wr,          
                                                rd_en                   =>      fifo_rd,   
                                                dout                    =>      fifo_out,   
                                                full                    =>      fifo_full,
                                                nearly_full     =>      fifo_nearly_full,
                                                empty                   =>      fifo_empty,
                                                reset                   =>      reset ,
                                                clk                     =>      clk 
                                        );
--

-------COMPONENET SMALL FIFO

                ram_Inst :  mac_ram_table 
                        GENERIC MAP     (ADDR_WIDTH => ADDR_WIDTH)
                        port MAP (
                        clk     => clk,
                        reset => reset,
                        in_mac_no_prt=> ram_in_mac,
                        in_address => ram_in_address,
                        in_check=> ram_in_check,
                        match_address =>ram_match_address,
                        match=>ram_match,
                        unmatch=>ram_unmatch,
                        in_wr=> ram_in_wr,
                        in_rd => in_rd,
                        in_key=>in_key,
                        last_address=>last_std,
                        out_port        => out_port,
                        out_rd_rdy => out_rd_rdy,
                        out_mac => out_mac      
                        );
                        ram_in_mac(63 DOWNTO 16)<=fifo_out(63 DOWNTO 16);
                        ram_in_mac(15 DOWNTO 8)<=std_logic_vector(to_unsigned(weight_i, 8));
                        ram_in_mac(7 DOWNTO 0)<=fifo_out(7 DOWNTO 0);
--                      add             <=ram_in_address;
--                      entry   <= ram_in_mac;
--                      rdy         <= ram_in_wr;
--                      check   <= ram_in_check;
------------------------------------
        last_std <= std_logic_vector(to_unsigned(last+1, ADDR_WIDTH));
        PROCESS(clk, reset)
                BEGIN
                        IF reset= '1' THEN
                                        last <= 0 ;
                        ELSIF clk'EVENT AND clk = '1' THEN
                                IF (state =ADD_ENTRY )THEN last <= last +1   ;END IF;
                        END IF;
                END PROCESS;
                
        PROCESS(clk, reset)
                BEGIN
                        IF reset= '1' THEN
                        state   <=      IDLE    ;
                        ELSIF clk'EVENT AND clk = '1' THEN
                                state   <=      state_next      ;
                        END IF;
                END PROCESS;
        PROCESS(state)
                BEGIN           
                                                        fifo_rd                 <= '0'; 
                                                        ram_in_wr               <= '0';
                                                        ram_in_check    <= '0';
                                                        ram_in_address  <= (OTHERS=>'0');
                                                        weight_up               <= '0'; 
                                                        weight_restart  <= '0';
                                                        state_next              <=      state;
                                                
                                                
                        CASE state IS 
                                                
                                WHEN    IDLE =>
                                                IF fifo_empty = '0' THEN
                                                        fifo_rd <= '1';
                                                        
                                                        state_next <= START;
                                                END IF;
                                                        weight_restart  <= '1';
                                WHEN    START =>
                                                        
                                                        IF weight_i      >      fifo_out(15 DOWNTO 8)   THEN
                                                                state_next      <=      IDLE    ;                                                               
                                                        ELSE
                                                                state_next  <= LATCH_MAC_LOOKUP;
                                                        END IF;
                                                        
                                WHEN    LATCH_MAC_LOOKUP =>
                                                                        
                                                                ram_in_check<= '1';
                                                                state_next      <= CHECK_MAC_MATCH;
                                                
                                WHEN    CHECK_MAC_MATCH =>
                                                IF ram_match = '1' THEN
                                                        state_next <= UPDATE_ENTRY;
                                                ELSIF ram_unmatch = '1' THEN
                                                        state_next <= ADD_ENTRY;
                                                END IF;
                                                
                                WHEN    UPDATE_ENTRY =>
                                                        ram_in_wr <='1';
                                                        ram_in_address <= ram_match_address;
                                                        weight_up       <=  '1';
                                                        state_next <= START;
                                                
                                WHEN    ADD_ENTRY =>    
                                                        ram_in_wr <='1';
                                                        ram_in_address <=std_logic_vector(to_unsigned(last+1, ADDR_WIDTH));                     
                                                        weight_up       <=  '1';
                                                        state_next <= START;
                                WHEN OTHERS =>
                                                        state_next<= IDLE;
                                END CASE;
                END PROCESS;
---------------------------------------------------------------------
                
        process (clk)
                variable   cnt             : integer range 0 to 255;
        begin
                if (rising_edge(clk)) then

                        if weight_restart = '1' then
                                -- Reset the counter to 0
                                cnt := 0;

                        elsif weight_up = '1' then
                                -- Increment the counter if counting is enabled                    
                                cnt := cnt + 1;

                        end if;
                end if;
        weight_i        <= cnt+1;       
end process;
--------------------------------------------------------------------------------------------------------        
                
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.