--******************************************************************************
--* @short Logic to combine the status bits of all chips to the GMT status.
--* (Inside ROP Chip)
--*
--* Contains only asynchronous logic to compare the status signals
--* from the chips into an overal GMT status.
--*
--******************************************************************************
--* @author SAKULIN Hannes <hsakulin@dsy-srv3.cern.ch>
--* @version $Revision: 1.2 $
--* @date $Date: 2004/12/16 19:02:15 $
--******************************************************************************
--/
library IEEE;
use IEEE.Std_logic_1164.all;
-- pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.all;
-- pragma translate_on
use IEEE.NUMERIC_STD.all;
use work.VMEMux.all;
use work.ROPVMEAddrMap.all;
entity ROPCombineStatus is
port (
-- STATUS Signals of FPGAs for VME
dcm_locked_ROP : in std_logic;
dcm_locked_INF : in std_logic;
dcm_locked_INC : in std_logic;
dcm_locked_IND : in std_logic;
dcm_locked_INB : in std_logic;
dcm_locked_AUF : in std_logic;
dcm_locked_LFF : in std_logic;
dcm_locked_LFB : in std_logic;
dcm_locked_AUB : in std_logic;
dcm_locked_SRT : in std_logic;
-- STATUS Signals of FPGAs for TCS
status_ROP : in std_logic_vector(1 downto 0);
status_INF : in std_logic_vector(1 downto 0);
status_INC : in std_logic_vector(1 downto 0);
status_IND : in std_logic_vector(1 downto 0);
status_INB : in std_logic_vector(1 downto 0);
status_AUF : in std_logic_vector(1 downto 0);
status_LFF : in std_logic_vector(1 downto 0);
status_LFB : in std_logic_vector(1 downto 0);
status_AUB : in std_logic_vector(1 downto 0);
status_SRT : in std_logic_vector(1 downto 0);
STAT_GMT : out std_logic_vector(3 downto 0);
busy_from_SW : in std_logic;
ready_from_SW : in std_logic;
-- Clock and control
clk : in std_logic;
reset : in std_logic
);
end;
architecture behavioral of ROPCombineStatus is
attribute syn_useioff : boolean;
attribute syn_useioff of behavioral : architecture is true;
signal warning_ROP, outofsync_ROP, error_ROP : std_logic;
signal warning_INF, outofsync_INF, error_INF : std_logic;
signal warning_INC, outofsync_INC, error_INC : std_logic;
signal warning_IND, outofsync_IND, error_IND : std_logic;
signal warning_INB, outofsync_INB, error_INB : std_logic;
signal warning_AUF, outofsync_AUF, error_AUF : std_logic;
signal warning_LFB, outofsync_LFB, error_LFB : std_logic;
signal warning_LFF, outofsync_LFF, error_LFF : std_logic;
signal warning_AUB, outofsync_AUB, error_AUB : std_logic;
signal warning_SRT, outofsync_SRT, error_SRT : std_logic;
signal any_warning, any_outofsync, any_error : std_logic;
begin
warning_ROP <= '1' when status_ROP = "01" else '0';
warning_INF <= '1' when status_INF = "01" else '0';
warning_INC <= '1' when status_INC = "01" else '0';
warning_IND <= '1' when status_IND = "01" else '0';
warning_INB <= '1' when status_INB = "01" else '0';
warning_AUF <= '1' when status_AUF = "01" else '0';
warning_LFB <= '1' when status_LFB = "01" else '0';
warning_LFF <= '1' when status_LFF = "01" else '0';
warning_AUB <= '1' when status_AUB = "01" else '0';
warning_SRT <= '1' when status_SRT = "01" else '0';
outofsync_ROP <= '1' when status_ROP = "10" else '0';
outofsync_INF <= '1' when status_INF = "10" else '0';
outofsync_INC <= '1' when status_INC = "10" else '0';
outofsync_IND <= '1' when status_IND = "10" else '0';
outofsync_INB <= '1' when status_INB = "10" else '0';
outofsync_AUF <= '1' when status_AUF = "10" else '0';
outofsync_LFB <= '1' when status_LFB = "10" else '0';
outofsync_LFF <= '1' when status_LFF = "10" else '0';
outofsync_AUB <= '1' when status_AUB = "10" else '0';
outofsync_SRT <= '1' when status_SRT = "10" else '0';
error_ROP <= '1' when (status_ROP = "11" or dcm_locked_ROP = '0') else '0';
error_INF <= '1' when (status_INF = "11" or dcm_locked_INF = '0') else '0';
error_INC <= '1' when (status_INC = "11" or dcm_locked_INC = '0') else '0';
error_IND <= '1' when (status_IND = "11" or dcm_locked_IND = '0') else '0';
error_INB <= '1' when (status_INB = "11" or dcm_locked_INB = '0') else '0';
error_AUF <= '1' when (status_AUF = "11" or dcm_locked_AUF = '0') else '0';
error_LFB <= '1' when (status_LFB = "11" or dcm_locked_LFB = '0') else '0';
error_LFF <= '1' when (status_LFF = "11" or dcm_locked_LFF = '0') else '0';
error_AUB <= '1' when (status_AUB = "11" or dcm_locked_AUB = '0') else '0';
error_SRT <= '1' when (status_SRT = "11" or dcm_locked_SRT = '0') else '0';
any_warning <= warning_ROP or
warning_INF or
warning_INC or
warning_IND or
warning_INB or
warning_AUF or
warning_LFB or
warning_LFF or
warning_AUB or
warning_SRT;
any_error <= error_ROP or
error_INF or
error_INC or
error_IND or
error_INB or
error_AUF or
error_LFB or
error_LFF or
error_AUB or
error_SRT;
any_outofsync <= outofsync_ROP or
outofsync_INF or
outofsync_INC or
outofsync_IND or
outofsync_INB or
outofsync_AUF or
outofsync_LFB or
outofsync_LFF or
outofsync_AUB or
outofsync_SRT;
-- priority encoder
stat_GMT <= "1100" when any_error = '1' else -- ERROR
"0010" when any_outofsync = '1' else -- OUTOFSYNC
"0100" when busy_from_SW = '1' else -- BUSY
"0001" when any_warning = '1' else -- WARNING
"1000" when ready_from_SW = '1' else -- READY
"0000"; -- DISCONNECTED
end architecture behavioral;