]> jspc29.x-matter.uni-frankfurt.de Git - cri.git/commitdiff
allow odd numbers of downlinks for CRI hub
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 16 Nov 2021 13:54:06 +0000 (14:54 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 16 Nov 2021 13:54:06 +0000 (14:54 +0100)
src/hub/trb_net16_cri_hub.vhd

index 01cb0b5a23aad57d5ae6abb7a4af95393c4ff56d..ce95c26c6836e9ce07bc1c296219cfcd48edf3f0 100644 (file)
@@ -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,