From 7ffb1b9ee901e7c3cbe745c1f1e8cd2b0697fa66 Mon Sep 17 00:00:00 2001 From: Adrian Weber Date: Tue, 21 Jul 2020 16:02:00 +0200 Subject: [PATCH] number of data hubs is now automaticly scaling to the MII_NUMBER. max. 12 downlinks per hub. --- src/hub/cri_hub_func.vhd | 113 +++++++++++++++++++++++++++ src/hub/trb_net16_cri_hub.vhd | 143 +++++++++++++++++++--------------- 2 files changed, 194 insertions(+), 62 deletions(-) create mode 100644 src/hub/cri_hub_func.vhd diff --git a/src/hub/cri_hub_func.vhd b/src/hub/cri_hub_func.vhd new file mode 100644 index 0000000..7cd7c2d --- /dev/null +++ b/src/hub/cri_hub_func.vhd @@ -0,0 +1,113 @@ +library ieee; +use ieee.std_logic_1164.all; +USE IEEE.numeric_std.ALL; +USE IEEE.std_logic_UNSIGNED.ALL; +library work; +use work.trb_net_std.all; +use work.trb_net16_hub_func.all; + +package cri_hub_func is + + function calc_uplink_number (DOWNLINK_NUM : integer) + return hub_mii_config_t; + + function calc_downlink_number (DOWNLINK_NUM : integer) + return hub_mii_config_t; + + function calc_uplink_only_number (DOWNLINK_NUM : integer) + return hub_mii_config_t; + + function calc_number_data_hubs (MII_NUMBER : integer) + return integer; + + function calc_ports_last_data_hub (MII_NUMBER : integer) + return integer; + + function calc_number_config_hub_ports (MII_NUMBER : integer) + return integer; + +end package cri_hub_func; + +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 + 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 + tmp(i) := 1; + else + tmp(i) := 0; + end if; + end loop; + + return tmp; + end function; + + function calc_downlink_number (DOWNLINK_NUM : 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 + tmp(i) := 0; + else + tmp(i) := 1; + end if; + end loop; + + return tmp; + end function; + + function calc_uplink_only_number (DOWNLINK_NUM : integer) + return hub_mii_config_t is + begin + + return calc_uplink_number(DOWNLINK_NUM); + end function; + + function calc_number_data_hubs (MII_NUMBER : integer) -- ALl links. first N-1 are downlinks, last is uplink! + return integer is + variable tmp : integer := 0; + begin + if (MII_NUMBER < 2) then + tmp := 1; + else + tmp := ((MII_NUMBER-2) / 12) + 1; + end if; + + return tmp; + end function; + + function calc_ports_data_hub (MII_NUMBER : integer; + HUB : integer) -- ALl links. first N-1 are downlinks, last is uplink! + return integer is + variable tmp : integer := 0; + begin + if HUB = (calc_number_data_hubs(MII_NUMBER)-1) then + if ((MII_NUMBER-1) mod 12) = 0 then + tmp := 12; + else + tmp := ((MII_NUMBER-1) mod 12); + end if; + else + tmp := 12; + end if; + return tmp; + end function; + + function calc_number_config_hub_ports (MII_NUMBER : integer) -- ALl links. first N-1 are downlinks, last is uplink! + return integer is + variable tmp : integer := 0; + begin + tmp := calc_number_data_hubs(MII_NUMBER) + 1; + + return tmp; + end function; + + +end package body; diff --git a/src/hub/trb_net16_cri_hub.vhd b/src/hub/trb_net16_cri_hub.vhd index 8edcbba..73c94c0 100644 --- a/src/hub/trb_net16_cri_hub.vhd +++ b/src/hub/trb_net16_cri_hub.vhd @@ -6,6 +6,7 @@ library work; use work.trb_net_std.all; use work.trb_net_components.all; use work.trb_net16_hub_func.all; +use work.cri_hub_func.all; --take care of USE_INPUT_SBUF for multiplexer! @@ -44,8 +45,8 @@ entity trb_net16_cri_hub is INT_NUMBER : integer range 0 to c_MAX_API_PER_HUB := 0; 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; - HUB_CONTROLLER_NUM : integer range 2 to 5 := 2 + RESET_IOBUF_AT_TIMEOUT : integer range 0 to 1 := c_NO--; + --HUB_CONTROLLER_NUM : integer range 2 to 5 := 5 ); port ( CLK : in std_logic; @@ -65,13 +66,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-1 downto 0); - DATA_OUT : out std_logic_vector((MII_NUMBER*(2*c_DATA_WIDTH))-1 downto 0); - DATA_READY : out std_logic_vector(MII_NUMBER-1 downto 0); + DATA_ACTIVE : out std_logic_vector(MII_NUMBER-2 downto 0); + DATA_OUT : out std_logic_vector((MII_NUMBER*(2*c_DATA_WIDTH))-2 downto 0); + DATA_READY : out std_logic_vector(MII_NUMBER-2 downto 0); - DATA_ADDRESS_SENDER : out std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-1 downto 0); - DATA_SEQNMBR : out std_logic_vector((MII_NUMBER*8)-1 downto 0); - DATA_LENGTH : out std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-1 downto 0); + DATA_ADDRESS_SENDER : out std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-2 downto 0); + DATA_SEQNMBR : out std_logic_vector((MII_NUMBER*8)-2 downto 0); + DATA_LENGTH : out std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-2 downto 0); --ONEWIRE @@ -141,32 +142,32 @@ end entity; architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is - 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 (calc_number_config_hub_ports(MII_NUMBER)-2 downto 0); + signal int_med_data_out : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); + signal int_med_packet_num_out : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*3-1 downto 0); + signal int_med_read_in : std_logic_vector (calc_number_config_hub_ports(MII_NUMBER)-2 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 (calc_number_config_hub_ports(MII_NUMBER)-2 downto 0); + signal int_med_data_in : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); + signal int_med_packet_num_in : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*3-1 downto 0); + signal int_med_read_out : std_logic_vector (calc_number_config_hub_ports(MII_NUMBER)-2 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 ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); + signal int_med_ctrl_op : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); signal bus_hub_dbg_0_rx, bus_hub_dbg_1_rx : CTRLBUS_RX; signal bus_hub_dbg_0_tx, bus_hub_dbg_1_tx : CTRLBUS_TX; - signal loc_stat_op_1 : std_logic_vector (15 downto 0); - signal loc_ctrl_op_1 : std_logic_vector (15 downto 0); + signal loc_stat_op : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); + signal loc_ctrl_op : std_logic_vector ((calc_number_config_hub_ports(MII_NUMBER)-1)*16-1 downto 0); - signal buf_DATA_ACTIVE : std_logic_vector(MII_NUMBER-1 downto 0); - signal buf_DATA_OUT : std_logic_vector((MII_NUMBER*(2*c_DATA_WIDTH))-1 downto 0); - signal buf_DATA_READY : std_logic_vector(MII_NUMBER-1 downto 0); + signal buf_DATA_ACTIVE : std_logic_vector(MII_NUMBER-2 downto 0); + signal buf_DATA_OUT : std_logic_vector((MII_NUMBER*(2*c_DATA_WIDTH))-2 downto 0); + signal buf_DATA_READY : std_logic_vector(MII_NUMBER-2 downto 0); - signal buf_DATA_ADDRESS_SENDER : std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-1 downto 0); - signal buf_DATA_SEQNMBR : std_logic_vector((MII_NUMBER*8)-1 downto 0); - signal buf_DATA_LENGTH : std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-1 downto 0); + signal buf_DATA_ADDRESS_SENDER : std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-2 downto 0); + signal buf_DATA_SEQNMBR : std_logic_vector((MII_NUMBER*8)-2 downto 0); + signal buf_DATA_LENGTH : std_logic_vector((MII_NUMBER*c_DATA_WIDTH)-2 downto 0); -- Debug signal datardy_cnt_ret : std_logic_vector (15 downto 0); @@ -174,18 +175,21 @@ architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is begin + gen_unused_signals : if 1 =1 generate + constant HUB_CONTROLLER_NUM : integer := calc_number_config_hub_ports(MII_NUMBER); + 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 => (0,1,0,0,0,0,0,0,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), -- adjust to HUB_CONTROLLER_NUM (here it is for 5) - MII_IS_DOWNLINK => (1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),--(1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0), - MII_IS_UPLINK_ONLY => (0,1,0,0,0,0,0,0,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), + MII_IS_UPLINK => calc_uplink_number(HUB_CONTROLLER_NUM-1), --(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),--(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 => x"0001", + INIT_ENDPOINT_ID => x"0000", CLOCK_FREQUENCY => CLOCK_FREQUENCY, BROADCAST_SPECIAL_ADDR => BROADCAST_SPECIAL_ADDR, COMPILE_TIME => COMPILE_TIME, @@ -258,19 +262,24 @@ begin BUS_HUB_DBG_RX => bus_hub_dbg_0_rx, BUS_HUB_DBG_TX => bus_hub_dbg_0_tx ); - + end generate; + +gen_data_hubs : for i in 0 to calc_number_data_hubs(MII_NUMBER)-1 generate --MII_NUMBER = Down- and Uplinks + constant links : integer := calc_ports_data_hub(MII_NUMBER,i)+1; + constant downlinks : integer := calc_ports_data_hub(MII_NUMBER,i); + begin THE_HUB_1 : entity work.trb_net16_cri_hub_base generic map( HUB_USED_CHANNELS => (0,1,0,1), INIT_ADDRESS => INIT_ADDRESS, - MII_NUMBER => MII_NUMBER, + MII_NUMBER => links, MII_IS_UPLINK => MII_IS_UPLINK, MII_IS_DOWNLINK => MII_IS_DOWNLINK, MII_IS_UPLINK_ONLY => MII_IS_UPLINK_ONLY, --USE_ONEWIRE => c_YES, HARDWARE_VERSION => HARDWARE_VERSION, INCLUDED_FEATURES => INCLUDED_FEATURES, - INIT_ENDPOINT_ID => x"0002", + INIT_ENDPOINT_ID => std_logic_vector(to_unsigned(i+1,16)), CLOCK_FREQUENCY => CLOCK_FREQUENCY, BROADCAST_SPECIAL_ADDR => BROADCAST_SPECIAL_ADDR, COMPILE_TIME => COMPILE_TIME, @@ -282,43 +291,43 @@ THE_HUB_1 : entity work.trb_net16_cri_hub_base CLK_EN => '1', --Media interfacces - MED_DATAREADY_OUT(MII_NUMBER-2 downto 0) => MED_DATAREADY_OUT(MII_NUMBER-2 downto 0), - MED_DATAREADY_OUT(MII_NUMBER-1) => int_med_dataready_in(0), + MED_DATAREADY_OUT(links-2 downto 0) => MED_DATAREADY_OUT((downlinks-1)+i*12 downto i*12), + MED_DATAREADY_OUT(links-1) => int_med_dataready_in(i), - MED_DATA_OUT((MII_NUMBER-1)*16-1 downto 0) => MED_DATA_OUT((MII_NUMBER-1)*16-1 downto 0), - MED_DATA_OUT(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16) => int_med_data_in(15 downto 0), + MED_DATA_OUT((links-1)*16-1 downto 0) => MED_DATA_OUT((downlinks*16)-1+i*12*16 downto i*12*16), + MED_DATA_OUT(links*16-1 downto (links-1)*16) => int_med_data_in(i*16+15 downto i*16), - MED_PACKET_NUM_OUT((MII_NUMBER-1)*3-1 downto 0) => MED_PACKET_NUM_OUT((MII_NUMBER-1)*3-1 downto 0), - MED_PACKET_NUM_OUT(MII_NUMBER*3-1 downto (MII_NUMBER-1)*3) => int_med_packet_num_in(2 downto 0), + MED_PACKET_NUM_OUT((links-1)*3-1 downto 0) => MED_PACKET_NUM_OUT((downlinks*3)-1+i*12*3 downto i*12*3), + 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((MII_NUMBER-1)*1-1 downto 0) => MED_READ_IN((MII_NUMBER-1)*1-1 downto 0), - MED_READ_IN(MII_NUMBER-1) => int_med_read_out(0), + MED_READ_IN((links-1)*1-1 downto 0) => MED_READ_IN((downlinks-1)+i*12 downto i*12), + MED_READ_IN(links-1) => int_med_read_out(i), - MED_DATAREADY_IN((MII_NUMBER-1)*1-1 downto 0) => MED_DATAREADY_IN((MII_NUMBER-1)*1-1 downto 0), - MED_DATAREADY_IN(MII_NUMBER-1) => int_med_dataready_out(0), + MED_DATAREADY_IN((links-1)*1-1 downto 0) => MED_DATAREADY_IN((downlinks-1)+i*12 downto i*12), + MED_DATAREADY_IN(links-1) => int_med_dataready_out(i), - MED_DATA_IN((MII_NUMBER-1)*16-1 downto 0) => MED_DATA_IN((MII_NUMBER-1)*16-1 downto 0), - MED_DATA_IN((MII_NUMBER)*16-1 downto (MII_NUMBER-1)*16) => int_med_data_out(15 downto 0), + MED_DATA_IN((links-1)*16-1 downto 0) => MED_DATA_IN((downlinks*16)-1+i*12*16 downto i*12*16), + MED_DATA_IN((links)*16-1 downto (links-1)*16) => int_med_data_out(i*16+15 downto i*16), - MED_PACKET_NUM_IN((MII_NUMBER-1)*3-1 downto 0) => MED_PACKET_NUM_IN((MII_NUMBER-1)*3-1 downto 0), - MED_PACKET_NUM_IN((MII_NUMBER)*3-1 downto (MII_NUMBER-1)*3) => int_med_packet_num_out(2 downto 0), + MED_PACKET_NUM_IN((links-1)*3-1 downto 0) => MED_PACKET_NUM_IN((downlinks*3)-1+i*12*3 downto i*12*3), + 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((MII_NUMBER-1)*1-1 downto 0) => MED_READ_OUT((MII_NUMBER-1)*1-1 downto 0), - MED_READ_OUT(MII_NUMBER-1) => int_med_read_in(0), + MED_READ_OUT((links-1)*1-1 downto 0) => MED_READ_OUT((downlinks-1)+i*12 downto i*12), + MED_READ_OUT(links-1) => int_med_read_in(i), - MED_STAT_OP((MII_NUMBER-1)*16-1 downto 0) => MED_STAT_OP((MII_NUMBER-1)*16-1 downto 0), - MED_STAT_OP((MII_NUMBER)*16-1 downto (MII_NUMBER-1)*16) => loc_stat_op_1, --input + MED_STAT_OP((links-1)*16-1 downto 0) => MED_STAT_OP((downlinks*16)-1+i*12*16 downto i*12*16), + MED_STAT_OP((links)*16-1 downto (links-1)*16) => loc_stat_op(i*16+15 downto i*16), --input - MED_CTRL_OP((MII_NUMBER-1)*16-1 downto 0) => MED_CTRL_OP((MII_NUMBER-1)*16-1 downto 0), - MED_CTRL_OP((MII_NUMBER)*16-1 downto (MII_NUMBER-1)*16) => loc_ctrl_op_1, --output + MED_CTRL_OP((links-1)*16-1 downto 0) => MED_CTRL_OP((downlinks*16)-1+i*12*16 downto i*12*16), + MED_CTRL_OP((links)*16-1 downto (links-1)*16) => loc_ctrl_op(i*16+15 downto i*16), --output - DATA_ACTIVE => buf_DATA_ACTIVE, - DATA_OUT => buf_DATA_OUT, - DATA_READY => buf_DATA_READY, + DATA_ACTIVE((downlinks-1) downto 0) => buf_DATA_ACTIVE((downlinks-1)+i*12 downto i*12), + DATA_OUT((downlinks*(2*c_DATA_WIDTH)-1) downto 0) => buf_DATA_OUT((downlinks*(2*c_DATA_WIDTH)-1)+i*12*(2*c_DATA_WIDTH) downto i*12*(2*c_DATA_WIDTH)), + DATA_READY((downlinks-1) downto 0) => buf_DATA_READY((downlinks-1)+i*12 downto i*12), - DATA_ADDRESS_SENDER => buf_DATA_ADDRESS_SENDER, - DATA_SEQNMBR => buf_DATA_SEQNMBR, - DATA_LENGTH => buf_DATA_LENGTH, + DATA_ADDRESS_SENDER((downlinks*c_DATA_WIDTH-1) downto 0) => buf_DATA_ADDRESS_SENDER((downlinks*c_DATA_WIDTH-1)+i*12*c_DATA_WIDTH downto i*12*c_DATA_WIDTH), + DATA_SEQNMBR((downlinks*8-1) downto 0) => buf_DATA_SEQNMBR((downlinks*8-1)+i*12*8 downto i*12*8), + DATA_LENGTH((downlinks*c_DATA_WIDTH-1) downto 0) => buf_DATA_LENGTH((downlinks*c_DATA_WIDTH-1)+i*12*c_DATA_WIDTH downto i*12*c_DATA_WIDTH), ONEWIRE_DATA => ONEWIRE_DATA, ONEWIRE_ADDR => ONEWIRE_ADDR, @@ -353,6 +362,11 @@ THE_HUB_1 : entity work.trb_net16_cri_hub_base BUS_HUB_DBG_TX => bus_hub_dbg_1_tx ); +-- int_med_dataready_in(3 downto 1) <= (others => '0'); +-- int_med_data_in(63 downto 16) <= (others => '0'); +-- int_med_packet_num_in(11 downto 3) <= (others => '0'); +-- int_med_read_in(3 downto 1) <= (others => '0'); + end generate; THE_Event_Cntr : process begin wait until rising_edge(CLK); @@ -392,9 +406,14 @@ THE_CRI_DATA_RECEIVER_DEBUG_HANDLER : process begin --end if; end if; end process; - -loc_stat_op_1 <= int_med_ctrl_op(15) & "000" & x"000";--7 -int_med_stat_op <= loc_ctrl_op_1(15) & "000" & x"000"; --7 + + 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 + +-- gen_med_controls : for i in 1 to HUB_CONTROLLER_NUM-2 generate +-- loc_stat_op((i+1)*16-1 downto i*16) <= int_med_ctrl_op(i*16+15) & "000" & x"007";--7 +-- int_med_stat_op((i+1)*16-1 downto i*16) <= loc_ctrl_op(i*16+15) & "000" & x"007"; --7 +-- end generate; DATA_ACTIVE <= buf_DATA_ACTIVE; DATA_OUT <= buf_DATA_OUT; -- 2.43.0