]> jspc29.x-matter.uni-frankfurt.de Git - cri.git/commitdiff
add possibility to not using uplink in hubs or terminate uplink mediainterface
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Mon, 22 Nov 2021 13:26:37 +0000 (14:26 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Mon, 22 Nov 2021 13:26:37 +0000 (14:26 +0100)
src/hub/cri_hub_func.vhd
src/hub/trb_net16_cri_hub.vhd

index a2013c1aa1c4568091571752577e3fcaf9b26d3e..3ef15c7b87b2fb31f35163c47bd48000954c9d29 100644 (file)
@@ -9,14 +9,17 @@ use work.trb_net16_hub_func.all;
 package cri_hub_func is
 
   function calc_uplink_number (DOWNLINK_NUM   : integer;
-                               INT_NUM        : integer)
+                               INT_NUM        : integer;
+                               USE_UPLINK     : integer)
     return hub_mii_config_t;
 
-  function calc_downlink_number (DOWNLINK_NUM   : integer)
+  function calc_downlink_number (DOWNLINK_NUM   : integer;
+                                 USE_UPLINK     : integer)
     return hub_mii_config_t;
 
   function calc_uplink_only_number (DOWNLINK_NUM   : integer;
-                                    INT_NUM        : integer)
+                                    INT_NUM        : integer;
+                                    USE_UPLINK     : integer)
     return hub_mii_config_t;
 
 end package cri_hub_func;
@@ -25,15 +28,16 @@ package body cri_hub_func is
 
 
   function calc_uplink_number (DOWNLINK_NUM   : integer;  -- DOWNLINK_NUM is number of Downlinks ! Automaticly inserts one uplink at end
-                               INT_NUM        : integer) -- Number of Internal Interfaces
+                               INT_NUM        : integer;
+                               USE_UPLINK     : integer) -- Number of Internal Interfaces
     return hub_mii_config_t is       -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
     variable tmp : hub_mii_config_t := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
     begin
 
       for i in 0 to 16 loop
-        if (i = DOWNLINK_NUM) then
+        if ((i = DOWNLINK_NUM) and (USE_UPLINK = c_YES)) then
           tmp(i) := 1;
-        elsif ((INT_NUM > 0) and (i = DOWNLINK_NUM + INT_NUM + 1)) then -- INT_NUM is after Uplink and hub control channel
+        elsif ((INT_NUM > 0) and (i = DOWNLINK_NUM + INT_NUM + USE_UPLINK)) then -- INT_NUM is after Uplink and hub control channel
           tmp(i) := 1;  
         else
           tmp(i) := 0;
@@ -43,13 +47,14 @@ package body cri_hub_func is
       return tmp;
     end function;
     
-  function calc_downlink_number (DOWNLINK_NUM   : integer)
+  function calc_downlink_number (DOWNLINK_NUM   : integer;
+                                 USE_UPLINK     : integer)
     return hub_mii_config_t is       -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
     variable tmp : hub_mii_config_t := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
     begin
 
       for i in 0 to 16 loop
-        if (i = DOWNLINK_NUM) or (i > (DOWNLINK_NUM+1)) then
+        if ((USE_UPLINK = c_YES) and (i = DOWNLINK_NUM)) or (i > (DOWNLINK_NUM+USE_UPLINK)) then
           tmp(i) := 0;
         else
           tmp(i) := 1;
@@ -60,11 +65,12 @@ package body cri_hub_func is
     end function;
 
   function calc_uplink_only_number (DOWNLINK_NUM   : integer;
-                                    INT_NUM        : integer)
+                                    INT_NUM        : integer;
+                                    USE_UPLINK     : integer)
     return hub_mii_config_t is
     begin
 
-      return calc_uplink_number(DOWNLINK_NUM, INT_NUM);
+      return calc_uplink_number(DOWNLINK_NUM, INT_NUM, USE_UPLINK);
     end function;
 
 end package body;
index 5d517d37613036da5e15bc0d93aa0bf6f340957b..4455a6a19ee6b56c325a5d3fbb77b2af26784630 100644 (file)
@@ -45,7 +45,8 @@ entity trb_net16_cri_hub is
     INT_NUMBER              : integer range 0 to c_MAX_API_PER_HUB := 1;
     INT_CHANNELS            : hub_api_config_t := (others => 3);
     INT_IBUF_DEPTH          : hub_api_config_t := (others => 6);
-    RESET_IOBUF_AT_TIMEOUT  : integer range 0 to 1 := c_NO--;
+    RESET_IOBUF_AT_TIMEOUT  : integer range 0 to 1 := c_NO;
+    USE_UPLINK              : integer range 0 to 1 := c_YES
     --HUB_CONTROLLER_NUM      : integer range 2 to 5 := 5
     );
   port (
@@ -66,13 +67,13 @@ entity trb_net16_cri_hub is
     MED_CTRL_OP       : out std_logic_vector (MII_NUMBER*16-1 downto 0);
     
     --Received Data from connected boards
-    DATA_ACTIVE         : out std_logic_vector(MII_NUMBER-2 downto 0);
-    DATA_OUT            : out std_logic_vector(((MII_NUMBER-1)*(2*c_DATA_WIDTH))-1 downto 0);
-    DATA_READY          : out std_logic_vector(MII_NUMBER-2 downto 0);
+    DATA_ACTIVE         : out std_logic_vector(MII_NUMBER-USE_UPLINK-1 downto 0);
+    DATA_OUT            : out std_logic_vector(((MII_NUMBER-USE_UPLINK)*(2*c_DATA_WIDTH))-1 downto 0);
+    DATA_READY          : out std_logic_vector(MII_NUMBER-USE_UPLINK-1 downto 0);
     
-    DATA_ADDRESS_SENDER : out std_logic_vector(((MII_NUMBER-1)*c_DATA_WIDTH)-1 downto 0);
-    DATA_SEQNMBR        : out std_logic_vector(((MII_NUMBER-1)*8)-1 downto 0);
-    DATA_LENGTH         : out std_logic_vector(((MII_NUMBER-1)*c_DATA_WIDTH)-1 downto 0);
+    DATA_ADDRESS_SENDER : out std_logic_vector(((MII_NUMBER-USE_UPLINK)*c_DATA_WIDTH)-1 downto 0);
+    DATA_SEQNMBR        : out std_logic_vector(((MII_NUMBER-USE_UPLINK)*8)-1 downto 0);
+    DATA_LENGTH         : out std_logic_vector(((MII_NUMBER-USE_UPLINK)*c_DATA_WIDTH)-1 downto 0);
     
     
     --ONEWIRE
@@ -138,7 +139,7 @@ end entity;
 
 architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is
 
-  constant HUB_CONTROLLER_NUM      : integer := 3;--calc_number_config_hub_ports(MII_NUMBER);
+  constant HUB_CONTROLLER_NUM      : integer := 2 + USE_UPLINK;--calc_number_config_hub_ports(MII_NUMBER);
   signal hub_init_dataready_out    : std_logic_vector( INT_NUMBER downto 0);
   signal hub_reply_dataready_out   : std_logic_vector( INT_NUMBER downto 0);
   signal hub_init_dataready_in     : std_logic_vector( INT_NUMBER downto 0);
@@ -156,60 +157,60 @@ architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is
   signal hub_init_packet_num_in    : std_logic_vector( INT_NUMBER*c_NUM_WIDTH downto 0);
   signal hub_reply_packet_num_in   : std_logic_vector( INT_NUMBER*c_NUM_WIDTH downto 0);
 
-  signal int_med_dataready_out  : std_logic_vector (HUB_CONTROLLER_NUM-2 downto 0);
-  signal int_med_data_out       : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
-  signal int_med_packet_num_out : std_logic_vector ((HUB_CONTROLLER_NUM-1)*3-1 downto 0);
-  signal int_med_read_in        : std_logic_vector (HUB_CONTROLLER_NUM-2 downto 0);
+  signal int_med_dataready_out  : std_logic_vector (HUB_CONTROLLER_NUM-USE_UPLINK-1 downto 0);
+  signal int_med_data_out       : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
+  signal int_med_packet_num_out : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*3-1 downto 0);
+  signal int_med_read_in        : std_logic_vector (HUB_CONTROLLER_NUM-USE_UPLINK-1 downto 0);
   
-  signal int_med_dataready_in   : std_logic_vector (HUB_CONTROLLER_NUM-2 downto 0);
-  signal int_med_data_in        : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
-  signal int_med_packet_num_in  : std_logic_vector ((HUB_CONTROLLER_NUM-1)*3-1 downto 0);
-  signal int_med_read_out       : std_logic_vector (HUB_CONTROLLER_NUM-2 downto 0);
+  signal int_med_dataready_in   : std_logic_vector (HUB_CONTROLLER_NUM-USE_UPLINK-1 downto 0);
+  signal int_med_data_in        : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
+  signal int_med_packet_num_in  : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*3-1 downto 0);
+  signal int_med_read_out       : std_logic_vector (HUB_CONTROLLER_NUM-USE_UPLINK-1 downto 0);
   
-  signal int_med_stat_op        : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
-  signal int_med_ctrl_op        : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
+  signal int_med_stat_op        : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
+  signal int_med_ctrl_op        : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
 
-  signal bus_hub_dbg_rx_i       : ctrlbus_rx_array_t(0 to HUB_CONTROLLER_NUM-1);--calc_number_data_hubs(MII_NUMBER));
-  signal bus_hub_dbg_tx_i       : ctrlbus_tx_array_t(0 to HUB_CONTROLLER_NUM-1);--calc_number_data_hubs(MII_NUMBER));
+  signal bus_hub_dbg_rx_i       : ctrlbus_rx_array_t(0 to HUB_CONTROLLER_NUM-USE_UPLINK);--calc_number_data_hubs(MII_NUMBER));
+  signal bus_hub_dbg_tx_i       : ctrlbus_tx_array_t(0 to HUB_CONTROLLER_NUM-USE_UPLINK);--calc_number_data_hubs(MII_NUMBER));
+
+  signal loc_stat_op             : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
+  signal loc_ctrl_op             : std_logic_vector ((HUB_CONTROLLER_NUM-USE_UPLINK)*16-1 downto 0);
+
+  signal buf_DATA_ACTIVE          : std_logic_vector(MII_NUMBER-USE_UPLINK-1 downto 0);
+  signal buf_DATA_OUT             : std_logic_vector(((MII_NUMBER-USE_UPLINK)*(2*c_DATA_WIDTH))-1 downto 0);
+  signal buf_DATA_READY           : std_logic_vector(MII_NUMBER-USE_UPLINK-1 downto 0);
+
+  signal buf_DATA_ADDRESS_SENDER  : std_logic_vector(((MII_NUMBER-USE_UPLINK)*c_DATA_WIDTH)-1 downto 0);
+  signal buf_DATA_SEQNMBR         : std_logic_vector(((MII_NUMBER-USE_UPLINK)*8)-1 downto 0);
+  signal buf_DATA_LENGTH          : std_logic_vector(((MII_NUMBER-USE_UPLINK)*c_DATA_WIDTH)-1 downto 0);
 
-  signal loc_stat_op             : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
-  signal loc_ctrl_op             : std_logic_vector ((HUB_CONTROLLER_NUM-1)*16-1 downto 0);
-  
-  signal buf_DATA_ACTIVE          : std_logic_vector(MII_NUMBER-2 downto 0);
-  signal buf_DATA_OUT             : std_logic_vector(((MII_NUMBER-1)*(2*c_DATA_WIDTH))-1 downto 0);
-  signal buf_DATA_READY           : std_logic_vector(MII_NUMBER-2 downto 0);
-  
-  signal buf_DATA_ADDRESS_SENDER  : std_logic_vector(((MII_NUMBER-1)*c_DATA_WIDTH)-1 downto 0);
-  signal buf_DATA_SEQNMBR         : std_logic_vector(((MII_NUMBER-1)*8)-1 downto 0);
-  signal buf_DATA_LENGTH          : std_logic_vector(((MII_NUMBER-1)*c_DATA_WIDTH)-1 downto 0);
-  
   -- Debug
   signal datardy_cnt_ret   : std_logic_vector (15 downto 0);
   signal datardy_cnt_int   : std_logic_vector (15 downto 0);
-  
+
   --external reset_all_sync
   signal hub_make_network_reset    : std_logic;
   signal external_send_reset_long  : std_logic;
   signal external_send_reset_timer : std_logic;
-  signal timer_ticks               : std_logic_vector(1 downto 0);  
-  
+  signal timer_ticks               : std_logic_vector(1 downto 0);
+
   signal HUB_MED_CTRL_OP   : std_logic_vector(MII_NUMBER*16-1 downto 0);
   signal buf_HUB_STAT_GEN  : std_logic_vector (31 downto 0);
-  
-  constant MAX_HUB_SIZE   : integer := (MII_NUMBER-1)/2;
+
+--  constant MAX_HUB_SIZE   : integer := (MII_NUMBER-1)/2;
 
 begin
 
-  gen_hubController : if 1 = 1  generate
+  gen_CONTROL_HUB_WITH_UPLINK : if USE_UPLINK = c_YES  generate
     begin
   THE_HUB_CONTROLLER : entity work.trb_net16_cri_hub_base
     generic map( 
       HUB_USED_CHANNELS   => (0,0,0,1),
       INIT_ADDRESS        => INIT_ADDRESS,
       MII_NUMBER          => HUB_CONTROLLER_NUM,
-      MII_IS_UPLINK       => calc_uplink_number(HUB_CONTROLLER_NUM-1,INT_NUMBER),  --(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),-- -- adjust to HUB_CONTROLLER_NUM (here it is for 5)
-      MII_IS_DOWNLINK     => calc_downlink_number(HUB_CONTROLLER_NUM-1),--(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
-      MII_IS_UPLINK_ONLY  => calc_uplink_only_number(HUB_CONTROLLER_NUM-1,INT_NUMBER),--(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
+      MII_IS_UPLINK       => calc_uplink_number(HUB_CONTROLLER_NUM-1,INT_NUMBER,USE_UPLINK),  --(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),-- -- adjust to HUB_CONTROLLER_NUM (here it is for 5)
+      MII_IS_DOWNLINK     => calc_downlink_number(HUB_CONTROLLER_NUM-1,USE_UPLINK),--(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
+      MII_IS_UPLINK_ONLY  => calc_uplink_only_number(HUB_CONTROLLER_NUM-1,INT_NUMBER,USE_UPLINK),--(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
       --USE_ONEWIRE         => c_YES,
       HARDWARE_VERSION    => HARDWARE_VERSION,
       INCLUDED_FEATURES   => INCLUDED_FEATURES,
@@ -228,38 +229,153 @@ begin
       --Media interfacces
       MED_DATAREADY_OUT(HUB_CONTROLLER_NUM-2 downto 0)                           => int_med_dataready_out,          -- internal Downlinks to other hubs
       MED_DATAREADY_OUT(HUB_CONTROLLER_NUM-1)                                    => MED_DATAREADY_OUT(MII_NUMBER-1),--Uplink
-      
+
       MED_DATA_OUT((HUB_CONTROLLER_NUM-1)*16-1 downto 0)                         => int_med_data_out,
       MED_DATA_OUT((HUB_CONTROLLER_NUM)*16-1 downto (HUB_CONTROLLER_NUM-1)*16)   => MED_DATA_OUT(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
-      
+
       MED_PACKET_NUM_OUT((HUB_CONTROLLER_NUM-1)*3-1 downto 0)                    => int_med_packet_num_out,
       MED_PACKET_NUM_OUT(HUB_CONTROLLER_NUM*3-1 downto (HUB_CONTROLLER_NUM-1)*3) => MED_PACKET_NUM_OUT(MII_NUMBER*3-1 downto (MII_NUMBER-1)*3),
-    
+
       MED_READ_IN(HUB_CONTROLLER_NUM-2 downto 0)                                 => int_med_read_in,
       MED_READ_IN(HUB_CONTROLLER_NUM-1)                                          => MED_READ_IN(MII_NUMBER-1),
-      ----------                                                                 
+      ----------
       MED_DATAREADY_IN(HUB_CONTROLLER_NUM-2 downto 0)                            => int_med_dataready_in,
       MED_DATAREADY_IN(HUB_CONTROLLER_NUM-1)                                     => MED_DATAREADY_IN(MII_NUMBER-1),
-      
+
       MED_DATA_IN((HUB_CONTROLLER_NUM-1)*16-1 downto 0)                          => int_med_data_in,
       MED_DATA_IN((HUB_CONTROLLER_NUM)*16-1 downto (HUB_CONTROLLER_NUM-1)*16)    => MED_DATA_IN(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
-                                                                                 
+
       MED_PACKET_NUM_IN((HUB_CONTROLLER_NUM-1)*3-1 downto 0)                     => int_med_packet_num_in,
       MED_PACKET_NUM_IN(HUB_CONTROLLER_NUM*3-1 downto (HUB_CONTROLLER_NUM-1)*3)  => MED_PACKET_NUM_IN(MII_NUMBER*3-1 downto (MII_NUMBER-1)*3),
-      
+
       MED_READ_OUT(HUB_CONTROLLER_NUM-2 downto 0)                                => int_med_read_out,
       MED_READ_OUT(HUB_CONTROLLER_NUM-1)                                         => MED_READ_OUT(MII_NUMBER-1),
       ----------
       MED_STAT_OP((HUB_CONTROLLER_NUM-1)*16-1 downto 0)                          => int_med_stat_op,
       MED_STAT_OP(HUB_CONTROLLER_NUM*16-1 downto (HUB_CONTROLLER_NUM-1)*16)      => med_stat_op(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
-                                                                                 
+
       MED_CTRL_OP((HUB_CONTROLLER_NUM-1)*16-1 downto 0)                          => int_med_ctrl_op,
       MED_CTRL_OP(HUB_CONTROLLER_NUM*16-1 downto (HUB_CONTROLLER_NUM-1)*16)      => HUB_MED_CTRL_OP(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
-      
-      ONEWIRE_DATA                    => ONEWIRE_DATA, 
-      ONEWIRE_ADDR                    => ONEWIRE_ADDR, 
+
+      ONEWIRE_DATA                    => ONEWIRE_DATA,
+      ONEWIRE_ADDR                    => ONEWIRE_ADDR,
+      ONEWIRE_WRITE                   => ONEWIRE_WRITE,
+
+      --INT: interfaces to connect DCA slow control (or also other API)
+      INT_INIT_DATAREADY_OUT          => hub_init_dataready_out,
+      INT_INIT_DATA_OUT               => hub_init_data_out,
+      INT_INIT_PACKET_NUM_OUT         => hub_init_packet_num_out,
+      INT_INIT_READ_IN                => hub_init_read_in,
+      INT_INIT_DATAREADY_IN           => hub_init_dataready_in,
+      INT_INIT_DATA_IN                => hub_init_data_in,
+      INT_INIT_PACKET_NUM_IN          => hub_init_packet_num_in,
+      INT_INIT_READ_OUT               => hub_init_read_out,
+
+      INT_REPLY_DATAREADY_OUT         => hub_reply_dataready_out,
+      INT_REPLY_DATA_OUT              => hub_reply_data_out,
+      INT_REPLY_PACKET_NUM_OUT        => hub_reply_packet_num_out,
+      INT_REPLY_READ_IN               => hub_reply_read_in,
+      INT_REPLY_DATAREADY_IN          => hub_reply_dataready_in,
+      INT_REPLY_DATA_IN               => hub_reply_data_in,
+      INT_REPLY_PACKET_NUM_IN         => hub_reply_packet_num_in,
+      INT_REPLY_READ_OUT              => hub_reply_read_out,
+
+      COMMON_STAT_REGS                => (others => '0'),--open,--common_stat_reg,
+      COMMON_CTRL_REGS                => COMMON_CTRL_REGS,
+      MY_ADDRESS_OUT                  => open,--my_address,
+      TEMPERATURE_IN                  => TEMPERATURE_IN,
+
+      --REGIO INTERFACE
+      REGIO_ADDR_OUT                  => REGIO_ADDR_OUT,
+      REGIO_READ_ENABLE_OUT           => REGIO_READ_ENABLE_OUT,
+      REGIO_WRITE_ENABLE_OUT          => REGIO_WRITE_ENABLE_OUT,
+      REGIO_DATA_OUT                  => REGIO_DATA_OUT,
+      REGIO_DATA_IN                   => REGIO_DATA_IN,
+      REGIO_DATAREADY_IN              => REGIO_DATAREADY_IN,
+      REGIO_NO_MORE_DATA_IN           => REGIO_NO_MORE_DATA_IN,
+      REGIO_WRITE_ACK_IN              => REGIO_WRITE_ACK_IN,
+      REGIO_UNKNOWN_ADDR_IN           => REGIO_UNKNOWN_ADDR_IN,
+      REGIO_TIMEOUT_OUT               => REGIO_TIMEOUT_OUT,
+
+      TIMER_TICKS_OUT                 => timer_ticks,
+
+      --ONEWIRE                         => TEMPSENS,
+      --ONEWIRE_MONITOR_OUT             => open,
+      --Status ports (for debugging)
+
+      HUB_STAT_GEN                    => buf_HUB_STAT_GEN,
+
+      MPLEX_CTRL                      => (others => '0'),
+      CTRL_DEBUG( 2 downto 0)         => "111",
+      CTRL_DEBUG(31 downto 3)         => (others => '0'),
+      STAT_DEBUG                      => open,
+
+      BUS_HUB_DBG_RX                  => bus_hub_dbg_rx_i(0),
+      BUS_HUB_DBG_TX                  => bus_hub_dbg_tx_i(0)
+      );
+  end generate gen_CONTROL_HUB_WITH_UPLINK;
+
+
+ gen_CONTROL_HUB_WITHOUT_UPLINK : if USE_UPLINK = c_NO  generate
+    begin
+  THE_HUB_CONTROLLER : entity work.trb_net16_cri_hub_base
+    generic map(
+      HUB_USED_CHANNELS   => (0,0,0,1),
+      INIT_ADDRESS        => INIT_ADDRESS,
+      MII_NUMBER          => HUB_CONTROLLER_NUM,
+      MII_IS_UPLINK       => calc_uplink_number(HUB_CONTROLLER_NUM-1,INT_NUMBER,0),  --(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),-- -- adjust to HUB_CONTROLLER_NUM (here it is for 5)
+      MII_IS_DOWNLINK     => calc_downlink_number(HUB_CONTROLLER_NUM-1,0),--(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
+      MII_IS_UPLINK_ONLY  => calc_uplink_only_number(HUB_CONTROLLER_NUM-1,INT_NUMBER,0),--(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),--(0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--
+      --USE_ONEWIRE         => c_YES,
+      HARDWARE_VERSION    => HARDWARE_VERSION,
+      INCLUDED_FEATURES   => INCLUDED_FEATURES,
+      INIT_ENDPOINT_ID    => INIT_ENDPOINT_ID,
+      CLOCK_FREQUENCY     => CLOCK_FREQUENCY,
+      BROADCAST_SPECIAL_ADDR => BROADCAST_SPECIAL_ADDR,
+      COMPILE_TIME        => COMPILE_TIME,
+      USE_VAR_ENDPOINT_ID => c_NO,
+      INT_NUMBER          => INT_NUMBER
+      )
+    port map (
+      CLK    => CLK,
+      RESET  => RESET,
+      CLK_EN => '1',
+
+      --Media interfacces
+      MED_DATAREADY_OUT(HUB_CONTROLLER_NUM-1 downto 0)                           => int_med_dataready_out,          -- internal Downlinks to other hubs
+      --MED_DATAREADY_OUT(HUB_CONTROLLER_NUM-1)                                    => MED_DATAREADY_OUT(MII_NUMBER-1),--Uplink
+
+      MED_DATA_OUT((HUB_CONTROLLER_NUM)*16-1 downto 0)                         => int_med_data_out,
+      --MED_DATA_OUT((HUB_CONTROLLER_NUM)*16-1 downto (HUB_CONTROLLER_NUM-1)*16)   => MED_DATA_OUT(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
+
+      MED_PACKET_NUM_OUT((HUB_CONTROLLER_NUM)*3-1 downto 0)                    => int_med_packet_num_out,
+      --MED_PACKET_NUM_OUT(HUB_CONTROLLER_NUM*3-1 downto (HUB_CONTROLLER_NUM-1)*3) => MED_PACKET_NUM_OUT(MII_NUMBER*3-1 downto (MII_NUMBER-1)*3),
+
+      MED_READ_IN(HUB_CONTROLLER_NUM-1 downto 0)                                 => int_med_read_in,
+      --MED_READ_IN(HUB_CONTROLLER_NUM-1)                                          => MED_READ_IN(MII_NUMBER-1),
+      ----------
+      MED_DATAREADY_IN(HUB_CONTROLLER_NUM-1 downto 0)                            => int_med_dataready_in,
+      --MED_DATAREADY_IN(HUB_CONTROLLER_NUM-1)                                     => MED_DATAREADY_IN(MII_NUMBER-1),
+
+      MED_DATA_IN((HUB_CONTROLLER_NUM)*16-1 downto 0)                          => int_med_data_in,
+      --MED_DATA_IN((HUB_CONTROLLER_NUM)*16-1 downto (HUB_CONTROLLER_NUM-1)*16)    => MED_DATA_IN(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
+
+      MED_PACKET_NUM_IN((HUB_CONTROLLER_NUM)*3-1 downto 0)                     => int_med_packet_num_in,
+      --MED_PACKET_NUM_IN(HUB_CONTROLLER_NUM*3-1 downto (HUB_CONTROLLER_NUM-1)*3)  => MED_PACKET_NUM_IN(MII_NUMBER*3-1 downto (MII_NUMBER-1)*3),
+
+      MED_READ_OUT(HUB_CONTROLLER_NUM-1 downto 0)                                => int_med_read_out,
+      --MED_READ_OUT(HUB_CONTROLLER_NUM-1)                                         => MED_READ_OUT(MII_NUMBER-1),
+      ----------
+      MED_STAT_OP((HUB_CONTROLLER_NUM)*16-1 downto 0)                          => int_med_stat_op,
+      --MED_STAT_OP(HUB_CONTROLLER_NUM*16-1 downto (HUB_CONTROLLER_NUM-1)*16)      => med_stat_op(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
+
+      MED_CTRL_OP((HUB_CONTROLLER_NUM)*16-1 downto 0)                          => int_med_ctrl_op,
+      --MED_CTRL_OP(HUB_CONTROLLER_NUM*16-1 downto (HUB_CONTROLLER_NUM-1)*16)      => HUB_MED_CTRL_OP(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
+
+      ONEWIRE_DATA                    => ONEWIRE_DATA,
+      ONEWIRE_ADDR                    => ONEWIRE_ADDR,
       ONEWIRE_WRITE                   => ONEWIRE_WRITE,
-      
+
       --INT: interfaces to connect DCA slow control (or also other API)
       INT_INIT_DATAREADY_OUT          => hub_init_dataready_out,
       INT_INIT_DATA_OUT               => hub_init_data_out,
@@ -269,7 +385,7 @@ begin
       INT_INIT_DATA_IN                => hub_init_data_in,
       INT_INIT_PACKET_NUM_IN          => hub_init_packet_num_in,
       INT_INIT_READ_OUT               => hub_init_read_out,
-      
+
       INT_REPLY_DATAREADY_OUT         => hub_reply_dataready_out,
       INT_REPLY_DATA_OUT              => hub_reply_data_out,
       INT_REPLY_PACKET_NUM_OUT        => hub_reply_packet_num_out,
@@ -278,46 +394,46 @@ begin
       INT_REPLY_DATA_IN               => hub_reply_data_in,
       INT_REPLY_PACKET_NUM_IN         => hub_reply_packet_num_in,
       INT_REPLY_READ_OUT              => hub_reply_read_out,
-      
+
       COMMON_STAT_REGS                => (others => '0'),--open,--common_stat_reg,
-      COMMON_CTRL_REGS                => COMMON_CTRL_REGS,      
+      COMMON_CTRL_REGS                => COMMON_CTRL_REGS,
       MY_ADDRESS_OUT                  => open,--my_address,
       TEMPERATURE_IN                  => TEMPERATURE_IN,
-      
+
       --REGIO INTERFACE
       REGIO_ADDR_OUT                  => REGIO_ADDR_OUT,
       REGIO_READ_ENABLE_OUT           => REGIO_READ_ENABLE_OUT,
       REGIO_WRITE_ENABLE_OUT          => REGIO_WRITE_ENABLE_OUT,
-      REGIO_DATA_OUT                  => REGIO_DATA_OUT,        
-      REGIO_DATA_IN                   => REGIO_DATA_IN,         
-      REGIO_DATAREADY_IN              => REGIO_DATAREADY_IN,    
-      REGIO_NO_MORE_DATA_IN           => REGIO_NO_MORE_DATA_IN, 
-      REGIO_WRITE_ACK_IN              => REGIO_WRITE_ACK_IN,    
-      REGIO_UNKNOWN_ADDR_IN           => REGIO_UNKNOWN_ADDR_IN, 
+      REGIO_DATA_OUT                  => REGIO_DATA_OUT,
+      REGIO_DATA_IN                   => REGIO_DATA_IN,
+      REGIO_DATAREADY_IN              => REGIO_DATAREADY_IN,
+      REGIO_NO_MORE_DATA_IN           => REGIO_NO_MORE_DATA_IN,
+      REGIO_WRITE_ACK_IN              => REGIO_WRITE_ACK_IN,
+      REGIO_UNKNOWN_ADDR_IN           => REGIO_UNKNOWN_ADDR_IN,
       REGIO_TIMEOUT_OUT               => REGIO_TIMEOUT_OUT,
-      
+
       TIMER_TICKS_OUT                 => timer_ticks,
-      
+
       --ONEWIRE                         => TEMPSENS,
       --ONEWIRE_MONITOR_OUT             => open,
       --Status ports (for debugging)
-      
+
       HUB_STAT_GEN                    => buf_HUB_STAT_GEN,
-      
+
       MPLEX_CTRL                      => (others => '0'),
       CTRL_DEBUG( 2 downto 0)         => "111",
       CTRL_DEBUG(31 downto 3)         => (others => '0'),
       STAT_DEBUG                      => open,
-      
+
       BUS_HUB_DBG_RX                  => bus_hub_dbg_rx_i(0),
       BUS_HUB_DBG_TX                  => bus_hub_dbg_tx_i(0)
       );
-  end generate;    
+  end generate gen_CONTROL_HUB_WITHOUT_UPLINK;
 
 
 gen_data_hubs : for i in 0 to 1 generate --For now fixed to 1 (2 hubs), could be set to HUB_CONTROLLER_NUM-2 with additional corrections
-    constant links     : integer := (((MII_NUMBER-1) / 2) + ((MII_NUMBER-1) mod 2) + 1);
-    constant downlinks : integer := (((MII_NUMBER-1) / 2) + ((MII_NUMBER-1) mod 2));
+    constant links     : integer := (((MII_NUMBER-USE_UPLINK) / 2) + ((MII_NUMBER-USE_UPLINK) mod 2) + 1);
+    constant downlinks : integer := (((MII_NUMBER-USE_UPLINK) / 2) + ((MII_NUMBER-USE_UPLINK) mod 2));
 
     signal data_active_unused         : std_logic;
     signal data_out_unused            : std_logic_vector(2*c_DATA_WIDTH-1 downto 0);
@@ -378,7 +494,7 @@ gen_data_hubs : for i in 0 to 1 generate --For now fixed to 1 (2 hubs), could be
 --   end generate Hub_0_LINKS;
 
   --connect links of hub_1: if odd number of downlinks, keep last one open
-  EVEN_LINKS: if not ((i = 1) and (((MII_NUMBER-1) mod 2) = 1)) generate
+  EVEN_LINKS: if not ((i = 1) and (((MII_NUMBER-USE_UPLINK) mod 2) = 1)) generate
     MED_DATAREADY_OUT((downlinks-1) + i*downlinks downto i*downlinks)   <= med_dataready_out_i;
     MED_DATA_OUT((downlinks*c_DATA_WIDTH)-1 + i*downlinks*c_DATA_WIDTH downto i*downlinks*c_DATA_WIDTH) <= med_data_out_i;
     MED_PACKET_NUM_OUT((downlinks*3)-1 + i*downlinks*3 downto i*downlinks*3) <= med_packet_num_out_i;
@@ -405,7 +521,7 @@ gen_data_hubs : for i in 0 to 1 generate --For now fixed to 1 (2 hubs), could be
     buf_DATA_LENGTH((downlinks*c_DATA_WIDTH)-1 + i*downlinks*c_DATA_WIDTH downto i*downlinks*c_DATA_WIDTH) <= buf_DATA_LENGTH_i;
   end generate EVEN_LINKS;
 
-  ODD_LINKS:  if (i = 1) and (((MII_NUMBER-1) mod 2) = 1) generate
+  ODD_LINKS:  if (i = 1) and (((MII_NUMBER-USE_UPLINK) mod 2) = 1) generate
     MED_DATAREADY_OUT((downlinks-2) + i*downlinks downto i*downlinks) <= med_dataready_out_i((downlinks-2) downto 0);
     MED_DATA_OUT(((downlinks-1)*c_DATA_WIDTH)-1 + i*downlinks*c_DATA_WIDTH downto i*downlinks*c_DATA_WIDTH) <= med_data_out_i(((downlinks-1)*c_DATA_WIDTH-1) downto 0);
     MED_PACKET_NUM_OUT(((downlinks-1)*3)-1 + i*downlinks*3 downto i*downlinks*3) <= med_packet_num_out_i(((downlinks-1)*3-1) downto 0);
@@ -446,9 +562,9 @@ THE_HUB_DATA : entity work.trb_net16_cri_hub_base
       HUB_USED_CHANNELS   => (0,1,0,1),
       INIT_ADDRESS        => INIT_ADDRESS,
       MII_NUMBER          => links,
-      MII_IS_UPLINK       => calc_uplink_number(downlinks,0),
-      MII_IS_DOWNLINK     => calc_downlink_number(downlinks),
-      MII_IS_UPLINK_ONLY  => calc_uplink_number(downlinks,0),
+      MII_IS_UPLINK       => calc_uplink_number(downlinks,0,c_YES),
+      MII_IS_DOWNLINK     => calc_downlink_number(downlinks,c_YES),
+      MII_IS_UPLINK_ONLY  => calc_uplink_number(downlinks,0,c_YES),
       --USE_ONEWIRE         => c_YES,
       HARDWARE_VERSION    => HARDWARE_VERSION,
       INCLUDED_FEATURES   => INCLUDED_FEATURES,
@@ -466,31 +582,31 @@ THE_HUB_DATA : entity work.trb_net16_cri_hub_base
       --Media interfacces
       MED_DATAREADY_OUT(links-2 downto 0)                => med_dataready_out_i,
       MED_DATAREADY_OUT(links-1)                         => int_med_dataready_in(i),
-                                                                   
+
       MED_DATA_OUT((links-1)*16-1 downto 0)              => med_data_out_i,
       MED_DATA_OUT(links*16-1 downto (links-1)*16)       => int_med_data_in(i*16+15 downto i*16),
-                                                                   
+
       MED_PACKET_NUM_OUT((links-1)*3-1 downto 0)         => med_packet_num_out_i,
       MED_PACKET_NUM_OUT(links*3-1 downto (links-1)*3)   => int_med_packet_num_in(i*3+2 downto i*3),
-                                                                   
+
       MED_READ_IN((links-1)*1-1 downto 0)                => med_read_in_i,
       MED_READ_IN(links-1)                               => int_med_read_out(i),
-                                                                   
+
       MED_DATAREADY_IN((links-1)*1-1 downto 0)           => med_dataready_in_i,
       MED_DATAREADY_IN(links-1)                          => int_med_dataready_out(i),
-                                                                   
+
       MED_DATA_IN((links-1)*16-1 downto 0)               => med_data_in_i,
       MED_DATA_IN((links)*16-1 downto (links-1)*16)      => int_med_data_out(i*16+15 downto i*16),
-      
+
       MED_PACKET_NUM_IN((links-1)*3-1 downto 0)          => med_packet_num_in_i,
       MED_PACKET_NUM_IN((links)*3-1  downto (links-1)*3) => int_med_packet_num_out(i*3+2 downto i*3),
-      
+
       MED_READ_OUT((links-1)*1-1 downto 0)               => med_read_out_i,
       MED_READ_OUT(links-1)                              => int_med_read_in(i),
-      
+
       MED_STAT_OP((links-1)*16-1 downto 0)               => med_stat_op_i,
       MED_STAT_OP((links)*16-1 downto (links-1)*16)      => loc_stat_op(i*16+15 downto i*16), --input
-      
+
       MED_CTRL_OP((links-1)*16-1 downto 0)               => med_ctrl_op_i,
       MED_CTRL_OP((links)*16-1 downto (links-1)*16)      => loc_ctrl_op(i*16+15 downto i*16), --output
 
@@ -500,24 +616,24 @@ THE_HUB_DATA : entity work.trb_net16_cri_hub_base
       DATA_OUT((downlinks*(2*c_DATA_WIDTH)-1) downto 0)  => buf_DATA_OUT_i,
       DATA_READY(links-1)                                => data_ready_unused,
       DATA_READY((downlinks-1)  downto 0)                => buf_DATA_READY_i,
-      
+
       DATA_ADDRESS_SENDER(links*c_DATA_WIDTH-1 downto downlinks*c_DATA_WIDTH)  => data_address_sender_unused,
       DATA_ADDRESS_SENDER((downlinks*c_DATA_WIDTH-1) downto 0)  => buf_DATA_ADDRESS_SENDER_i,
       DATA_SEQNMBR(links*8-1 downto downlinks*8)                => data_seqnmbr_unused,
       DATA_SEQNMBR((downlinks*8-1) downto 0)                    => buf_DATA_SEQNMBR_i,
       DATA_LENGTH(links*c_DATA_WIDTH-1 downto downlinks*c_DATA_WIDTH) => data_length_unused,
       DATA_LENGTH((downlinks*c_DATA_WIDTH-1) downto 0)          => buf_DATA_LENGTH_i,
-      
-      ONEWIRE_DATA                    => ONEWIRE_DATA, 
-      ONEWIRE_ADDR                    => ONEWIRE_ADDR, 
+
+      ONEWIRE_DATA                    => ONEWIRE_DATA,
+      ONEWIRE_ADDR                    => ONEWIRE_ADDR,
       ONEWIRE_WRITE                   => ONEWIRE_WRITE,
-      
+
       COMMON_STAT_REGS                => (others => '0'),--open,--common_stat_reg,
       COMMON_CTRL_REGS                => open,--common_ctrl_reg,
       MY_ADDRESS_OUT                  => open,--my_address,
       TEMPERATURE_IN                  => TEMPERATURE_IN,
-      
-      
+
+
       --REGIO INTERFACE
       REGIO_ADDR_OUT                  => open,--ctrlbus_rx.addr,
       REGIO_READ_ENABLE_OUT           => open,--ctrlbus_rx.read,
@@ -529,17 +645,17 @@ THE_HUB_DATA : entity work.trb_net16_cri_hub_base
       REGIO_WRITE_ACK_IN              => '0',--wrack,
       REGIO_UNKNOWN_ADDR_IN           => '0',--ctrlbus_tx.unknown,
       REGIO_TIMEOUT_OUT               => open,--ctrlbus_rx.timeout,
-      
+
       --ONEWIRE                         => TEMPSENS,
       --ONEWIRE_MONITOR_OUT             => open,
       --Status ports (for debugging)
       MPLEX_CTRL                      => (others => '0'),
       CTRL_DEBUG                      => (others => '0'),
       STAT_DEBUG                      => open,
-      
+
       BUS_HUB_DBG_RX                  => bus_hub_dbg_rx_i(i + 1),
       BUS_HUB_DBG_TX                  => bus_hub_dbg_tx_i(i + 1)
-      );      
+      );
 
 --  int_med_dataready_in(3 downto 1)   <= (others => '0');
 --  int_med_data_in(63 downto 16)      <= (others => '0');
@@ -611,12 +727,21 @@ THE_CRI_DATA_RECEIVER_DEBUG_HANDLER : process begin
 ---------------------------------------------------------------------
 -- External Reset
 ---------------------------------------------------------------------
+  gen_WITH_UPLINK : if USE_UPLINK = c_YES generate
+    gen_resync : for i in 0 to MII_NUMBER-2 generate
+      MED_CTRL_OP(14+i*16 downto i*16) <= HUB_MED_CTRL_OP(14+i*16 downto i*16);
+      MED_CTRL_OP(15+i*16) <= HUB_MED_CTRL_OP(15+i*16) or hub_make_network_reset or med_stat_op(15+(MII_NUMBER-1)*16);
+    end generate;
+    MED_CTRL_OP(15+(MII_NUMBER-1)*16) <= hub_make_network_reset;  -- Uplink
+  end generate GEN_WITH_UPLINK;
+
+  gen_WITHOUT_UPLINK : if USE_UPLINK = c_NO generate
+    gen_resync : for i in 0 to MII_NUMBER-1 generate
+      MED_CTRL_OP(14+i*16 downto i*16) <= HUB_MED_CTRL_OP(14+i*16 downto i*16);
+      MED_CTRL_OP(15+i*16) <= HUB_MED_CTRL_OP(15+i*16) or hub_make_network_reset;
+    end generate;
+  end generate gen_WITHOUT_UPLINK;
 
-  gen_resync : for i in 0 to MII_NUMBER-2 generate
-    MED_CTRL_OP(14+i*16 downto i*16) <= HUB_MED_CTRL_OP(14+i*16 downto i*16);
-    MED_CTRL_OP(15+i*16) <= HUB_MED_CTRL_OP(15+i*16) or hub_make_network_reset or med_stat_op(15+(MII_NUMBER-1)*16);
-  end generate;
-  MED_CTRL_OP(15+(MII_NUMBER-1)*16) <= hub_make_network_reset;
   --synch_dca_reset : process begin  
   --  wait until rising_edge(CLK);
     hub_make_network_reset <= external_send_reset_long;
@@ -639,8 +764,11 @@ THE_CRI_DATA_RECEIVER_DEBUG_HANDLER : process begin
 ---------------------------------------------------------------------
 -- Med Control handling
 ---------------------------------------------------------------------
-  loc_stat_op(15 downto 0)     <= int_med_ctrl_op(15) & "000" & x"000";--7 
-  int_med_stat_op(15 downto 0) <= loc_ctrl_op(15) & "000" & x"000";  --7
+--TODO: Use it in both hubs!!
+  gen_med_stst_ctrl : for i in 0 to 1 generate
+    loc_stat_op(15 + i*16 downto i*16)     <= int_med_ctrl_op(15 + i*16) & "000" & x"000";--7
+    int_med_stat_op(15 + i*16 downto i*16) <= loc_ctrl_op(15 + i*16) & "000" & x"000";  --7
+  end generate gen_med_stst_ctrl;
   
 ---------------------------------------------------------------------
 -- Data output preparation