From 05020c5d6043397aa8a490b52dc1af78902b528a Mon Sep 17 00:00:00 2001 From: Adrian Weber Date: Tue, 16 Nov 2021 14:54:06 +0100 Subject: [PATCH] allow odd numbers of downlinks for CRI hub --- src/hub/trb_net16_cri_hub.vhd | 151 ++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 18 deletions(-) diff --git a/src/hub/trb_net16_cri_hub.vhd b/src/hub/trb_net16_cri_hub.vhd index 01cb0b5..ce95c26 100644 --- a/src/hub/trb_net16_cri_hub.vhd +++ b/src/hub/trb_net16_cri_hub.vhd @@ -316,8 +316,8 @@ begin 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) + 1); - constant downlinks : integer := ((MII_NUMBER-1) / 2); + 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)); signal data_active_unused : std_logic; signal data_out_unused : std_logic_vector(2*c_DATA_WIDTH-1 downto 0); @@ -325,7 +325,122 @@ gen_data_hubs : for i in 0 to 1 generate --For now fixed to 1 (2 hubs), could be signal data_address_sender_unused : std_logic_vector(c_DATA_WIDTH-1 downto 0); signal data_seqnmbr_unused : std_logic_vector(7 downto 0); signal data_length_unused : std_logic_vector(c_DATA_WIDTH-1 downto 0); + + signal med_dataready_out_i : std_logic_vector((downlinks-1) downto 0); + signal med_data_out_i : std_logic_vector((downlinks*c_DATA_WIDTH-1) downto 0); + signal med_packet_num_out_i : std_logic_vector((downlinks*3-1) downto 0); + signal med_read_in_i : std_logic_vector((downlinks-1) downto 0); + + signal med_dataready_in_i : std_logic_vector((downlinks-1) downto 0); + signal med_data_in_i : std_logic_vector((downlinks*c_DATA_WIDTH-1) downto 0); + signal med_packet_num_in_i : std_logic_vector((downlinks*3-1) downto 0); + signal med_read_out_i : std_logic_vector((downlinks-1) downto 0); + + signal med_stat_op_i : std_logic_vector((downlinks*16-1) downto 0); + signal med_ctrl_op_i : std_logic_vector((downlinks*16-1) downto 0); + + signal buf_DATA_ACTIVE_i : std_logic_vector((downlinks-1) downto 0); + signal buf_DATA_OUT_i : std_logic_vector((downlinks*2*c_DATA_WIDTH-1) downto 0); + signal buf_DATA_READY_i : std_logic_vector((downlinks-1) downto 0); + + signal buf_DATA_ADDRESS_SENDER_i : std_logic_vector((downlinks*c_DATA_WIDTH-1) downto 0); + signal buf_DATA_SEQNMBR_i : std_logic_vector((downlinks*8)-1 downto 0); + signal buf_DATA_LENGTH_i : std_logic_vector((downlinks*c_DATA_WIDTH-1) downto 0); + begin + + -- connect all links of hub_0 + Hub_0_LINKS: if i = 0 generate + MED_DATAREADY_OUT((downlinks-1) downto 0) <= med_dataready_out_i; + MED_DATA_OUT((downlinks*c_DATA_WIDTH)-1 downto 0) <= med_data_out_i; + MED_PACKET_NUM_OUT((downlinks*3)-1 downto 0 ) <= med_packet_num_out_i; + + med_read_in_i <= MED_READ_IN((downlinks-1) downto 0); + + med_dataready_in_i <= MED_DATAREADY_IN((downlinks-1) downto 0); + med_data_in_i <= MED_DATA_IN((downlinks*c_DATA_WIDTH)-1 downto 0); + med_packet_num_in_i <= MED_PACKET_NUM_IN((downlinks*3)-1 downto 0 ); + + MED_READ_OUT((downlinks-1) downto 0) <= med_read_out_i; + + med_stat_op_i <= MED_STAT_OP((downlinks*16)-1 downto 0); + + HUB_MED_CTRL_OP((downlinks*16)-1 downto 0) <= med_ctrl_op_i; + + --Data output to uTS generator + buf_DATA_ACTIVE((downlinks-1) downto 0) <= buf_DATA_ACTIVE_i; + buf_DATA_OUT((downlinks*2*c_DATA_WIDTH)-1 downto 0) <= buf_DATA_OUT_i; + buf_DATA_READY((downlinks-1) downto 0) <= buf_DATA_READY_i; + + buf_DATA_ADDRESS_SENDER((downlinks*c_DATA_WIDTH)-1 downto 0) <= buf_DATA_ADDRESS_SENDER_i; + buf_DATA_SEQNMBR((downlinks*8)-1 downto 0) <= buf_DATA_SEQNMBR_i; + buf_DATA_LENGTH((downlinks*c_DATA_WIDTH)-1 downto 0) <= buf_DATA_LENGTH_i; + end generate Hub_0_LINKS; + + --connect links of hub_1: if odd number of downlinks, keep last one open + EVEN_LINKS: if (i = 1) and (((MII_NUMBER-1) mod 2) = 0) generate + MED_DATAREADY_OUT((downlinks-1) + downlinks downto downlinks) <= med_dataready_out_i; + MED_DATA_OUT((downlinks*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH) <= med_data_out_i; + MED_PACKET_NUM_OUT((downlinks*3)-1 + downlinks*3 downto downlinks*3) <= med_packet_num_out_i; + + med_read_in_i <= MED_READ_IN((downlinks-1) + downlinks downto downlinks); + + med_dataready_in_i <= MED_DATAREADY_IN((downlinks-1) + downlinks downto downlinks); + med_data_in_i <= MED_DATA_IN((downlinks*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH); + med_packet_num_in_i <= MED_PACKET_NUM_IN((downlinks*3)-1 + downlinks*3 downto downlinks*3); + + MED_READ_OUT((downlinks-1) + downlinks downto downlinks) <= med_read_out_i; + + med_stat_op_i <= MED_STAT_OP((downlinks*16)-1 + downlinks*16 downto downlinks*16); + + HUB_MED_CTRL_OP((downlinks*16)-1 + downlinks*16 downto downlinks*16) <= med_ctrl_op_i; + + --Data output to uTS generator + buf_DATA_ACTIVE((downlinks-1) + downlinks downto downlinks) <= buf_DATA_ACTIVE_i; + buf_DATA_OUT((downlinks*2*c_DATA_WIDTH)-1 + downlinks*2*c_DATA_WIDTH downto downlinks*2*c_DATA_WIDTH) <= buf_DATA_OUT_i; + buf_DATA_READY((downlinks-1) + downlinks downto downlinks) <= buf_DATA_READY_i; + + buf_DATA_ADDRESS_SENDER((downlinks*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH) <= buf_DATA_ADDRESS_SENDER_i; + buf_DATA_SEQNMBR((downlinks*8)-1 + downlinks*8 downto downlinks*8) <= buf_DATA_SEQNMBR_i; + buf_DATA_LENGTH((downlinks*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto 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 + MED_DATAREADY_OUT((downlinks-2) + downlinks downto downlinks) <= med_dataready_out_i((downlinks-2) downto 0); + MED_DATA_OUT(((downlinks-1)*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH) <= med_data_out_i(((downlinks-1)*c_DATA_WIDTH-1) downto 0); + MED_PACKET_NUM_OUT(((downlinks-1)*3)-1 + downlinks*3 downto downlinks*3) <= med_packet_num_out_i(((downlinks-1)*3-1) downto 0); + + med_read_in_i((downlinks-2) downto 0) <= MED_READ_IN((downlinks-2) + downlinks downto downlinks); + med_read_in_i(downlinks-1) <= '0'; + + med_dataready_in_i((downlinks-2) downto 0) <= MED_DATAREADY_IN((downlinks-2) + downlinks downto downlinks); + med_dataready_in_i(downlinks-1) <= '0'; + + med_data_in_i(((downlinks-1)*c_DATA_WIDTH-1) downto 0) <= MED_DATA_IN(((downlinks-1)*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH); + med_data_in_i(((downlinks)*c_DATA_WIDTH-1) downto ((downlinks-1)*c_DATA_WIDTH)) <= (others => '0'); + + med_packet_num_in_i(((downlinks-1)*3-1) downto 0) <= MED_PACKET_NUM_IN(((downlinks-1)*3)-1 + downlinks*3 downto downlinks*3); + med_packet_num_in_i(((downlinks)*3-1) downto ((downlinks-1)*3)) <= (others => '0'); + + MED_READ_OUT((downlinks-2) + downlinks downto downlinks) <= med_read_out_i((downlinks-2) downto 0); + + med_stat_op_i(((downlinks-1)*16-1) downto 0) <= MED_STAT_OP(((downlinks-1)*16)-1 + downlinks*16 downto downlinks*16); + med_stat_op_i(((downlinks)*16-1) downto ((downlinks-1)*16)+3) <= (others => '0'); + med_stat_op_i((downlinks-1)*16+2 downto ((downlinks-1)*16)) <= (others => '1'); -- ERROR_NC -> not connected for hub + + HUB_MED_CTRL_OP(((downlinks-1)*16)-1 + downlinks*16 downto downlinks*16) <= med_ctrl_op_i(((downlinks-1)*16-1) downto 0); + + --Data output to uTS generator + buf_DATA_ACTIVE((downlinks-2) + downlinks downto downlinks) <= buf_DATA_ACTIVE_i((downlinks-2) downto 0); + buf_DATA_OUT(((downlinks-1)*2*c_DATA_WIDTH)-1 + downlinks*2*c_DATA_WIDTH downto downlinks*2*c_DATA_WIDTH) <= buf_DATA_OUT_i(((downlinks-1)*2*c_DATA_WIDTH)-1 downto 0); + buf_DATA_READY((downlinks-2) + downlinks downto downlinks) <= buf_DATA_READY_i((downlinks-2) downto 0); + + buf_DATA_ADDRESS_SENDER(((downlinks-1)*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH) <= buf_DATA_ADDRESS_SENDER_i(((downlinks-1)*c_DATA_WIDTH)-1 downto 0); + buf_DATA_SEQNMBR(((downlinks-1)*8)-1 + downlinks*8 downto downlinks*8) <= buf_DATA_SEQNMBR_i(((downlinks-1)*8)-1 downto 0); + buf_DATA_LENGTH(((downlinks-1)*c_DATA_WIDTH)-1 + downlinks*c_DATA_WIDTH downto downlinks*c_DATA_WIDTH) <= buf_DATA_LENGTH_i(((downlinks-1)*c_DATA_WIDTH)-1 downto 0); + end generate ODD_LINKS; + + THE_HUB_DATA : entity work.trb_net16_cri_hub_base generic map( HUB_USED_CHANNELS => (0,1,0,1), @@ -349,49 +464,49 @@ THE_HUB_DATA : entity work.trb_net16_cri_hub_base CLK_EN => '1', --Media interfacces - MED_DATAREADY_OUT(links-2 downto 0) => MED_DATAREADY_OUT((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + 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((downlinks*16)-1+i*MAX_HUB_SIZE*16 downto i*MAX_HUB_SIZE*16), + 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((downlinks*3)-1+i*MAX_HUB_SIZE*3 downto i*MAX_HUB_SIZE*3), + 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((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + 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((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + 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((downlinks*16)-1+i*MAX_HUB_SIZE*16 downto i*MAX_HUB_SIZE*16), + 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((downlinks*3)-1+i*MAX_HUB_SIZE*3 downto i*MAX_HUB_SIZE*3), + 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((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + 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((downlinks*16)-1+i*MAX_HUB_SIZE*16 downto i*MAX_HUB_SIZE*16), + 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) => HUB_MED_CTRL_OP((downlinks*16)-1+i*MAX_HUB_SIZE*16 downto i*MAX_HUB_SIZE*16), + 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 DATA_ACTIVE(links-1) => data_active_unused, - DATA_ACTIVE((downlinks-1) downto 0) => buf_DATA_ACTIVE((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + DATA_ACTIVE((downlinks-1) downto 0) => buf_DATA_ACTIVE_i, DATA_OUT(links*2*c_DATA_WIDTH-1 downto downlinks*2*c_DATA_WIDTH) => data_out_unused, - DATA_OUT((downlinks*(2*c_DATA_WIDTH)-1) downto 0) => buf_DATA_OUT((downlinks*(2*c_DATA_WIDTH)-1)+i*MAX_HUB_SIZE*(2*c_DATA_WIDTH) downto i*MAX_HUB_SIZE*(2*c_DATA_WIDTH)), + 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((downlinks-1)+i*MAX_HUB_SIZE downto i*MAX_HUB_SIZE), + 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((downlinks*c_DATA_WIDTH-1)+i*MAX_HUB_SIZE*c_DATA_WIDTH downto i*MAX_HUB_SIZE*c_DATA_WIDTH), + 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((downlinks*8-1)+i*MAX_HUB_SIZE*8 downto i*MAX_HUB_SIZE*8), + 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((downlinks*c_DATA_WIDTH-1)+i*MAX_HUB_SIZE*c_DATA_WIDTH downto i*MAX_HUB_SIZE*c_DATA_WIDTH), + DATA_LENGTH((downlinks*c_DATA_WIDTH-1) downto 0) => buf_DATA_LENGTH_i, ONEWIRE_DATA => ONEWIRE_DATA, ONEWIRE_ADDR => ONEWIRE_ADDR, -- 2.43.0