source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/data_generator.vhd @ 10502

Last change on this file since 10502 was 10502, checked in by neise, 9 years ago
soft & hardware trigger getrennt
File size: 16.8 KB
Line 
1--
2-- VHDL Architecture FACT_FAD_lib.data_generator.beha
3--
4-- Created:
5--          by - FPGA_Developer.UNKNOWN (EEPC8)
6--          at - 14:36:14 10.02.2010
7--
8-- using Mentor Graphics HDL Designer(TM) 2008.1 (Build 17)
9
10library IEEE;
11use IEEE.STD_LOGIC_1164.ALL;
12use IEEE.STD_LOGIC_ARITH.ALL;
13use IEEE.STD_LOGIC_UNSIGNED.ALL;
14library fact_fad_lib;
15use fact_fad_lib.fad_definitions.all;
16
17-- -- Uncomment the following library declaration if instantiating
18-- -- any Xilinx primitives in this code.
19-- library UNISIM;
20-- use UNISIM.VComponents.all;
21
22entity data_generator is
23generic(
24        RAM_ADDR_WIDTH : integer := 12
25);
26port( 
27        clk                                             : in    std_logic;                                      -- CLK_25.
28        data_out                                : out   std_logic_vector (63 downto 0);
29        addr_out                                : out   std_logic_vector (RAM_ADDR_WIDTH-1 downto 0);
30        dataRAM_write_ea_o              : out   std_logic_vector (0 downto 0) := "0";
31        ram_start_addr                  : in    std_logic_vector (RAM_ADDR_WIDTH-1 downto 0);
32        ram_write_ea                    : in    std_logic;
33        ram_write_ready                 : out   std_logic := '0';
34        ram_write_ready_ack             : IN    std_logic;
35       
36        roi_array                               : in    roi_array_type;
37        roi_max                                 : in    roi_max_type;
38        sensor_array                    : in    sensor_array_type;
39        sensor_ready                    : in    std_logic;
40        dac_array                               : in    dac_array_type;
41       
42        config_start                    : in    std_logic;
43        config_done                             : out   std_logic := '0';
44       
45-- EVT HEADER - part 1
46        package_length                  : in    std_logic_vector (15 downto 0);
47        pll_lock                                : in    std_logic_vector ( 3 downto 0);
48        dwrite_enable_in                : in    std_logic;
49        denable_enable_in               : in    std_logic;
50
51-- EVT HEADER - part 2  --> FTM trigger informaton, comes in late ...
52-- during EVT header wrinting, this field is left out ... and only written into event header,
53-- when the DRS chip were read out already.
54        FTM_RS485_ready                 : in    std_logic;
55        FTM_trigger_info                : in    std_logic_vector (55 downto 0); --7 byte
56        FTM_receiver_status : in std_logic;
57
58-- EVT HEADER - part 3
59        fad_event_counter               : in    std_logic_vector (31 downto 0);
60        refclk_counter                  : in    std_logic_vector (11 downto 0);
61        refclk_too_high                 : in    std_logic;
62        refclk_too_low                  : in    std_logic;
63
64-- EVT HEADER - part 4
65        board_id                                : in    std_logic_vector (3 downto 0);
66        crate_id                                : in    std_logic_vector (1 downto 0);
67        DCM_PS_status                   : in    std_logic_vector (7 downto 0);
68        DCM_locked_status               : in    std_logic;
69        DCM_ready_status                : in    std_logic;
70        SPI_SCLK_enable_status  : in    std_logic;
71        TRG_GEN_div                             : in    std_logic_vector (15 downto 0);
72
73-- EVT HEADER - part 5
74        dna                                             : in    std_logic_vector (63 downto 0);
75
76-- EVT HEADER - part 6
77        runnumber                               : in    std_logic_vector (31 downto 0); 
78        timer_value                             : in    std_logic_vector (31 downto 0); -- time in units of 100us
79
80        hardware_trigger_in             : in    std_logic;
81        software_trigger_in             : in    std_logic;
82       
83        adc_data_array                  : in    adc_data_array_type;
84        adc_output_enable_inverted                                      : out   std_logic := '1';
85        adc_clk_en                              : out   std_logic := '0';
86        adc_otr                                 : in    std_logic_vector (3 downto 0);
87        drs_channel_id                  : out   std_logic_vector (3 downto 0) := (others => '0');
88
89--drs_dwrite : out std_logic := '1';
90        drs_readout_ready               : out   std_logic := '0';
91        drs_readout_ready_ack   : in    std_logic;
92        drs_clk_en                              : out   std_logic := '0';
93        start_read_drs_stop_cell: out   std_logic := '0';
94
95        drs_srin_write_8b               : out   std_logic := '0';
96        drs_srin_write_ack              : in    std_logic;
97        drs_srin_data                   : out   std_logic_vector (7 downto 0) := (others => '0');
98        drs_srin_write_ready    : in    std_logic;
99
100        drs_read_s_cell_ready   : in    std_logic;
101        drs_s_cell_array                : in    drs_s_cell_array_type;
102
103        drs_readout_started             : out   std_logic := '0';
104        trigger_veto : out std_logic := '1'
105);
106end data_generator ;
107
108architecture Behavioral of data_generator is
109
110type state_generate_type is (
111        CONFIG,         -- IDLE branches into this state, if needed.
112        CONFIG_DRS_01,                  -- these four states configure the DRS shift registers,
113        CONFIG_DRS_02,                  -- the make great use of the drs_pulser entity.
114        CONFIG_DRS_03,                  -- maybe they should be moved into the drs_pulser entity.
115        WAIT_FOR_DRS_CONFIG_READY,
116
117        IDLE,
118        WRITE_HEADER, WRITE_FTM_INFO, WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER, WRITE_BOARD_ID,
119        WRITE_DNA, WRITE_TIMER, WRITE_TEMPERATURES, 
120        WRITE_DAC1, WRITE_DAC2,
121        WAIT_FOR_STOP_CELL,
122        START_DRS_READING,
123        WRITE_CHANNEL_ID, WRITE_START_CELL, WRITE_ROI, WRITE_FILLING,
124        WAIT_FOR_ADC, WRITE_ADC_DATA,
125        WAIT_FOR_EXTERNAL_TRIGGER_READY, WRITE_EXTERNAL_TRIGGER,
126        WRITE_END_FLAG,
127        WRITE_DATA_END, WRITE_DATA_END_WAIT,
128        WRITE_DATA_STOP, WRITE_DATA_STOP1
129);
130
131-- configuration stuff:
132                -- this flag is set, when ever a rising edge on 'config_start' is detected.
133                -- this flag is cleared only, when a configuration was successfully processed
134signal config_start_sig : std_logic := '0';
135
136
137signal state_generate : state_generate_type := CONFIG;
138signal start_addr : std_logic_vector (RAM_ADDR_WIDTH-1 downto 0) := (others => '0');
139
140signal data_cntr : integer  range 0 to 1024 := 0;
141signal addr_cntr : integer range 0 to RAM_SIZE_64B := 0;    -- counts 64 bit words
142signal channel_id : integer range 0 to 9 := 0;
143signal adc_wait_cnt : integer range 0 to 7 := 0;
144
145signal hardware_trigger_sr :std_logic_vector(1 downto 0) := "00";
146signal software_trigger_sr :std_logic_vector(1 downto 0) := "00";
147
148signal ram_write_ea_flag : std_logic := '0';
149signal new_config_int : std_logic := '0';
150
151-- internal signal: to be sampled once and used instead of inputs!
152signal roi_max_int : roi_max_type;
153signal package_length_sig : std_logic_vector (15 downto 0);
154signal sig_drs_readout_started : std_logic := '0';
155
156signal FTM_trigger_info_local_copy : std_logic_vector (55 downto 0) := (others => '0'); --7 byte
157signal runnumber_local_copy : std_logic_vector (31 downto 0);
158
159-- self configuration signals:
160signal internal_roi_array : roi_array_type;
161signal internal_roi_max : roi_max_type;
162
163begin
164drs_readout_started <= sig_drs_readout_started;
165generate_data : process (clk)
166begin
167        if rising_edge (clk) then
168
169                if (config_start = '1') then
170                        config_start_sig <= '1';
171                        config_done <= '0';
172                end if;
173                hardware_trigger_sr <= hardware_trigger_sr(0) & hardware_trigger_in; --synching in of asynchrounous trigger signal.
174                software_trigger_sr <= software_trigger_sr(0) & software_trigger_in; --synching in of asynchrounous trigger signal.
175                addr_out <= start_addr + conv_std_logic_vector(addr_cntr, RAM_ADDR_WIDTH);
176               
177                case state_generate is
178               
179               
180                when CONFIG =>
181                        internal_roi_array <= roi_array;
182                        package_length_sig <= package_length;
183                        internal_roi_max <= roi_max;
184                        state_generate <= CONFIG_DRS_01;
185                -- configure DRS
186                -- all this might be done in the drs_pulser entity
187                when CONFIG_DRS_01 =>                                                   -- BEGIN CONFIG DRS
188                        drs_channel_id <= DRS_WRITE_SHIFT_REG;
189                        drs_srin_data <= "11111111";
190                        drs_srin_write_8b <= '1';
191                        if (drs_srin_write_ack = '1') then
192                                drs_srin_write_8b <= '0';
193                                state_generate <= CONFIG_DRS_02;
194                        end if;
195                when CONFIG_DRS_02 =>
196                        if (drs_srin_write_ready = '1') then
197                                state_generate <= CONFIG_DRS_03;
198                        end if;
199                when CONFIG_DRS_03 =>
200                        drs_channel_id <= DRS_WRITE_CONFIG_REG;
201                        drs_srin_data <= "11111111";
202                        drs_srin_write_8b <= '1';
203                        if (drs_srin_write_ack = '1') then
204                                drs_srin_write_8b <= '0';
205                                state_generate <= WAIT_FOR_DRS_CONFIG_READY;
206                        end if;
207                       
208                -- last state of CONFIG:
209                        -- here the input roi_max is sampled
210                        -- all other interesting input signals should be sampled here as well!
211                when WAIT_FOR_DRS_CONFIG_READY =>                                                       -- END OF CONFIG
212                        if (drs_srin_write_ready = '1') then
213                                drs_channel_id <= DRS_ADDR_IDLE; -- to make sure not to write accidentally into DRS shift registers
214                                roi_max_int <= internal_roi_max;
215                                config_done <= '1';
216                                state_generate <= IDLE;
217                        end if;
218                        -- end configure DRS
219               
220
221                when IDLE =>
222                        state_generate <= IDLE;
223                        trigger_veto <= '0';
224                        if (config_start_sig = '1') then
225                                config_start_sig <= '0';
226                                state_generate <= CONFIG;
227                        end if;
228                       
229                        if (ram_write_ea = '1' and ( hardware_trigger_sr = "01" or software_trigger_sr = "01") ) then
230                                sig_drs_readout_started <= '1'; -- is set to '0' in next state ... just a pulse.
231                                runnumber_local_copy <= runnumber;
232                                trigger_veto <= '1';
233                                start_read_drs_stop_cell <= '1';
234                                adc_output_enable_inverted <= '0';
235                                -- at this moment the ADC ist beeing clocked.
236                                -- this is not the start of the readout.
237                                -- the DRS needs to be clocked as well.
238                                adc_clk_en <= '1';
239                                start_addr <= ram_start_addr;
240                                state_generate <= WRITE_HEADER;
241                        end if;
242
243                       
244                when WRITE_HEADER =>
245                        sig_drs_readout_started <= '0'; -- is set to '1' in state IDLE
246                        dataRAM_write_ea_o <= "1";
247                        data_out <= 
248                                -- the first word contains a lot of single status bits.
249                                        pll_lock &                              -- 4 bits
250                                        denable_enable_in &     -- 1 bit
251                                        dwrite_enable_in &      -- 1 bit
252                                        refclk_too_high &               -- 1 bit
253                                        refclk_too_low &                -- 1 bit
254                                        DCM_locked_status &     -- 1 bit
255                                        DCM_ready_status &              -- 1 bit
256                                        SPI_SCLK_enable_status &-- 1 bit
257                                        conv_std_logic_vector(0,5) &
258                                PACKAGE_VERSION & PACKAGE_SUB_VERSION & 
259                                package_length_sig & 
260                                X"FB01";
261                        addr_cntr <= addr_cntr + 1; 
262                        state_generate <= WRITE_FTM_INFO;
263                                       
264                when WRITE_FTM_INFO =>
265                        -- THIS is just a dummy STATE just to make reading easier.
266                        -- at this point normally the FTM RS485 data would be written .. but we do not know it
267                        -- so here we do not write the FTM info ... just jump over it.
268                        addr_cntr <= addr_cntr + 1; 
269                        state_generate <= WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER;
270                                       
271                when WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER =>
272                        data_out <= 
273                                        "0000" & refclk_counter & 
274                                        X"0000" &
275                                        fad_event_counter(15 downto 0) & 
276                                        fad_event_counter(31 downto 16) ;
277                        addr_cntr <= addr_cntr + 1;
278                        state_generate <= WRITE_BOARD_ID;
279                       
280                when WRITE_BOARD_ID =>     
281                        data_out <= TRG_GEN_div &                                                       -- this is a kind of prescaler for the continouus trigger generator
282                                                X"0000" &                                                               -- this might be the number of soft triggers beeing generated in a 'burst' not implemented yet
283                                                X"00" & DCM_PS_status &                                 -- number of steps, the phase shifter was shifted...
284                                                "000000" & crate_id & "0000" & board_id;                        -- position of the board inside the camera
285                        addr_cntr <= addr_cntr + 1;
286                        state_generate <= WRITE_DNA;
287
288                when WRITE_DNA =>
289                        data_out <=                             
290                                dna(55 downto 48) & dna(63 downto 56) &
291                                dna(39 downto 32) & dna(47 downto 40) &
292                                dna(23 downto 16) & dna(31 downto 24) &
293                                dna(7 downto 0) & dna(15 downto 8);
294                        addr_cntr <= addr_cntr + 1;
295                        state_generate <= WRITE_TIMER;
296
297                when WRITE_TIMER =>
298                        data_out <= 
299                                runnumber_local_copy(15 downto 0) &             -- 2times 16bit reserved for additional status info
300                                runnumber_local_copy(31 downto 16) & 
301                                timer_value(15 downto 0) &
302                                timer_value(31 downto 16);
303                        addr_cntr <= addr_cntr + 1;
304                        state_generate <= WRITE_TEMPERATURES;
305
306                -- DANGER: thist state can wait endlessly, if somethings wrong.
307                when WRITE_TEMPERATURES =>     -- temperatures
308                        if (sensor_ready = '1') then
309                                data_out <= conv_std_logic_vector (sensor_array (3), 16) &
310                                                        conv_std_logic_vector (sensor_array (2), 16) &
311                                                        conv_std_logic_vector (sensor_array (1), 16) &
312                                                        conv_std_logic_vector (sensor_array (0), 16);
313                                addr_cntr <= addr_cntr + 1;
314                                state_generate <= WRITE_DAC1;
315                        end if;
316
317                when WRITE_DAC1 =>
318                        data_out <= conv_std_logic_vector (dac_array (3), 16) &
319                                                conv_std_logic_vector (dac_array (2), 16) &
320                                                conv_std_logic_vector (dac_array (1), 16) &
321                                                conv_std_logic_vector (dac_array (0), 16);
322                        addr_cntr <= addr_cntr + 1;
323                        state_generate <= WRITE_DAC2;
324                when WRITE_DAC2 =>
325                        data_out <= conv_std_logic_vector (dac_array (7), 16) &
326                                                conv_std_logic_vector (dac_array (6), 16) &
327                                                conv_std_logic_vector (dac_array (5), 16) &
328                                                conv_std_logic_vector (dac_array (4), 16);
329                        addr_cntr <= addr_cntr + 1;
330                        state_generate <= WAIT_FOR_STOP_CELL;
331
332                when WAIT_FOR_STOP_CELL =>
333                        start_read_drs_stop_cell <= '0';
334                        if (drs_read_s_cell_ready = '1') then
335                                state_generate <= START_DRS_READING;
336                        end if;
337
338                when START_DRS_READING =>
339                        --drs channel number
340                        drs_channel_id <= conv_std_logic_vector (channel_id, 4);
341                       
342                        --adc_output_enable_inverted <= '0'; -- nur für Emulator ??????????????????
343                        -- this has been done earlier already ... why does it need to be repeated?
344
345                        --starte drs-clocking
346                        -- this is an interesting point:
347                                -- here the DRS clock starts to tick. but only some states later
348                                -- the ADC data is actually read out.
349                                -- the reason is, that the ADC has a latency of 7 clock cycles, which means,
350                                -- when the next rising edge of the DRS clock is produced.
351                                -- an analog value is put out.
352                                -- when the next rising edge of the ADC clock is produced.
353                                -- this very analog value is sampled.
354                                -- but only seven clock ticks later, the degital result is available.
355                                -- from that point on, every clock tick produces a valid digital result.
356                        drs_clk_en <= '1';
357                        adc_wait_cnt <= 0;
358                        state_generate <= WRITE_CHANNEL_ID;
359
360                when WRITE_CHANNEL_ID =>    -- write DRS and Channel IDs
361                        data_out <=             conv_std_logic_vector(3,12) & conv_std_logic_vector(channel_id,4) &
362                                                        conv_std_logic_vector(2,12) & conv_std_logic_vector(channel_id,4) &
363                                                        conv_std_logic_vector(1,12) & conv_std_logic_vector(channel_id,4) &
364                                                        conv_std_logic_vector(0,12) & conv_std_logic_vector(channel_id,4);
365                        addr_cntr <= addr_cntr + 1;
366                        state_generate <= WRITE_START_CELL;
367                when WRITE_START_CELL =>    -- write start cells
368                        data_out <=     "000000" & drs_s_cell_array (3) &
369                                                        "000000" & drs_s_cell_array (2) &
370                                                        "000000" & drs_s_cell_array (1) &
371                                                        "000000" & drs_s_cell_array (0); 
372                        addr_cntr <= addr_cntr + 1;
373                        state_generate <= WRITE_ROI;
374               
375                when WRITE_ROI =>    -- write ROI
376                        data_out <=     "00000" & conv_std_logic_vector (internal_roi_array((3) * 9 + channel_id), 11) &
377                                                "00000" & conv_std_logic_vector (internal_roi_array((2) * 9 + channel_id), 11) &
378                                                "00000" & conv_std_logic_vector (internal_roi_array((1) * 9 + channel_id), 11) &
379                                                "00000" & conv_std_logic_vector (internal_roi_array((0) * 9 + channel_id), 11);
380                        addr_cntr <= addr_cntr + 1;
381                        state_generate <= WRITE_FILLING;
382
383                when WRITE_FILLING =>    -- write FILLING
384                        data_out <= conv_std_logic_vector(0,64); -- filling
385                        addr_cntr <= addr_cntr + 1;
386                        state_generate <= WAIT_FOR_ADC;
387
388                when WAIT_FOR_ADC =>
389                -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
390                        if (adc_wait_cnt < 4 ) then -- anpassen!!!! -- 3 für Simulation, 4 für FPGA???
391                                adc_wait_cnt <= adc_wait_cnt + 1;
392                        else
393                                state_generate <= WRITE_ADC_DATA;
394                        end if;
395                when WRITE_ADC_DATA =>
396                        if (data_cntr < roi_max_int (channel_id)) then
397                                data_out <= adc_data_array(3)(7 downto 0) & "000" & adc_otr(3) & adc_data_array(3)(11 downto 8) &
398          adc_data_array(2)(7 downto 0) & "000" & adc_otr(2) & adc_data_array(2)(11 downto 8) &
399          adc_data_array(1)(7 downto 0) & "000" & adc_otr(1) & adc_data_array(1)(11 downto 8) &
400          adc_data_array(0)(7 downto 0) & "000" & adc_otr(0) & adc_data_array(0)(11 downto 8) ;
401
402                                addr_cntr <= addr_cntr + 1;
403                                state_generate <= WRITE_ADC_DATA;
404                                data_cntr <= data_cntr + 1;
405                        else
406                                drs_clk_en <= '0';
407                                --adc_output_enable_inverted <= '1'; -- nur für Emulator
408                                if (channel_id = 8) then
409                                        state_generate <= WAIT_FOR_EXTERNAL_TRIGGER_READY;
410                                        adc_output_enable_inverted <= '1';
411                                        -- switch off ADC_CLK
412                                        adc_clk_en <= '0';
413                                else
414                                        channel_id <= channel_id + 1;     -- increment channel_id
415                                        state_generate <= START_DRS_READING;
416                                        data_cntr <= 0;
417                                end if;
418                        end if;
419               
420                when WAIT_FOR_EXTERNAL_TRIGGER_READY =>
421                        state_generate <= WAIT_FOR_EXTERNAL_TRIGGER_READY;
422                        if (FTM_RS485_ready = '1') then
423                                --make local copy and proceed
424                                FTM_trigger_info_local_copy <= FTM_trigger_info;
425                                state_generate <= WRITE_EXTERNAL_TRIGGER;
426                        end if;
427               
428               
429                when WRITE_EXTERNAL_TRIGGER =>    -- external trigger ID
430                        addr_out <= start_addr + conv_std_logic_vector(1, RAM_ADDR_WIDTH);
431                        data_out <=     FTM_trigger_info_local_copy(15 downto 0) &
432                                                FTM_trigger_info_local_copy(31 downto 16) &
433                                                FTM_trigger_info_local_copy(47 downto 32) &
434                                                "0000000"& FTM_receiver_status & FTM_trigger_info_local_copy(55 downto 48);
435                        state_generate <= WRITE_END_FLAG;
436
437                when WRITE_END_FLAG =>
438                        data_out <= conv_std_logic_vector(0, 32) & X"04FE" & X"4242";
439                        addr_cntr <= addr_cntr + 1;
440                        state_generate <= WRITE_DATA_END;
441                when WRITE_DATA_END =>
442                        dataRAM_write_ea_o <= "0";
443                                --information to: memory manager.
444                                -- one Event was completely written into dataRAM.
445                        ram_write_ready <= '1';                                 
446                        state_generate <= WRITE_DATA_END_WAIT;
447                when WRITE_DATA_END_WAIT =>
448                        -- check if memory manager received the formaer information.
449                        -- go on to next state.
450                        if (ram_write_ready_ack = '1') then
451                                state_generate <= WRITE_DATA_STOP;
452                                ram_write_ready <= '0';
453                        end if;
454                when WRITE_DATA_STOP =>
455                        if (ram_write_ready_ack = '0') then
456                                drs_readout_ready <= '1';                       --info to: trigger manager.
457                                data_cntr <= 0;
458                                addr_cntr <= 0;
459                                channel_id <= 0;
460                                state_generate <= WRITE_DATA_STOP1;
461                        end if;
462                when WRITE_DATA_STOP1 =>
463                        if (drs_readout_ready_ack = '1') then
464                                drs_readout_ready <= '0';
465                                state_generate <= IDLE;
466                        end if;
467                when others =>
468                        null;
469                end case; -- state_generate
470        end if; -- rising_edge (clk)
471end process generate_data;
472end Behavioral;
Note: See TracBrowser for help on using the repository browser.