From 547de1371bf1ab8608a641afe7cfb28c03014c32 Mon Sep 17 00:00:00 2001 From: Adrian Weber Date: Mon, 22 Nov 2021 14:26:37 +0100 Subject: [PATCH] add possibility to not using uplink in hubs or terminate uplink mediainterface --- src/hub/cri_hub_func.vhd | 26 +-- src/hub/trb_net16_cri_hub.vhd | 330 +++++++++++++++++++++++----------- 2 files changed, 245 insertions(+), 111 deletions(-) diff --git a/src/hub/cri_hub_func.vhd b/src/hub/cri_hub_func.vhd index a2013c1..3ef15c7 100644 --- a/src/hub/cri_hub_func.vhd +++ b/src/hub/cri_hub_func.vhd @@ -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; diff --git a/src/hub/trb_net16_cri_hub.vhd b/src/hub/trb_net16_cri_hub.vhd index 5d517d3..4455a6a 100644 --- a/src/hub/trb_net16_cri_hub.vhd +++ b/src/hub/trb_net16_cri_hub.vhd @@ -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 -- 2.43.0