URL
https://opencores.org/ocsvn/loadbalancer/loadbalancer/trunk
Subversion Repositories loadbalancer
[/] [loadbalancer/] [trunk/] [TABLE/] [hello_pkt.vhd] - Rev 2
Compare with Previous | Blame | View Log
---this file could be used to build ARP RESPONSE -------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; USE WORK.CONFIG.ALL; ------------------------------- ENTITY hello_pkt IS GENERIC(DATA_WIDTH :INTEGER := 64; CTRL_WIDTH :INTEGER := 8); PORT( SIGNAL tx_in_data : IN STD_LOGIC_VECTOR(63 DOWNTO 0); SIGNAL tx_in_ctrl : IN STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL tx_in_wr : IN STD_LOGIC; SIGNAL rx_in_data : IN STD_LOGIC_VECTOR(63 DOWNTO 0); SIGNAL rx_in_ctrl : IN STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL rx_in_wr : IN STD_LOGIC; SIGNAL out_data : OUT STD_LOGIC_VECTOR(63 DOWNTO 0); SIGNAL out_ctrl : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL out_wr : OUT STD_LOGIC; -- SIGNAL out_cnt : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- SIGNAL cnt_enable :OUT STD_LOGIC; SIGNAL out_rdy :IN STD_LOGIC; SIGNAL in_rdy :OUT STD_LOGIC; SIGNAL reset :IN STD_LOGIC; SIGNAL clk :IN STD_LOGIC ); END ENTITY hello_pkt; ------------------------------------------------------ ARCHITECTURE behavior OF hello_pkt IS ------------------------ COMPONENT Aging_Timer is generic( N: integer := 32; -- 32 bits couter M: integer := TIMER_PERIOD -- 125000 = 1 miliscond ); port( clk, reset: in std_logic; timeout: out std_logic; timer_aging_bit: out std_logic; count_out: out std_logic_vector(31 downto 0)--N-1 ); end COMPONENT Aging_Timer; ---------------------------------------------------------------------------- ------------ one hot encoding state definition TYPE state_type is (IDLE,TIMEOUT, WRITE_HEADER); -- ATTRIBUTE enum_encoding: STRING; -- ATTRIBUTE enum_encoding OF state_type: TYPE IS "onehot"; SIGNAL state, state_next: state_type; TYPE state_ch_type is (IDLE,IN_PACKET); SIGNAL state_ch, state_ch_next: state_ch_type; ------------end state machine definition TYPE counters_type IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(31 DOWNTO 0); SIGNAL tx_array : counters_type; SIGNAL rx_array : counters_type; TYPE status_type IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0); CONSTANT status : status_type:=(X"00", X"00", X"00", X"00"); -- SIGNAL FCS : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL MSGSeqnum : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL MSGSeqnum_up : STD_LOGIC; ---------------internal signals SIGNAL out_data_p : STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0); SIGNAL out_ctrl_p : STD_LOGIC_VECTOR(CTRL_WIDTH-1 DOWNTO 0); SIGNAL out_wr_p : STD_LOGIC; -- SIGNAL source_port : STD_LOGIC_VECTOR(1 DOWNTO 0);--just four ports -- SIGNAL dest_port : STD_LOGIC_VECTOR(15 DOWNTO 0);--just four ports SIGNAL word_cnt : INTEGER; SIGNAL word_cnt_up : STD_LOGIC; SIGNAL word_cnt_rst : STD_LOGIC; SIGNAL time_out : STD_LOGIC; SIGNAL clear_to_send : STD_LOGIC; ------IP HEADER CHECK SUM CALCULATIONS CONSTANT TEMP : INTEGER :=17664 + 0 + 0 + 16401 + CONV_INTEGER(DIST_UNICAST_LB(31 DOWNTO 16)) + CONV_INTEGER(DIST_UNICAST_LB(15 DOWNTO 0)) + CONV_INTEGER(DIST_MULTICAST_ALL(31 DOWNTO 16))+ CONV_INTEGER(DIST_MULTICAST_ALL(15 DOWNTO 0)); CONSTANT TEMP1 : STD_LOGIC_VECTOR(19 DOWNTO 0 ):= std_logic_vector(to_unsigned(TEMP, 20)); CONSTANT TEMP2 : STD_LOGIC_VECTOR(3 DOWNTO 0 ) := TEMP1(19 DOWNTO 16); CONSTANT TEMP3 : STD_LOGIC_VECTOR(15 DOWNTO 0 ) := TEMP1(15 DOWNTO 0)+ TEMP2; CONSTANT FCS : STD_LOGIC_VECTOR(15 DOWNTO 0 ) := NOT TEMP3; -- + X"0000" + X"0000" + X"4011" + DIST_UNICAST_LB(31 DOWNTO 16)+ -- DIST_UNICAST_LB(15 DOWNTO 0) + DIST_MULTICAST_ALL(31 DOWNTO 16) -- + DIST_MULTICAST_ALL(15 DOWNTO 0); ------------------------------------- ------------------------------------------- BEGIN --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -------PORT MAP SMALL FIFO DATA ------------------------ Aging_Timer_Inst : Aging_Timer GENERIC MAP ( N => 32 , M =>TIMER_PERIOD-- 125000 = 1 miliscond ) port MAP( clk => clk, reset => reset, timeout =>open , timer_aging_bit =>open, count_out => open ); time_out<= '0'; process (clk) variable cnt : STD_LOGIC_VECTOR(15 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (OTHERS=>'0'); elsif MSGSeqnum_up = '1' then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count MSGSeqnum <= cnt; -- cnt_enable <= word_cnt_up; end process; -------------------------------------------------- PROCESS(reset,clk) BEGIN IF (reset ='1') THEN state <= IDLE; ELSIF clk'EVENT AND clk ='1' THEN state <= state_next; END IF; END PROCESS; PROCESS(state, clear_to_send, time_out, word_cnt, out_rdy) BEGIN state_next <= state; word_cnt_up <= '0'; word_cnt_rst <= '0'; in_rdy <= '1'; MSGSeqnum_up <= '0'; CASE state IS WHEN IDLE => in_rdy <= '1'; IF time_out ='1' THEN word_cnt_rst <= '1'; state_next <= TIMEOUT; END IF; WHEN TIMEOUT => in_rdy <= '0'; -- IF clear_to_send ='1' THEN word_cnt_rst <= '1'; MSGSeqnum_up <= '1'; state_next <= WRITE_HEADER; -- END IF; WHEN WRITE_HEADER => in_rdy <= '0'; IF word_cnt > 21 THEN state_next <= IDLE; ELSIF ( word_cnt <= 21 ) AND out_rdy = '1' THEN word_cnt_up <= '1'; state_next <= WRITE_HEADER; END IF; WHEN OTHERS => state_next <= IDLE; END CASE; END PROCESS; -------------------------------------------------------------------- process (clk) variable cnt : INTEGER; begin if (rising_edge(clk)) then if word_cnt_rst = '1' then -- Reset the counter to 0 cnt := 0; elsif word_cnt_up = '1' then -- Increment the counter if counting is enabled cnt := cnt + 1; end if; end if; -- Output the current count word_cnt <= cnt; -- cnt_enable <= word_cnt_up; end process; -- out_cnt <= std_logic_vector(to_unsigned(word_cnt, 8)); -------------------OUTPUT ASSIGNMENT with word_cnt select out_data_p <= DEFAULT_INT_PORT & X"0014" & X"0040" &X"00A0" WHEN 1, X"FFFFFFFFFFFF" & mac_array(0)(47 DOWNTO 32) when 2, mac_array(0)(31 DOWNTO 0) & X"0800" & X"4500"when 3, X"0000000000004011" when 4, FCS & DIST_UNICAST_LB & DIST_MULTICAST_ALL(31 DOWNTO 16) WHEN 5, DIST_MULTICAST_ALL(15 DOWNTO 0) & DIST_PORT & DIST_PORT&X"0000" WHEN 6, X"0000"& DIST_VER & DIST_MSGTYPE & NODE_ID&X"00"& NODE_TYPE(23 downto 16)WHEN 7, NODE_TYPE(15 DOWNTO 0) & MSGSeqnum & X"00000000" WHEN 8, X"00" & status(0) & mac_array(0) WHEN 9,--port 0 vlan_array(0) & ip_array(0) & subnet_array(0)(31 DOWNTO 16) WHEN 10,--port 0 subnet_array(0)(15 DOWNTO 0) & tx_array(0) & rx_array(0)(31 DOWNTO 16) WHEN 11, rx_array(0)(15 DOWNTO 0) & X"01" & status(1) & mac_array(1)(47 DOWNTO 16) WHEN 12, mac_array(1)(15 DOWNTO 0)& vlan_array(1) & ip_array(1) WHEN 13, subnet_array(1)& tx_array(1) WHEN 14, rx_array(1) & X"02" & status(2) & mac_array(2)(47 DOWNTO 32) WHEN 15,--port 0 mac_array(2)(31 DOWNTO 0)& vlan_array(2) & ip_array(2)(31 DOWNTO 16)&X"0" WHEN 16, ip_array(2)(15 DOWNTO 0)&subnet_array(2)& tx_array(2)(31 DOWNTO 16) WHEN 17, tx_array(2)(15 DOWNTO 0)& rx_array(2) & X"03" & status(3)WHEN 18, mac_array(3) & vlan_array(3)&X"0" WHEN 19, ip_array(3) & subnet_array(3) WHEN 20, tx_array(3) & rx_array(3) WHEN 21, ( OTHERS=>'0') when others; out_wr_p <= word_cnt_up when word_cnt >= 1 AND word_cnt <= 21 else '0'; out_ctrl_p <= X"FF" when word_cnt = 1 else X"01" when word_cnt = 21 else X"00" ; PROCESS(reset,clk) BEGIN IF clk'EVENT AND clk ='1' THEN out_data <= out_data_p; out_ctrl <= out_ctrl_p; out_wr <= out_wr_p; -- out_wr_p <= word_cnt_up; END IF; END PROCESS; ------------------------------counters array----------------------------------------- process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif tx_in_wr='1' AND tx_in_ctrl = X"FF" AND tx_in_data(63 DOWNTO 48) =X"0001" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count tx_array(0) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif tx_in_wr='1' AND tx_in_ctrl = X"FF" AND tx_in_data(63 DOWNTO 48) =X"0004" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count tx_array(1) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif tx_in_wr='1' AND tx_in_ctrl = X"FF" AND tx_in_data(63 DOWNTO 48) =X"0010" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count tx_array(2) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif tx_in_wr='1' AND tx_in_ctrl = X"FF" AND tx_in_data(63 DOWNTO 48) =X"0040" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count tx_array(3) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif rx_in_wr='1' AND rx_in_ctrl = X"FF" AND rx_in_data(31 DOWNTO 16) =X"0000" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count rx_array(0) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif rx_in_wr='1' AND rx_in_ctrl = X"FF" AND rx_in_data(31 DOWNTO 16) =X"0002" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count rx_array(1) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif rx_in_wr='1' AND rx_in_ctrl = X"FF" AND rx_in_data(31 DOWNTO 16) =X"0004" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count rx_array(2) <= cnt; end process; process (clk) variable cnt : STD_LOGIC_VECTOR(31 DOWNTO 0); begin if (rising_edge(clk)) then if reset = '1' then -- Reset the counter to 0 cnt := (others=>'0'); elsif rx_in_wr='1' AND rx_in_ctrl = X"FF" AND rx_in_data(31 DOWNTO 16) =X"0006" then -- Increment the counter if counting is enabled cnt := cnt + '1'; end if; end if; -- Output the current count rx_array(3) <= cnt; end process; ------------------------------counters array----------------------------------------- END behavior;