CBM_CLK_OUT : out std_logic;\r
CBM_RESET_OUT: out std_logic;\r
\r
+ REBOOT_FPGA_OUT : out std_logic;\r
+ \r
-- Media Interface\r
SD_RXD_P_IN : in std_logic := '0';\r
SD_RXD_N_IN : in std_logic := '0';\r
signal cbm_data2send_buf_i : std_logic_vector(15 downto 0);\r
\r
signal cbm_phy_ctrl_i : std_logic_vector(31 downto 0);\r
+ \r
+ signal cbm_reboot_fpga_i : std_logic;\r
+ \r
\r
-- regio\r
signal regio_rx, rdo_regio_rx, phy_regio_rx, sync_regio_rx : CTRLBUS_RX;\r
signal trb_data_override_i : std_logic_vector(16 downto 0);\r
signal cbm_data_override_i : std_logic_vector(16 downto 0);\r
\r
+-- reboot fsm\r
+ type RB_FSM_STATES is (WAIT_FOR_D, WAIT_FOR_1, WAIT_FOR_E, REBOOT);\r
+ signal rb_fsm_i : RB_FSM_STATES;\r
begin\r
THE_CBM_PHY: cbmnet_phy_ecp3\r
generic map (\r
REGIO_WRITE_ACK_OUT <= regio_tx.ack;\r
REGIO_NO_MORE_DATA_OUT <= regio_tx.nack;\r
REGIO_UNKNOWN_ADDR_OUT <= regio_tx.unknown;\r
+\r
+ \r
+-- REBOOT via DLM\r
+ THE_DLM_REBOOT: process\r
+ begin\r
+ cbm_reboot_fpga_i <= '0';\r
+ if cbm_link_active_i='0' then\r
+ rb_fsm_i <= WAIT_FOR_D;\r
+ else\r
+ case (rb_fsm_i) is\r
+ when WAIT_FOR_D =>\r
+ if cbm_dlm_rec_va_i='1' and cbm_dlm_rec_type_i=x"d" then\r
+ rb_fsm_i <= WAIT_FOR_1;\r
+ end if;\r
+ \r
+ when WAIT_FOR_1 =>\r
+ if cbm_dlm_rec_va_i='1' then\r
+ if cbm_dlm_rec_type_i=x"1" then\r
+ rb_fsm_i <= WAIT_FOR_E;\r
+ else\r
+ rb_fsm_i <= WAIT_FOR_D;\r
+ end if;\r
+ end if;\r
+ \r
+ when WAIT_FOR_E =>\r
+ if cbm_dlm_rec_va_i='1' then\r
+ if cbm_dlm_rec_type_i=x"E" then\r
+ rb_fsm_i <= REBOOT;\r
+ else\r
+ rb_fsm_i <= WAIT_FOR_D;\r
+ end if;\r
+ end if;\r
+ \r
+ when REBOOT =>\r
+ cbm_reboot_fpga_i <= '1';\r
+ end case;\r
+ end if;\r
+ end process;\r
+ \r
+ THE_REBOOT_SYNC: pos_edge_strech_sync\r
+ port map (\r
+ IN_CLK_IN => cbm_clk_i,\r
+ DATA_IN => cbm_reboot_fpga_i,\r
+ OUT_CLK_IN => TRB_CLK_IN,\r
+ DATA_OUT => REBOOT_FPGA_OUT\r
+ );\r
end architecture;
\ No newline at end of file
CBM_CLK_OUT : out std_logic;
CBM_RESET_OUT: out std_logic;
+ REBOOT_FPGA_OUT: out std_logic;
+
-- Media Interface
SD_RXD_P_IN : in std_logic := '0';
SD_RXD_N_IN : in std_logic := '0';
signal regio_data_ready_i : std_logic;
signal regio_unkown_address_i : std_logic;
- signal cfg_enabled_i : std_logic;
+ signal cfg_enabled_i : std_logic;
+ signal cfg_include_gbe_i : std_logic := '1';
signal cfg_source_i : std_logic_vector(15 downto 0);
signal cfg_source_override_i : std_logic;
+
+ signal gbe_include_i : std_logic := '1';
begin
GBE_CTS_NUMBER_OUT <= HUB_CTS_NUMBER_IN;
GBE_CTS_CODE_OUT <= HUB_CTS_CODE_IN;
GBE_CTS_INFORMATION_OUT <= HUB_CTS_INFORMATION_IN;
GBE_CTS_READOUT_TYPE_OUT <= HUB_CTS_READOUT_TYPE_IN;
- GBE_CTS_START_READOUT_OUT <= HUB_CTS_START_READOUT_IN;
+ GBE_CTS_START_READOUT_OUT <= HUB_CTS_START_READOUT_IN and gbe_include_i;
GBE_FEE_DATA_OUT <= HUB_FEE_DATA_IN;
- GBE_FEE_DATAREADY_OUT <= HUB_FEE_DATAREADY_IN;
+ GBE_FEE_DATAREADY_OUT <= HUB_FEE_DATAREADY_IN and gbe_include_i;
GBE_FEE_STATUS_BITS_OUT <= HUB_FEE_STATUS_BITS_IN;
- GBE_FEE_BUSY_OUT <= HUB_FEE_BUSY_IN;
+ GBE_FEE_BUSY_OUT <= HUB_FEE_BUSY_IN and gbe_include_i;
- HUB_FEE_READ_OUT <= GBE_FEE_READ_IN;
- HUB_CTS_READOUT_FINISHED_OUT <= GBE_CTS_READOUT_FINISHED_IN;
+ HUB_FEE_READ_OUT <= GBE_FEE_READ_IN or not gbe_include_i;
+ HUB_CTS_READOUT_FINISHED_OUT <= GBE_CTS_READOUT_FINISHED_IN or not gbe_include_i;
HUB_CTS_STATUS_BITS_OUT <= GBE_CTS_STATUS_BITS_IN;
proc_reset: process is
-- read
case addr is
- when 16#00# => regio_data_status_i(0) <= cfg_enabled_i;
+ when 16#00# =>
+ regio_data_status_i(0) <= cfg_enabled_i;
+ regio_data_status_i(1) <= cfg_include_gbe_i;
when 16#01# => regio_data_status_i(16 downto 0) <= cfg_source_override_i & cfg_source_i;
when 16#02# => regio_data_status_i <= std_logic_vector(stat_connections_i); regio_data_ready_i <= trb_from_cbm_sync_ack_i;
case addr is
when 16#0# =>
cfg_enabled_i <= REGIO_IN.data(0);
+ cfg_include_gbe_i <= REGIO_IN.data(1);
when 16#1# =>
cfg_source_i <= REGIO_IN.data(15 downto 0);
regio_unkown_address_i <= '1';
end case;
end if;
+
+ if RESET_IN = '1' then
+ cfg_enabled_i <= '0';
+ cfg_include_gbe_i <= '1';
+ end if;
+
+ -- make sure, we enable/disable gbe not during an ongoing rdo
+ if HUB_CTS_START_READOUT_IN='0' and HUB_FEE_BUSY_IN='0' then
+ gbe_include_i <= cfg_include_gbe_i;
+ end if;
end process;