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

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