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