Skip to content
Snippets Groups Projects
Select Git revision
  • f86783d33ffec532adef3d1940ad2a522ee58bc9
  • master default protected
  • optimize_workflow
  • poppy_integration_v50
  • poppy_integration
  • releases/v5.0 protected
  • use-versioned-releases
  • releases/v5.0rc2 protected
  • releases/v5.0rc1 protected
  • releases/ldv_v407_atdb protected
  • ldv_v407_debug
  • releases/ldv_v406_debug protected
  • releases/ldv_v405 protected
  • releases/ldv_v404 protected
  • v5.0
  • v5.0rc2
  • v5.0rc1
  • ldv_v406_debug
  • ldv_v405_debug
  • ldv_v404
  • ldv_v403
  • ldv_v402
  • v4.0
  • ldv_v401
  • ldv_v40
  • ldv_v031
  • ldv_v03
  • ldv_v01
28 results

LoSoTo.Residual.cwl

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ring_pkg.vhd 6.01 KiB
    -------------------------------------------------------------------------------
    --
    -- Copyright 2021
    -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
    -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
    --
    -- Licensed under the Apache License, Version 2.0 (the "License");
    -- you may not use this file except in compliance with the License.
    -- You may obtain a copy of the License at
    --
    --     http://www.apache.org/licenses/LICENSE-2.0
    --
    -- Unless required by applicable law or agreed to in writing, software
    -- distributed under the License is distributed on an "AS IS" BASIS,
    -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -- See the License for the specific language governing permissions and
    -- limitations under the License.
    --
    -------------------------------------------------------------------------------
    
    -------------------------------------------------------------------------------
    --
    -- Author: R. van der Walle
    -- Purpose: 
    -- . This package contains ring specific constants.
    -- Description:
    -- Remark:
    -------------------------------------------------------------------------------
    LIBRARY ieee, common_lib;
    USE IEEE.std_logic_1164.ALL;
    USE common_lib.common_pkg.ALL;
    USE common_lib.common_mem_pkg.ALL;
    USE common_lib.common_field_pkg.ALL;
    USE common_lib.common_network_layers_pkg.ALL;
    
    PACKAGE ring_pkg is
    -- lane info, see https://support.astron.nl/confluence/x/jyu7Ag
      TYPE t_ring_lane_info IS RECORD
        transport_nof_hops : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
        lane_direction     : STD_LOGIC; 
      END RECORD;   
    
      CONSTANT c_ring_lane_info_rst : t_ring_lane_info :=
          ( (OTHERS => '0'), '0' );  
    
      CONSTANT c_ring_lane_info_field_arr : t_common_field_arr(1 DOWNTO 0) :=
          ( (field_name_pad("transport_nof_hops"), "RW", 32, field_default(0)),
            (field_name_pad("lane_direction"),     "RO",  1, field_default(0)) );
    
    -- ring info, see https://support.astron.nl/confluence/x/jyu7Ag
      TYPE t_ring_info IS RECORD
        O_rn                     : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
        N_rn                     : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); 
        use_cable_to_next_rn     : STD_LOGIC;   
        use_cable_to_previous_rn : STD_LOGIC;  
      END RECORD;   
    
      CONSTANT c_ring_info_rst : t_ring_info := 
          ( (OTHERS => '0'), (OTHERS => '0'), '0', '0' );  
    
      CONSTANT c_ring_info_field_arr : t_common_field_arr(3 DOWNTO 0) := 
          ( (field_name_pad("O_rn"),                     "RW", 8, field_default( 0)),
            (field_name_pad("N_rn"),                     "RW", 8, field_default(16)),
            (field_name_pad("use_cable_to_next_rn"),     "RW", 1, field_default( 0)),
            (field_name_pad("use_cable_to_previous_rn"), "RW", 1, field_default( 0)) );
    
      CONSTANT c_ring_eth_dst_mac : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0) := x"FFFFFFFFFFFF";
      CONSTANT c_ring_eth_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0) := x"002286080000";
      CONSTANT c_ring_pkt_type_bf : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0) := x"10FB";
      CONSTANT c_ring_pkt_type_xc : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0) := x"10FC";
      CONSTANT c_ring_pkt_type_so : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0) := x"10FD";
      CONSTANT c_ring_pkt_type_tb : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0) := x"10FE";
    
      CONSTANT c_ring_eth_nof_hdr_fields : NATURAL := 3;
      CONSTANT c_ring_eth_hdr_field_sel  : STD_LOGIC_VECTOR(c_ring_eth_nof_hdr_fields-1 DOWNTO 0) := "000";
      CONSTANT c_ring_eth_hdr_field_arr : t_common_field_arr(c_ring_eth_nof_hdr_fields-1 DOWNTO 0) := (
          ( field_name_pad("eth_dst_mac"  ), "RW", 48, field_default(c_ring_eth_dst_mac) ), 
          ( field_name_pad("eth_src_mac"  ), "RW", 48, field_default(c_ring_eth_src_mac) ),
          ( field_name_pad("eth_type"     ), "RW", 16, field_default(0) )
      );
      CONSTANT c_ring_eth_hdr_field_size : NATURAL := ceil_div(field_slv_len(c_ring_eth_hdr_field_arr), c_longword_w);  -- = 14/8 = 2 longwords
    
      CONSTANT c_ring_dp_nof_hdr_fields : NATURAL := 6;
      CONSTANT c_ring_dp_hdr_field_sel  : STD_LOGIC_VECTOR(c_ring_dp_nof_hdr_fields-1 DOWNTO 0) := "000"&"000";
      CONSTANT c_ring_dp_hdr_field_arr : t_common_field_arr(c_ring_dp_nof_hdr_fields-1 DOWNTO 0) := (
          ( field_name_pad("eth_dst_mac"  ), "RW", 48, field_default(c_ring_eth_dst_mac) ),  
          ( field_name_pad("eth_src_mac"  ), "RW", 48, field_default(c_ring_eth_src_mac) ),
          ( field_name_pad("eth_type"     ), "RW", 16, field_default(0) ),
          ( field_name_pad("dp_channel"   ), "RW", 16, field_default(0) ),
          ( field_name_pad("dp_sync"      ), "RW",  1, field_default(0) ),
          ( field_name_pad("dp_bsn"       ), "RW", 63, field_default(0) )
      );
      CONSTANT c_ring_dp_hdr_field_size : NATURAL := ceil_div(field_slv_len(c_ring_dp_hdr_field_arr), c_longword_w);  -- = 24/8 = 3 longwords
    
      FUNCTION func_ring_nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL;
      FUNCTION func_ring_nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR; -- return vector length is same as hops vector length
    
     END PACKAGE ring_pkg;
    
    PACKAGE BODY ring_pkg IS
    
      FUNCTION func_ring_nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL IS
        VARIABLE v_source_rn     : INTEGER;
        VARIABLE v_source_rn_nat : NATURAL;
      BEGIN
    
        IF lane_dir > 0 THEN --transport in positive direction (even lanes)
          v_source_rn := this_rn - hops;
        ELSE                 --transport in negative direction (odd lanes)
          v_source_rn := this_rn + hops;
        END IF;
    
        IF v_source_rn < 0 THEN -- Cannot use MOD as N_rn is not a constant.
          v_source_rn := v_source_rn + N_rn;
        END IF;
    
        IF v_source_rn >= N_rn THEN
          v_source_rn := v_source_rn - N_rn;
        END IF;
    
        v_source_rn_nat := v_source_rn;
        RETURN v_source_rn_nat;
      END;
    
      FUNCTION func_ring_nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR IS
      BEGIN
        RETURN TO_UVEC(func_ring_nof_hops_to_source_rn(TO_UINT(hops), TO_UINT(this_rn), TO_UINT(N_rn), lane_dir),hops'LENGTH);
      END;
      
    END ring_pkg;