70 use IEEE.STD_LOGIC_1164.
ALL;
72 use IEEE.NUMERIC_STD.
ALL;
74 library TOB_rdout_lib;
83 hw_addr : in STD_LOGIC_VECTOR(1 downto 0) ;
136 type FPGA_mapping_array is array(3 downto 0) of std_logic_vector(1 downto 0);
137 constant FPGA_mapping : FPGA_mapping_array := ("10", "01", "11", "00") ;
138 constant LO_almost_full_value : unsigned := X"1FF0" ;
139 signal RAW_out_valid_i : std_logic ;
140 signal RAW_rdout_fifo_rd_en_i : t_49_arr_1b ;
141 signal BCN_fifo_rd_en_out_i : std_logic;
143 signal rec_err_flg_4b_i : STD_LOGIC_VECTOR (3 downto 0) ;
144 signal rd_on_err_en_i : std_logic ;
145 signal BCN_in_i : STD_LOGIC_VECTOR (11 downto 0) ;
146 signal valid_BCN_i : STD_LOGIC ;
147 signal L1A_ID_in_i : STD_LOGIC_VECTOR (23 downto 0) ;
148 signal L1A_ID_EXT_in_i : STD_LOGIC_VECTOR (7 downto 0) ;
151 signal FIFO_RAW_Data_prog_full_i : STD_LOGIC;
152 signal ORed_err_flg_i : STD_LOGIC;
153 signal mgt_disable_i : STD_LOGIC;
154 signal RAW_out_i : STD_LOGIC_VECTOR(31 downto 0) ;
156 signal RAW_out_is_char_i : std_logic ;
158 signal CLK_280M_i : std_logic ;
159 signal RST_i : std_logic ;
161 signal payld_cntr_rst : std_logic ;
162 signal payld_cntr_rst_i : std_logic ;
163 signal payld_cntr_en : std_logic ;
164 signal raw_payld_cntr_i : std_logic_vector(11 downto 0) ;
166 signal frame_cntr_en_i : std_logic ;
167 signal write_in_LO_FIFO_i : std_logic ;
169 signal RAW_in_i : DPR_RAW_out_36_type ;
170 signal RAW_in_tmp : DPR_RAW_out_36_type ;
171 signal RAW_in_valid_i : t_49_arr_1b ;
172 signal RAW_in_valid_tmp : t_49_arr_1b ;
174 signal opt_link_num_i : std_logic_vector(7 downto 0) := "00000000" ;
175 signal fpga_num_i : std_logic_vector(1 downto 0) := "00" ;
176 signal raw_rd_all_in_i : std_logic ;
177 signal safe_mode_i : std_logic ;
178 signal BCN_FIFO_empty_i : std_logic ;
179 signal link_err_FIFO_empty_i : std_logic ;
180 signal BCN_FIFO_prog_full_in_i : std_logic ;
183 signal links_err_4b_in_i : std_logic_vector(3 downto 0);
184 signal channel_error_map_i : STD_LOGIC_VECTOR (48 downto 0);
185 signal channel_error_rdout_i : STD_LOGIC_VECTOR (48 downto 0);
188 idle, wait_1, wait_2, wait_3, wait_4, wait_5, wait_6, wait_7, wait_8,
189 start, pause, hdr_sel, err_sop, err_eop, BCN_wait,
190 norm_sop_1, norm_sop_2, norm_tlr, norm_eop,
191 rd_bcn_fifo, empty_raw_fifo,
192 rdout_raw_1, rdout_raw_2, rdout_raw_3, rdout_raw_4, rdout_raw_5, rdout_raw_6, rdout_raw_7,
196 SIGNAL current_state : STATE_TYPE;
197 signal i : integer range 0 to 50;
198 signal ii : integer range 0 to 8;
201 attribute keep : string ;
202 attribute max_fanout : integer;
204 attribute keep of RAW_out_valid_i : signal is "true" ;
205 attribute max_fanout of RAW_out_valid_i : signal is 30;
206 attribute keep of rd_on_err_en_i : signal is "true" ;
207 attribute max_fanout of rd_on_err_en_i : signal is 30;
208 attribute keep of RAW_in_i : signal is "true" ;
209 attribute max_fanout of RAW_in_i : signal is 30;
210 attribute keep of RAW_rdout_fifo_rd_en_i : signal is "true" ;
211 attribute max_fanout of RAW_rdout_fifo_rd_en_i : signal is 30;
216 attribute keep of raw_rd_all_in_i : signal is "true" ;
217 attribute max_fanout of raw_rd_all_in_i : signal is 30;
218 attribute keep of safe_mode_i : signal is "true" ;
219 attribute max_fanout of safe_mode_i : signal is 30;
220 attribute keep of i : signal is "true" ;
221 attribute max_fanout of i : signal is 30;
222 attribute keep of ii : signal is "true" ;
223 attribute max_fanout of ii : signal is 30;
229 CLK_280M_i <= CLK_280M_in ;
240 payld_cntr_rst <= RST_i OR payld_cntr_rst_i;
254 CE => payld_cntr_en ,
256 RST => payld_cntr_rst,
257 Q => raw_payld_cntr_i
262 U3A_proc1 :
process (CLK_280M_i)
264 if rising_edge (CLK_280M_i) then
267 write_in_LO_FIFO_i <= '1';
269 write_in_LO_FIFO_i <= '0' ;
278 U4_rd_fsm :
process (CLK_280M_i)
280 if CLK_280M_i'event and CLK_280M_i = '1' then
302 RAW_in_i <= RAW_in_tmp;
303 RAW_in_valid_i <= RAW_in_valid_tmp;
306 current_state <= idle ;
307 RAW_out_i <= (others => '0') ;
310 CASE current_state is
312 payld_cntr_rst_i <= '0' ;
313 frame_cntr_en_i <= '0' ;
314 RAW_rdout_fifo_rd_en_i <= (others => '0') ;
315 BCN_fifo_rd_en_out_i <= '0' ;
316 payld_cntr_en <= '0' ;
317 RAW_out_valid_i <= '0' ;
318 RAW_out_is_char_i <= '0' ;
321 rd_on_err_en_i <= '0' ;
322 rec_err_flg_4b_i <= (others => '0') ;
323 current_state <= idle ;
325 if (write_in_LO_FIFO_i = '1' ) then
326 if (BCN_FIFO_empty_i = '0') AND (link_err_FIFO_empty_i = '0') then
329 current_state <= idle ;
330 BCN_fifo_rd_en_out_i <= '0';
331 RAW_out_valid_i <= '0' ;
333 if (BCN_FIFO_prog_full_in_i = '1') then
335 RAW_rdout_fifo_rd_en_i <= '1' & X"FFFFFFFFFFFF" ;
336 BCN_fifo_rd_en_out_i <= '1';
337 RAW_out_valid_i <= '0' ;
338 current_state <= norm_sop_1 ;
340 BCN_fifo_rd_en_out_i <= '1' ;
341 RAW_out_valid_i <= '0' ;
343 current_state <= rd_bcn_fifo ;
350 RAW_rdout_fifo_rd_en_i <= (others => '0') ;
351 BCN_fifo_rd_en_out_i <= '0' ;
352 RAW_out_valid_i <= '0' ;
353 current_state <= rd_bcn_fifo ;
355 if valid_BCN_i = '1' then
356 if (raw_rd_all_in_i = '1' ) then
357 current_state <= norm_sop_1 ;
359 if (BCN_FIFO_prog_full_in_i = '1' OR ORed_err_flg_i = '0') then
360 RAW_rdout_fifo_rd_en_i <= '1' & X"FFFFFFFFFFFF" ;
362 current_state <= norm_sop_1 ;
364 current_state <= norm_sop_1 ;
381 BCN_fifo_rd_en_out_i <= '0' ;
382 RAW_out_i <= X"000" & BCN_in_i & ch_sop2 ;
383 RAW_out_is_char_i <= '1';
384 RAW_out_valid_i <= '1' ;
385 current_state <= norm_sop_2 ;
387 if ( safe_mode_i = '1' ) then
388 RAW_rdout_fifo_rd_en_i <= '1' & X"FFFFFFFFFFFF" ;
390 RAW_rdout_fifo_rd_en_i <= (others => '0') ;
394 RAW_out_i <= L1A_ID_EXT_in_i & L1A_ID_in_i ;
395 RAW_out_is_char_i <= '0';
396 RAW_out_valid_i <= '1' ;
398 if ( safe_mode_i = '1' ) then
399 RAW_rdout_fifo_rd_en_i <= '1' & X"FFFFFFFFFFFF" ;
400 current_state <= empty_raw_fifo ;
402 current_state <= wait_1;
403 RAW_rdout_fifo_rd_en_i(i) <= '1' ;
406 when empty_raw_fifo =>
407 RAW_out_valid_i <= '0' ;
410 RAW_rdout_fifo_rd_en_i <= (others => '0') ;
412 if (ORed_err_flg_i = '0' ) then
414 current_state <= sub_trl_1 ;
416 current_state <= norm_eop ;
419 RAW_rdout_fifo_rd_en_i <= '1' & X"FFFFFFFFFFFF" ;
420 current_state <= empty_raw_fifo ;
425 fpga_num_i <= FPGA_mapping(to_integer(unsigned(hw_addr)));
426 opt_link_num_i <= std_logic_vector(to_unsigned(i,8)) ;
427 payld_cntr_en <= '0';
428 RAW_out_valid_i <= '0';
429 current_state <= wait_2 ;
433 payld_cntr_en <= '0';
434 RAW_out_valid_i <= '0';
435 current_state <= wait_3 ;
438 payld_cntr_en <= '0';
439 RAW_out_valid_i <= '0';
440 current_state <= wait_4 ;
443 RAW_rdout_fifo_rd_en_i(i) <= '1' ;
445 payld_cntr_en <= (RAW_in_valid_i(i) AND (raw_rd_all_in_i OR channel_error_rdout_i(i) )) ;
447 RAW_out_valid_i <= (RAW_in_valid_i(i) AND (raw_rd_all_in_i OR channel_error_rdout_i(i) )) ;
448 RAW_out_i <= RAW_in_i(i)(31 downto 0);
449 rd_on_err_en_i <= channel_error_rdout_i(i);
451 current_state <= rdout_raw_2 ;
454 RAW_out_i <= RAW_in_i(i)(31 downto 0);
456 RAW_out_valid_i <= ( RAW_in_valid_i(i) AND (raw_rd_all_in_i OR rd_on_err_en_i) );
458 payld_cntr_en <= ( RAW_in_valid_i(i) AND (raw_rd_all_in_i OR rd_on_err_en_i) );
462 current_state <= rdout_raw_3 ;
464 RAW_rdout_fifo_rd_en_i(i) <= '0' ;
465 rec_err_flg_4b_i <= RAW_in_i(i)(35 downto 32) ;
468 RAW_rdout_fifo_rd_en_i(i) <= '0' ;
469 current_state <= rdout_raw_2 ;
473 RAW_rdout_fifo_rd_en_i(i) <= '1' ;
480 payld_cntr_en <= (raw_rd_all_in_i OR rd_on_err_en_i) ;
482 RAW_out_i <= mgt_disable_i & rec_err_flg_4b_i(2 downto 0) & "00" & X"0000" & fpga_num_i & opt_link_num_i;
483 RAW_out_valid_i <= (raw_rd_all_in_i OR rd_on_err_en_i) ;
487 current_state <= sub_trl_1 ;
489 current_state <= wait_1 ;
491 RAW_rdout_fifo_rd_en_i(i) <= '1' ;
495 payld_cntr_en <= '1' ;
496 RAW_out_i <= channel_error_map_i(31 downto 0);
497 RAW_out_valid_i <= '1';
498 current_state <= sub_trl_2 ;
502 payld_cntr_en <= '1' ;
504 RAW_out_i <= ORed_err_flg_i & links_err_4b_in_i(2 downto 0) & raw_rd_all_in_i & "0000000000" & channel_error_map_i(48 downto 32);
505 RAW_out_valid_i <= '1';
506 current_state <= wait_5 ;
509 payld_cntr_en <= '0' ;
510 RAW_out_valid_i <= '0' ;
511 current_state <= norm_eop ;
514 payld_cntr_rst_i <= '1' ;
515 RAW_out_is_char_i <= '1';
516 RAW_out_i <= safe_mode_i & "000" & X"00" & raw_payld_cntr_i(11 downto 0) & ch_eop ;
517 RAW_out_valid_i <= '1' ;
519 current_state <= wait_6 ;
522 payld_cntr_rst_i <= '0' ;
523 RAW_out_is_char_i <= '0';
524 RAW_out_valid_i <= '0' ;
525 current_state <= wait_7 ;
528 frame_cntr_en_i <= '1' ;
529 current_state <= idle ;
Generic Counter for process FPGA.
in CLK STD_LOGIC
Clock signal input.
in CE STD_LOGIC
Enable signal input.
out Q STD_LOGIC_VECTOR( width- 1 downto 0)
Counter Output signal.
in RST STD_LOGIC
Reset signal input.
FSM to write RAW calolimeter data to Link Output FIFO for process FPGA.
FSM to write RAW calolimeter data to Link Output FIFO for process FPGA.
out raw_data_mux_fsm STD_LOGIC_VECTOR( 7 downto 0)
Monitor state machine status register.
out RAW_rdout_fifo_rd_en_out t_49_arr_1b
read enable signal to all RAW data FIFOs
in raw_rd_all_in STD_LOGIC
readout all raw data links
in bcn_fifo_47b_in STD_LOGIC_VECTOR( 46 downto 0)
BCN fifo data 47b = 1b FIFO_RAW_Data_prog_full_i + 0 + 1b Privilege Read + 12b BCN_ID_in + 32b L1A_ID...
in BCN_FIFO_prog_full_in STD_LOGIC
BCN & L1A FIFO prog full flag.
in FIFO_error_flags_54b STD_LOGIC_VECTOR( 53 downto 0)
Link Error FIFO = ZERO + 1-b request RAW data on error + ORed 3-bit link error + 49-bit channel error...
out BCN_fifo_rd_en_out STD_LOGIC
read enable signal to BCN & L1A FIFOs
in BCN_FIFO_empty STD_LOGIC
FIFO empty flag from BCN L1A FIFO.
out RAW_safe_mode_out STD_LOGIC
Safe Mode operation flag for RAW readout.
in mgt_enable_in STD_LOGIC_VECTOR( 48 downto 0)
MGT enable signals - use to enable readout on error.
in LO_FIFO_data_count_in STD_LOGIC_VECTOR( 12 downto 0)
Link Output FIFO data count.
out RAW_out_valid STD_LOGIC
RAW data valid signal to Link_outpout_FIFO.
in valid_RAW_in t_49_arr_1b
RAW data valid signal.
in RAW_FIFO_prog_full_in std_logic
RAW Input FIFO partial FULL flag.
in link_err_FIFO_empty STD_LOGIC
FIFO empty flag from link error FIFO.
in valid_BCN_in std_logic
RAW data valid signal.
in rdout_RAW_36b_in DPR_RAW_out_36_type
raw data 36b = 4b+32b ERR+RAW
in hw_addr STD_LOGIC_VECTOR( 1 downto 0)
FPGA Hardware Address.
in LO_FIFO_prog_full_in std_logic
Link Output FIFO partial FULL flag to receive RAW calorimeter data.
out RAW_out STD_LOGIC_VECTOR( 31 downto 0)
RAW data 32b to Link_outpout_FIFO.
out RAW_out_is_char STD_LOGIC
RAW data is CHAR signal to Link_outpout_FIFO.
out frame_cntr_en STD_LOGIC
Comp;leted frame counter enable.
in clk_280M_in STD_LOGIC
fabric 280MHz clock