]> jspc29.x-matter.uni-frankfurt.de Git - cri.git/commitdiff
preparation of CRI hub for DCA connection and small bug fix
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 2 Mar 2021 15:27:30 +0000 (16:27 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 2 Mar 2021 15:27:30 +0000 (16:27 +0100)
src/hub/trb_net16_cri_hub.vhd
src/hub/trb_net16_cri_hub_base3.vhd

index 215025a362fd4207f9fc436c46a453b3f7197b9e..0003ddfbb2b0e436c70f122d4729684d2cf099c7 100644 (file)
@@ -42,7 +42,7 @@ entity trb_net16_cri_hub is
     MII_IS_DOWNLINK         : hub_mii_config_t := (others => c_YES);
     MII_IS_UPLINK_ONLY      : hub_mii_config_t := (others => c_NO);
   -- settings for external api connections
-    INT_NUMBER              : integer range 0 to c_MAX_API_PER_HUB := 0;
+    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--;
@@ -80,30 +80,24 @@ entity trb_net16_cri_hub is
     ONEWIRE_ADDR            : in  std_logic_vector( 2 downto 0);
     ONEWIRE_WRITE           : in  std_logic;
 
-    --INT: interfaces to connect APIs
-    INT_INIT_DATAREADY_OUT    : out std_logic_vector (INT_NUMBER downto 0);
-    INT_INIT_DATA_OUT         : out std_logic_vector (INT_NUMBER*c_DATA_WIDTH downto 0);
-    INT_INIT_PACKET_NUM_OUT   : out std_logic_vector (INT_NUMBER*c_NUM_WIDTH  downto 0);
-    INT_INIT_READ_IN          : in  std_logic_vector (INT_NUMBER downto 0) := (others => '0');
-    INT_INIT_DATAREADY_IN     : in  std_logic_vector (INT_NUMBER downto 0) := (others => '0');
-    INT_INIT_DATA_IN          : in  std_logic_vector (INT_NUMBER*c_DATA_WIDTH downto 0) := (others => '0');
-    INT_INIT_PACKET_NUM_IN    : in  std_logic_vector (INT_NUMBER*c_NUM_WIDTH  downto 0) := (others => '0');
-    INT_INIT_READ_OUT         : out std_logic_vector (INT_NUMBER downto 0);
-    INT_REPLY_DATAREADY_OUT   : out std_logic_vector (INT_NUMBER downto 0);
-    INT_REPLY_DATA_OUT        : out std_logic_vector (INT_NUMBER*c_DATA_WIDTH downto 0);
-    INT_REPLY_PACKET_NUM_OUT  : out std_logic_vector (INT_NUMBER*c_NUM_WIDTH  downto 0);
-    INT_REPLY_READ_IN         : in  std_logic_vector (INT_NUMBER downto 0) := (others => '0');
-    INT_REPLY_DATAREADY_IN    : in  std_logic_vector (INT_NUMBER downto 0) := (others => '0');
-    INT_REPLY_DATA_IN         : in  std_logic_vector (INT_NUMBER*c_DATA_WIDTH downto 0) := (others => '0');
-    INT_REPLY_PACKET_NUM_IN   : in  std_logic_vector (INT_NUMBER*c_NUM_WIDTH downto 0) := (others => '0');
-    INT_REPLY_READ_OUT        : out std_logic_vector (INT_NUMBER downto 0);
+    --Slow Control connection for DCA
+    DCA_INIT_DATAREADY_IN        : in  std_logic_vector ( 0 downto 0) := (others => '0');
+    DCA_INIT_DATA_IN             : in  std_logic_vector (15 downto 0) := (others => '0');
+    DCA_INIT_PACKET_NUM_IN       : in  std_logic_vector ( 2 downto 0) := (others => '0');
+    DCA_INIT_READ_OUT            : out std_logic_vector ( 0 downto 0);
+    
+    DCA_REPLY_DATAREADY_OUT      : out std_logic_vector ( 0 downto 0);
+    DCA_REPLY_DATA_OUT           : out std_logic_vector (15 downto 0);
+    DCA_REPLY_PACKET_NUM_OUT     : out std_logic_vector ( 2 downto 0);
+    DCA_REPLY_READ_IN            : in  std_logic_vector ( 0 downto 0) := (others => '0');
+    DCA_BUSY_OUT                 : out std_logic_vector ( 0 downto 0);
 
     COMMON_STAT_REGS             : in  std_logic_vector (std_COMSTATREG*32-1 downto 0) := (others => '0');  --Status of common STAT regs
     COMMON_CTRL_REGS             : out std_logic_vector (std_COMCTRLREG*32-1 downto 0);  --Status of common STAT regs
     COMMON_STAT_REG_STROBE       : out std_logic_vector (std_COMSTATREG-1 downto 0);
     COMMON_CTRL_REG_STROBE       : out std_logic_vector (std_COMCTRLREG-1 downto 0);
     MY_ADDRESS_OUT               : out std_logic_vector (15 downto 0);
-    TEMPERATURE_IN               : in std_logic_vector (11 downto 0);
+    TEMPERATURE_IN               : in  std_logic_vector (11 downto 0);
     
     --REGIO INTERFACE
     REGIO_ADDR_OUT               : out std_logic_vector(16-1 downto 0);
@@ -129,6 +123,8 @@ entity trb_net16_cri_hub is
     STAT_CTRL_REGS               : out std_logic_vector (8*32-1 downto 0);  --Status of custom CTRL regs
     IOBUF_STAT_INIT_OBUF_DEBUG   : out std_logic_vector (MII_NUMBER*32*2**(c_MUX_WIDTH-1)-1 downto 0);
     IOBUF_STAT_REPLY_OBUF_DEBUG  : out std_logic_vector (MII_NUMBER*32*2**(c_MUX_WIDTH-1)-1 downto 0);
+    
+    EXTERNAL_SEND_RESET          : in  std_logic := '0';
 
     --Debugging registers
     STAT_DEBUG                   : out std_logic_vector (31 downto 0);      --free status regs for debugging
@@ -142,6 +138,23 @@ end entity;
 
 architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is
 
+  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);
+  signal hub_reply_dataready_in    : std_logic_vector( INT_NUMBER downto 0);
+  signal hub_init_read_out         : std_logic_vector( INT_NUMBER downto 0);
+  signal hub_reply_read_out        : std_logic_vector( INT_NUMBER downto 0);
+  signal hub_init_read_in          : std_logic_vector( INT_NUMBER downto 0);
+  signal hub_reply_read_in         : std_logic_vector( INT_NUMBER downto 0);
+  signal hub_init_data_out         : std_logic_vector( INT_NUMBER*c_DATA_WIDTH downto 0);
+  signal hub_reply_data_out        : std_logic_vector( INT_NUMBER*c_DATA_WIDTH downto 0);
+  signal hub_init_data_in          : std_logic_vector( INT_NUMBER*c_DATA_WIDTH downto 0);
+  signal hub_reply_data_in         : std_logic_vector( INT_NUMBER*c_DATA_WIDTH downto 0);
+  signal hub_init_packet_num_out   : std_logic_vector( INT_NUMBER*c_NUM_WIDTH downto 0);
+  signal hub_reply_packet_num_out  : std_logic_vector( INT_NUMBER*c_NUM_WIDTH downto 0);
+  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 (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);
@@ -173,6 +186,15 @@ architecture trb_net16_cri_hub_arch of trb_net16_cri_hub is
   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 HUB_MED_CTRL_OP   : std_logic_vector(MII_NUMBER*16-1 downto 0);
+  signal buf_HUB_STAT_GEN  : std_logic_vector (31 downto 0);
+  
 begin
 
   gen_unused_signals : if 1 =1  generate
@@ -230,29 +252,30 @@ begin
       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)      => med_ctrl_op(MII_NUMBER*16-1 downto (MII_NUMBER-1)*16),
+      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 APIs
-      INT_INIT_DATAREADY_OUT          => INT_INIT_DATAREADY_OUT,
-      INT_INIT_DATA_OUT               => INT_INIT_DATA_OUT, 
-      INT_INIT_PACKET_NUM_OUT         => INT_INIT_PACKET_NUM_OUT,
-      INT_INIT_READ_IN                => INT_INIT_READ_IN,
-      INT_INIT_DATAREADY_IN           => INT_INIT_DATAREADY_IN,
-      INT_INIT_DATA_IN                => INT_INIT_DATA_IN,  
-      INT_INIT_PACKET_NUM_IN          => INT_INIT_PACKET_NUM_IN,
-      INT_INIT_READ_OUT               => INT_INIT_READ_OUT, 
-      INT_REPLY_DATAREADY_OUT         => INT_REPLY_DATAREADY_OUT,
-      INT_REPLY_DATA_OUT              => INT_REPLY_DATA_OUT,
-      INT_REPLY_PACKET_NUM_OUT        => INT_REPLY_PACKET_NUM_OUT,
-      INT_REPLY_READ_IN               => INT_REPLY_READ_IN,
-      INT_REPLY_DATAREADY_IN          => INT_REPLY_DATAREADY_IN,
-      INT_REPLY_DATA_IN               => INT_REPLY_DATA_IN, 
-      INT_REPLY_PACKET_NUM_IN         => INT_REPLY_PACKET_NUM_IN,
-      INT_REPLY_READ_OUT              => INT_REPLY_READ_OUT,
+      --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,      
@@ -269,11 +292,16 @@ begin
       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,     
+      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                      => (others => '0'),
       STAT_DEBUG                      => open,
@@ -344,7 +372,7 @@ THE_HUB_1 : entity work.trb_net16_cri_hub_base
       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((links-1)*16-1 downto 0)               => MED_CTRL_OP((downlinks*16)-1+i*12*16 downto i*12*16),
+      MED_CTRL_OP((links-1)*16-1 downto 0)               => HUB_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(links-1)                               => data_active_unused,
@@ -437,22 +465,73 @@ THE_CRI_DATA_RECEIVER_DEBUG_HANDLER : process begin
     --  BUS_HUB_DBG_TX.ack <= '1';
     --end if;
   end if;
-  end process;      
+  end process;
+  
+  
+---------------------------------------------------------------------
+-- Slowcontrol injection via GbE
+---------------------------------------------------------------------
 
+    hub_init_dataready_in(0)             <= DCA_INIT_DATAREADY_IN(0);   
+    hub_init_data_in(15 downto 0)        <= DCA_INIT_DATA_IN(15 downto 0);
+    hub_init_packet_num_in(2 downto 0)   <= DCA_INIT_PACKET_NUM_IN;  
+    DCA_INIT_READ_OUT(0)                 <= hub_init_read_out(0);
+    DCA_REPLY_DATAREADY_OUT(0)           <= hub_reply_dataready_out(0);
+    DCA_REPLY_DATA_OUT(15 downto 0)      <= hub_reply_data_out(15 downto 0);
+    DCA_REPLY_PACKET_NUM_OUT(2 downto 0) <= hub_reply_packet_num_out(2 downto 0);
+    hub_reply_read_in(0)                 <= DCA_REPLY_READ_IN(0);       
+    DCA_BUSY_OUT(0)                      <= buf_HUB_STAT_GEN(3);
+
+    hub_reply_dataready_in(0)<= '0';
+    hub_reply_data_in        <= (others => '0');
+    hub_reply_packet_num_in  <= (others => '0');
+    hub_init_read_in(0)      <= '1';
+  
+    --HUB_STAT_GEN <= buf_HUB_STAT_GEN;
+
+---------------------------------------------------------------------
+-- External Reset
+---------------------------------------------------------------------
+
+  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;-- or HUB_MED_CTRL_OP(15+i*16);
+  end generate;
+
+  --synch_dca_reset : process begin  
+  --  wait until rising_edge(CLK);
+    hub_make_network_reset <= external_send_reset_long;
+  --end process;
+
+  make_dca_reset : process begin
+    wait until rising_edge(CLK);
+    if(EXTERNAL_SEND_RESET = '1') then
+      external_send_reset_long  <= '1';
+      external_send_reset_timer <= '1';
+    end if;
+    if timer_ticks(0) = '1' then
+      external_send_reset_timer <= '0';
+      external_send_reset_long  <= external_send_reset_timer;
+    end if;
+  end process;  
+  
+  TIMER_TICKS_OUT <= timer_ticks;  
+  
+---------------------------------------------------------------------
+-- 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
   
--- 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;           
-DATA_READY          <= buf_DATA_READY;         
-                       
-DATA_ADDRESS_SENDER <= buf_DATA_ADDRESS_SENDER;
-DATA_SEQNMBR        <= buf_DATA_SEQNMBR;       
-DATA_LENGTH         <= buf_DATA_LENGTH;        
+---------------------------------------------------------------------
+-- Data output preparation
+---------------------------------------------------------------------
+  DATA_ACTIVE         <= buf_DATA_ACTIVE;       
+  DATA_OUT            <= buf_DATA_OUT;           
+  DATA_READY          <= buf_DATA_READY;         
+                         
+  DATA_ADDRESS_SENDER <= buf_DATA_ADDRESS_SENDER;
+  DATA_SEQNMBR        <= buf_DATA_SEQNMBR;       
+  DATA_LENGTH         <= buf_DATA_LENGTH;        
 
 end architecture;
index 49f04c6dadd64b479385f60ce8dcd8e3ddce2078..e50dad58b888b84a12b999439a73a07bdc818e14 100644 (file)
@@ -1054,9 +1054,9 @@ begin
           STAT_TIMEOUT                   => open,
           
           HUB_STAT_CHANNEL               => buf_HUB_STAT_CHANNEL,
-          HUB_STAT_GEN                   => buf_STAT_DEBUG,
+          HUB_STAT_GEN                   => buf_HUB_STAT_GEN,
                                           
-          STAT_DEBUG                     => buf_HUB_STAT_GEN,
+          STAT_DEBUG                     => buf_STAT_DEBUG,
           CTRL_DEBUG                     => CTRL_DEBUG
           );
     end generate;