]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
*** empty log message ***
authorhadeshyp <hadeshyp>
Thu, 29 Jul 2010 09:59:47 +0000 (09:59 +0000)
committerhadeshyp <hadeshyp>
Thu, 29 Jul 2010 09:59:47 +0000 (09:59 +0000)
gbe_ecp2m/trb_net16_gbe_buf.vhd
gbe_ecp2m/trb_net16_gbe_frame_constr.vhd
gbe_ecp2m/trb_net16_gbe_packet_constr.vhd
gbe_ecp2m/trb_net16_gbe_setup.vhd
gbe_ecp2m/trb_net16_ipu2gbe.vhd
gbe_ecp2m/trb_net_gbe_components.vhd

index bda8c3e1fffd6f3c578d60b0734a0cb33324e092..e5ec7ec23579be5e1cd747efbc3f6d6f36a8747a 100755 (executable)
@@ -8,7 +8,8 @@ library work;
 use work.trb_net_std.all;
 use work.trb_net_components.all;
 use work.trb_net16_hub_func.all;
-use work.version.all;
+use work.trb_net_gbe_components.all;
+--use work.version.all;
 
 entity trb_net16_gbe_buf is
 generic( 
@@ -82,102 +83,6 @@ port(
        SFP_PRSNT_N_IN                          : in    std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
        SFP_LOS_IN                                      : in    std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
        SFP_TXDIS_OUT                           : out   std_logic; -- SFP disable
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
-       -- PacketConstructor interface
-       IG_CTS_CTR_TST                          : out   std_logic_vector(2 downto 0);
-       IG_REM_CTR_TST                          : out   std_logic_vector(3 downto 0);
-       IG_BSM_LOAD_TST                         : out   std_logic_vector(3 downto 0);
-       IG_BSM_SAVE_TST                         : out   std_logic_vector(3 downto 0);
-       IG_DATA_TST                                     : out   std_logic_vector(15 downto 0);
-       IG_WCNT_TST                                     : out   std_logic_vector(15 downto 0);
-       IG_RCNT_TST                                     : out   std_logic_vector(16 downto 0);
-       IG_RD_EN_TST                            : out   std_logic;
-       IG_WR_EN_TST                            : out   std_logic;
-       IG_EMPTY_TST                            : out   std_logic;
-       IG_AEMPTY_TST                           : out   std_logic;
-       IG_FULL_TST                                     : out   std_logic;
-       IG_AFULL_TST                            : out   std_logic;
-       PC_WR_EN_TST                            : out   std_logic;
-       PC_DATA_TST                                     : out   std_logic_vector (7 downto 0);
-       PC_READY_TST                            : out   std_logic;
-       PC_START_OF_SUB_TST                     : out   std_logic;
-       PC_END_OF_DATA_TST                      : out   std_logic;
-       PC_SUB_SIZE_TST                         : out   std_logic_vector(31 downto 0);
-       PC_TRIG_NR_TST                          : out   std_logic_vector(31 downto 0);
-       PC_PADDING_TST                          : out   std_logic;
-       PC_DECODING_TST                         : out   std_logic_vector(31 downto 0);
-       PC_EVENT_ID_TST                         : out   std_logic_vector(31 downto 0);
-       PC_QUEUE_DEC_TST                        : out   std_logic_vector(31 downto 0);
-       PC_BSM_CONSTR_TST                       : out   std_logic_vector(3 downto 0);
-       PC_BSM_LOAD_TST                         : out   std_logic_vector(3 downto 0);
-       PC_BSM_SAVE_TST                         : out   std_logic_vector(3 downto 0);
-       PC_SHF_EMPTY_TST                        : out   std_logic;
-       PC_SHF_FULL_TST                         : out   std_logic;
-       PC_SHF_WR_EN_TST                        : out   std_logic;
-       PC_SHF_RD_EN_TST                        : out   std_logic;
-       PC_SHF_Q_TST                            : out   std_logic_vector(7 downto 0);
-       PC_DF_EMPTY_TST                         : out   std_logic;
-       PC_DF_FULL_TST                          : out   std_logic;
-       PC_DF_WR_EN_TST                         : out   std_logic;
-       PC_DF_RD_EN_TST                         : out   std_logic;
-       PC_DF_Q_TST                                     : out   std_logic_vector(7 downto 0);
-       PC_ALL_CTR_TST                          : out   std_logic_vector(4 downto 0);
-       PC_SUB_CTR_TST                          : out   std_logic_vector(4 downto 0);
-       PC_BYTES_LOADED_TST                     : out   std_logic_vector(15 downto 0);
-       PC_SIZE_LEFT_TST                        : out   std_logic_vector(31 downto 0);
-       PC_SUB_SIZE_TO_SAVE_TST         : out   std_logic_vector(31 downto 0);
-       PC_SUB_SIZE_LOADED_TST          : out   std_logic_vector(31 downto 0);
-       PC_SUB_BYTES_LOADED_TST         : out   std_logic_vector(31 downto 0);
-       PC_QUEUE_SIZE_TST                       : out   std_logic_vector(31 downto 0);
-       PC_ACT_QUEUE_SIZE_TST           : out   std_logic_vector(31 downto 0);
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
-       -- FrameConstructor interface
-       FC_WR_EN_TST                            : out   std_logic;
-       FC_DATA_TST                                     : out   std_logic_vector(7 downto 0);
-       FC_H_READY_TST                          : out   std_logic;
-       FC_READY_TST                            : out   std_logic;
-       FC_IP_SIZE_TST                          : out   std_logic_vector(15 downto 0);
-       FC_UDP_SIZE_TST                         : out   std_logic_vector(15 downto 0);
-       FC_IDENT_TST                            : out   std_logic_vector(15 downto 0);
-       FC_FLAGS_OFFSET_TST                     : out   std_logic_vector(15 downto 0);
-       FC_SOD_TST                                      : out   std_logic;
-       FC_EOD_TST                                      : out   std_logic;
-       FC_BSM_CONSTR_TST                       : out   std_logic_vector(7 downto 0);
-       FC_BSM_TRANS_TST                        : out   std_logic_vector(3 downto 0);
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
-       -- FrameTransmitter interface
-       FT_DATA_TST                             : out   std_logic_vector(8 downto 0);
-       FT_TX_EMPTY_TST                         : out   std_logic;
-       FT_START_OF_PACKET_TST          : out   std_logic;
-       FT_BSM_INIT_TST                         : out   std_logic_vector(3 downto 0);
-       FT_BSM_MAC_TST                          : out   std_logic_vector(3 downto 0);
-       FT_BSM_TRANS_TST                        : out   std_logic_vector(3 downto 0);
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
-       -- MAC interface
-       MAC_HADDR_TST                           : out   std_logic_vector(7 downto 0);
-       MAC_HDATA_TST                           : out   std_logic_vector(7 downto 0);
-       MAC_HCS_TST                                     : out   std_logic;
-       MAC_HWRITE_TST                          : out   std_logic;
-       MAC_HREAD_TST                           : out   std_logic;
-       MAC_HREADY_TST                          : out   std_logic;
-       MAC_HDATA_EN_TST                        : out   std_logic;
-       MAC_FIFOAVAIL_TST                       : out   std_logic;
-       MAC_FIFOEOF_TST                         : out   std_logic;
-       MAC_FIFOEMPTY_TST                       : out   std_logic;
-       MAC_TX_READ_TST                         : out   std_logic;
-       MAC_TX_DONE_TST                         : out   std_logic;
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
-       -- pcs and serdes
-       PCS_AN_LP_ABILITY_TST           : out   std_logic_vector(15 downto 0);
-       PCS_AN_COMPLETE_TST                     : out   std_logic;
-       PCS_AN_PAGE_RX_TST                      : out   std_logic;
-       -------------------------------------------------------------------------------------------
-       -------------------------------------------------------------------------------------------
        -- debug ports
        ANALYZER_DEBUG_OUT                      : out   std_logic_vector(63 downto 0)
 );
@@ -331,6 +236,21 @@ port(
 );
 end component;
 
+component fifo_4096x9 is
+port( 
+       Data    : in    std_logic_vector(8 downto 0);
+       WrClock : in    std_logic;
+       RdClock : in    std_logic;
+       WrEn    : in    std_logic;
+       RdEn    : in    std_logic;
+       Reset   : in    std_logic;
+       RPReset : in    std_logic;
+       Q       : out   std_logic_vector(8 downto 0);
+       Empty   : out   std_logic;
+       Full    : out   std_logic
+);
+end component;
+
 signal ig_bsm_save                             : std_logic_vector(3 downto 0);
 signal ig_bsm_load                             : std_logic_vector(3 downto 0);
 signal ig_cts_ctr                              : std_logic_vector(2 downto 0);
@@ -462,6 +382,7 @@ signal ip_cfg_mem_clk                       : std_logic;
 
 -- gk 22.04.10
 signal max_packet                    : std_logic_vector(31 downto 0);
+signal min_packet                    : std_logic_vector(31 downto 0);
 signal use_gbe                       : std_logic;
 signal use_trbnet                    : std_logic;
 signal use_multievents               : std_logic;
@@ -476,6 +397,16 @@ signal ft_eod                        : std_logic;
 -- gk 01.06.10
 signal dbg_ipu2gbe1                  : std_logic_vector(31 downto 0);
 signal dbg_ipu2gbe2                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe3                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe4                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe5                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe6                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe7                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe8                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe9                  : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe10                 : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe11                 : std_logic_vector(31 downto 0);
+signal dbg_ipu2gbe12                 : std_logic_vector(31 downto 0);
 signal dbg_pc1                       : std_logic_vector(31 downto 0);
 signal dbg_pc2                       : std_logic_vector(31 downto 0);
 signal dbg_fc1                       : std_logic_vector(31 downto 0);
@@ -487,6 +418,23 @@ signal mac_tx_staten                 : std_logic;
 signal mac_tx_statevec               : std_logic_vector(30 downto 0);
 signal mac_tx_discfrm                : std_logic;
 
+signal dbg_rd_en                     : std_logic;
+signal dbg_q                         : std_logic_vector(15 downto 0);
+
+-- gk 21.07.10
+signal allow_large                   : std_logic;
+
+-- gk 23.07.10
+signal reset_fifo                    : std_logic;
+
+-- gk 28.07.10
+signal bytes_sent_ctr                : std_logic_vector(31 downto 0);
+signal monitor_sent                  : std_logic_vector(31 downto 0);
+signal monitor_dropped               : std_logic_vector(31 downto 0);
+signal monitor_sm                    : std_logic_vector(31 downto 0);
+signal monitor_lr                    : std_logic_vector(31 downto 0);
+signal monitor_hr                    : std_logic_vector(31 downto 0);
+
 begin
 
 stage_ctrl_regs <= STAGE_CTRL_REGS_IN;
@@ -530,6 +478,7 @@ port map(
        GBE_SUBEVENT_DEC_OUT      => pc_decoding,
        GBE_QUEUE_DEC_OUT         => pc_queue_dec,
        GBE_MAX_PACKET_OUT        => max_packet,
+       GBE_MIN_PACKET_OUT        => min_packet,  -- gk 20.07.10
        GBE_MAX_FRAME_OUT         => pc_max_frame_size,
        GBE_USE_GBE_OUT           => use_gbe,
        GBE_USE_TRBNET_OUT        => use_trbnet,
@@ -537,15 +486,35 @@ port map(
        GBE_READOUT_CTR_OUT       => readout_ctr,  -- gk 26.04.10
        GBE_READOUT_CTR_VALID_OUT => readout_ctr_valid,  -- gk 26.04.10
        GBE_DELAY_OUT             => pc_delay,
+       GBE_ALLOW_LARGE_OUT       => allow_large,  -- gk 21.07.10
+       -- gk 28.07.10
+       MONITOR_BYTES_IN          => bytes_sent_ctr,
+       MONITOR_SENT_IN           => monitor_sent,
+       MONITOR_DROPPED_IN        => monitor_dropped,
+       MONITOR_SM_IN             => monitor_sm,
+       MONITOR_LR_IN             => monitor_lr,
+       MONITOR_HDR_IN            => monitor_hr,
        -- gk 01.06.10
        DBG_IPU2GBE1_IN           => dbg_ipu2gbe1,
        DBG_IPU2GBE2_IN           => dbg_ipu2gbe2,
+       DBG_IPU2GBE3_IN           => dbg_ipu2gbe3,
+       DBG_IPU2GBE4_IN           => dbg_ipu2gbe4,
+       DBG_IPU2GBE5_IN           => dbg_ipu2gbe5,
+       DBG_IPU2GBE6_IN           => dbg_ipu2gbe6,
+       DBG_IPU2GBE7_IN           => dbg_ipu2gbe7,
+       DBG_IPU2GBE8_IN           => dbg_ipu2gbe8,
+       DBG_IPU2GBE9_IN           => dbg_ipu2gbe9,
+       DBG_IPU2GBE10_IN          => dbg_ipu2gbe10,
+       DBG_IPU2GBE11_IN          => dbg_ipu2gbe11,
+       DBG_IPU2GBE12_IN          => dbg_ipu2gbe12,
        DBG_PC1_IN                => dbg_pc1,
        DBG_PC2_IN                => dbg_pc2,
        DBG_FC1_IN                => dbg_fc1,
        DBG_FC2_IN                => dbg_fc2,
        DBG_FT1_IN                => dbg_ft1,
-       DBG_FT2_IN                => dbg_ft2
+       DBG_FT2_IN                => dbg_ft2,
+       DBG_FIFO_RD_EN_OUT        => dbg_rd_en,
+       DBG_FIFO_Q_IN             => dbg_q
 );
 
 -- IP configurator: allows IP config to change for each event builder
@@ -628,35 +597,37 @@ port map(
        DATA_IPU_ENABLE_IN                      => use_trbnet, --'0', --: in    std_logic; -- IPU data is forwarded to CTS / TRBnet -- gk 22.04.10
        MULTI_EVT_ENABLE_IN                     => use_multievents, --'1', --: in       std_logic; -- enable multi event packets  -- gk 22.04.10
        MAX_MESSAGE_SIZE_IN                     => max_packet, --x"0000_FDE8",  -- gk 08.04.10  -- temporarily fixed here, to be set by slow ctrl -- gk 22.04.10
+       MIN_MESSAGE_SIZE_IN                     => min_packet, -- gk 20.07.10
        READOUT_CTR_IN                          => readout_ctr, -- gk 26.04.10
        READOUT_CTR_VALID_IN                    => readout_ctr_valid, -- gk 26.04.10
+       ALLOW_LARGE_IN                          => allow_large, -- gk 21.07.10
        -- PacketConstructor interface
        PC_WR_EN_OUT                            => pc_wr_en,
-       PC_DATA_OUT                                     => pc_data,
-       PC_READY_IN                                     => pc_ready,
-       PC_SOS_OUT                                      => pc_sos,
-       PC_EOD_OUT                                      => pc_eod,
+       PC_DATA_OUT                             => pc_data,
+       PC_READY_IN                             => pc_ready,
+       PC_SOS_OUT                              => pc_sos,
+       PC_EOD_OUT                              => pc_eod,
        PC_SUB_SIZE_OUT                         => pc_sub_size,
        PC_TRIG_NR_OUT                          => pc_trig_nr,
        PC_PADDING_OUT                          => pc_padding,
-       -- Debug
-       BSM_SAVE_OUT                            => ig_bsm_save,
-       BSM_LOAD_OUT                            => ig_bsm_load,
-       DBG_CTS_CTR_OUT                         => ig_cts_ctr,
-       DBG_REM_CTR_OUT                         => ig_rem_ctr,
-       DBG_SF_WCNT_OUT                         => ig_wcnt,
-       DBG_SF_RCNT_OUT                         => ig_rcnt,
-    DBG_SF_DATA_OUT                            => ig_data, 
-    DBG_SF_RD_EN_OUT                   => ig_rd_en,
-       DBG_SF_WR_EN_OUT                        => ig_wr_en,
-       DBG_SF_EMPTY_OUT                        => ig_empty,
-       DBG_SF_AEMPTY_OUT                       => ig_aempty,
-       DBG_SF_FULL_OUT                         => ig_full,
-       DBG_SF_AFULL_OUT                        => ig_afull,
-       --DEBUG_OUT                                     => ig_debug
+       MONITOR_OUT(31 downto 0)                => monitor_sent,
+       MONITOR_OUT(63 downto 32)               => monitor_dropped,
+       MONITOR_OUT(95 downto 64)               => monitor_hr,
+       MONITOR_OUT(127 downto 96)              => monitor_sm,
+       MONITOR_OUT(159 downto 128)             => monitor_lr,
        DEBUG_OUT(31 downto 0)                  => dbg_ipu2gbe1,
-       DEBUG_OUT(63 downto 32)                 => dbg_ipu2gbe2
-);      
+       DEBUG_OUT(63 downto 32)                 => dbg_ipu2gbe2,
+       DEBUG_OUT(95 downto 64)                 => dbg_ipu2gbe3,
+       DEBUG_OUT(127 downto 96)                => dbg_ipu2gbe4,
+       DEBUG_OUT(159 downto 128)               => dbg_ipu2gbe5,
+       DEBUG_OUT(191 downto 160)               => dbg_ipu2gbe6,
+       DEBUG_OUT(223 downto 192)               => dbg_ipu2gbe7,
+       DEBUG_OUT(255 downto 224)               => dbg_ipu2gbe8,
+       DEBUG_OUT(287 downto 256)               => dbg_ipu2gbe9,
+       DEBUG_OUT(319 downto 288)               => dbg_ipu2gbe10,
+       DEBUG_OUT(351 downto 320)               => dbg_ipu2gbe11,
+       DEBUG_OUT(383 downto 352)               => dbg_ipu2gbe12
+);
 
 -- Second stage: Packet constructor
 PACKET_CONSTRUCTOR : trb_net16_gbe_packet_constr
@@ -689,30 +660,6 @@ port map(
        FC_FLAGS_OFFSET_OUT             => fc_flags_offset,
        FC_SOD_OUT                              => fc_sod,
        FC_EOD_OUT                              => fc_eod,
-       -- debug ports
-       BSM_CONSTR_OUT                  => pc_bsm_constr,
-       BSM_LOAD_OUT                    => pc_bsm_load,
-       BSM_SAVE_OUT                    => pc_bsm_save,
-       DBG_SHF_EMPTY                   => pc_shf_empty,
-       DBG_SHF_FULL                    => pc_shf_full,
-       DBG_SHF_WR_EN                   => pc_shf_wr_en,
-       DBG_SHF_RD_EN                   => pc_shf_rd_en,
-       DBG_SHF_Q                               => pc_shf_q,
-       DBG_DF_EMPTY                    => pc_df_empty,
-       DBG_DF_FULL                             => pc_df_full,
-       DBG_DF_WR_EN                    => pc_df_wr_en,
-       DBG_DF_RD_EN                    => pc_df_rd_en,
-    DBG_DF_Q                           => pc_df_q,
-    DBG_ALL_CTR                                => pc_all_ctr,
-       DBG_SUB_CTR                             => pc_sub_ctr,
-       DBG_MY_CTR              => open,
-       DBG_BYTES_LOADED                => pc_bytes_loaded,
-       DBG_SIZE_LEFT                   => pc_size_left,
-       DBG_SUB_SIZE_TO_SAVE    => pc_sub_size_to_save,
-       DBG_SUB_SIZE_LOADED             => pc_sub_size_loaded,
-       DBG_SUB_BYTES_LOADED    => pc_sub_bytes_loaded,
-       DBG_QUEUE_SIZE                  => pc_queue_size,
-       DBG_ACT_QUEUE_SIZE              => pc_act_queue_size,
        DEBUG_OUT(31 downto 0)          => dbg_pc1,
        DEBUG_OUT(63 downto 32)         => dbg_pc2
 );
@@ -1066,6 +1013,35 @@ sim_gen: if (DO_SIMULATION = 1) generate
 
 end generate sim_gen;
 
+-- gk 28.07.10
+BYTES_SENT_CTR_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       bytes_sent_ctr <= (others => '0');
+               elsif (fc_wr_en = '1') then
+                       bytes_sent_ctr <= bytes_sent_ctr + x"1";
+               end if;
+       end if;
+end process BYTES_SENT_CTR_PROC;
+
+
+-- reset_fifo <= '1' when RESET = '1' or pc_sos = '1' else '0';
+-- 
+-- debug_fifo : fifo_4096x9
+-- port map( 
+--     Data(7 downto 0)    => pcs_txd,
+--     Data(8) => '0',
+--     WrClock => serdes_clk_125,
+--     RdClock => CLK,
+--     WrEn    => pcs_tx_en,
+--     RdEn    => dbg_rd_en,
+--     Reset   => reset_fifo,
+--     RPReset => reset_fifo,
+--     Q       => dbg_q(8 downto 0),
+--     Empty   => open,
+--     Full    => open
+-- );
 
 ------------------------------------------------------------------------------------------------
 ------------------------------------------------------------------------------------------------
@@ -1077,91 +1053,6 @@ end generate sim_gen;
 --***************
 analyzer_debug <= pcs_stat_debug;
 
--- Interconnection signals
-IG_CTS_CTR_TST           <= ig_cts_ctr;
-IG_REM_CTR_TST           <= ig_rem_ctr;
-IG_BSM_LOAD_TST          <= ig_bsm_load;
-IG_BSM_SAVE_TST          <= ig_bsm_save;
-IG_DATA_TST              <= ig_data;
-IG_WCNT_TST              <= ig_wcnt;
-IG_RCNT_TST              <= ig_rcnt;
-IG_RD_EN_TST             <= ig_rd_en;
-IG_WR_EN_TST             <= ig_wr_en;
-IG_EMPTY_TST             <= ig_empty;
-IG_AEMPTY_TST            <= ig_aempty;
-IG_FULL_TST              <= ig_full;
-IG_AFULL_TST             <= ig_afull;
--- PacketConstructor signals
-PC_WR_EN_TST             <= pc_wr_en;
-PC_DATA_TST              <= pc_data;
-PC_READY_TST             <= pc_ready;
-PC_START_OF_SUB_TST      <= pc_sos;
-PC_END_OF_DATA_TST       <= pc_eod;
-PC_SUB_SIZE_TST          <= pc_sub_size;
-PC_TRIG_NR_TST           <= pc_trig_nr;
-PC_PADDING_TST           <= pc_padding;
-PC_DECODING_TST          <= pc_decoding;
-PC_EVENT_ID_TST          <= pc_event_id;
-PC_QUEUE_DEC_TST         <= pc_queue_dec;
-PC_BSM_CONSTR_TST        <= pc_bsm_constr;
-PC_BSM_LOAD_TST          <= pc_bsm_load;
-PC_BSM_SAVE_TST          <= pc_bsm_save;
-PC_SHF_EMPTY_TST         <= pc_shf_empty;
-PC_SHF_FULL_TST          <= pc_shf_full;
-PC_SHF_WR_EN_TST         <= pc_shf_wr_en;
-PC_SHF_RD_EN_TST         <= pc_shf_rd_en;
-PC_SHF_Q_TST             <= pc_shf_q;
-PC_DF_EMPTY_TST          <= pc_df_empty;
-PC_DF_FULL_TST           <= pc_df_full;
-PC_DF_WR_EN_TST          <= pc_df_wr_en;
-PC_DF_RD_EN_TST          <= pc_df_rd_en;
-PC_DF_Q_TST              <= pc_df_q;
-PC_ALL_CTR_TST           <= pc_all_ctr;
-PC_SUB_CTR_TST           <= pc_sub_ctr;
-PC_BYTES_LOADED_TST      <= pc_bytes_loaded;
-PC_SIZE_LEFT_TST         <= pc_size_left;
-PC_SUB_SIZE_TO_SAVE_TST  <= pc_sub_size_to_save;
-PC_SUB_SIZE_LOADED_TST   <= pc_sub_size_loaded;
-PC_SUB_BYTES_LOADED_TST  <= pc_sub_bytes_loaded;
-PC_QUEUE_SIZE_TST        <= pc_queue_size;
-PC_ACT_QUEUE_SIZE_TST    <= pc_act_queue_size;
--- FrameConstructor signals
-FC_WR_EN_TST             <= fc_wr_en;
-FC_DATA_TST              <= fc_data;
-FC_SOD_TST               <= fc_sod;
-FC_EOD_TST               <= fc_eod;
-FC_IP_SIZE_TST           <= fc_ip_size;
-FC_UDP_SIZE_TST          <= fc_udp_size;
-FC_H_READY_TST           <= fc_h_ready;
-FC_READY_TST             <= fc_ready;
-FC_IDENT_TST             <= fc_ident;
-FC_FLAGS_OFFSET_TST      <= fc_flags_offset;
-FC_BSM_CONSTR_TST        <= fc_bsm_constr;
-FC_BSM_TRANS_TST         <= fc_bsm_trans;
--- FrameTransmitter signals
-FT_TX_EMPTY_TST          <= ft_tx_empty;
-FT_DATA_TST              <= ft_data;  -- gk 04.05.10
-FT_START_OF_PACKET_TST   <= ft_start_of_packet;
-FT_BSM_INIT_TST          <= ft_bsm_init;
-FT_BSM_MAC_TST           <= ft_bsm_mac;
-FT_BSM_TRANS_TST         <= ft_bsm_trans;
--- MAC
-MAC_HADDR_TST            <= mac_haddr;
-MAC_HDATA_TST            <= mac_hdataout;
-MAC_HCS_TST              <= mac_hcs;
-MAC_HWRITE_TST           <= mac_hwrite;
-MAC_HREAD_TST            <= mac_hread;
-MAC_HREADY_TST           <= mac_hready;
-MAC_HDATA_EN_TST         <= mac_hdata_en;
-MAC_FIFOAVAIL_TST        <= mac_fifoavail;
-MAC_FIFOEOF_TST          <= mac_fifoeof;
-MAC_FIFOEMPTY_TST        <= mac_fifoempty;
-MAC_TX_DONE_TST          <= mac_tx_done;
-MAC_TX_READ_TST          <= mac_tx_read;
-PCS_AN_LP_ABILITY_TST    <= pcs_an_lp_ability;
-PCS_AN_COMPLETE_TST      <= pcs_an_complete;
-PCS_AN_PAGE_RX_TST       <= pcs_an_page_rx;
-
 -- Outputs
 FEE_READ_OUT             <= fee_read;
 
index 628e05d13f7e6c886b4a1fb8deca1e83c1dc3eae..d9ece243e9a5855db2663a0fa0620ab100a251e5 100755 (executable)
@@ -85,6 +85,7 @@ signal fpf_data             : std_logic_vector(7 downto 0);
 signal fpf_empty            : std_logic;\r
 signal fpf_full             : std_logic;\r
 signal fpf_wr_en            : std_logic;\r
+signal fpf_rd_en            : std_logic;\r
 signal fpf_q                : std_logic_vector(8 downto 0);\r
 signal ip_size              : std_logic_vector(15 downto 0);\r
 signal ip_checksum          : std_logic_vector(31 downto 0);\r
@@ -217,7 +218,6 @@ begin
        end if;\r
 end process constructMachineProc;\r
 \r
-\r
 --find next state of construct machine\r
 constructMachine: process( constructCurrentState, START_OF_DATA_IN, END_OF_DATA_IN, headers_int_counter, put_udp_headers, CUR_MAX )\r
 begin\r
@@ -314,7 +314,7 @@ begin
                if (RESET = '1') or (constructCurrentState = IDLE) then\r
                        headers_int_counter <= 0;\r
                else\r
-                       if headers_int_counter = cur_max then\r
+                       if (headers_int_counter = cur_max) then\r
                                headers_int_counter <= 0;\r
                        else\r
                                headers_int_counter <= headers_int_counter + 1;\r
@@ -380,6 +380,7 @@ begin
        end case;\r
 end process fpfDataProc;\r
 \r
+\r
 readyFramesCtrProc: process( CLK )\r
 begin\r
        if rising_edge(CLK) then\r
@@ -406,7 +407,6 @@ port map(
        Full                => fpf_full\r
 );\r
 \r
-\r
 transferToRdClock : signal_sync\r
        generic map(\r
          DEPTH => 2,\r
@@ -415,7 +415,7 @@ transferToRdClock : signal_sync
        port map(\r
          RESET    => RESET,\r
          D_IN     => ready_frames_ctr,\r
-         CLK0     => RD_CLK,\r
+         CLK0     => RD_CLK, --CLK,\r
          CLK1     => RD_CLK,\r
          D_OUT    => ready_frames_ctr_q\r
          );\r
@@ -436,7 +436,7 @@ begin
        case transmitCurrentState is\r
                when T_IDLE =>\r
                        bsm_trans <= x"0";\r
-                       if( sent_frames_ctr /= ready_frames_ctr_q ) then\r
+                       if( (sent_frames_ctr /= ready_frames_ctr_q) ) then\r
                                transmitNextState <= T_LOAD;\r
                        else\r
                                transmitNextState <= T_IDLE;\r
@@ -469,7 +469,7 @@ begin
        if rising_edge(RD_CLK) then\r
                if   ( RESET = '1' ) then\r
                        ft_sop <= '0';\r
-               elsif( (transmitCurrentState = T_IDLE) and (sent_frames_ctr /= ready_frames_ctr_q) ) then\r
+               elsif ((transmitCurrentState = T_IDLE) and (sent_frames_ctr /= ready_frames_ctr_q)) then\r
                        ft_sop <= '1';\r
                else\r
                        ft_sop <= '0';\r
@@ -495,7 +495,8 @@ debug(28)              <= fpf_full;
 debug(29)              <= fpf_empty;\r
 debug(30)              <= ready;\r
 debug(31)              <= headers_ready;\r
-debug(47 downto 32)    <= ready_frames_ctr;\r
+debug(47 downto 32)    <= ready_frames_ctr_q;\r
+debug(48)              <= '0';\r
 \r
 \r
 -- Output\r
index 4e7653370472629953d25fb92ca798a97830435d..d09e4b0ce782a7411641e7e1c04fa52c220e13ff 100755 (executable)
@@ -21,7 +21,7 @@ port(
        PC_END_OF_DATA_IN       : in    std_logic;\r
        -- queue and subevent layer headers\r
        PC_SUB_SIZE_IN          : in    std_logic_vector(31 downto 0); -- store and swap\r
-       PC_PADDING_IN           : in std_logic;  -- gk 29.03.10\r
+       PC_PADDING_IN           : in    std_logic;  -- gk 29.03.10\r
        PC_DECODING_IN          : in    std_logic_vector(31 downto 0); -- swap\r
        PC_EVENT_ID_IN          : in    std_logic_vector(31 downto 0); -- swap\r
        PC_TRIG_NR_IN           : in    std_logic_vector(31 downto 0); -- store and swap!\r
@@ -39,47 +39,22 @@ port(
        FC_FLAGS_OFFSET_OUT     : out   std_logic_vector(15 downto 0);\r
        FC_SOD_OUT              : out   std_logic;\r
        FC_EOD_OUT              : out   std_logic;\r
-       -- debug ports\r
-       BSM_CONSTR_OUT          : out   std_logic_vector(3 downto 0);\r
-       BSM_LOAD_OUT            : out   std_logic_vector(3 downto 0);\r
-       BSM_SAVE_OUT            : out   std_logic_vector(3 downto 0);\r
-       DBG_SHF_EMPTY           : out   std_logic;\r
-       DBG_SHF_FULL            : out   std_logic;\r
-       DBG_SHF_WR_EN           : out   std_logic;\r
-       DBG_SHF_RD_EN           : out   std_logic;\r
-       DBG_SHF_Q               : out   std_logic_vector(7 downto 0);\r
-       DBG_DF_EMPTY            : out   std_logic;\r
-       DBG_DF_FULL             : out   std_logic;\r
-       DBG_DF_WR_EN            : out   std_logic;\r
-       DBG_DF_RD_EN            : out   std_logic;\r
-       DBG_DF_Q                : out   std_logic_vector(7 downto 0);\r
-       DBG_ALL_CTR             : out   std_logic_vector(4 downto 0);\r
-       DBG_SUB_CTR             : out   std_logic_vector(4 downto 0);\r
-       DBG_MY_CTR              : out   std_logic_vector(1 downto 0);\r
-       DBG_BYTES_LOADED        : out   std_logic_vector(15 downto 0);\r
-       DBG_SIZE_LEFT           : out   std_logic_vector(31 downto 0);\r
-       DBG_SUB_SIZE_TO_SAVE    : out   std_logic_vector(31 downto 0);\r
-       DBG_SUB_SIZE_LOADED     : out   std_logic_vector(31 downto 0);\r
-       DBG_SUB_BYTES_LOADED    : out   std_logic_vector(31 downto 0);\r
-       DBG_QUEUE_SIZE          : out   std_logic_vector(31 downto 0);\r
-       DBG_ACT_QUEUE_SIZE      : out   std_logic_vector(31 downto 0);\r
        DEBUG_OUT               : out   std_logic_vector(63 downto 0)\r
 );\r
 end trb_net16_gbe_packet_constr;\r
 \r
 architecture trb_net16_gbe_packet_constr of trb_net16_gbe_packet_constr is\r
 \r
--- FIFO for packet payload data\r
-component fifo_64kx8\r
+component fifo_64kx9\r
 port (\r
-       Data        : in  std_logic_vector(7 downto 0); \r
+       Data        : in  std_logic_vector(8 downto 0); \r
        WrClock     : in  std_logic; \r
        RdClock     : in  std_logic; \r
        WrEn        : in  std_logic; \r
        RdEn        : in  std_logic; \r
        Reset       : in  std_logic; \r
        RPReset     : in  std_logic; \r
-       Q           : out  std_logic_vector(7 downto 0); \r
+       Q           : out  std_logic_vector(8 downto 0); \r
        Empty       : out  std_logic; \r
        Full        : out  std_logic\r
 );\r
@@ -158,13 +133,16 @@ signal pc_ready             : std_logic;
 \r
 signal pc_sub_size          : std_logic_vector(31 downto 0);\r
 signal pc_trig_nr           : std_logic_vector(31 downto 0);\r
-signal pc_padding           : std_logic; -- gk 29.03.10\r
 signal rst_after_sub_comb   : std_logic;  -- gk 08.04.10\r
 signal rst_after_sub        : std_logic;  -- gk 08.04.10\r
 signal load_int_ctr         : integer range 0 to 3;  -- gk 08.04.10\r
 signal delay_ctr            : std_logic_vector(31 downto 0);  -- gk 28.04.10\r
 signal ticks_ctr            : std_logic_vector(7 downto 0);  -- gk 28.04.10\r
 \r
+-- gk 26.07.10\r
+signal load_eod             : std_logic;\r
+signal load_eod_q           : std_logic;\r
+\r
 begin\r
 \r
 -- Fakes\r
@@ -177,8 +155,6 @@ all_ctr <= std_logic_vector(to_unsigned(all_int_ctr, all_ctr'length)); -- for de
 sub_ctr <= std_logic_vector(to_unsigned(sub_int_ctr, sub_ctr'length)); -- for debugging\r
 my_ctr  <= std_logic_vector(to_unsigned(my_int_ctr, my_ctr'length)); -- for debugging\r
 \r
-pc_padding <= PC_PADDING_IN; -- gk 29.03.10  used to correct the subevent size written to subevent headers\r
-\r
 -- Fixed numbers\r
 \r
 --max_frame_size <= x"0578"; -- 1400 \r
@@ -202,19 +178,34 @@ begin
 end process;\r
 \r
 -- Data FIFO for incoming packet data from IPU buffer\r
-DATA_FIFO : fifo_64kx8\r
+-- gk 26.07.10\r
+DATA_FIFO : fifo_64kx9\r
 port map(\r
-       Data        =>  PC_DATA_IN,\r
+       Data(7 downto 0) => PC_DATA_IN,\r
+       Data(8)          => PC_END_OF_DATA_IN,\r
        WrClock     =>  CLK,\r
        RdClock     =>  CLK,\r
        WrEn        =>  df_wr_en,\r
        RdEn        =>  df_rd_en,\r
        Reset       =>  RESET,\r
        RPReset     =>  RESET,\r
-       Q           =>  df_q,\r
+       Q(7 downto 0) =>  df_q,\r
+       Q(8)          => load_eod,\r
        Empty       =>  df_empty,\r
        Full        =>  df_full\r
 );\r
+\r
+LOAD_EOD_PROC : process(CLK)\r
+begin\r
+       if rising_edge(CLK) then\r
+               if (RESET = '1') then\r
+                       load_eod_q <= '0';\r
+               else\r
+                       load_eod_q <= load_eod;\r
+               end if;\r
+       end if;\r
+end process LOAD_EOD_PROC;\r
+\r
 -- Write enable for the data FIFO\r
 -- !!!combinatorial signal!!!\r
 -- could be avoided as IPU2GBE does only send data in case of PC_READY.\r
@@ -271,136 +262,14 @@ begin
        end case;\r
 end process constructMachine;\r
 \r
-\r
---***********************\r
---      SUBEVENT HEADERS WRITE AND READ\r
---***********************\r
-\r
-SUBEVENT_HEADERS_FIFO : fifo_2048x8\r
-port map(\r
-       Data        =>  shf_data,\r
-       WrClock     =>  CLK,\r
-       RdClock     =>  CLK,\r
-       WrEn        =>  shf_wr_en,\r
-       RdEn        =>  shf_rd_en,\r
-       Reset       =>  RESET,\r
-       RPReset     =>  RESET,\r
-       Q           =>  shf_q,\r
-       Empty       =>  shf_empty,\r
-       Full        =>  shf_full\r
-);\r
-\r
--- write enable for SHF \r
-shf_wr_en <= '1' when ((saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA))\r
-                                else '0';\r
-\r
--- data multiplexing for SHF (convert 32bit LWs to 8bit)\r
--- CHANGED. \r
--- The SubEventHeader (4x 32bit is stored in [MSB:LSB] now, same byte order as data from PC.\r
-shfDataProc : process(saveSubCurrentState, sub_size_to_save, PC_DECODING_IN, PC_EVENT_ID_IN, \r
-                                         pc_trig_nr, my_int_ctr, fc_data)\r
-begin\r
-       case saveSubCurrentState is\r
-               when SIDLE          =>  shf_data <= x"ac";\r
-               when SAVE_SIZE      =>  shf_data <= sub_size_to_save(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
-               when SAVE_DECODING  =>  shf_data <= PC_DECODING_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
-               when SAVE_ID        =>  shf_data <= PC_EVENT_ID_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
-               when SAVE_TRIG_NR   =>  shf_data <= pc_trig_nr(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
-               when SAVE_TERM      =>  shf_data <= fc_data;\r
-               when others         =>  shf_data <= x"00";\r
-       end case;\r
-end process shfDataProc;\r
-\r
-saveSubMachineProc : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if (RESET = '1') then\r
-                       saveSubCurrentState <= SIDLE;\r
-               else\r
-                       saveSubCurrentState <= saveSubNextState;\r
-               end if;\r
-       end if;\r
-end process saveSubMachineProc;\r
-\r
-saveSubMachine : process(saveSubCurrentState, PC_START_OF_SUB_IN, sub_int_ctr, loadCurrentState, FC_H_READY_IN)\r
-begin\r
-       case saveSubCurrentState is\r
-               when SIDLE =>\r
-                       save_state <= x"0";\r
-                       if (PC_START_OF_SUB_IN = '1') then\r
-                               saveSubNextState <= SAVE_SIZE;\r
-                       -- this branch is dangerous!\r
-                       elsif (loadCurrentState = WAIT_FOR_FC) and (FC_H_READY_IN = '1') then -- means that loadCurrentState is put_q_len\r
-                               saveSubNextState <= SAVE_TERM;\r
-                       else\r
-                               saveSubNextState <= SIDLE;\r
-                       end if;\r
-               when SAVE_SIZE =>\r
-                       save_state <= x"1";\r
-                       if (sub_int_ctr = 3) then\r
-                               saveSubNextState <= SAVE_DECODING;\r
-                       else\r
-                               saveSubNextState <= SAVE_SIZE;\r
-                       end if;\r
-               when SAVE_DECODING =>\r
-                       save_state <= x"2";\r
-                       if (sub_int_ctr = 3) then\r
-                               saveSubNextState <= SAVE_ID;\r
-                       else\r
-                               saveSubNextState <= SAVE_DECODING;\r
-                       end if;\r
-               when SAVE_ID =>\r
-                       save_state <= x"3";\r
-                       if (sub_int_ctr = 3) then\r
-                               saveSubNextState <= SAVE_TRIG_NR;\r
-                       else\r
-                               saveSubNextState <= SAVE_ID;\r
-                       end if;\r
-               when SAVE_TRIG_NR =>\r
-                       save_state <= x"4";\r
-                       if (sub_int_ctr = 3) then\r
-                               saveSubNextState <= SIDLE;\r
-                       else\r
-                               saveSubNextState <= SAVE_TRIG_NR;\r
-                       end if;\r
-               when SAVE_TERM =>\r
-                       save_state <= x"5";\r
-                       if (sub_int_ctr = 31) then\r
-                               saveSubNextState <= SIDLE;\r
-                       else\r
-                               saveSubNextState <= SAVE_TERM;\r
-                       end if;\r
-               when others =>\r
-                       save_state <= x"f";\r
-                       saveSubNextState <= SIDLE;\r
-       end case;\r
-end process;\r
-\r
--- This counter is used for breaking down 32bit information words into 8bit bytes for \r
--- storing them in the SHF.\r
--- It is also used for the termination 32byte sequence.\r
-subIntProc: process( CLK )\r
-begin\r
-       if rising_edge(CLK) then\r
-               if (RESET = '1') or (saveSubCurrentState = SIDLE) then\r
-                       sub_int_ctr <= 0;\r
-               elsif (sub_int_ctr = 3) and (saveSubCurrentState /= SAVE_TERM) then\r
-                       sub_int_ctr <= 0;\r
-               elsif (sub_int_ctr = 31) and (saveSubCurrentState = SAVE_TERM) then\r
-                       sub_int_ctr <= 0;\r
-               elsif (saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA) then\r
-                       sub_int_ctr <= sub_int_ctr + 1;\r
-               end if;\r
-       end if;\r
-end process subIntProc;\r
-\r
 --***********************\r
 --      SIZE COUNTERS FOR SAVING SIDE\r
 --***********************\r
 \r
 -- gk 29.03.10 the subevent size saved to its headers cannot contain padding bytes but they are included in pc_sub_size\r
 -- that's why they are removed if pc_padding flag is asserted\r
-sub_size_to_save <= x"10" + pc_sub_size when pc_padding = '0' else x"c" + pc_sub_size; -- subevent headers + data\r
+sub_size_to_save <= (x"10" + pc_sub_size) when (PC_PADDING_IN = '0')\r
+                       else (x"c" + pc_sub_size); -- subevent headers + data\r
 \r
 -- BUG HERE BUG HERE BUG HERE BUG HERE\r
 -- gk 29.03.10 no changes here because the queue size should contain the padding bytes of subevents\r
@@ -433,7 +302,7 @@ end process loadMachineProc;
 \r
 loadMachine : process(loadCurrentState, constructCurrentState, all_int_ctr, df_empty,\r
                                          sub_bytes_loaded, sub_size_loaded, size_left, FC_H_READY_IN, max_frame_size, \r
-                                         bytes_loaded, divide_position, PC_DELAY_IN, delay_ctr)\r
+                                         bytes_loaded, divide_position, PC_DELAY_IN, delay_ctr, load_eod_q)\r
 begin\r
        case loadCurrentState is\r
                when LIDLE =>\r
@@ -480,12 +349,21 @@ begin
                        load_state <= x"6";\r
                        if (bytes_loaded = max_frame_size - 1) then\r
                                loadNextState <= DIVIDE;\r
-                       elsif (sub_bytes_loaded = sub_size_loaded) then  -- if all subevent bytes are loaded\r
-                               if (size_left = x"00000021") then  -- and there is no more data, only termination left\r
-                                       loadNextState <= LOAD_TERM;  -- add termination and close packet\r
-                               else -- there is more data in fifo\r
-                                       loadNextState <= LOAD_SUB;  -- add another subevent\r
-                               end if;\r
+                       -- gk 26.07.10\r
+                       -- close packet after one event loaded\r
+                       elsif (load_eod_q = '1') then\r
+                               loadNextState <= LOAD_TERM;\r
+--                     elsif (sub_bytes_loaded = sub_size_loaded) then  -- if all subevent bytes are loaded\r
+--                             if (size_left = x"00000021") then  -- and there is no more data, only termination left\r
+--                                     -- gk 21.07.10\r
+--                                     if (PC_SKIP_TERM_IN = '0') then\r
+--                                             loadNextState <= LOAD_TERM;  -- add termination and close packet\r
+--                                     else\r
+--                                             loadNextState <= CLEANUP;\r
+--                                     end if;\r
+--                             else -- there is more data in fifo\r
+--                                     loadNextState <= LOAD_SUB;  -- add another subevent\r
+--                             end if;\r
                        else\r
                                loadNextState <= LOAD_DATA;\r
                        end if;\r
@@ -533,31 +411,6 @@ begin
        end case;\r
 end process loadMachine;\r
 \r
--- delay counters\r
--- gk 28.04.10\r
-DELAY_CTR_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if ((RESET = '1') or (loadCurrentState = LIDLE)) then\r
-                       delay_ctr <= PC_DELAY_IN;\r
-               elsif ((loadCurrentState = DELAY) and (ticks_ctr(7) = '1')) then\r
-                       delay_ctr <= delay_ctr - x"1";\r
-               end if;\r
-       end if;\r
-end process DELAY_CTR_PROC;\r
-\r
--- gk 28.04.10\r
-TICKS_CTR_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if ((RESET = '1') or (loadCurrentState = LIDLE) or (ticks_ctr(7) = '1')) then\r
-                       ticks_ctr <= x"00";\r
-               elsif (loadCurrentState = DELAY) then\r
-                       ticks_ctr <= ticks_ctr + x"1";\r
-               end if;\r
-       end if;\r
-end process TICKS_CTR_PROC;\r
-\r
 dividePositionProc : process(CLK)\r
 begin\r
        if rising_edge(CLK) then\r
@@ -567,12 +420,17 @@ begin
                        if (loadCurrentState = LIDLE) then\r
                                divide_position <= "00";\r
                        elsif (loadCurrentState = LOAD_DATA) then\r
-                               if (sub_bytes_loaded = sub_size_loaded) and (size_left = x"00000021") then\r
+                               -- gk 26.07.10\r
+                               if (load_eod_q = '1') then -- if termination is about to be loaded divide on term\r
                                        divide_position <= "11";\r
-                               elsif  (sub_bytes_loaded = sub_size_loaded) and (size_left /= x"00000021") then\r
-                                       divide_position <= "01";\r
                                else\r
-                                       divide_position <= "00";\r
+                                       divide_position <= "00"; -- still data loaded divide on data\r
+--                             if (sub_bytes_loaded = sub_size_loaded) and (size_left = x"00000021") then\r
+--                                     divide_position <= "11";\r
+--                             elsif  (sub_bytes_loaded = sub_size_loaded) and (size_left /= x"00000021") then\r
+--                                     divide_position <= "01";\r
+--                             else\r
+--                                     divide_position <= "00";\r
                                end if;\r
                        elsif (loadCurrentState = LOAD_SUB) then\r
                                if (all_int_ctr = 15) then\r
@@ -653,8 +511,11 @@ begin
 --          df_rd_en <= '0';\r
                if (bytes_loaded = max_frame_size - x"1") then\r
                        df_rd_en <= '0';\r
-               elsif (sub_bytes_loaded = sub_size_loaded) then\r
+               -- gk 26.07.10\r
+               elsif (load_eod = '1') or (load_eod_q = '1') then\r
                        df_rd_en <= '0';\r
+--             elsif (sub_bytes_loaded = sub_size_loaded) then\r
+--                     df_rd_en <= '0';\r
                else\r
                        df_rd_en <= '1';\r
                end if;\r
@@ -715,6 +576,31 @@ begin
        end case;\r
 end process fcDataProc;\r
 \r
+-- delay counters\r
+-- gk 28.04.10\r
+DELAY_CTR_PROC : process(CLK)\r
+begin\r
+       if rising_edge(CLK) then\r
+               if ((RESET = '1') or (loadCurrentState = LIDLE)) then\r
+                       delay_ctr <= PC_DELAY_IN;\r
+               elsif ((loadCurrentState = DELAY) and (ticks_ctr(7) = '1')) then\r
+                       delay_ctr <= delay_ctr - x"1";\r
+               end if;\r
+       end if;\r
+end process DELAY_CTR_PROC;\r
+\r
+-- gk 28.04.10\r
+TICKS_CTR_PROC : process(CLK)\r
+begin\r
+       if rising_edge(CLK) then\r
+               if ((RESET = '1') or (loadCurrentState = LIDLE) or (ticks_ctr(7) = '1')) then\r
+                       ticks_ctr <= x"00";\r
+               elsif (loadCurrentState = DELAY) then\r
+                       ticks_ctr <= ticks_ctr + x"1";\r
+               end if;\r
+       end if;\r
+end process TICKS_CTR_PROC;\r
+\r
 \r
 --***********************\r
 --      SIZE COUNTERS FOR LOADING SIDE\r
@@ -724,7 +610,7 @@ queue_size_temp <= queue_size - x"20"; -- size of data without termination
 \r
 -- gk 08.04.10\r
 rst_after_sub_comb <= '1' when (loadCurrentState = LIDLE) or\r
-                       ((loadCurrentState = LOAD_DATA) and (sub_bytes_loaded = sub_size_loaded) and (size_left /= x"00000021"))\r
+                       ((loadCurrentState = LOAD_DATA) and (size_left /= x"00000021")) -- gk 26.07.10 -- and (sub_bytes_loaded = sub_size_loaded) \r
                        else '0';\r
 \r
 -- gk 08.04.10\r
@@ -772,7 +658,7 @@ end process subSizeLoadedProc;
 subBytesLoadedProc : process(CLK)\r
 begin\r
        if rising_edge(CLK) then\r
-               if (RESET = '1') or (loadCurrentState = LIDLE) or (sub_bytes_loaded = sub_size_loaded) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then  -- gk 08.04.10\r
+               if (RESET = '1') or (loadCurrentState = LIDLE) or (loadCurrentState = CLEANUP) or (rst_after_sub = '1') then   -- gk 26.07.10 --or (sub_bytes_loaded = sub_size_loaded) -- gk 08.04.10\r
                        sub_bytes_loaded <= x"00000011";  -- subevent headers doesnt count\r
                elsif (loadCurrentState = LOAD_DATA) then\r
                        sub_bytes_loaded <= sub_bytes_loaded + x"1";\r
@@ -917,6 +803,130 @@ fcUDPSizeProc : process(CLK)
 end process fcUDPSizeProc;\r
 \r
 \r
+--***********************\r
+--      SUBEVENT HEADERS WRITE AND READ\r
+--***********************\r
+\r
+SUBEVENT_HEADERS_FIFO : fifo_2048x8\r
+port map(\r
+       Data        =>  shf_data,\r
+       WrClock     =>  CLK,\r
+       RdClock     =>  CLK,\r
+       WrEn        =>  shf_wr_en,\r
+       RdEn        =>  shf_rd_en,\r
+       Reset       =>  RESET,\r
+       RPReset     =>  RESET,\r
+       Q           =>  shf_q,\r
+       Empty       =>  shf_empty,\r
+       Full        =>  shf_full\r
+);\r
+\r
+-- write enable for SHF \r
+shf_wr_en <= '1' when ((saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA))\r
+                                else '0';\r
+\r
+-- data multiplexing for SHF (convert 32bit LWs to 8bit)\r
+-- CHANGED. \r
+-- The SubEventHeader (4x 32bit is stored in [MSB:LSB] now, same byte order as data from PC.\r
+shfDataProc : process(saveSubCurrentState, sub_size_to_save, PC_DECODING_IN, PC_EVENT_ID_IN, \r
+                                         pc_trig_nr, my_int_ctr, fc_data)\r
+begin\r
+       case saveSubCurrentState is\r
+               when SIDLE          =>  shf_data <= x"ac";\r
+               when SAVE_SIZE      =>  shf_data <= sub_size_to_save(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
+               when SAVE_DECODING  =>  shf_data <= PC_DECODING_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
+               when SAVE_ID        =>  shf_data <= PC_EVENT_ID_IN(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
+               when SAVE_TRIG_NR   =>  shf_data <= pc_trig_nr(my_int_ctr * 8 + 7 downto my_int_ctr * 8);\r
+               when SAVE_TERM      =>  shf_data <= fc_data;\r
+               when others         =>  shf_data <= x"00";\r
+       end case;\r
+end process shfDataProc;\r
+\r
+saveSubMachineProc : process(CLK)\r
+begin\r
+       if rising_edge(CLK) then\r
+               if (RESET = '1') then\r
+                       saveSubCurrentState <= SIDLE;\r
+               else\r
+                       saveSubCurrentState <= saveSubNextState;\r
+               end if;\r
+       end if;\r
+end process saveSubMachineProc;\r
+\r
+saveSubMachine : process(saveSubCurrentState, PC_START_OF_SUB_IN, sub_int_ctr, loadCurrentState, FC_H_READY_IN)\r
+begin\r
+       case saveSubCurrentState is\r
+               when SIDLE =>\r
+                       save_state <= x"0";\r
+                       if (PC_START_OF_SUB_IN = '1') then\r
+                               saveSubNextState <= SAVE_SIZE;\r
+                       -- this branch is dangerous!\r
+                       elsif (loadCurrentState = WAIT_FOR_FC) and (FC_H_READY_IN = '1') then -- means that loadCurrentState is put_q_len\r
+                               saveSubNextState <= SAVE_TERM;\r
+                       else\r
+                               saveSubNextState <= SIDLE;\r
+                       end if;\r
+               when SAVE_SIZE =>\r
+                       save_state <= x"1";\r
+                       if (sub_int_ctr = 3) then\r
+                               saveSubNextState <= SAVE_DECODING;\r
+                       else\r
+                               saveSubNextState <= SAVE_SIZE;\r
+                       end if;\r
+               when SAVE_DECODING =>\r
+                       save_state <= x"2";\r
+                       if (sub_int_ctr = 3) then\r
+                               saveSubNextState <= SAVE_ID;\r
+                       else\r
+                               saveSubNextState <= SAVE_DECODING;\r
+                       end if;\r
+               when SAVE_ID =>\r
+                       save_state <= x"3";\r
+                       if (sub_int_ctr = 3) then\r
+                               saveSubNextState <= SAVE_TRIG_NR;\r
+                       else\r
+                               saveSubNextState <= SAVE_ID;\r
+                       end if;\r
+               when SAVE_TRIG_NR =>\r
+                       save_state <= x"4";\r
+                       if (sub_int_ctr = 3) then\r
+                               saveSubNextState <= SIDLE;\r
+                       else\r
+                               saveSubNextState <= SAVE_TRIG_NR;\r
+                       end if;\r
+               when SAVE_TERM =>\r
+                       save_state <= x"5";\r
+                       if (sub_int_ctr = 31) then\r
+                               saveSubNextState <= SIDLE;\r
+                       else\r
+                               saveSubNextState <= SAVE_TERM;\r
+                       end if;\r
+               when others =>\r
+                       save_state <= x"f";\r
+                       saveSubNextState <= SIDLE;\r
+       end case;\r
+end process;\r
+\r
+-- This counter is used for breaking down 32bit information words into 8bit bytes for \r
+-- storing them in the SHF.\r
+-- It is also used for the termination 32byte sequence.\r
+subIntProc: process( CLK )\r
+begin\r
+       if rising_edge(CLK) then\r
+               if (RESET = '1') or (saveSubCurrentState = SIDLE) then\r
+                       sub_int_ctr <= 0;\r
+               elsif (sub_int_ctr = 3) and (saveSubCurrentState /= SAVE_TERM) then\r
+                       sub_int_ctr <= 0;\r
+               elsif (sub_int_ctr = 31) and (saveSubCurrentState = SAVE_TERM) then\r
+                       sub_int_ctr <= 0;\r
+               elsif (saveSubCurrentState /= SIDLE) and (loadCurrentState /= PREP_DATA) then\r
+                       sub_int_ctr <= sub_int_ctr + 1;\r
+               end if;\r
+       end if;\r
+end process subIntProc;\r
+\r
+\r
+\r
 debug(3 downto 0)             <= constr_state;\r
 debug(7 downto 4)             <= save_state;\r
 debug(11 downto 8)            <= load_state;\r
@@ -941,29 +951,6 @@ FC_IDENT_OUT(7 downto 0)      <= fc_ident(15 downto 8);
 FC_FLAGS_OFFSET_OUT           <= fc_flags_offset;\r
 FC_SOD_OUT                    <= fc_sod;\r
 FC_EOD_OUT                    <= fc_eod;\r
-BSM_CONSTR_OUT                <= constr_state;\r
-BSM_LOAD_OUT                  <= load_state;\r
-BSM_SAVE_OUT                  <= save_state;\r
-DBG_SHF_EMPTY                 <= shf_empty;\r
-DBG_SHF_FULL                  <= shf_full;\r
-DBG_SHF_WR_EN                 <= shf_wr_en;\r
-DBG_SHF_RD_EN                 <= shf_rd_en;\r
-DBG_SHF_Q                     <= shf_q;\r
-DBG_DF_EMPTY                  <= df_empty;\r
-DBG_DF_FULL                   <= df_full;\r
-DBG_DF_WR_EN                  <= df_wr_en;\r
-DBG_DF_RD_EN                  <= df_rd_en;\r
-DBG_DF_Q                      <= df_q;\r
-DBG_ALL_CTR                   <= all_ctr;\r
-DBG_SUB_CTR                   <= sub_ctr;\r
-DBG_MY_CTR                    <= my_ctr;\r
-DBG_BYTES_LOADED              <= bytes_loaded;\r
-DBG_SIZE_LEFT                 <= size_left;\r
-DBG_SUB_SIZE_TO_SAVE          <= sub_size_to_save;\r
-DBG_SUB_SIZE_LOADED           <= sub_size_loaded;\r
-DBG_SUB_BYTES_LOADED          <= sub_bytes_loaded;\r
-DBG_QUEUE_SIZE                <= queue_size;\r
-DBG_ACT_QUEUE_SIZE            <= actual_queue_size;\r
 \r
 DEBUG_OUT                     <= debug;\r
 \r
index a44c796a2c6de1d083fff85985893565dc0a33bc..f8527977d396aa4369fb678c34c72049990325dc 100644 (file)
@@ -7,7 +7,7 @@ library work;
 use work.trb_net_std.all;
 use work.trb_net_components.all;
 use work.trb_net16_hub_func.all;
-use work.version.all;
+--use work.version.all;
 
 
 entity gbe_setup is
@@ -32,6 +32,7 @@ port(
        GBE_SUBEVENT_DEC_OUT      : out std_logic_vector(31 downto 0);
        GBE_QUEUE_DEC_OUT         : out std_logic_vector(31 downto 0);
        GBE_MAX_PACKET_OUT        : out std_logic_vector(31 downto 0);
+       GBE_MIN_PACKET_OUT        : out std_logic_vector(31 downto 0);
        GBE_MAX_FRAME_OUT         : out std_logic_vector(15 downto 0);
        GBE_USE_GBE_OUT           : out std_logic;
        GBE_USE_TRBNET_OUT        : out std_logic;
@@ -39,15 +40,35 @@ port(
        GBE_READOUT_CTR_OUT       : out std_logic_vector(23 downto 0);  -- gk 26.04.10
        GBE_READOUT_CTR_VALID_OUT : out std_logic;  -- gk 26.04.10
        GBE_DELAY_OUT             : out std_logic_vector(31 downto 0);
+       GBE_ALLOW_LARGE_OUT       : out std_logic;
+       -- gk 28.07.10
+       MONITOR_BYTES_IN          : in std_logic_vector(31 downto 0);
+       MONITOR_SENT_IN           : in std_logic_vector(31 downto 0);
+       MONITOR_DROPPED_IN        : in std_logic_vector(31 downto 0);
+       MONITOR_SM_IN             : in std_logic_vector(31 downto 0);
+       MONITOR_LR_IN             : in std_logic_vector(31 downto 0);
+       MONITOR_HDR_IN            : in std_logic_vector(31 downto 0);   
        -- gk 01.06.10
        DBG_IPU2GBE1_IN          : in std_logic_vector(31 downto 0);
        DBG_IPU2GBE2_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE3_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE4_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE5_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE6_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE7_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE8_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE9_IN          : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE10_IN         : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE11_IN         : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE12_IN         : in std_logic_vector(31 downto 0);
        DBG_PC1_IN               : in std_logic_vector(31 downto 0);
        DBG_PC2_IN               : in std_logic_vector(31 downto 0);
        DBG_FC1_IN               : in std_logic_vector(31 downto 0);
        DBG_FC2_IN               : in std_logic_vector(31 downto 0);
        DBG_FT1_IN               : in std_logic_vector(31 downto 0);
-       DBG_FT2_IN               : in std_logic_vector(31 downto 0)
+       DBG_FT2_IN               : in std_logic_vector(31 downto 0);
+       DBG_FIFO_RD_EN_OUT        : out std_logic;
+       DBG_FIFO_Q_IN             : in std_logic_vector(15 downto 0)
 );
 end entity;
 
@@ -59,6 +80,7 @@ signal subevent_id       : std_logic_vector(31 downto 0);
 signal subevent_dec      : std_logic_vector(31 downto 0);
 signal queue_dec         : std_logic_vector(31 downto 0);
 signal max_packet        : std_logic_vector(31 downto 0);
+signal min_packet        : std_logic_vector(31 downto 0);  -- gk 07.20.10
 signal max_frame         : std_logic_vector(15 downto 0);
 signal use_gbe           : std_logic;
 signal use_trbnet        : std_logic;
@@ -69,6 +91,7 @@ signal ack               : std_logic;  -- gk 26.04.10
 signal ack_q             : std_logic;  -- gk 26.04.10
 signal data_out          : std_logic_vector(31 downto 0);  -- gk 26.04.10
 signal delay             : std_logic_vector(31 downto 0);  -- gk 28.04.10
+signal allow_large       : std_logic;  -- gk 21.07.10
 
 begin
 
@@ -79,6 +102,7 @@ begin
                GBE_SUBEVENT_DEC_OUT      <= subevent_dec;
                GBE_QUEUE_DEC_OUT         <= queue_dec;
                GBE_MAX_PACKET_OUT        <= max_packet;
+               GBE_MIN_PACKET_OUT        <= min_packet;
                GBE_MAX_FRAME_OUT         <= max_frame;
                GBE_USE_GBE_OUT           <= use_gbe;
                GBE_USE_TRBNET_OUT        <= use_trbnet;
@@ -89,6 +113,7 @@ begin
                ack_q                     <= ack; -- gk 26.04.10
                BUS_DATA_OUT              <= data_out;  -- gk 26.04.10
                GBE_DELAY_OUT             <= delay; -- gk 28.04.10
+               GBE_ALLOW_LARGE_OUT       <= allow_large;  -- gk 21.07.10
        end if;
 end process OUT_PROC;
 
@@ -108,20 +133,25 @@ end process ACK_PROC;
 
 WRITE_PROC : process(CLK)
 begin
+       DBG_FIFO_RD_EN_OUT <= '0';
+
        if rising_edge(CLK) then
                if ( (RESET = '1') or (reset_values = '1') ) then
                        subevent_id       <= x"0000_00cf";
                        subevent_dec      <= x"0002_0001";
                        queue_dec         <= x"0003_0062";
-                       max_packet        <= x"0000_fde8"; --x"0000_fde8"; -- tester
+                       max_packet        <= x"0000_fde8"; -- 65k --x"0000_fde8"; -- tester
+                       min_packet        <= x"0000_0008"; -- gk 20.07.10
                        max_frame         <= x"0578";
                        use_gbe           <= '1';
                        use_trbnet        <= '0';
                        use_multievents   <= '0';
                        reset_values      <= '0';
-                       readout_ctr       <= x"00_0000"; --x"ff_ffff";  -- gk 26.04.10  -- gk 07.06.10 corrected bug found by Sergey
+                       readout_ctr       <= x"00_0000";  -- gk 26.04.10  -- gk 07.06.10 corrected bug found by Sergey
                        readout_ctr_valid <= '0';  -- gk 26.04.10
                        delay             <= x"0000_0000"; -- gk 28.04.10
+                       DBG_FIFO_RD_EN_OUT <= '0';
+                       allow_large       <= '0';  -- gk 21.07.10
 
                elsif (BUS_WRITE_EN_IN = '1') then
                        case BUS_ADDR_IN is
@@ -171,6 +201,21 @@ begin
                                when x"09" =>
                                        delay <= BUS_DATA_IN;
 
+                               when x"0a" =>
+                                       DBG_FIFO_RD_EN_OUT <= '1';
+
+                               -- gk 20.07.10
+                               when x"0b" =>
+                                       min_packet <= BUS_DATA_IN;
+
+                               -- gk 21.07.10
+                               when x"0c" =>
+                                       if (BUS_DATA_IN = x"0000_0000") then
+                                               allow_large <= '0';
+                                       else
+                                               allow_large <= '1';
+                                       end if;
+
                                when x"ff" =>
                                        if (BUS_DATA_IN = x"ffff_ffff") then
                                                reset_values <= '1';
@@ -183,6 +228,7 @@ begin
                                        subevent_dec      <= subevent_dec;
                                        queue_dec         <= queue_dec;
                                        max_packet        <= max_packet;
+                                       min_packet        <= min_packet;
                                        max_frame         <= max_frame;
                                        use_gbe           <= use_gbe;
                                        use_trbnet        <= use_trbnet;
@@ -191,6 +237,8 @@ begin
                                        readout_ctr       <= readout_ctr;  -- gk 26.04.10
                                        readout_ctr_valid <= readout_ctr_valid;  -- gk 26.04.10
                                        delay             <= delay; -- gk 28.04.10
+                                       DBG_FIFO_RD_EN_OUT <= '0';
+                                       allow_large       <= allow_large;
                        end case;
                else
                        reset_values <= '0';
@@ -251,6 +299,17 @@ begin
                                when x"09" =>
                                        data_out <= delay;
 
+                               when x"0b" =>
+                                       data_out <= min_packet;
+
+                               -- gk 21.07.10
+                               when x"0c" =>
+                                       if (allow_large = '0') then
+                                               data_out <= x"0000_0000";
+                                       else
+                                               data_out <= x"0000_0001";
+                                       end if;
+
                                -- gk 01.06.10
                                when x"e0" =>
                                        data_out <= DBG_IPU2GBE1_IN;
@@ -276,6 +335,58 @@ begin
                                when x"e7" =>
                                        data_out <= DBG_FT2_IN;
 
+                               when x"e8" =>
+                                       data_out(15 downto 0) <= DBG_FIFO_Q_IN;
+                                       data_out(31 downto 16) <= (others => '0');
+
+                               when x"e9" =>
+                                       data_out <= DBG_IPU2GBE3_IN;
+
+                               when x"ea" =>
+                                       data_out <= DBG_IPU2GBE4_IN;
+
+                               when x"eb" =>
+                                       data_out <= DBG_IPU2GBE5_IN;
+
+                               when x"ec" =>
+                                       data_out <= DBG_IPU2GBE6_IN;
+
+                               when x"ed" =>
+                                       data_out <= DBG_IPU2GBE7_IN;
+
+                               when x"ee" =>
+                                       data_out <= DBG_IPU2GBE8_IN;
+
+                               when x"ef" =>
+                                       data_out <= DBG_IPU2GBE9_IN;
+
+                               when x"f0" =>
+                                       data_out <= DBG_IPU2GBE10_IN;
+
+                               when x"f1" =>
+                                       data_out <= DBG_IPU2GBE11_IN;
+
+                               when x"f2" =>
+                                       data_out <= DBG_IPU2GBE12_IN;
+
+                               when x"f3" =>
+                                       data_out <= MONITOR_BYTES_IN;
+
+                               when x"f4" =>
+                                       data_out <= MONITOR_SENT_IN;
+
+                               when x"f5" =>
+                                       data_out <= MONITOR_DROPPED_IN;
+
+                               when x"f6" =>
+                                       data_out <= MONITOR_SM_IN;
+
+                               when x"f7" =>
+                                       data_out <= MONITOR_LR_IN;
+
+                               when x"f8" =>
+                                       data_out <= MONITOR_HDR_IN;
+
                                when others =>
                                        data_out <= (others => '0');
                        end case;
index 096acb09dab8fb3e06362acd9e5b0bffda174e62..0755d2c10a730417c96b251f609369df098b1deb 100755 (executable)
-LIBRARY ieee;\r
-use ieee.std_logic_1164.all;\r
-USE IEEE.numeric_std.ALL;\r
-USE IEEE.std_logic_UNSIGNED.ALL;\r
-use IEEE.std_logic_arith.all;\r
-\r
-library work;\r
-\r
-entity trb_net16_ipu2gbe is\r
-port( \r
-       CLK                         : in    std_logic;\r
-       RESET                       : in    std_logic;\r
-       -- IPU interface directed toward the CTS\r
-       CTS_NUMBER_IN               : in    std_logic_vector (15 downto 0);\r
-       CTS_CODE_IN                 : in    std_logic_vector (7  downto 0);\r
-       CTS_INFORMATION_IN          : in    std_logic_vector (7  downto 0);\r
-       CTS_READOUT_TYPE_IN         : in    std_logic_vector (3  downto 0);\r
-       CTS_START_READOUT_IN        : in    std_logic;\r
-       CTS_READ_IN                 : in    std_logic;\r
-       CTS_DATA_OUT                : out   std_logic_vector (31 downto 0);\r
-       CTS_DATAREADY_OUT           : out   std_logic;\r
-       CTS_READOUT_FINISHED_OUT    : out   std_logic;      --no more data, end transfer, send TRM\r
-       CTS_LENGTH_OUT              : out   std_logic_vector (15 downto 0);\r
-       CTS_ERROR_PATTERN_OUT       : out   std_logic_vector (31 downto 0);\r
-       -- Data from Frontends\r
-       FEE_DATA_IN                 : in    std_logic_vector (15 downto 0);\r
-       FEE_DATAREADY_IN            : in    std_logic;\r
-       FEE_READ_OUT                : out   std_logic;\r
-       FEE_BUSY_IN                 : in    std_logic;\r
-       FEE_STATUS_BITS_IN          : in    std_logic_vector (31 downto 0);\r
-       -- slow control interface\r
-       START_CONFIG_OUT                        : out   std_logic; -- reconfigure MACs/IPs/ports/packet size\r
-       BANK_SELECT_OUT                         : out   std_logic_vector(3 downto 0); -- configuration page address\r
-       CONFIG_DONE_IN                          : in    std_logic; -- configuration finished\r
-       DATA_GBE_ENABLE_IN                      : in    std_logic; -- IPU data is forwarded to GbE\r
-       DATA_IPU_ENABLE_IN                      : in    std_logic; -- IPU data is forwarded to CTS / TRBnet\r
-       MULTI_EVT_ENABLE_IN                     : in    std_logic; -- enable multi event packets\r
-       MAX_MESSAGE_SIZE_IN                     : in    std_logic_vector(31 downto 0); -- the maximum size of one HadesQueue  -- gk 08.04.10\r
-       READOUT_CTR_IN                          : in    std_logic_vector(23 downto 0); -- gk 26.04.10\r
-       READOUT_CTR_VALID_IN                    : in    std_logic; -- gk 26.04.10\r
-       -- PacketConstructor interface\r
-       PC_WR_EN_OUT                : out   std_logic;\r
-       PC_DATA_OUT                 : out   std_logic_vector (7 downto 0);\r
-       PC_READY_IN                 : in    std_logic;\r
-       PC_SOS_OUT                  : out   std_logic;\r
-       PC_EOD_OUT                  : out   std_logic;\r
-       PC_SUB_SIZE_OUT             : out   std_logic_vector(31 downto 0);\r
-       PC_TRIG_NR_OUT              : out   std_logic_vector(31 downto 0);\r
-       PC_PADDING_OUT              : out   std_logic;\r
-       -- Debug\r
-       BSM_SAVE_OUT                : out   std_logic_vector(3 downto 0);\r
-       BSM_LOAD_OUT                : out   std_logic_vector(3 downto 0);\r
-       DBG_REM_CTR_OUT             : out   std_logic_vector(3 downto 0);\r
-       DBG_CTS_CTR_OUT             : out   std_logic_vector(2 downto 0);\r
-       DBG_SF_WCNT_OUT             : out   std_logic_vector(15 downto 0);\r
-       DBG_SF_RCNT_OUT             : out   std_logic_vector(16 downto 0);\r
-       DBG_SF_DATA_OUT             : out   std_logic_vector(15 downto 0);\r
-       DBG_SF_RD_EN_OUT            : out   std_logic;\r
-       DBG_SF_WR_EN_OUT            : out   std_logic;\r
-       DBG_SF_EMPTY_OUT            : out   std_logic;\r
-       DBG_SF_AEMPTY_OUT           : out   std_logic;\r
-       DBG_SF_FULL_OUT             : out   std_logic;\r
-       DBG_SF_AFULL_OUT            : out   std_logic;\r
-       DEBUG_OUT                   : out   std_logic_vector(63 downto 0)\r
-);\r
-end entity;\r
-\r
-architecture trb_net16_ipu2gbe of trb_net16_ipu2gbe is\r
-\r
-component fifo_32kx16x8_mb\r
-port( \r
-       Data            : in    std_logic_vector(15 downto 0); \r
-       WrClock         : in    std_logic;\r
-       RdClock         : in    std_logic; \r
-       WrEn            : in    std_logic;\r
-       RdEn            : in    std_logic;\r
-       Reset           : in    std_logic; \r
-       RPReset         : in    std_logic; \r
-       AmEmptyThresh   : in    std_logic_vector(15 downto 0); \r
-       AmFullThresh    : in    std_logic_vector(14 downto 0); \r
-       Q               : out   std_logic_vector(7 downto 0); \r
-       WCNT            : out   std_logic_vector(15 downto 0); \r
-       RCNT            : out   std_logic_vector(16 downto 0);\r
-       Empty           : out   std_logic;\r
-       AlmostEmpty     : out   std_logic;\r
-       Full            : out   std_logic;\r
-       AlmostFull      : out   std_logic\r
-);\r
-end component;\r
-\r
-type saveStates is (SIDLE, SAVE_EVT_ADDR, WAIT_FOR_DATA, SAVE_DATA, ADD_SUBSUB1, ADD_SUBSUB2, ADD_SUBSUB3, ADD_SUBSUB4, TERMINATE, SCLOSE);\r
-signal saveCurrentState, saveNextState : saveStates;\r
-signal state                : std_logic_vector(3 downto 0);\r
-signal data_req_comb        : std_logic;\r
-signal data_req             : std_logic; -- request data signal, will be used for fee_read generation\r
-signal rst_saved_ctr_comb   : std_logic;\r
-signal rst_saved_ctr        : std_logic;\r
-\r
-signal fee_read_comb        : std_logic;\r
-signal fee_read             : std_logic; -- fee_read signal\r
-signal saved_ctr            : std_logic_vector(16 downto 0);\r
-signal ce_saved_ctr         : std_logic;\r
-\r
--- header data\r
-signal cts_rnd              : std_logic_vector(15 downto 0);\r
-signal cts_rnd_saved        : std_logic;\r
-signal cts_trg              : std_logic_vector(15 downto 0);\r
-signal cts_trg_saved        : std_logic;\r
-signal cts_len              : std_logic_vector(16 downto 0);\r
-signal cts_len_saved        : std_logic;\r
-\r
--- CTS interface\r
-signal cts_error_pattern    : std_logic_vector(31 downto 0);\r
-signal cts_length           : std_logic_vector(15 downto 0);\r
-signal cts_readout_finished : std_logic;\r
-signal cts_dataready        : std_logic;\r
-signal cts_data             : std_logic_vector(31 downto 0);\r
-\r
--- Split FIFO signals\r
-signal sf_data              : std_logic_vector(15 downto 0);\r
-signal sf_wr_en_comb        : std_logic;\r
-signal sf_wr_en             : std_logic; -- write signal for FIFO\r
-signal sf_rd_en_comb        : std_logic;\r
-signal sf_rd_en             : std_logic; -- read signal for FIFO\r
-signal sf_rd_valid_comb     : std_logic;\r
-signal sf_rd_valid          : std_logic;\r
-signal sf_wcnt              : std_logic_vector(15 downto 0);\r
-signal sf_rcnt              : std_logic_vector(16 downto 0);\r
-signal sf_empty             : std_logic;\r
-signal sf_aempty            : std_logic;\r
-signal sf_full              : std_logic;\r
-signal sf_afull             : std_logic;\r
-\r
--------------------------------------------------------------------\r
-type loadStates is (LIDLE, INIT, REMOVE, DECIDE, CALCA, CALCB, LOAD, PAD0, PAD1, PAD2, PAD3, LOAD_SUBSUB, CALCC, CLOSE, WAIT_PC);\r
-signal loadCurrentState, loadNextState : loadStates;\r
-signal state2               :   std_logic_vector(3 downto 0);\r
-\r
-signal rem_ctr              : std_logic_vector(3 downto 0); -- counter for stripping / storing header data\r
-signal rst_rem_ctr_comb     : std_logic;\r
-signal rst_rem_ctr          : std_logic; -- reset the remove counter\r
-signal rst_regs_comb        : std_logic;\r
-signal rst_regs             : std_logic; -- reset storage registers\r
-signal rem_phase_comb       : std_logic;\r
-signal rem_phase            : std_logic; -- header remove phase\r
-signal data_phase_comb      : std_logic;\r
-signal data_phase           : std_logic; -- data transport phase from split fifo to PC\r
-signal pad_phase_comb       : std_logic;\r
-signal pad_phase            : std_logic; -- padding phase\r
-signal calc_pad_comb        : std_logic;\r
-signal calc_pad             : std_logic; -- check if padding bytes need to be added to PC_SUB_SIZE\r
-signal pad_data_comb        : std_logic;\r
-signal pad_data             : std_logic; -- reset PC_DATA register to known padding byte value\r
-\r
-signal pc_sos_comb          : std_logic;\r
-signal pc_sos               : std_logic; -- start of data signal\r
-signal pc_eod_comb          : std_logic;\r
-signal pc_eod               : std_logic; -- end of data signal\r
-\r
-signal ce_rem_ctr_comb      : std_logic;\r
-signal ce_rem_ctr           : std_logic; -- count enable for remove counter\r
-signal remove_done_comb     : std_logic;\r
-signal remove_done          : std_logic; -- end of header stripping process\r
-signal read_done_comb       : std_logic;\r
-signal read_done            : std_logic; -- end of data phase (read phase from SF)\r
-\r
-signal pc_data              : std_logic_vector(7 downto 0);\r
-signal pc_data_q            : std_logic_vector(7 downto 0);\r
-signal pc_trig_nr           : std_logic_vector(15 downto 0);\r
-signal pc_sub_size          : std_logic_vector(17 downto 0);\r
-signal read_size            : std_logic_vector(17 downto 0); -- number of byte to be read from split fifo\r
-signal padding_needed       : std_logic;\r
-signal pc_wr_en_comb        : std_logic;\r
-signal pc_wr_en_q           : std_logic;\r
-signal pc_wr_en_qq          : std_logic;\r
-signal pc_wr_en_qqq         : std_logic;\r
-signal pc_eod_q             : std_logic;\r
-signal pc_eod_qq            : std_logic;\r
-\r
-signal debug                : std_logic_vector(63 downto 0);\r
-\r
--- gk \r
-signal bank_select          : std_logic_vector(3 downto 0);\r
-signal save_addr_comb       : std_logic;\r
-signal save_addr            : std_logic;\r
-signal addr_saved_comb     : std_logic;\r
-signal addr_saved          : std_logic;\r
-signal start_config        : std_logic;\r
-signal config_done         : std_logic;\r
-signal add_sub_state        : std_logic;\r
-signal add_sub_state_comb   : std_logic;\r
-signal add_sub_ctr          : std_logic_vector(3 downto 0);\r
-signal load_sub             : std_logic;\r
-signal load_sub_comb        : std_logic;\r
-signal load_sub_done        : std_logic;\r
-signal load_sub_done_comb   : std_logic;\r
-signal load_sub_ctr         : std_logic_vector(3 downto 0);\r
-signal load_sub_ctr_comb    : std_logic;\r
-signal actual_message_size  : std_logic_vector(31 downto 0);\r
-signal rst_msg              : std_logic;\r
-signal rst_msg_comb         : std_logic;\r
-signal more_subevents       : std_logic;\r
-signal data_phase2          : std_logic;\r
-signal data_phase2_comb     : std_logic;\r
-signal trig_random          : std_logic_vector(7 downto 0);\r
-signal readout_ctr          : std_logic_vector(23 downto 0);\r
-signal readout_ctr_lock     : std_logic;\r
-\r
-begin\r
-\r
--- Fake signals\r
---START_CONFIG_OUT <= '0'; -- gk 27.03.10\r
-BANK_SELECT_OUT <= bank_select; -- gk 27.03.10\r
-START_CONFIG_OUT <= start_config;  -- gk 27.03.10\r
-config_done <= CONFIG_DONE_IN; -- gk 29.03.10\r
-\r
--- gk 26.04.10\r
-READOUT_CTR_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if ((RESET = '1') or (READOUT_CTR_VALID_IN = '1')) then\r
-                       readout_ctr <= READOUT_CTR_IN;\r
-                       readout_ctr_lock <= '0';\r
-               -- gk 15.06.10\r
-               -- increment the counter after the event is sent\r
-               elsif ( (saveCurrentState = SCLOSE) and (readout_ctr_lock = '0') ) then\r
-                       readout_ctr_lock <= '1';\r
-                       readout_ctr <= readout_ctr + x"1";\r
-               elsif (saveCurrentState = SIDLE) then\r
-                       readout_ctr_lock <= '0';\r
---             elsif ((CTS_START_READOUT_IN = '0') and (readout_ctr_lock = '0')) then\r
---                     readout_ctr <= readout_ctr + x"1";\r
---                     readout_ctr_lock <= '1';\r
---             elsif (CTS_START_READOUT_IN = '0') then\r
---                     readout_ctr_lock <= '0';\r
-               end if;\r
-       end if;\r
-end process READOUT_CTR_PROC;\r
-\r
--- gk 27.03.10\r
-bank_select_proc : process( CLK )\r
-begin\r
-       if rising_edge( CLK ) then\r
-               -- gk 29.03.10 for debug only: should round robin over 4 addresses with each subevent\r
---             if( (RESET = '1') or (bank_select > "0011") ) then\r
---                     bank_select <= "0000";\r
---             elsif( (sf_rd_en = '1') and (rem_ctr = x"2") ) then\r
---                     bank_select <= bank_select + x"1";\r
---             end if;\r
-               -- gk 29.03.10\r
-               if( (RESET = '1') or (rst_msg = '1') ) then --(rst_regs = '1') ) then\r
-                       bank_select <= "0000";\r
-               -- gk 01.06.10 THERE WAS A BUG, IT SHOUDL BE TAKEN FROM SF_Q\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"2") ) then\r
-                       bank_select <= pc_data(3 downto 0); --CTS_INFORMATION_IN(3 downto 0);\r
-               end if;\r
-       end if;\r
-end process bank_select_proc;\r
-\r
--- gk 29.03.10\r
-start_config_proc : process( CLK )\r
-begin\r
-       if rising_edge( CLK ) then\r
-               if( (RESET = '1') or (config_done = '1') or (rst_msg = '1') ) then --(rst_regs = '1') or (config_done = '1') ) then\r
-                       start_config <= '0';\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"2") ) then  -- gk 01.06.10\r
-                       start_config <= '1';\r
-               end if;\r
-       end if;\r
-end process start_config_proc;\r
-\r
--- CTS interface signals\r
-cts_error_pattern    <= (others => '0'); -- FAKE\r
-\r
-cts_length           <= x"0000"; -- length of data payload is always 0\r
-cts_data             <= b"0001" & cts_rnd(11 downto 0) & cts_trg; -- reserved bits = '0', pack bit = '1'\r
-\r
-cts_readout_finished <= '1' when (saveCurrentState = SCLOSE) else '0';\r
-\r
-cts_dataready        <= '1' when ((saveCurrentState = SAVE_DATA) and (FEE_BUSY_IN = '0')) or (saveCurrentState = TERMINATE) \r
-                                                       else '0';\r
-\r
--- Byte swapping... done here. TAKE CARE!\r
--- The split FIFO is in natural bus order (i.e. Motorola style, [15:0]). This means that the two bytes\r
--- on the write side need to be swapped to appear in GbE style (i.e. Intel style) on the 8bit port.\r
--- Please mind that PC_SUB_SIZE and PC_TRIG_NR stay in a human readable format, and need to be byteswapped\r
--- for GbE inside the packet constructor.\r
---\r
--- Long live the Endianess!\r
-\r
--- Sync all critical pathes\r
-THE_SYNC_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               --sf_data       <= FEE_DATA_IN; -- gk 27.03.10 moved out to the process below\r
-               sf_wr_en      <= sf_wr_en_comb;\r
-               ce_rem_ctr    <= ce_rem_ctr_comb;\r
-               sf_rd_en      <= sf_rd_en_comb;\r
-               fee_read      <= fee_read_comb;\r
-               read_done     <= read_done_comb;\r
-               pc_eod_qq     <= pc_eod_q;\r
-               pc_eod_q      <= pc_eod;\r
-               pc_wr_en_qqq  <= pc_wr_en_qq;\r
-               pc_wr_en_qq   <= pc_wr_en_q;\r
-               pc_wr_en_q    <= pc_wr_en_comb;\r
-       end if;\r
-end process THE_SYNC_PROC;\r
-\r
--- gk 27.03.10 data selector for sf to write the evt builder address on top of data\r
-SF_DATA_PROC : process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if (RESET = '1') then  -- gk 31.05.10\r
-                       sf_data <= (others => '0');\r
-               elsif( save_addr = '1' ) then\r
-                       sf_data(3 downto 0) <= CTS_INFORMATION_IN(3 downto 0); -- only last 4 bits are the evt builder address\r
-                       sf_data(15 downto 4) <= x"abc";\r
-               -- gk 29.03.10 four entries to save the fee_status into sf for the subsubevent\r
-               elsif( (add_sub_state = '1') and (add_sub_ctr = x"0") ) then\r
-                       sf_data <= x"0001"; -- gk 06.11.10\r
-               elsif( (add_sub_state = '1') and (add_sub_ctr = x"1") ) then\r
-                       sf_data <= x"5555"; -- gk 06.11.10\r
-               elsif( (add_sub_state = '1') and (add_sub_ctr = x"2") ) then\r
-                       sf_data <= FEE_STATUS_BITS_IN(31 downto 16);\r
-               elsif( (add_sub_state = '1') and (add_sub_ctr = x"3") ) then\r
-                       sf_data <= FEE_STATUS_BITS_IN(15 downto 0);\r
-               else\r
-                       sf_data <= FEE_DATA_IN;\r
-               end if;\r
-       end if;\r
-end process SF_DATA_PROC;\r
-\r
--- combinatorial read signal for the FEE data interface, DO NOT USE DIRECTLY\r
-fee_read_comb <= '1' when ( (sf_afull = '0') and (data_req = '1') and (DATA_GBE_ENABLE_IN = '1') ) -- GbE enabled\r
-                                        else '0';\r
-\r
--- combinatorial write signal for the split FIFO, DO NOT USE DIRECTLY\r
--- gk 27.03.10\r
---sf_wr_en_comb <= '1' when ( (fee_read = '1') and (FEE_DATAREADY_IN = '1') and (DATA_GBE_ENABLE_IN = '1') ) -- GbE enabled\r
---                                      else '0';\r
-sf_wr_en_comb <= '1' when ( (fee_read = '1') and (FEE_DATAREADY_IN = '1') and (DATA_GBE_ENABLE_IN = '1') ) or -- GbE enabled\r
-                                       (save_addr = '1') or\r
-                                       (add_sub_state = '1')  -- gk 29.03.10 save the subsubevent\r
-                                        else '0';\r
-\r
--- Counter for header word storage\r
-THE_CTS_SAVED_CTR: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then\r
-                       saved_ctr <= (others => '0');\r
-               elsif( ce_saved_ctr = '1' ) then\r
-                       saved_ctr <= saved_ctr + 1;\r
-               end if;\r
-       end if;\r
-end process THE_CTS_SAVED_CTR;\r
-\r
--- gk 27.03.10 do not count evt builder address as saved ipu bytes\r
---ce_saved_ctr <= sf_wr_en;\r
-ce_saved_ctr <= '0' when addr_saved = '1' else sf_wr_en;\r
-\r
--- Statemachine for reading data payload, handling IPU channel and storing data in the SPLIT_FIFO\r
-saveMachineProc: process( CLK )\r
-begin\r
-       if rising_edge(CLK) then\r
-               if RESET = '1' then\r
-                       saveCurrentState <= SIDLE;\r
-                       data_req         <= '0';\r
-                       rst_saved_ctr    <= '0';\r
-                       save_addr        <= '0'; -- gk 27.03.10\r
-                       addr_saved       <= '0'; -- gk 27.03.10\r
-                       add_sub_state    <= '0'; -- gk 29.03.10\r
-               else\r
-                       saveCurrentState <= saveNextState;\r
-                       data_req         <= data_req_comb;\r
-                       rst_saved_ctr    <= rst_saved_ctr_comb;\r
-                       save_addr        <= save_addr_comb; -- gk 27.03.10\r
-                       addr_saved       <= addr_saved_comb; -- gk 27.03.10\r
-                       add_sub_state    <= add_sub_state_comb; -- gk 29.03.10\r
-               end if;\r
-       end if;\r
-end process saveMachineProc;\r
-\r
-saveMachine: process( saveCurrentState, CTS_START_READOUT_IN, FEE_BUSY_IN, CTS_READ_IN )\r
-begin\r
-       saveNextState      <= SIDLE;\r
-       data_req_comb      <= '0';\r
-       rst_saved_ctr_comb <= '0';\r
-       save_addr_comb     <= '0'; -- gk 27.03.10\r
-       addr_saved_comb    <= '0'; -- gk 27.03.10\r
-       add_sub_state_comb <= '0';  -- gk 29.03.10\r
-       case saveCurrentState is\r
-               when SIDLE =>\r
-                       state <= x"0";\r
-                       if (CTS_START_READOUT_IN = '1') then\r
-                               saveNextState <= SAVE_EVT_ADDR; --WAIT_FOR_DATA; -- gk 27.03.10\r
-                               data_req_comb <= '1';\r
-                               rst_saved_ctr_comb <= '1';\r
-                       else\r
-                               saveNextState <= SIDLE;\r
-                       end if;\r
-               -- gk 27.03.10\r
-               when SAVE_EVT_ADDR =>\r
-                       state <= x"5";\r
-                       saveNextState <= WAIT_FOR_DATA;\r
-                       data_req_comb <= '1';\r
-                       save_addr_comb <= '1';\r
-               when WAIT_FOR_DATA =>\r
-                       state <= x"1";\r
-                       if (FEE_BUSY_IN = '1') then\r
-                               saveNextState <= SAVE_DATA;\r
-                               data_req_comb <= '1';\r
-                       else\r
-                               saveNextState <= WAIT_FOR_DATA;\r
-                               data_req_comb <= '1';\r
-                       end if;\r
-                       addr_saved_comb <= '1';  -- gk 27.03.10\r
-               when SAVE_DATA =>\r
-                       state <= x"2";\r
-                       if (FEE_BUSY_IN = '0') then\r
-                               saveNextState <= TERMINATE;\r
-                       else\r
-                               saveNextState <= SAVE_DATA;\r
-                               data_req_comb <= '1';\r
-                       end if;\r
-               when TERMINATE =>\r
-                       state <= x"3";\r
-                       if (CTS_READ_IN = '1') then\r
-                               saveNextState <= SCLOSE;\r
-                       else\r
-                               saveNextState <= TERMINATE;\r
-                       end if;\r
-               when SCLOSE =>\r
-                       state <= x"4";\r
-                       if (CTS_START_READOUT_IN = '0') then\r
-                               saveNextState <= ADD_SUBSUB1; --SIDLE;  -- gk 29.03.10\r
-                       else\r
-                               saveNextState <= SCLOSE;\r
-                       end if;\r
-               -- gk 29.03.10 new states during which the subsub bytes are saved\r
-               when ADD_SUBSUB1 =>\r
-                       state <= x"6";\r
-                       add_sub_state_comb <= '1';\r
-                       saveNextState <= ADD_SUBSUB2;\r
-               when ADD_SUBSUB2 =>\r
-                       state<= x"7";\r
-                       add_sub_state_comb <= '1';\r
-                       saveNextState <= ADD_SUBSUB3;\r
-               when ADD_SUBSUB3 =>\r
-                       state<= x"8";\r
-                       add_sub_state_comb <= '1';\r
-                       saveNextState <= ADD_SUBSUB4;\r
-               when ADD_SUBSUB4 =>\r
-                       state<= x"9";\r
-                       add_sub_state_comb <= '1';\r
-                       saveNextState <= SIDLE;\r
-               when others =>\r
-                       state <= x"f";\r
-                       saveNextState <= SIDLE;\r
-       end case;\r
-end process saveMachine;\r
-\r
--- gk 29.03.10\r
-ADD_SUB_CTR_PROC : process( CLK )\r
-begin\r
-       if( rising_edge( CLK ) ) then\r
-               if( (RESET = '1') or (rst_saved_ctr = '1') ) then\r
-                       add_sub_ctr <= (others => '0');\r
-               elsif( add_sub_state = '1' ) then\r
-                       add_sub_ctr <= add_sub_ctr + 1;\r
-               end if;\r
-       end if;\r
-end process ADD_SUB_CTR_PROC;\r
-\r
--- save triggerRnd from incoming data for cts response\r
-CTS_RND_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then\r
-                       cts_rnd       <= (others => '0');\r
-                       cts_rnd_saved <= '0';\r
-               elsif( (saved_ctr(2 downto 0) = b"000") and (sf_wr_en = '1') and (cts_rnd_saved = '0') ) then\r
-                       cts_rnd <= sf_data;\r
-                       cts_rnd_saved <= '1';\r
-               end if;\r
-       end if;\r
-end process CTS_RND_PROC;\r
-\r
--- save triggerNr from incoming data for cts response\r
-CTS_TRG_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then\r
-                       cts_trg       <= (others => '0');\r
-                       cts_trg_saved <= '0';\r
-               elsif( (saved_ctr(2 downto 0) = b"001") and (sf_wr_en = '1') and (cts_trg_saved = '0') ) then\r
-                       cts_trg <= sf_data;\r
-                       cts_trg_saved <= '1';\r
-               end if;\r
-       end if;\r
-end process CTS_TRG_PROC;\r
-\r
--- save size from incoming data for cts response (future) and to get rid of padding\r
-CTS_SIZE_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then\r
-                       cts_len       <= (others => '0');\r
-                       cts_len_saved <= '0';\r
-               elsif( (saved_ctr(2 downto 0) = b"010") and (sf_wr_en = '1') and (cts_len_saved = '0') ) then\r
-                       cts_len(16 downto 1) <= sf_data; -- change from 32b words to 16b words\r
-                       cts_len(0)           <= '0';\r
-               elsif( (saved_ctr(2 downto 0) = b"011") and (cts_len_saved = '0') ) then\r
-                       cts_len       <= cts_len + x"4";\r
-                       cts_len_saved <= '1';\r
-               end if;\r
-       end if;\r
-end process CTS_SIZE_PROC;\r
-\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-\r
--- Split FIFO\r
-THE_SPLIT_FIFO: fifo_32kx16x8_mb\r
-port map( \r
-       -- Byte swapping for correct byte order on readout side of FIFO\r
-       Data(15 downto 8) => sf_data(7 downto 0),\r
-       Data(7 downto 0)  => sf_data(15 downto 8),\r
-       WrClock         => CLK,\r
-       RdClock         => CLK, \r
-       WrEn            => sf_wr_en,\r
-       RdEn            => sf_rd_en,\r
-       Reset           => RESET, \r
-       RPReset         => RESET, \r
-       AmEmptyThresh   => b"0000_0000_0000_0010", -- one byte ahead\r
-       AmFullThresh    =>  b"111_1111_1110_1111", -- 0x7fef = 32751\r
-       Q               => pc_data, --open,\r
-       WCNT            => sf_wcnt,\r
-       RCNT            => sf_rcnt,\r
-       Empty           => sf_empty,\r
-       AlmostEmpty     => sf_aempty,\r
-       Full            => sf_full,\r
-       AlmostFull      => sf_afull\r
-);\r
-\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-\r
--- write signal for PC data\r
-pc_wr_en_comb <= (data_phase and sf_rd_en) or pad_phase or (load_sub and sf_rd_en) or data_phase2; -- gk 30.03.10 added load_sub  -- gk 20.04.10 added data_phase2\r
-\r
--- FIFO data delay process (also forces padding bytes to known value)\r
-THE_DATA_DELAY_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if( pad_data = '1' ) then\r
-                       pc_data_q <= x"aa"; -- padding for 64bit\r
-               else\r
-                       pc_data_q   <= pc_data;\r
-               end if;\r
-       end if;\r
-end process THE_DATA_DELAY_PROC;\r
-\r
--- Statemachine for reading the data payload from the SPLIT_FIFO and feeding\r
--- it into the packet constructor\r
-loadMachineProc : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if RESET = '1' then\r
-                       loadCurrentState <= LIDLE;\r
-                       rst_rem_ctr      <= '0';\r
-                       rem_phase        <= '0';\r
-                       calc_pad         <= '0';\r
-                       data_phase       <= '0';\r
-                       pad_phase        <= '0';\r
-                       pc_sos           <= '0';\r
-                       pc_eod           <= '0';\r
-                       rst_regs         <= '0';\r
-                       pad_data         <= '0';\r
-                       load_sub         <= '0'; -- gk 30.03.10\r
-                       rst_msg          <= '0'; -- gk 08.04.10\r
-                       data_phase2      <= '0'; -- gk 20.04.10\r
-               else\r
-                       loadCurrentState <= loadNextState;\r
-                       rst_rem_ctr      <= rst_rem_ctr_comb;\r
-                       rem_phase        <= rem_phase_comb;\r
-                       calc_pad         <= calc_pad_comb;\r
-                       data_phase       <= data_phase_comb;\r
-                       pad_phase        <= pad_phase_comb;\r
-                       pc_sos           <= pc_sos_comb;\r
-                       pc_eod           <= pc_eod_comb;\r
-                       rst_regs         <= rst_regs_comb;\r
-                       pad_data         <= pad_data_comb;\r
-                       load_sub         <= load_sub_comb; -- gk 30.03.10\r
-                       rst_msg          <= rst_msg_comb; -- gk 08.04.10\r
-                       data_phase2      <= data_phase2_comb;  -- gk 20.04.10\r
-               end if;\r
-       end if;\r
-end process loadMachineProc;\r
-\r
-sf_rd_en_comb <= '1' when ( (sf_aempty = '0') and (rem_phase = '1') and  (remove_done = '0') ) or\r
-                                       ( (sf_aempty = '0') and (data_phase = '1') and (read_done = '0')   ) or\r
-                                       ( (sf_aempty = '0') and (load_sub = '1') and (load_sub_done = '0') ) -- gk 30.03.10\r
-                                        else '0';\r
-\r
-ce_rem_ctr_comb <= '1' when ( (sf_aempty = '0') and (rem_phase = '1') and ( remove_done = '0') ) \r
-                                          else '0';\r
-\r
-loadMachine : process( loadCurrentState, sf_aempty, remove_done, read_done, padding_needed, PC_READY_IN, load_sub_done )\r
-begin\r
-       loadNextState    <= LIDLE;\r
-       rst_rem_ctr_comb <= '0';\r
-       rem_phase_comb   <= '0';\r
-       calc_pad_comb    <= '0';\r
-       data_phase_comb  <= '0';\r
-       pad_phase_comb   <= '0';\r
-       pc_sos_comb      <= '0';\r
-       pc_eod_comb      <= '0';\r
-       rst_regs_comb    <= '0';\r
-       pad_data_comb    <= '0';\r
-       load_sub_comb    <= '0';  -- gk 30.03.10\r
-       rst_msg_comb     <= '0';  -- gk 08.04.10\r
-       data_phase2_comb <= '0';  -- gk 20.04.10\r
-       case loadCurrentState is\r
-               when LIDLE =>\r
-                       state2 <= x"0";\r
-                       if( (sf_aempty = '0') and (PC_READY_IN = '1') ) then\r
-                               loadNextState <= INIT;\r
-                               rst_rem_ctr_comb <= '1';\r
-                               rst_regs_comb <= '1';\r
-                               rst_msg_comb <= '1';  -- gk 08.04.10\r
-                       else\r
-                               loadNextState <= LIDLE;\r
-                       end if;\r
-               when INIT =>\r
-                       state2 <= x"1";\r
-                       loadNextState <= REMOVE;\r
-                       rem_phase_comb <= '1';\r
-               -- gk 08.04.10 changed to gather more subevents into one queue\r
-               when REMOVE =>\r
-                       state2 <= x"2";\r
-                       if( remove_done = '1' ) then\r
-                               loadNextState <= DECIDE;\r
-                               if (MULTI_EVT_ENABLE_IN = '1') then\r
-                                       -- gk 03.06.10\r
-                                       if(pc_sub_size(2) = '0') then\r
-                                               if((actual_message_size + pc_sub_size + x"18") <= MAX_MESSAGE_SIZE_IN) then\r
-                                                       loadNextState <= CALCA;\r
-                                                       calc_pad_comb <= '1';\r
-                                               else\r
-                                                       loadNextState <= CALCC;\r
-                                               end if;\r
-                                       else\r
-                                               if((actual_message_size + pc_sub_size + x"1c") <= MAX_MESSAGE_SIZE_IN) then\r
-                                                       loadNextState <= CALCA;\r
-                                                       calc_pad_comb <= '1';\r
-                                               else\r
-                                                       loadNextState <= CALCC;\r
-                                               end if;\r
-                                       end if;\r
-                               else\r
-                                       loadNextState <= CALCA;\r
-                                       calc_pad_comb <= '1';\r
-                               end if;\r
-                       else\r
-                               loadNextState <= REMOVE;\r
-                               rem_phase_comb <= '1';\r
-                       end if;\r
-               when CALCA =>\r
-                       state2 <= x"3";\r
-                       loadNextState <= CALCB;\r
-                       pc_sos_comb <= '1';\r
-               when CALCB =>\r
-                       -- we need a branch in case of length "0"!!!!\r
-                       state2 <= x"4";\r
-                       loadNextState <= LOAD;\r
-                       -- gk 20.04.2010\r
-                       if (more_subevents = '0') then\r
-                               data_phase_comb <= '1';\r
-                       else\r
-                               data_phase2_comb <= '1';\r
-                       end if;\r
-               when LOAD =>\r
-                       state2 <= x"5";\r
-                       -- gk 31.03.10 after loading subevent data read the subsubevent from sf\r
-                       if ( read_done = '1' ) then\r
-                               loadNextState <= LOAD_SUBSUB;\r
-                       -- gk 31.03.10 moved to the load_subsub state\r
---                     if   ( (read_done = '1') and (padding_needed = '0') ) then\r
---                             loadNextState <= LOAD_SUBSUB; --CALCC;  --gk 30.03.10\r
---                     elsif( (read_done = '1') and (padding_needed = '1') ) then\r
---                             loadNextState <= PAD0;\r
---                             pad_phase_comb <= '1';\r
-                       else\r
-                               loadNextState <= LOAD;\r
-                               data_phase_comb <= '1';\r
-                       end if;\r
-               -- gk 31.03.10\r
-               when LOAD_SUBSUB =>\r
-                       state2 <= x"d";\r
-                       if( load_sub_done = '1' ) then\r
-                               if( padding_needed = '0' ) then\r
-                                       if (MULTI_EVT_ENABLE_IN = '1') then\r
-                                               loadNextState <= INIT; --CALCC;  -- gk 08.04.10\r
-                                               rst_rem_ctr_comb <= '1';  -- gk 08.04.10\r
-                                               rst_regs_comb <= '1';  -- gk 08.04.10\r
-                                       else\r
-                                               loadNextState <= CALCC;\r
-                                       end if;\r
-                               else\r
-                                       loadNextState <= PAD0;\r
-                                       pad_phase_comb <= '1';\r
-                               end if;\r
-                       else\r
-                               loadNextState <= LOAD_SUBSUB;\r
-                               load_sub_comb <= '1';\r
-                       end if;\r
-               when PAD0 =>\r
-                       state2 <= x"6";\r
-                       loadNextState <= PAD1;\r
-                       pad_phase_comb <= '1';\r
-                       pad_data_comb <= '1';\r
-               when PAD1 =>\r
-                       state2 <= x"7";\r
-                       loadNextState <= PAD2;\r
-                       pad_phase_comb <= '1';\r
-                       pad_data_comb <= '1';\r
-               when PAD2 =>\r
-                       state2 <= x"8";\r
-                       loadNextState <= PAD3;\r
-                       pad_phase_comb <= '1';\r
-                       pad_data_comb <= '1';\r
-               when PAD3 =>\r
-                       state2 <= x"9";\r
-                       if (MULTI_EVT_ENABLE_IN = '1') then\r
-                               loadNextState <= INIT; -- gk 08.04.10\r
-                               rst_rem_ctr_comb <= '1';  -- gk 08.04.10\r
-                               rst_regs_comb <= '1';  -- gk 08.04.10\r
-                       else\r
-                               loadNextState <= CALCC;\r
-                       end if;\r
-                       pad_data_comb <= '1';\r
-               -- gk 31.03.10 the load_subsub state moved straight after load and before padding\r
-               -- gk 30.03.10\r
---             when LOAD_SUBSUB =>\r
---                     state2 <= x"d";\r
---                     if( load_sub_done = '1' ) then\r
---                             loadNextState <= CALCC;\r
---                     else\r
---                             loadNextState <= LOAD_SUBSUB;\r
---                             load_sub_comb <= '1';\r
---                     end if;\r
-               when CALCC =>\r
-                       state2 <= x"a";\r
-                       loadNextState <= CLOSE;\r
-                       pc_eod_comb <= '1';\r
-               when CLOSE =>\r
-                       state2 <= x"b";\r
-                       loadNextState <= WAIT_PC;\r
-                       --rst_regs_comb <= '1';  -- gk 08.04.10\r
-                       rst_msg_comb <= '1';  -- gk 08.04.10\r
-               when WAIT_PC =>\r
-                       state2 <= x"c";\r
-                       if( PC_READY_IN = '1' ) then\r
-                               if (MULTI_EVT_ENABLE_IN = '1') then\r
-                                       loadNextState <= CALCA; --LIDLE;  -- gk 08.04.10\r
-                                       calc_pad_comb <= '1';  -- gk 08.04.10\r
-                               else\r
-                                       loadNextState <= LIDLE;\r
-                               end if;\r
-                       else\r
-                               loadNextState <= WAIT_PC;\r
-                       end if;\r
-               when others =>\r
-                       state2 <= x"f";\r
-                       loadNextState <= LIDLE;\r
-       end case;\r
-end process loadMachine;\r
-\r
--- gk 30.03.10\r
-load_sub_ctr_comb <= '1' when ( (load_sub = '1') and (load_sub_done = '0') and (sf_aempty = '0') )\r
-                               else '0';\r
-\r
--- gk 30.03.10\r
-LOAD_SUB_CTR_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_regs = '1') ) then  -- gk 08.04.10\r
-                       load_sub_ctr <= (others => '0');\r
-               elsif( (load_sub_ctr_comb = '1') ) then\r
-                       load_sub_ctr <= load_sub_ctr + 1;\r
-               end if;\r
-       end if;\r
-end process LOAD_SUB_CTR_PROC;\r
-\r
--- gk 30.03.10\r
-load_sub_done_comb <= '1' when (load_sub_ctr = x"7") else '0';\r
-\r
--- gk 30.03.10\r
-LOAD_SUB_DONE_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if ( (RESET = '1') or (rst_regs = '1') ) then  -- gk 08.04.10\r
-                       load_sub_done <= '0';\r
-               else\r
-                       load_sub_done <= load_sub_done_comb;\r
-               end if;\r
-       end if;\r
-end process LOAD_SUB_DONE_PROC;\r
-\r
--- gk 20.04.10\r
--- used only in multiple event mode\r
-MORE_SUBEVENTS_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if( (RESET = '1') or (rst_msg = '1') ) then\r
-                       more_subevents <= '0';\r
-               elsif (data_phase = '1') then\r
-                       more_subevents <= '1';\r
-               end if;\r
-       end if;\r
-end process MORE_SUBEVENTS_PROC;\r
-\r
--- gk 26.04.10\r
-TRIG_RANDOM_PROC : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if ((RESET = '1') or (rst_regs = '1')) then\r
-                       trig_random <= (others => '0');\r
-               elsif ((sf_rd_en = '1') and (rem_ctr = x"4")) then\r
-                       trig_random <= pc_data;\r
-               end if;\r
-       end if;\r
-end process TRIG_RANDOM_PROC;\r
-\r
-\r
--- Counter for stripping the unneeded parts of the data stream, and saving the important parts\r
-THE_REMOVE_CTR: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_rem_ctr = '1') ) then\r
-                       rem_ctr <= (others => '0');\r
-               elsif( (ce_rem_ctr = '1') ) then\r
-                       rem_ctr <= rem_ctr + 1;\r
-               end if;\r
-       end if;\r
-end process THE_REMOVE_CTR;\r
-\r
-remove_done_comb <= '1' when ( rem_ctr = x"8" ) else '0'; --( rem_ctr = x"6" ) else '0';  -- gk 29.03.10 two more for evt builder address\r
-\r
-THE_REM_DONE_SYNC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_rem_ctr = '1') ) then\r
-                       remove_done <= '0';\r
-               else\r
-                       remove_done <= remove_done_comb;\r
-               end if;\r
-       end if;\r
-end process THE_REM_DONE_SYNC;\r
-\r
--- extract the trigger number from splitfifo data\r
-THE_TRG_NR_PROC: process( CLK )\r
-begin\r
-       if rising_edge(CLK) then\r
-               if   ( (RESET = '1') or (rst_regs = '1') ) then\r
-                       pc_trig_nr <= (others => '0');\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"6") ) then  -- x"4" gk 29.03.10\r
-                       pc_trig_nr(7 downto 0) <= pc_data;\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"5") ) then  -- x"3" gk 29.03.10\r
-                       pc_trig_nr(15 downto 8) <= pc_data;\r
-               end if;\r
-       end if;\r
-end process THE_TRG_NR_PROC;\r
-\r
--- check for padding\r
-THE_PADDING_NEEDED_PROC: process( CLK )\r
-begin\r
-       if rising_edge(CLK) then\r
-               if   ( (RESET = '1') or (rst_regs = '1') ) then\r
-                       padding_needed <= '0';\r
-               elsif( (remove_done = '1') and (pc_sub_size(2) = '1') ) then\r
-                       padding_needed <= '1';\r
-               elsif( (remove_done = '1') and (pc_sub_size(2) = '0') ) then\r
-                       padding_needed <= '0';\r
-               end if;\r
-       end if;\r
-end process THE_PADDING_NEEDED_PROC;\r
-\r
--- extract the subevent size from the splitfifo data, convert it from 32b to 8b units,\r
--- and in case of padding needed increase it accordingly\r
-THE_SUB_SIZE_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_regs = '1') ) then\r
-                       pc_sub_size <= (others => '0');\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"8") ) then  -- x"6" gk 29.03.10\r
-                       pc_sub_size(9 downto 2) <= pc_data;\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"7") ) then  -- x"5" gk 29.03.10\r
-                       pc_sub_size(17 downto 10) <= pc_data;\r
-               -- gk 30.03.10 bug fixed in the way that is written below\r
-               -- gk 27.03.10 should be corrected by sending padding_needed signal to pc and take care of it when setting sub_size_to_save\r
-               elsif( (calc_pad = '1') and (padding_needed = '1') ) then\r
-                       pc_sub_size <= pc_sub_size + x"4" + x"8"; -- BUG: SubEvtSize does NOT include 64bit padding!!!\r
-               elsif( (calc_pad = '1') and (padding_needed = '0') ) then\r
-                       pc_sub_size <= pc_sub_size + x"8";\r
-               end if;\r
-       end if;\r
-end process THE_SUB_SIZE_PROC;\r
-\r
--- number of bytes to read from split fifo\r
-THE_READ_SIZE_PROC: process( CLK )\r
-begin\r
-       if( rising_edge(CLK) ) then\r
-               if   ( (RESET = '1') or (rst_rem_ctr = '1') ) then\r
-                       read_size   <= (others => '0');\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"8") ) then  -- x"6" gk 29.03.10\r
-                       read_size(9 downto 2) <= pc_data;\r
-               elsif( (sf_rd_en = '1') and (rem_ctr = x"7") ) then  -- x"5" gk 29.03.10\r
-                       read_size(17 downto 10) <= pc_data;\r
---      elsif( ((calc_pad = '1') and (read_done = '0')) ) then\r
---          read_size <= read_size - 2;\r
-               elsif( ((sf_rd_en = '1') and (data_phase = '1')) ) then\r
-                       read_size <= read_size - 1;\r
-               end if;\r
-       end if;\r
-end process THE_READ_SIZE_PROC;\r
-\r
--- gk 08.04.10\r
--- used only in multi event mode\r
-ACTUAL_MSG_SIZE_PROC : process(CLK)\r
-begin\r
-       if(rising_edge(CLK)) then\r
-               if( (RESET = '1') or (rst_msg = '1') ) then\r
-                       actual_message_size <= x"0000_0028"; -- gk 29.04.10 termination + queue headers\r
-               -- gk 28.04.10\r
-               elsif (pc_sos = '1') then\r
-                       actual_message_size <= actual_message_size + pc_sub_size + x"10";  -- gk 28.04.10 +x10 for subevent headers\r
---             elsif ( (read_done = '1') and (data_phase = '1') ) then\r
---                     actual_message_size <= actual_message_size + pc_sub_size;\r
---             elsif( (calc_pad = '1') and (padding_needed = '1') ) then\r
---                     actual_message_size <= actual_message_size + pc_sub_size + 4 + 8;\r
---             elsif( (calc_pad = '1') and (padding_needed = '0') ) then\r
---                     actual_message_size <= actual_message_size + pc_sub_size + 8;\r
-               end if;\r
-       end if;\r
-end process ACTUAL_MSG_SIZE_PROC;\r
-\r
-read_done_comb <= '1' when (read_size < 3 ) else '0'; -- "2"\r
-\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-------------------------------------------------------------------------------------------\r
-\r
--- Debug signals\r
-debug(0)              <= sf_full;\r
-debug(1)              <= sf_empty;\r
-debug(2)              <= sf_afull;\r
-debug(3)              <= sf_aempty;\r
-\r
-debug(7 downto  4)    <= state2;\r
-\r
-debug(11 downto 8)    <= state;\r
-\r
-dbg_bs_proc : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if RESET = '1' then\r
-                       debug(15 downto 12) <= (others => '0');\r
-               elsif ( (sf_rd_en = '1') and (rem_ctr = x"3") ) then\r
-                       debug(15 downto 12) <= bank_select;\r
-               end if;\r
-       end if;\r
-end process dbg_bs_proc;\r
-\r
-debug(16)             <= config_done;\r
-debug(17)             <= remove_done;\r
-debug(18)             <= read_done;\r
-debug(19)             <= padding_needed;\r
-\r
-debug(20)             <= load_sub_done;\r
-\r
-dbg_cts_inf_proc : process(CLK)\r
-begin\r
-       if rising_edge(CLK) then\r
-               if RESET = '1' then\r
-                       debug(39 downto 32) <= (others => '0');\r
-               elsif ( save_addr = '1' ) then\r
-                       debug(39 downto 32) <= CTS_INFORMATION_IN;\r
-               end if;\r
-       end if;\r
-end process dbg_cts_inf_proc;\r
---debug(47 downto 32)   <= pc_sub_size(15 downto 0);\r
-debug(47 downto 40) <= (others => '0');\r
-debug(63 downto 48)   <= actual_message_size(15 downto 0);\r
-\r
--- debug(31)           <= remove_done;\r
--- debug(30)           <= read_done;\r
--- debug(29)           <= ce_rem_ctr;\r
--- debug(28)           <= rst_rem_ctr;\r
--- debug(27)           <= rst_regs;\r
--- debug(26)           <= rem_phase;\r
--- debug(25)           <= data_phase;\r
--- debug(24)           <= pad_phase;\r
--- debug(23)           <= pad_data;\r
--- debug(22 downto 17) <= (others => '0');\r
--- debug(16 downto 0)  <= saved_ctr;\r
-\r
--- Outputs\r
-FEE_READ_OUT             <= fee_read;\r
-CTS_ERROR_PATTERN_OUT    <= cts_error_pattern;\r
-CTS_DATA_OUT             <= cts_data;\r
-CTS_DATAREADY_OUT        <= cts_dataready;\r
-CTS_READOUT_FINISHED_OUT <= cts_readout_finished;\r
-CTS_LENGTH_OUT           <= cts_length;\r
-\r
-PC_SOS_OUT               <= pc_sos;\r
-PC_EOD_OUT               <= pc_eod_q;\r
-PC_DATA_OUT              <= pc_data_q;\r
-PC_WR_EN_OUT             <= pc_wr_en_qq;\r
-PC_TRIG_NR_OUT           <= readout_ctr(23 downto 16) & pc_trig_nr & trig_random; -- x"0000" & pc_trig_nr;  -- gk 26.04.10\r
-PC_SUB_SIZE_OUT          <= b"0000_0000_0000_00" & pc_sub_size;\r
-PC_PADDING_OUT           <= padding_needed;\r
-\r
-BSM_SAVE_OUT             <= state;\r
-BSM_LOAD_OUT             <= state2;\r
-DBG_CTS_CTR_OUT          <= saved_ctr(2 downto 0);\r
-DBG_REM_CTR_OUT          <= rem_ctr;\r
-DBG_SF_DATA_OUT          <= sf_data;\r
-DBG_SF_WCNT_OUT          <= sf_wcnt;\r
-DBG_SF_RCNT_OUT          <= read_size(16 downto 0); --sf_rcnt;\r
-DBG_SF_RD_EN_OUT         <= sf_rd_en;\r
-DBG_SF_WR_EN_OUT         <= sf_wr_en;\r
-DBG_SF_EMPTY_OUT         <= sf_empty;\r
-DBG_SF_AEMPTY_OUT        <= sf_aempty;\r
-DBG_SF_FULL_OUT          <= sf_full;\r
-DBG_SF_AFULL_OUT         <= sf_afull;\r
-\r
-DEBUG_OUT                <= debug;\r
-\r
+LIBRARY ieee;
+use ieee.std_logic_1164.all;
+USE IEEE.numeric_std.ALL;
+USE IEEE.std_logic_UNSIGNED.ALL;
+use IEEE.std_logic_arith.all;
+
+library work;
+
+entity trb_net16_ipu2gbe is
+port( 
+       CLK                         : in    std_logic;
+       RESET                       : in    std_logic;
+       -- IPU interface directed toward the CTS
+       CTS_NUMBER_IN               : in    std_logic_vector (15 downto 0);
+       CTS_CODE_IN                 : in    std_logic_vector (7  downto 0);
+       CTS_INFORMATION_IN          : in    std_logic_vector (7  downto 0);
+       CTS_READOUT_TYPE_IN         : in    std_logic_vector (3  downto 0);
+       CTS_START_READOUT_IN        : in    std_logic;
+       CTS_READ_IN                 : in    std_logic;
+       CTS_DATA_OUT                : out   std_logic_vector (31 downto 0);
+       CTS_DATAREADY_OUT           : out   std_logic;
+       CTS_READOUT_FINISHED_OUT    : out   std_logic;      --no more data, end transfer, send TRM
+       CTS_LENGTH_OUT              : out   std_logic_vector (15 downto 0);
+       CTS_ERROR_PATTERN_OUT       : out   std_logic_vector (31 downto 0);
+       -- Data from Frontends
+       FEE_DATA_IN                 : in    std_logic_vector (15 downto 0);
+       FEE_DATAREADY_IN            : in    std_logic;
+       FEE_READ_OUT                : out   std_logic;
+       FEE_BUSY_IN                 : in    std_logic;
+       FEE_STATUS_BITS_IN          : in    std_logic_vector (31 downto 0);
+       -- slow control interface
+       START_CONFIG_OUT                        : out   std_logic; -- reconfigure MACs/IPs/ports/packet size
+       BANK_SELECT_OUT                         : out   std_logic_vector(3 downto 0); -- configuration page address
+       CONFIG_DONE_IN                          : in    std_logic; -- configuration finished
+       DATA_GBE_ENABLE_IN                      : in    std_logic; -- IPU data is forwarded to GbE
+       DATA_IPU_ENABLE_IN                      : in    std_logic; -- IPU data is forwarded to CTS / TRBnet
+       MULTI_EVT_ENABLE_IN                     : in    std_logic; -- enable multi event packets
+       MAX_MESSAGE_SIZE_IN                     : in    std_logic_vector(31 downto 0); -- the maximum size of one HadesQueue  -- gk 08.04.10
+       MIN_MESSAGE_SIZE_IN                     : in    std_logic_vector(31 downto 0); -- gk 20.07.10
+       READOUT_CTR_IN                          : in    std_logic_vector(23 downto 0); -- gk 26.04.10
+       READOUT_CTR_VALID_IN                    : in    std_logic; -- gk 26.04.10
+       -- PacketConstructor interface
+       ALLOW_LARGE_IN                          : in    std_logic;  -- gk 21.07.10
+       PC_WR_EN_OUT                : out   std_logic;
+       PC_DATA_OUT                 : out   std_logic_vector (7 downto 0);
+       PC_READY_IN                 : in    std_logic;
+       PC_SOS_OUT                  : out   std_logic;
+       PC_EOD_OUT                  : out   std_logic;
+       PC_SUB_SIZE_OUT             : out   std_logic_vector(31 downto 0);
+       PC_TRIG_NR_OUT              : out   std_logic_vector(31 downto 0);
+       PC_PADDING_OUT              : out   std_logic;
+       MONITOR_OUT                 : out   std_logic_vector(191 downto 0);
+       DEBUG_OUT                   : out   std_logic_vector(383 downto 0)
+);
+end entity;
+
+architecture trb_net16_ipu2gbe of trb_net16_ipu2gbe is
+
+component fifo_32kx16x8_mb2
+port( 
+       Data            : in    std_logic_vector(17 downto 0); 
+       WrClock         : in    std_logic;
+       RdClock         : in    std_logic; 
+       WrEn            : in    std_logic;
+       RdEn            : in    std_logic;
+       Reset           : in    std_logic; 
+       RPReset         : in    std_logic; 
+       AmEmptyThresh   : in    std_logic_vector(15 downto 0); 
+       AmFullThresh    : in    std_logic_vector(14 downto 0); 
+       Q               : out   std_logic_vector(8 downto 0); 
+       WCNT            : out   std_logic_vector(15 downto 0); 
+       RCNT            : out   std_logic_vector(16 downto 0);
+       Empty           : out   std_logic;
+       AlmostEmpty     : out   std_logic;
+       Full            : out   std_logic;
+       AlmostFull      : out   std_logic
+);
+end component;
+
+type saveStates is (SIDLE, SAVE_EVT_ADDR, WAIT_FOR_DATA, SAVE_DATA, ADD_SUBSUB1, ADD_SUBSUB2, ADD_SUBSUB3, ADD_SUBSUB4, TERMINATE, SCLOSE);
+signal saveCurrentState, saveNextState : saveStates;
+signal state                : std_logic_vector(3 downto 0);
+signal data_req_comb        : std_logic;
+signal data_req             : std_logic; -- request data signal, will be used for fee_read generation
+signal rst_saved_ctr_comb   : std_logic;
+signal rst_saved_ctr        : std_logic;
+
+signal fee_read_comb        : std_logic;
+signal fee_read             : std_logic; -- fee_read signal
+signal saved_ctr            : std_logic_vector(16 downto 0);
+signal ce_saved_ctr         : std_logic;
+
+-- header data
+signal cts_rnd              : std_logic_vector(15 downto 0);
+signal cts_rnd_saved        : std_logic;
+signal cts_trg              : std_logic_vector(15 downto 0);
+signal cts_trg_saved        : std_logic;
+signal cts_len              : std_logic_vector(16 downto 0);
+signal cts_len_saved        : std_logic;
+
+-- CTS interface
+signal cts_error_pattern    : std_logic_vector(31 downto 0);
+signal cts_length           : std_logic_vector(15 downto 0);
+signal cts_readout_finished : std_logic;
+signal cts_dataready        : std_logic;
+signal cts_data             : std_logic_vector(31 downto 0);
+
+-- Split FIFO signals
+signal sf_data              : std_logic_vector(15 downto 0);
+signal sf_wr_en_comb        : std_logic;
+signal sf_wr_en             : std_logic; -- write signal for FIFO
+signal sf_rd_en_comb        : std_logic;
+signal sf_rd_en             : std_logic; -- read signal for FIFO
+signal sf_wcnt              : std_logic_vector(15 downto 0);
+signal sf_rcnt              : std_logic_vector(16 downto 0);
+signal sf_empty             : std_logic;
+signal sf_aempty            : std_logic;
+signal sf_full              : std_logic;
+signal sf_afull             : std_logic;
+
+-------------------------------------------------------------------
+type loadStates is (LIDLE, INIT, REMOVE, DECIDE, CALCA, CALCB, LOAD, PAD0, PAD1, PAD2, PAD3, LOAD_SUBSUB, CALCC, CLOSE, WAIT_PC, DROP, WAIT_TO_REMOVE, DROP_SUBSUB, PAUSE_BEFORE_DROP1, PAUSE_BEFORE_DROP2);
+signal loadCurrentState, loadNextState : loadStates;
+signal state2               :   std_logic_vector(3 downto 0);
+
+signal rem_ctr              : std_logic_vector(3 downto 0); -- counter for stripping / storing header data
+signal rst_rem_ctr_comb     : std_logic;
+signal rst_rem_ctr          : std_logic; -- reset the remove counter
+signal rst_regs_comb        : std_logic;
+signal rst_regs             : std_logic; -- reset storage registers
+signal rem_phase_comb       : std_logic;
+signal rem_phase            : std_logic; -- header remove phase
+signal data_phase_comb      : std_logic;
+signal data_phase           : std_logic; -- data transport phase from split fifo to PC
+signal pad_phase_comb       : std_logic;
+signal pad_phase            : std_logic; -- padding phase
+signal calc_pad_comb        : std_logic;
+signal calc_pad             : std_logic; -- check if padding bytes need to be added to PC_SUB_SIZE
+signal pad_data_comb        : std_logic;
+signal pad_data             : std_logic; -- reset PC_DATA register to known padding byte value
+
+signal pc_sos_comb          : std_logic;
+signal pc_sos               : std_logic; -- start of data signal
+signal pc_eod_comb          : std_logic;
+signal pc_eod               : std_logic; -- end of data signal
+
+signal ce_rem_ctr_comb      : std_logic;
+signal ce_rem_ctr           : std_logic; -- count enable for remove counter
+signal remove_done_comb     : std_logic;
+signal remove_done          : std_logic; -- end of header stripping process
+signal read_done_comb       : std_logic;
+signal read_done            : std_logic; -- end of data phase (read phase from SF)
+
+signal pc_data              : std_logic_vector(7 downto 0);
+signal pc_data_q            : std_logic_vector(7 downto 0);
+signal pc_trig_nr           : std_logic_vector(15 downto 0);
+signal pc_sub_size          : std_logic_vector(17 downto 0);
+signal read_size            : std_logic_vector(17 downto 0); -- number of byte to be read from split fifo
+signal padding_needed       : std_logic;
+signal pc_wr_en_comb        : std_logic;
+signal pc_wr_en_q           : std_logic;
+signal pc_wr_en_qq          : std_logic;
+signal pc_wr_en_qqq         : std_logic;
+signal pc_eod_q             : std_logic;
+
+signal debug                : std_logic_vector(383 downto 0);
+
+-- gk 
+signal bank_select          : std_logic_vector(3 downto 0);
+signal save_addr_comb       : std_logic;
+signal save_addr            : std_logic;
+signal addr_saved_comb     : std_logic;
+signal addr_saved          : std_logic;
+signal start_config        : std_logic;
+signal config_done         : std_logic;
+signal add_sub_state        : std_logic;
+signal add_sub_state_comb   : std_logic;
+signal add_sub_ctr          : std_logic_vector(3 downto 0);
+signal load_sub             : std_logic;
+signal load_sub_comb        : std_logic;
+signal load_sub_done        : std_logic;
+signal load_sub_done_comb   : std_logic;
+signal load_sub_ctr         : std_logic_vector(3 downto 0);
+signal load_sub_ctr_comb    : std_logic;
+signal actual_message_size  : std_logic_vector(31 downto 0);
+signal more_subevents       : std_logic;
+signal trig_random          : std_logic_vector(7 downto 0);
+signal readout_ctr          : std_logic_vector(23 downto 0);
+signal readout_ctr_lock     : std_logic;
+signal pc_trig_nr_q         : std_logic_vector(31 downto 0);
+
+-- gk 20.07.10
+signal inc_data_ctr         : std_logic_vector(31 downto 0);
+signal dropped_sm_events_ctr : std_logic_vector(31 downto 0);
+signal dropped_lr_events_ctr : std_logic_vector(31 downto 0);
+signal dropped_ctr          : std_logic_vector(31 downto 0);
+-- gk 22.07.10
+signal headers_invalid      : std_logic;
+signal headers_invalid_ctr  : std_logic_vector(31 downto 0);
+signal cts_len_q            : std_logic_vector(15 downto 0);
+signal cts_trg_q            : std_logic_vector(15 downto 0);
+signal cts_rnd_q            : std_logic_vector(15 downto 0);
+signal first_run_trg        : std_logic_vector(15 downto 0);
+signal first_run_addr       : std_logic_vector(15 downto 0);
+signal first_run_lock       : std_logic;
+signal cts_addr             : std_logic_vector(15 downto 0);
+signal cts_addr_q           : std_logic_vector(15 downto 0);
+signal cts_addr_saved       : std_logic;
+
+-- gk 24.07.10
+signal save_eod             : std_logic;
+signal save_eod_comb        : std_logic;
+
+signal load_eod             : std_logic;
+signal endpoint_addr        : std_logic_vector(15 downto 0);
+signal endp_addr_lock       : std_logic;
+
+signal saved_events_ctr     : std_logic_vector(15 downto 0);
+signal loaded_events_ctr    : std_logic_vector(15 downto 0);
+signal constr_events_ctr    : std_logic_vector(31 downto 0);
+signal event_waiting        : std_logic;
+
+signal drop_sub             : std_logic;
+signal drop_sub_comb        : std_logic;
+signal drop_event           : std_logic;
+signal drop_event_comb      : std_logic;
+signal drop_small           : std_logic;
+signal drop_large           : std_logic;
+signal drop_headers         : std_logic;
+signal drop_small_comb      : std_logic;
+signal drop_large_comb      : std_logic;
+signal drop_headers_comb    : std_logic;
+signal inc_trg_ctr          : std_logic;
+signal inc_trg_ctr_comb     : std_logic;
+
+signal invalid_hsize_ctr    : std_logic_vector(15 downto 0);
+signal invalid_hsize_lock   : std_logic;
+
+begin
+
+-- Fake signals
+--START_CONFIG_OUT <= '0'; -- gk 27.03.10
+BANK_SELECT_OUT <= bank_select; -- gk 27.03.10
+START_CONFIG_OUT <= start_config;  -- gk 27.03.10
+config_done <= CONFIG_DONE_IN; -- gk 29.03.10
+
+-- CTS interface signals
+cts_error_pattern    <= (others => '0'); -- FAKE
+
+cts_length           <= x"0000"; -- length of data payload is always 0
+cts_data             <= b"0001" & cts_rnd(11 downto 0) & cts_trg; -- reserved bits = '0', pack bit = '1'
+
+cts_readout_finished <= '1' when (saveCurrentState = SCLOSE) else '0';
+
+cts_dataready        <= '1' when ((saveCurrentState = SAVE_DATA) and (FEE_BUSY_IN = '0')) or (saveCurrentState = TERMINATE) 
+                                                       else '0';
+
+-- Byte swapping... done here. TAKE CARE!
+-- The split FIFO is in natural bus order (i.e. Motorola style, [15:0]). This means that the two bytes
+-- on the write side need to be swapped to appear in GbE style (i.e. Intel style) on the 8bit port.
+-- Please mind that PC_SUB_SIZE and PC_TRIG_NR stay in a human readable format, and need to be byteswapped
+-- for GbE inside the packet constructor.
+--
+-- Long live the Endianess!
+
+-- Sync all critical pathes
+THE_SYNC_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               --sf_data       <= FEE_DATA_IN; -- gk 27.03.10 moved out to the process below
+               sf_wr_en      <= sf_wr_en_comb;
+               ce_rem_ctr    <= ce_rem_ctr_comb;
+               sf_rd_en      <= sf_rd_en_comb;
+               fee_read      <= fee_read_comb;
+               read_done     <= read_done_comb;
+               pc_eod_q      <= pc_eod;
+               pc_wr_en_qqq  <= pc_wr_en_qq;
+               pc_wr_en_qq   <= pc_wr_en_q;
+               pc_wr_en_q    <= pc_wr_en_comb;
+       end if;
+end process THE_SYNC_PROC;
+
+-- gk 27.03.10 data selector for sf to write the evt builder address on top of data
+SF_DATA_PROC : process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if (RESET = '1') then  -- gk 31.05.10
+                       sf_data <= (others => '0');
+               elsif( save_addr = '1' ) then
+                       sf_data(3 downto 0) <= CTS_INFORMATION_IN(3 downto 0); -- only last 4 bits are the evt builder address
+                       sf_data(15 downto 4) <= x"abc";
+               -- gk 29.03.10 four entries to save the fee_status into sf for the subsubevent
+               elsif( (add_sub_state = '1') and (add_sub_ctr = x"0") ) then
+                       sf_data <= x"0001"; -- gk 11.06.10
+               elsif( (add_sub_state = '1') and (add_sub_ctr = x"1") ) then
+                       sf_data <= x"5555"; -- gk 11.06.10
+               elsif( (add_sub_state = '1') and (add_sub_ctr = x"2") ) then
+                       sf_data <= FEE_STATUS_BITS_IN(31 downto 16);
+               elsif( (add_sub_state = '1') and (add_sub_ctr = x"3") ) then
+                       sf_data <= FEE_STATUS_BITS_IN(15 downto 0);
+               else
+                       sf_data <= FEE_DATA_IN;
+               end if;
+       end if;
+end process SF_DATA_PROC;
+
+-- combinatorial read signal for the FEE data interface, DO NOT USE DIRECTLY
+fee_read_comb <= '1' when ( (sf_afull = '0') and (data_req = '1') and (DATA_GBE_ENABLE_IN = '1') ) -- GbE enabled
+                                        else '0';
+
+-- combinatorial write signal for the split FIFO, DO NOT USE DIRECTLY
+sf_wr_en_comb <= '1' when ( (fee_read = '1') and (FEE_DATAREADY_IN = '1') and (DATA_GBE_ENABLE_IN = '1') ) or -- GbE enabled
+                                       (save_addr = '1') or
+                                       (add_sub_state = '1')  -- gk 29.03.10 save the subsubevent
+                                        else '0';
+
+-- gk 27.03.10 do not count evt builder address as saved ipu bytes
+--ce_saved_ctr <= sf_wr_en;
+ce_saved_ctr <= '0' when addr_saved = '1' else sf_wr_en;
+
+-- Statemachine for reading data payload, handling IPU channel and storing data in the SPLIT_FIFO
+saveMachineProc: process( CLK )
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       saveCurrentState <= SIDLE;
+                       data_req         <= '0';
+                       rst_saved_ctr    <= '0';
+                       save_addr        <= '0'; -- gk 27.03.10
+                       addr_saved       <= '0'; -- gk 27.03.10
+                       add_sub_state    <= '0'; -- gk 29.03.10
+                       save_eod         <= '0'; -- gk 25.07.10
+               else
+                       saveCurrentState <= saveNextState;
+                       data_req         <= data_req_comb;
+                       rst_saved_ctr    <= rst_saved_ctr_comb;
+                       save_addr        <= save_addr_comb; -- gk 27.03.10
+                       addr_saved       <= addr_saved_comb; -- gk 27.03.10
+                       add_sub_state    <= add_sub_state_comb; -- gk 29.03.10
+                       save_eod         <= save_eod_comb; -- gk 25.07.10
+               end if;
+       end if;
+end process saveMachineProc;
+
+saveMachine: process( saveCurrentState, CTS_START_READOUT_IN, FEE_BUSY_IN, CTS_READ_IN)
+begin
+       saveNextState      <= SIDLE;
+       data_req_comb      <= '0';
+       rst_saved_ctr_comb <= '0';
+       save_addr_comb     <= '0'; -- gk 27.03.10
+       addr_saved_comb    <= '0'; -- gk 27.03.10
+       add_sub_state_comb <= '0'; -- gk 29.03.10
+       save_eod_comb      <= '0'; -- gk 25.07.10
+       case saveCurrentState is
+               when SIDLE =>
+                       state <= x"0";
+                       if (CTS_START_READOUT_IN = '1') then
+                               saveNextState <= SAVE_EVT_ADDR; --WAIT_FOR_DATA; -- gk 27.03.10
+                               data_req_comb <= '1';
+                               rst_saved_ctr_comb <= '1';
+                       else
+                               saveNextState <= SIDLE;
+                       end if;
+               -- gk 27.03.10
+               when SAVE_EVT_ADDR =>
+                       state <= x"5";
+                       saveNextState <= WAIT_FOR_DATA;
+                       data_req_comb <= '1';
+                       save_addr_comb <= '1';
+               when WAIT_FOR_DATA =>
+                       state <= x"1";
+                       if (FEE_BUSY_IN = '1') then
+                               saveNextState <= SAVE_DATA;
+                               data_req_comb <= '1';
+                       else
+                               saveNextState <= WAIT_FOR_DATA;
+                               data_req_comb <= '1';
+                       end if;
+                       addr_saved_comb <= '1';  -- gk 27.03.10
+               when SAVE_DATA =>
+                       state <= x"2";
+                       if (FEE_BUSY_IN = '0') then
+                               saveNextState <= TERMINATE;
+                       else
+                               saveNextState <= SAVE_DATA;
+                               data_req_comb <= '1';
+                       end if;
+               when TERMINATE =>
+                       state <= x"3";
+                       if (CTS_READ_IN = '1') then
+                               saveNextState <= SCLOSE;
+                       else
+                               saveNextState <= TERMINATE;
+                       end if;
+               when SCLOSE =>
+                       state <= x"4";
+                       if (CTS_START_READOUT_IN = '0') then
+                               saveNextState <= ADD_SUBSUB1; --SIDLE;  -- gk 29.03.10
+                       else
+                               saveNextState <= SCLOSE;
+                       end if;
+               -- gk 29.03.10 new states during which the subsub bytes are saved
+               when ADD_SUBSUB1 =>
+                       state <= x"6";
+                       saveNextState <= ADD_SUBSUB2;
+                       add_sub_state_comb <= '1';
+               when ADD_SUBSUB2 =>
+                       state<= x"7";
+                       saveNextState <= ADD_SUBSUB3;
+                       add_sub_state_comb <= '1';
+                       save_eod_comb <= '1';
+               when ADD_SUBSUB3 =>
+                       state<= x"8";
+                       saveNextState <= ADD_SUBSUB4;
+                       add_sub_state_comb <= '1';
+               when ADD_SUBSUB4 =>
+                       state<= x"9";
+                       saveNextState <= SIDLE;
+                       add_sub_state_comb <= '1';
+               when others =>
+                       state <= x"f";
+                       saveNextState <= SIDLE;
+       end case;
+end process saveMachine;
+
+-- gk 29.03.10
+ADD_SUB_CTR_PROC : process( CLK )
+begin
+       if( rising_edge( CLK ) ) then
+               if( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       add_sub_ctr <= (others => '0');
+               elsif( add_sub_state = '1' ) then
+                       add_sub_ctr <= add_sub_ctr + 1;
+               end if;
+       end if;
+end process ADD_SUB_CTR_PROC;
+
+--********
+-- SAVE INCOMING EVENT HEADERS
+--********
+
+-- Counter for header word storage
+THE_CTS_SAVED_CTR: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       saved_ctr <= (others => '0');
+               elsif( ce_saved_ctr = '1' ) then
+                       saved_ctr <= saved_ctr + 1;
+               end if;
+       end if;
+end process THE_CTS_SAVED_CTR;
+
+-- save triggerRnd from incoming data for cts response
+CTS_RND_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       cts_rnd       <= (others => '0');
+                       cts_rnd_saved <= '0';
+               elsif( (saved_ctr(2 downto 0) = b"000") and (sf_wr_en = '1') and (cts_rnd_saved = '0') ) then
+                       cts_rnd <= sf_data;
+                       cts_rnd_saved <= '1';
+               end if;
+       end if;
+end process CTS_RND_PROC;
+
+-- save triggerNr from incoming data for cts response
+CTS_TRG_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       cts_trg       <= (others => '0');
+                       cts_trg_saved <= '0';
+               elsif( (saved_ctr(2 downto 0) = b"001") and (sf_wr_en = '1') and (cts_trg_saved = '0') ) then
+                       cts_trg <= sf_data;
+                       cts_trg_saved <= '1';
+               end if;
+       end if;
+end process CTS_TRG_PROC;
+
+-- save size from incoming data for cts response (future) and to get rid of padding
+CTS_SIZE_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       cts_len       <= (others => '0');
+                       cts_len_saved <= '0';
+               elsif( (saved_ctr(2 downto 0) = b"010") and (sf_wr_en = '1') and (cts_len_saved = '0') ) then
+                       cts_len(16 downto 1) <= sf_data; -- change from 32b words to 16b words
+                       cts_len(0)           <= '0';
+               elsif( (saved_ctr(2 downto 0) = b"011") and (cts_len_saved = '0') ) then
+                       cts_len       <= cts_len + x"4";
+                       cts_len_saved <= '1';
+               end if;
+       end if;
+end process CTS_SIZE_PROC;
+
+-- gk 22.07.10
+CTS_ADDR_PROC : process(CLK)
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_saved_ctr = '1') ) then
+                       cts_addr       <= (others => '0');
+                       cts_addr_saved <= '0';
+               elsif( (saved_ctr(2 downto 0) = b"011") and (sf_wr_en = '1') and (cts_addr_saved = '0') ) then
+                       cts_addr       <= sf_data;
+                       cts_addr_saved <= '1';
+               end if;
+       end if;
+end process CTS_ADDR_PROC;
+
+--******
+-- SAVE FIRST EVENT HEADER VALUES
+--******
+
+-- gk 22.07.10
+FIRST_RUN_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       first_run_trg <= (others => '0');
+                       first_run_addr <= (others => '0');
+                       first_run_lock <= '0';
+               elsif (first_run_lock = '0') and (cts_addr_saved = '1') then
+                       first_run_trg <= cts_trg;
+                       first_run_addr <= cts_addr;
+                       first_run_lock <= '1';
+               -- important: value saved by saveMachine but incremented by loadMachine
+               elsif (first_run_lock = '1') and (inc_trg_ctr = '1') then
+                       first_run_trg <= first_run_trg + x"1";
+               end if;
+       end if;
+end process FIRST_RUN_PROC;
+
+-- gk 25.07.10
+SAVED_EVT_CTR_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       saved_events_ctr <= (others => '0');
+               elsif (save_eod = '1') then
+                       saved_events_ctr <= saved_events_ctr + x"1";
+               end if;
+       end if;
+end process SAVED_EVT_CTR_PROC;
+
+
+-- gk 20.07.10
+INC_DATA_CTR_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') or (rst_saved_ctr = '1') then
+                       inc_data_ctr <= (others => '0');
+               elsif (sf_wr_en = '1') and (data_req = '1') then
+                       inc_data_ctr(31 downto 1) <= inc_data_ctr(31 downto 1) + x"1";
+               end if;
+       end if;
+end process INC_DATA_CTR_proc;
+
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+
+-- Split FIFO
+THE_SPLIT_FIFO: fifo_32kx16x8_mb2
+port map( 
+       -- Byte swapping for correct byte order on readout side of FIFO
+       Data(7 downto 0)  => sf_data(15 downto 8),
+       Data(8)           => '0',
+       Data(16 downto 9) => sf_data(7 downto 0),
+       Data(17)          => save_eod,
+       WrClock         => CLK,
+       RdClock         => CLK,
+       WrEn            => sf_wr_en,
+       RdEn            => sf_rd_en,
+       Reset           => RESET,
+       RPReset         => RESET,
+       AmEmptyThresh   => b"0000_0000_0000_0010", -- one byte ahead
+       AmFullThresh    =>  b"111_1111_1110_1111", -- 0x7fef = 32751
+       Q(7 downto 0)   => pc_data,
+       Q(8)            => load_eod,
+       WCNT            => sf_wcnt,
+       RCNT            => sf_rcnt,
+       Empty           => sf_empty,
+       AlmostEmpty     => sf_aempty,
+       Full            => sf_full,
+       AlmostFull      => sf_afull
+);
+
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+
+-- gk 25.07.10
+EVENT_WAITING_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       event_waiting <= '0';
+               elsif (loaded_events_ctr /= saved_events_ctr) then
+                       event_waiting <= '1';
+               else
+                       event_waiting <= '0';
+               end if;
+       end if;
+end process EVENT_WAITING_PROC;
+
+-- write signal for PC data
+pc_wr_en_comb <= '1' when ((data_phase = '1') and (sf_rd_en = '1')) or
+                       (pad_phase = '1') or
+                       ((load_sub = '1') and (sf_rd_en = '1')) or
+                       ((drop_sub = '1') and (sf_rd_en = '1')) or
+                       ((drop_event = '1') and (sf_rd_en = '1'))
+                       else '0';
+
+sf_rd_en_comb <= '1' when ( (sf_aempty = '0') and (rem_phase = '1') and  (remove_done = '0') ) or
+                       --( (sf_aempty = '0') and (data_phase = '1') and (read_done = '0') ) or
+                       ( (sf_aempty = '0') and (data_phase = '1') and (load_eod = '0') ) or  -- gk 26.07.10
+                       ( (sf_aempty = '0') and (load_sub = '1') and (load_sub_done = '0') ) or -- gk 30.03.10
+                       ( (sf_aempty = '0') and (drop_event = '1') and (load_eod = '0') ) or
+                       ( (sf_aempty = '0') and (drop_sub = '1') and (load_sub_done = '0') )
+                       else '0';
+
+ce_rem_ctr_comb <= '1' when ( (sf_aempty = '0') and (rem_phase = '1') and ( remove_done = '0') )
+                       else '0';
+
+-- FIFO data delay process (also forces padding bytes to known value)
+THE_DATA_DELAY_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if( pad_data = '1' ) then
+                       pc_data_q <= x"aa"; -- padding for 64bit
+               -- gk 21.07.10
+               -- set the error flag if a broken packet is sent
+               elsif (drop_sub = '1') and (load_sub_ctr = x"3") then
+                       pc_data_q <= pc_data(7 downto 3) & '1' & pc_data(1 downto 0);
+               else
+                       pc_data_q   <= pc_data;
+               end if;
+       end if;
+end process THE_DATA_DELAY_PROC;
+
+-- Statemachine for reading the data payload from the SPLIT_FIFO and feeding
+-- it into the packet constructor
+loadMachineProc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       loadCurrentState <= LIDLE;
+                       rst_rem_ctr      <= '0';
+                       rem_phase        <= '0';
+                       calc_pad         <= '0';
+                       data_phase       <= '0';
+                       pad_phase        <= '0';
+                       pc_sos           <= '0';
+                       pc_eod           <= '0';
+                       rst_regs         <= '0';
+                       pad_data         <= '0';
+                       load_sub         <= '0'; -- gk 30.03.10
+                       drop_sub         <= '0'; -- gk 25.07.10
+                       drop_event       <= '0'; -- gk 25.07.10
+                       drop_small       <= '0'; -- gk 25.07.10
+                       drop_large       <= '0'; -- gk 25.07.10
+                       drop_headers     <= '0'; -- gk 25.07.10
+                       inc_trg_ctr      <= '0'; -- gk 26.07.10
+               else
+                       loadCurrentState <= loadNextState;
+                       rst_rem_ctr      <= rst_rem_ctr_comb;
+                       rem_phase        <= rem_phase_comb;
+                       calc_pad         <= calc_pad_comb;
+                       data_phase       <= data_phase_comb;
+                       pad_phase        <= pad_phase_comb;
+                       pc_sos           <= pc_sos_comb;
+                       pc_eod           <= pc_eod_comb;
+                       rst_regs         <= rst_regs_comb;
+                       pad_data         <= pad_data_comb;
+                       load_sub         <= load_sub_comb; -- gk 30.03.1
+                       drop_sub         <= drop_sub_comb;  -- gk 25.07.10
+                       drop_event       <= drop_event_comb;  -- gk 25.07.10
+                       drop_small       <= drop_small_comb;  -- gk 25.07.10
+                       drop_large       <= drop_large_comb; -- gk 25.07.10
+                       drop_headers     <= drop_headers_comb; -- gk 25.07.10
+                       inc_trg_ctr      <= inc_trg_ctr_comb; -- gk 26.07.10
+               end if;
+       end if;
+end process loadMachineProc;
+
+loadMachine : process( loadCurrentState, sf_aempty, remove_done, read_done, padding_needed, PC_READY_IN, load_sub_done, pc_sub_size, MIN_MESSAGE_SIZE_IN, MAX_MESSAGE_SIZE_IN, pc_trig_nr, first_run_trg, endpoint_addr, first_run_addr, load_eod, event_waiting)
+begin
+       loadNextState    <= LIDLE;
+       rst_rem_ctr_comb <= '0';
+       rem_phase_comb   <= '0';
+       calc_pad_comb    <= '0';
+       data_phase_comb  <= '0';
+       pad_phase_comb   <= '0';
+       pc_sos_comb      <= '0';
+       pc_eod_comb      <= '0';
+       rst_regs_comb    <= '0';
+       pad_data_comb    <= '0';
+       load_sub_comb    <= '0';  -- gk 30.03.10
+       drop_sub_comb    <= '0';  -- gk 25.07.10
+       drop_event_comb  <= '0';  -- gk 25.07.10
+       drop_small_comb  <= '0';  -- gk 25.07.10
+       drop_large_comb  <= '0';  -- gk 25.07.10
+       drop_headers_comb <= '0'; -- gk 25.07.10
+       inc_trg_ctr_comb <= '0';  -- gk 26.07.10
+       case loadCurrentState is
+               when LIDLE =>
+                       state2 <= x"0";
+                       -- gk 23.07.10
+                       if( (sf_aempty = '0') and (PC_READY_IN = '1') and (event_waiting = '1') ) then
+                               loadNextState <= INIT;
+                               rst_rem_ctr_comb <= '1';
+                               rst_regs_comb <= '1';
+                       else
+                               loadNextState <= LIDLE;
+                       end if;
+               when INIT =>
+                       state2 <= x"1";
+                       loadNextState <= REMOVE;
+                       rem_phase_comb <= '1';
+               when REMOVE =>
+                       state2 <= x"2";
+                       if( remove_done = '1' ) then
+                               loadNextState <= WAIT_TO_REMOVE;
+                               inc_trg_ctr_comb <= '1';
+                       else
+                               loadNextState <= REMOVE;
+                               rem_phase_comb <= '1';
+                       end if;
+               when WAIT_TO_REMOVE =>
+                       if (rem_ctr = x"a") then
+                               loadNextState <= DECIDE;
+                       else
+                               loadNextState <= WAIT_TO_REMOVE;
+                       end if;
+               when DECIDE =>
+                       if (pc_sub_size >= MAX_MESSAGE_SIZE_IN) then
+                               loadNextState <= PAUSE_BEFORE_DROP1;
+                               drop_large_comb <= '1';
+                       elsif (pc_sub_size <= MIN_MESSAGE_SIZE_IN) then
+                               loadNextState <= PAUSE_BEFORE_DROP1;
+                               drop_small_comb <= '1';
+                       elsif (pc_trig_nr + x"1" /= first_run_trg) then
+                               loadNextState <= PAUSE_BEFORE_DROP1;
+                               drop_headers_comb <= '1';
+                       elsif (endpoint_addr /= first_run_addr) then
+                               loadNextState <= PAUSE_BEFORE_DROP1;
+                               drop_headers_comb <= '1';
+                       else
+                               loadNextState <= CALCA;
+                       end if;
+                       calc_pad_comb <= '1';
+               when CALCA =>
+                       state2 <= x"3";
+                       loadNextState <= CALCB;
+                       pc_sos_comb <= '1';
+               when CALCB =>
+                       -- we need a branch in case of length "0"!!!!
+                       state2 <= x"4";
+                       loadNextState <= LOAD;
+                       data_phase_comb <= '1';
+               when LOAD =>
+                       state2 <= x"5";
+                       -- gk 31.03.10 after loading subevent data read the subsubevent from sf
+                       if (load_eod = '1') then
+                               loadNextState <= LOAD_SUBSUB;
+                       else
+                               loadNextState <= LOAD;
+                               data_phase_comb <= '1';
+                       end if;
+               -- gk 31.03.10
+               when LOAD_SUBSUB =>
+                       state2 <= x"d";
+                       if( load_sub_done = '1' ) then
+                               if( padding_needed = '0' ) then
+                                       loadNextState <= CALCC;
+                               else
+                                       loadNextState <= PAD0;
+                                       pad_phase_comb <= '1';
+                               end if;
+                       else
+                               loadNextState <= LOAD_SUBSUB;
+                               load_sub_comb <= '1';
+                       end if;
+               when PAD0 =>
+                       state2 <= x"6";
+                       loadNextState <= PAD1;
+                       pad_phase_comb <= '1';
+                       pad_data_comb <= '1';
+               when PAD1 =>
+                       state2 <= x"7";
+                       loadNextState <= PAD2;
+                       pad_phase_comb <= '1';
+                       pad_data_comb <= '1';
+               when PAD2 =>
+                       state2 <= x"8";
+                       loadNextState <= PAD3;
+                       pad_phase_comb <= '1';
+                       pad_data_comb <= '1';
+               when PAD3 =>
+                       state2 <= x"9";
+                       loadNextState <= CALCC;
+                       pad_data_comb <= '1';
+               when CALCC =>
+                       state2 <= x"a";
+                       loadNextState <= CLOSE;
+                       pc_eod_comb <= '1';
+               when CLOSE =>
+                       state2 <= x"b";
+                       loadNextState <= WAIT_PC;
+                       rst_regs_comb <= '1';
+               when WAIT_PC =>
+                       state2 <= x"c";
+                       if( PC_READY_IN = '1' ) then
+                               loadNextState <= LIDLE;
+                       else
+                               loadNextState <= WAIT_PC;
+                       end if;
+               when PAUSE_BEFORE_DROP1 =>
+                       loadNextState <= PAUSE_BEFORE_DROP2;
+                       pc_sos_comb <= '1';
+               when PAUSE_BEFORE_DROP2 =>
+                       loadNextState <= DROP;
+                       drop_event_comb <= '1';
+               -- gk 23.07.10
+               when DROP =>
+                       state2 <= x"e";
+                       -- when data is dropped the eod marker stands as its end
+                       if (load_eod = '1') then
+                               loadNextState <= DROP_SUBSUB;
+                       else
+                               loadNextState <= DROP;
+                               drop_event_comb <= '1';
+                       end if;
+               -- gk 25.07.10
+               when DROP_SUBSUB =>
+                       if (load_sub_done = '1') then
+                               if( padding_needed = '0' ) then
+                                       loadNextState <= CALCC;
+                               else
+                                       loadNextState <= PAD0;
+                                       pad_phase_comb <= '1';
+                               end if;
+                       else
+                               loadNextState <= DROP_SUBSUB;
+                               drop_sub_comb <= '1';
+                       end if;
+               when others =>
+                       state2 <= x"f";
+                       loadNextState <= LIDLE;
+       end case;
+end process loadMachine;
+
+-- gk 25.07.10
+INVALID_STATS_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       dropped_lr_events_ctr <= (others => '0');
+                       dropped_sm_events_ctr <= (others => '0');
+                       headers_invalid_ctr   <= (others => '0');
+                       dropped_ctr           <= (others => '0');
+                       invalid_hsize_ctr     <= (others => '0');
+               elsif (rst_regs = '1') then
+                       invalid_hsize_lock <= '0';
+               elsif (drop_small = '1') then
+                       dropped_sm_events_ctr <= dropped_sm_events_ctr + x"1";
+                       dropped_ctr <= dropped_ctr + x"1";
+               elsif (drop_large = '1') then
+                       dropped_lr_events_ctr <= dropped_lr_events_ctr + x"1";
+                       dropped_ctr <= dropped_ctr + x"1";
+               elsif (drop_headers = '1') then
+                       headers_invalid_ctr   <= headers_invalid_ctr + x"1";
+                       dropped_ctr <= dropped_ctr + x"1";
+               elsif (load_eod = '1') and (read_size /= x"3fffe") and (invalid_hsize_lock = '0') then
+                       invalid_hsize_ctr <= invalid_hsize_ctr + x"1";
+                       invalid_hsize_lock <= '1';
+               end if;
+       end if;
+end process INVALID_STATS_PROC;
+
+-- gk 26.04.10
+READOUT_CTR_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if ((RESET = '1') or (READOUT_CTR_VALID_IN = '1')) then
+                       readout_ctr <= READOUT_CTR_IN;
+                       readout_ctr_lock <= '0';
+               elsif (pc_sos = '1') then
+                       readout_ctr <= readout_ctr + x"1";
+               end if;
+       end if;
+end process READOUT_CTR_PROC;
+
+--******
+-- SELECTION OF EVENT BUILDER
+--******
+
+-- gk 27.03.10
+bank_select_proc : process( CLK )
+begin
+       if rising_edge( CLK ) then
+               -- gk 29.03.10
+               if( (RESET = '1') or (rst_regs = '1') ) then
+                       bank_select <= "0000";
+               -- gk 01.06.10 THERE WAS A BUG, IT SHOUDL BE TAKEN FROM SF_Q
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"2") ) then
+                       bank_select <= pc_data(3 downto 0); --CTS_INFORMATION_IN(3 downto 0);
+               end if;
+       end if;
+end process bank_select_proc;
+
+-- gk 29.03.10
+start_config_proc : process( CLK )
+begin
+       if rising_edge( CLK ) then
+               if( (RESET = '1') or (config_done = '1') or (rst_regs = '1') ) then
+                       start_config <= '0';
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"2") ) then  -- gk 01.06.10
+                       start_config <= '1';
+               end if;
+       end if;
+end process start_config_proc;
+
+
+--******
+-- LOAD SUBSUBEVENT
+--******
+
+-- gk 30.03.10
+load_sub_ctr_comb <= '1' when ( ((load_sub = '1') or (drop_sub = '1')) and (load_sub_done = '0') and (sf_aempty = '0') )
+                               else '0';
+
+-- gk 30.03.10
+LOAD_SUB_CTR_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_regs = '1') ) then  -- gk 08.04.10
+                       load_sub_ctr <= (others => '0');
+               elsif( (load_sub_ctr_comb = '1') ) then
+                       load_sub_ctr <= load_sub_ctr + 1;
+               end if;
+       end if;
+end process LOAD_SUB_CTR_PROC;
+
+-- gk 30.03.10
+-- load_sub_done_comb <= '1' when ((load_sub_ctr = x"7") and (drop_sub = '0')) or
+--                             ((load_sub_ctr = x"4") and (drop_sub = '1'))
+--                             else '0';
+load_sub_done_comb <= '1' when (load_sub_ctr = x"4") else '0';
+
+-- gk 30.03.10
+LOAD_SUB_DONE_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if ( (RESET = '1') or (rst_regs = '1') ) then  -- gk 08.04.10
+                       load_sub_done <= '0';
+               else
+                       load_sub_done <= load_sub_done_comb;
+               end if;
+       end if;
+end process LOAD_SUB_DONE_PROC;
+
+--******
+-- EXTRACT EVENT HEADERS FROM SPLITFIFO
+--******
+
+-- Counter for stripping the unneeded parts of the data stream, and saving the important parts
+THE_REMOVE_CTR: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_rem_ctr = '1') ) then
+                       rem_ctr <= (others => '0');
+               elsif( (ce_rem_ctr = '1') ) then
+                       rem_ctr <= rem_ctr + 1;
+               end if;
+       end if;
+end process THE_REMOVE_CTR;
+
+remove_done_comb <= '1' when ( rem_ctr = x"8" ) else '0'; --( rem_ctr = x"6" ) else '0';  -- gk 29.03.10 two more for evt builder address
+
+THE_REM_DONE_SYNC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_rem_ctr = '1') ) then
+                       remove_done <= '0';
+               else
+                       remove_done <= remove_done_comb;
+               end if;
+       end if;
+end process THE_REM_DONE_SYNC;
+
+-- gk 26.04.10
+TRIG_RANDOM_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if ((RESET = '1') or (rst_regs = '1')) then
+                       trig_random <= (others => '0');
+               elsif ((sf_rd_en = '1') and (rem_ctr = x"4")) then
+                       trig_random <= pc_data;
+               end if;
+       end if;
+end process TRIG_RANDOM_PROC;
+
+-- extract the trigger number from splitfifo data
+THE_TRG_NR_PROC: process( CLK )
+begin
+       if rising_edge(CLK) then
+               if   ( (RESET = '1') or (rst_regs = '1') ) then
+                       pc_trig_nr <= (others => '0');
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"6") ) then  -- x"4" gk 29.03.10
+                       pc_trig_nr(7 downto 0) <= pc_data;
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"5") ) then  -- x"3" gk 29.03.10
+                       pc_trig_nr(15 downto 8) <= pc_data;
+               end if;
+       end if;
+end process THE_TRG_NR_PROC;
+
+-- extract the subevent size from the splitfifo data, convert it from 32b to 8b units,
+-- and in case of padding needed increase it accordingly
+THE_SUB_SIZE_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_regs = '1') ) then
+                       pc_sub_size <= (others => '0');
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"8") ) then  -- x"6" gk 29.03.10
+                       pc_sub_size(9 downto 2) <= pc_data;
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"7") ) then  -- x"5" gk 29.03.10
+                       pc_sub_size(17 downto 10) <= pc_data;
+               -- gk 20.07.10
+               -- gk 30.03.10 bug fixed in the way that is written below
+               -- gk 27.03.10 should be corrected by sending padding_needed signal to pc and take care of it when setting sub_size_to_save
+               elsif( (calc_pad = '1') and (padding_needed = '1') ) then
+                       pc_sub_size <= pc_sub_size + x"4" + x"8"; -- BUG: SubEvtSize does NOT include 64bit padding!!!
+               elsif( (calc_pad = '1') and (padding_needed = '0') ) then
+                       pc_sub_size <= pc_sub_size + x"8";
+               end if;
+       end if;
+end process THE_SUB_SIZE_PROC;
+
+-- gk 25.07.10
+ENDP_ADDRESS_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') or (rst_regs = '1') then
+                       endpoint_addr <= (others => '0');
+                       endp_addr_lock <= '0';
+               elsif( (rem_ctr = x"a") and (endp_addr_lock = '0') ) then
+                       endpoint_addr(7 downto 0) <= pc_data;
+                       endp_addr_lock <= '1';
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"9") ) then
+                       endpoint_addr(15 downto 8) <= pc_data;
+                       endp_addr_lock <= '0';
+               end if;
+       end if;
+end process ENDP_ADDRESS_PROC;
+
+
+
+-- check for padding
+THE_PADDING_NEEDED_PROC: process( CLK )
+begin
+       if rising_edge(CLK) then
+               if   ( (RESET = '1') or (rst_regs = '1') ) then
+                       padding_needed <= '0';
+               elsif( (remove_done = '1') and (pc_sub_size(2) = '1') ) then
+                       padding_needed <= '1';
+               elsif( (remove_done = '1') and (pc_sub_size(2) = '0') ) then
+                       padding_needed <= '0';
+               end if;
+       end if;
+end process THE_PADDING_NEEDED_PROC;
+
+-- number of bytes to read from split fifo
+THE_READ_SIZE_PROC: process( CLK )
+begin
+       if( rising_edge(CLK) ) then
+               if   ( (RESET = '1') or (rst_regs = '1') ) then --(rst_rem_ctr = '1') ) then
+                       read_size   <= (others => '0');
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"8") ) then  -- x"6" gk 29.03.10
+                       read_size(9 downto 2) <= pc_data;
+               elsif( (sf_rd_en = '1') and (rem_ctr = x"7") ) then  -- x"5" gk 29.03.10
+                       read_size(17 downto 10) <= pc_data;
+               elsif( ((sf_rd_en = '1') and (data_phase = '1')) ) then
+                       read_size <= read_size - 1;
+               -- gk 25.07.10
+               elsif( ((sf_rd_en = '1') and (drop_event = '1')) ) then
+                       read_size <= read_size - 1;
+               end if;
+       end if;
+end process THE_READ_SIZE_PROC;
+
+read_done_comb <= '1' when (read_size < 3 ) else '0'; -- "2"
+
+--******
+-- EVENTS COUNTERS
+--******
+
+-- gk 25.07.10
+LOADED_EVT_CTR_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       loaded_events_ctr <= (others => '0');
+               elsif (remove_done = '1') then
+                       loaded_events_ctr <= loaded_events_ctr + x"1";
+               end if;
+       end if;
+end process LOADED_EVT_CTR_PROC;
+
+-- gk 25.07.10
+CONSTR_EVENTS_CTR_PROC : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       constr_events_ctr <= (others => '0');
+               elsif (pc_eod = '1') then
+                       constr_events_ctr <= constr_events_ctr + x"1";
+               end if;
+       end if;
+end process CONSTR_EVENTS_CTR_PROC;
+
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------
+
+-- Debug signals
+debug(0)              <= sf_full;
+debug(1)              <= sf_empty;
+debug(2)              <= sf_afull;
+debug(3)              <= sf_aempty;
+
+debug(7 downto  4)    <= state2;
+
+debug(11 downto 8)    <= state;
+
+dbg_bs_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if RESET = '1' then
+                       debug(15 downto 12) <= (others => '0');
+               elsif ( (sf_rd_en = '1') and (rem_ctr = x"3") ) then
+                       debug(15 downto 12) <= bank_select;
+               end if;
+       end if;
+end process dbg_bs_proc;
+
+debug(16)             <= config_done;
+debug(17)             <= remove_done;
+debug(18)             <= read_done;
+debug(19)             <= padding_needed;
+
+debug(20)             <= load_sub_done;
+
+dbg_cts_inf_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       debug(39 downto 32) <= (others => '0');
+               elsif ( save_addr = '1' ) then
+                       debug(39 downto 32) <= CTS_INFORMATION_IN;
+               end if;
+       end if;
+end process dbg_cts_inf_proc;
+
+debug(47 downto 40) <= (others => '0');
+
+
+debug(63 downto 48)   <= actual_message_size(15 downto 0);
+
+dbg_pc_sub_size_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       debug(81 downto 64) <= (others => '0');
+               elsif (pc_sos = '1') then
+                       debug(81 downto 64) <= pc_sub_size;
+               end if;
+       end if;
+end process dbg_pc_sub_size_proc;
+
+dbg_empty_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') or (rst_regs = '1') then
+                       debug(84 downto 82) <= (others => '0');
+               elsif (read_size = 2) then
+                       debug(82) <= sf_empty;
+               elsif (read_size = 1) then
+                       debug(83) <= sf_empty;
+               elsif (read_size = 0) then
+                       debug(84) <= sf_empty;
+               end if;
+       end if;
+end process dbg_empty_proc;
+
+debug(95 downto 85) <= (others => '0');
+
+dbg_inc_ctr_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       debug(127 downto 96) <= (others => '1');
+               elsif (saveCurrentState = SCLOSE) then
+                       debug(127 downto 96) <= inc_data_ctr;
+               end if;
+       end if;
+end process dbg_inc_ctr_proc;
+
+debug(143 downto 128) <= dropped_sm_events_ctr(15 downto 0);
+debug(159 downto 144) <= dropped_lr_events_ctr(15 downto 0);
+
+debug(175 downto 160) <= headers_invalid_ctr(15 downto 0);
+debug(191 downto 176) <= (others => '0');
+
+dbg_cts_q_proc : process(CLK)
+begin
+       if rising_edge(CLK) then
+               if (RESET = '1') then
+                       cts_len_q <= (others => '0');
+                       cts_rnd_q <= (others => '0');
+                       cts_trg_q <= (others => '0');
+                       cts_addr_q <= (others => '0');
+               elsif (cts_len_saved = '1') then
+                       cts_len_q <= cts_len(16 downto 1);
+                       cts_addr_q <= cts_addr;
+                       cts_rnd_q <= cts_rnd;
+                       cts_trg_q <= cts_trg;
+               end if;
+       end if;
+end process dbg_cts_q_proc;
+
+debug(207 downto 192) <= cts_trg_q;
+debug(223 downto 208) <= cts_rnd_q;
+debug(239 downto 224) <= cts_addr_q;
+debug(255 downto 240) <= cts_len_q;
+debug(271 downto 256) <= first_run_trg;
+debug(287 downto 272) <= first_run_addr;
+
+debug(303 downto 288) <= saved_events_ctr;
+debug(319 downto 304) <= loaded_events_ctr;
+
+debug(335 downto 320) <= constr_events_ctr(15 downto 0);
+debug(351 downto 336) <= dropped_ctr(15 downto 0);
+
+debug(367 downto 352) <= invalid_hsize_ctr;
+debug(383 downto 368) <= (others => '0');
+
+MONITOR_OUT(31 downto 0)    <= constr_events_ctr;
+MONITOR_OUT(63 downto 32)   <= dropped_ctr;
+MONITOR_OUT(95 downto 64)   <= headers_invalid_ctr;
+MONITOR_OUT(127 downto 96)  <= dropped_sm_events_ctr;
+MONITOR_OUT(159 downto 128) <= dropped_lr_events_ctr;
+MONITOR_OUT(191 downto 160) <= (others => '0');
+
+-- Outputs
+FEE_READ_OUT             <= fee_read;
+CTS_ERROR_PATTERN_OUT    <= cts_error_pattern;
+CTS_DATA_OUT             <= cts_data;
+CTS_DATAREADY_OUT        <= cts_dataready;
+CTS_READOUT_FINISHED_OUT <= cts_readout_finished;
+CTS_LENGTH_OUT           <= cts_length;
+
+PC_SOS_OUT               <= pc_sos;
+PC_EOD_OUT               <= pc_eod; -- gk 26.07.10 --pc_eod_q;
+PC_DATA_OUT              <= pc_data_q;
+PC_WR_EN_OUT             <= pc_wr_en_qq;
+
+PC_TRIG_NR_OUT           <= readout_ctr(23 downto 16) & pc_trig_nr & trig_random;
+
+PC_SUB_SIZE_OUT          <= b"0000_0000_0000_00" & pc_sub_size;
+PC_PADDING_OUT           <= padding_needed;
+
+DEBUG_OUT                <= debug;
+
 end architecture;
\ No newline at end of file
index 0557e7133b9628a5e2cde32d41138bb932de1811..4d50070b64a0158f726c875243b8f825a06fffef 100644 (file)
@@ -51,24 +51,8 @@ port(
        PC_SUB_SIZE_OUT             : out   std_logic_vector(31 downto 0);
        PC_TRIG_NR_OUT              : out   std_logic_vector(31 downto 0);
        PC_PADDING_OUT              : out   std_logic;
-       PC_SKIP_HEADERS_OUT         : out   std_logic;
-       PC_SKIP_TERM_OUT            : out   std_logic;
-       PC_DROP_EVENT_OUT           : out   std_logic;
-       -- Debug
-       BSM_SAVE_OUT                : out   std_logic_vector(3 downto 0);
-       BSM_LOAD_OUT                : out   std_logic_vector(3 downto 0);
-       DBG_REM_CTR_OUT             : out   std_logic_vector(3 downto 0);
-       DBG_CTS_CTR_OUT             : out   std_logic_vector(2 downto 0);
-       DBG_SF_WCNT_OUT             : out   std_logic_vector(15 downto 0);
-       DBG_SF_RCNT_OUT             : out   std_logic_vector(16 downto 0);
-       DBG_SF_DATA_OUT             : out   std_logic_vector(15 downto 0);
-       DBG_SF_RD_EN_OUT            : out   std_logic;
-       DBG_SF_WR_EN_OUT            : out   std_logic;
-       DBG_SF_EMPTY_OUT            : out   std_logic;
-       DBG_SF_AEMPTY_OUT           : out   std_logic;
-       DBG_SF_FULL_OUT             : out   std_logic;
-       DBG_SF_AFULL_OUT            : out   std_logic;
-       DEBUG_OUT                   : out   std_logic_vector(351 downto 0)
+       MONITOR_OUT                 : out   std_logic_vector(191 downto 0);
+       DEBUG_OUT                   : out   std_logic_vector(383 downto 0)
 );
 end component;
 
@@ -83,8 +67,6 @@ port(
        PC_START_OF_SUB_IN      : in    std_logic;
        PC_END_OF_DATA_IN       : in    std_logic;
        -- queue and subevent layer headers
-       PC_SKIP_HEADERS_IN      : in    std_logic;
-       PC_SKIP_TERM_IN         : in    std_logic;
        PC_SUB_SIZE_IN          : in    std_logic_vector(31 downto 0); -- store and swap
        PC_PADDING_IN           : in std_logic;  -- gk 29.03.10
        PC_DECODING_IN          : in    std_logic_vector(31 downto 0); -- swap
@@ -104,30 +86,6 @@ port(
        FC_FLAGS_OFFSET_OUT     : out   std_logic_vector(15 downto 0);
        FC_SOD_OUT              : out   std_logic;
        FC_EOD_OUT              : out   std_logic;
-       -- debug ports
-       BSM_CONSTR_OUT          : out   std_logic_vector(3 downto 0);
-       BSM_LOAD_OUT            : out   std_logic_vector(3 downto 0);
-       BSM_SAVE_OUT            : out   std_logic_vector(3 downto 0);
-       DBG_SHF_EMPTY           : out   std_logic;
-       DBG_SHF_FULL            : out   std_logic;
-       DBG_SHF_WR_EN           : out   std_logic;
-       DBG_SHF_RD_EN           : out   std_logic;
-       DBG_SHF_Q               : out   std_logic_vector(7 downto 0);
-       DBG_DF_EMPTY            : out   std_logic;
-       DBG_DF_FULL             : out   std_logic;
-       DBG_DF_WR_EN            : out   std_logic;
-       DBG_DF_RD_EN            : out   std_logic;
-       DBG_DF_Q                : out   std_logic_vector(7 downto 0);
-       DBG_ALL_CTR             : out   std_logic_vector(4 downto 0);
-       DBG_SUB_CTR             : out   std_logic_vector(4 downto 0);
-       DBG_MY_CTR              : out   std_logic_vector(1 downto 0);
-       DBG_BYTES_LOADED        : out   std_logic_vector(15 downto 0);
-       DBG_SIZE_LEFT           : out   std_logic_vector(31 downto 0);
-       DBG_SUB_SIZE_TO_SAVE    : out   std_logic_vector(31 downto 0);
-       DBG_SUB_SIZE_LOADED     : out   std_logic_vector(31 downto 0);
-       DBG_SUB_BYTES_LOADED    : out   std_logic_vector(31 downto 0);
-       DBG_QUEUE_SIZE          : out   std_logic_vector(31 downto 0);
-       DBG_ACT_QUEUE_SIZE      : out   std_logic_vector(31 downto 0);
        DEBUG_OUT               : out   std_logic_vector(63 downto 0)
 );
 end component;
@@ -281,6 +239,13 @@ port(
        GBE_READOUT_CTR_VALID_OUT : out std_logic;  -- gk 26.04.10
        GBE_DELAY_OUT             : out std_logic_vector(31 downto 0);
        GBE_ALLOW_LARGE_OUT       : out std_logic;
+       -- gk 28.07.10
+       MONITOR_BYTES_IN          : in std_logic_vector(31 downto 0);
+       MONITOR_SENT_IN           : in std_logic_vector(31 downto 0);
+       MONITOR_DROPPED_IN        : in std_logic_vector(31 downto 0);
+       MONITOR_SM_IN             : in std_logic_vector(31 downto 0);
+       MONITOR_LR_IN             : in std_logic_vector(31 downto 0);
+       MONITOR_HDR_IN            : in std_logic_vector(31 downto 0);
        -- gk 01.06.10
        DBG_IPU2GBE1_IN          : in std_logic_vector(31 downto 0);
        DBG_IPU2GBE2_IN          : in std_logic_vector(31 downto 0);
@@ -293,6 +258,7 @@ port(
        DBG_IPU2GBE9_IN          : in std_logic_vector(31 downto 0);
        DBG_IPU2GBE10_IN         : in std_logic_vector(31 downto 0);
        DBG_IPU2GBE11_IN         : in std_logic_vector(31 downto 0);
+       DBG_IPU2GBE12_IN         : in std_logic_vector(31 downto 0);
        DBG_PC1_IN               : in std_logic_vector(31 downto 0);
        DBG_PC2_IN               : in std_logic_vector(31 downto 0);
        DBG_FC1_IN               : in std_logic_vector(31 downto 0);