From 30286432cb3c49f9aca3ea6b53490de8aab4cfe7 Mon Sep 17 00:00:00 2001 From: Adrian Weber Date: Tue, 2 Mar 2021 16:27:30 +0100 Subject: [PATCH] preparation of CRI hub for DCA connection and small bug fix --- src/hub/trb_net16_cri_hub.vhd | 183 ++++++++++++++++++++-------- src/hub/trb_net16_cri_hub_base3.vhd | 4 +- 2 files changed, 133 insertions(+), 54 deletions(-) diff --git a/src/hub/trb_net16_cri_hub.vhd b/src/hub/trb_net16_cri_hub.vhd index 215025a..0003ddf 100644 --- a/src/hub/trb_net16_cri_hub.vhd +++ b/src/hub/trb_net16_cri_hub.vhd @@ -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; diff --git a/src/hub/trb_net16_cri_hub_base3.vhd b/src/hub/trb_net16_cri_hub_base3.vhd index 49f04c6..e50dad5 100644 --- a/src/hub/trb_net16_cri_hub_base3.vhd +++ b/src/hub/trb_net16_cri_hub_base3.vhd @@ -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; -- 2.43.0