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);
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),
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,