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

Last change on this file since 10172 was 10172, checked in by neise, 9 years ago
still unstable
File size: 15.9 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
23  generic(
24    RAM_ADDR_WIDTH : integer := 12
25  );
26   port( 
27--      led            : OUT    std_logic_vector (7 DOWNTO 0) := (OTHERS => '0');
28
29      clk            : in     std_logic;
30      data_out       : out    std_logic_vector (63 downto 0);
31      addr_out       : out    std_logic_vector (RAM_ADDR_WIDTH-1 downto 0);
32      write_ea       : out    std_logic_vector (0 downto 0) := "0";
33      ram_start_addr : in    std_logic_vector (RAM_ADDR_WIDTH-1 downto 0);
34      ram_write_ea : in std_logic;
35      ram_write_ready : out std_logic := '0';
36      -- --
37      ram_write_ready_ack : IN std_logic;
38      -- --
39      config_start_mm, config_start_cm, config_start_spi : out std_logic := '0';
40      config_ready_mm, config_ready_cm, config_ready_spi : in std_logic;
41      config_started_mm, config_started_cm, config_started_spi : in std_logic;
42      roi_array : in roi_array_type;
43      roi_max : in roi_max_type;
44      sensor_array : in sensor_array_type;
45      sensor_ready : in std_logic;
46      dac_array : in dac_array_type;
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      --
52           
53      -- EVT HEADER - part 2  --> FTM trigger informaton, comes in late ...
54      -- during EVT header wrinting, this field is left out ... and only written into event header,
55      -- when the DRS chip were read out already.
56      FTM_RS485_ready : in std_logic;
57      FTM_trigger_info : in std_logic_vector (55 downto 0); --7 byte
58      --
59     
60                        -- EVT HEADER - part 3
61      fad_event_counter     : in std_logic_vector (31 downto 0);
62      refclk_counter    : in std_logic_vector (11 downto 0);
63      refclk_too_high: in std_logic;
64      refclk_too_low : in std_logic;
65      --
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      TRG_GEN_div                                       : in std_logic_vector (15 downto 0);
72      --
73     
74      -- EVT HEADER - part 5
75      dna                               : in std_logic_vector (63 downto 0);
76      --
77     
78      -- EVT HEADER - part 6
79      timer_value : in std_logic_vector (31 downto 0); -- time in units of 100us
80      --
81     
82      trigger        : in std_logic;
83--      s_trigger      : in std_logic;
84      new_config     : in std_logic;
85      config_started : out std_logic := '0';
86      adc_data_array : in adc_data_array_type;
87      adc_oeb : 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      -- --
96      drs_clk_en, drs_read_s_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      );
108end data_generator ;
109
110architecture Behavioral of data_generator is
111
112type state_generate_type is (INIT, CONFIG, CONFIG1, CONFIG2,CONFIG3, CONFIG4, CONFIG5, CONFIG6, CONFIG7, 
113                                WRITE_DATA_IDLE,
114                                WRITE_HEADER, WRITE_FTM_INFO, WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER, WRITE_BOARD_ID,
115                                WRITE_DNA, WRITE_TIMER, WRITE_TEMPERATURES, 
116                                WRITE_DAC1, WRITE_DAC2,
117                                WAIT_FOR_STOP_CELL,
118                                START_DRS_READING,
119                                WRITE_CHANNEL_ID, WRITE_START_CELL, WRITE_ROI, WRITE_FILLING,
120                                WAIT_FOR_ADC, WRITE_ADC_DATA,
121                                WRITE_EXTERNAL_TRIGGER,
122                                WRITE_END_FLAG,
123                                WRITE_DATA_END, WRITE_DATA_END_WAIT,
124                                WRITE_DATA_STOP, WRITE_DATA_STOP1);
125
126signal state_generate : state_generate_type := INIT;
127signal start_addr : std_logic_vector (RAM_ADDR_WIDTH-1 downto 0) := (others => '0');
128
129signal data_cntr : integer  range 0 to 1024 := 0;
130signal evnt_cntr : std_logic_vector (31 downto 0) := (others => '0');
131signal addr_cntr : integer range 0 to RAM_SIZE_64B := 0;    -- counts 64 bit words
132signal channel_id : integer range 0 to 9 := 0;
133signal adc_wait_cnt : integer range 0 to 7 := 0;
134
135signal trigger_flag :std_logic := '0';
136signal ram_write_ea_flag : std_logic := '0';
137signal new_config_int : std_logic := '0';
138
139signal roi_max_int : roi_max_type;
140
141signal sig_drs_readout_started : std_logic := '0';
142
143begin
144drs_readout_started <= sig_drs_readout_started;
145
146generate_data : process (clk)
147begin
148        if rising_edge (clk) then
149                trigger_flag <= trigger;
150                addr_out <= start_addr + conv_std_logic_vector(addr_cntr, RAM_ADDR_WIDTH);
151                case state_generate is
152                when INIT =>
153                        state_generate <= CONFIG;
154                when CONFIG =>
155                        config_started <= '1';
156                        if (new_config = '0') then
157                                config_started <= '0';
158                                -- config config manager
159                                config_start_cm <= '1';
160                                if (config_started_cm = '1') then
161                                        config_start_cm <= '0';
162                                        state_generate <= CONFIG1;
163                                end if;
164                        end if;
165                when CONFIG1 =>
166                        if (config_ready_cm = '1') then
167                                config_start_mm <= '1';
168                        end if;
169                        if (config_started_mm = '1') then
170                                config_start_mm <= '0';
171                                state_generate <= CONFIG2;
172                        end if;
173        when CONFIG2 =>
174          if (config_ready_mm = '1') then
175            config_start_spi <= '1';
176          end if;
177          if (config_started_spi = '1') then
178            config_start_spi <= '0';
179            state_generate <= CONFIG3;
180          end if;
181        when CONFIG3 =>
182          if (config_ready_spi = '1') then
183            state_generate <= CONFIG4;
184--            state_generate <= WRITE_DATA_IDLE;
185          end if;
186        -- configure DRS
187        when CONFIG4 =>
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 <= CONFIG5;
194          end if;
195        when CONFIG5 =>
196          if (drs_srin_write_ready = '1') then
197            roi_max_int <= roi_max;
198            state_generate <= CONFIG6;
199          end if;
200          when CONFIG6 =>
201            drs_channel_id <= DRS_WRITE_CONFIG_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 <= CONFIG7;
207            end if;
208          when CONFIG7 =>
209            if (drs_srin_write_ready = '1') then
210              drs_channel_id <= DRS_ADDR_IDLE; -- to make sure not to write accidentally into DRS shift registers
211              roi_max_int <= roi_max;
212              state_generate <= WRITE_DATA_IDLE;
213            end if;
214        -- end configure DRS
215
216        when WRITE_DATA_IDLE =>
217          if (new_config = '1') then
218            state_generate <= CONFIG;
219          end if;
220--          if (ram_write_ea = '1' and (trigger_flag = '1' or s_trigger = '1')) then
221          if (ram_write_ea = '1' and trigger_flag = '1') then
222            sig_drs_readout_started <= '1'; -- is set to '0' in state WRITE_DAC1
223            -- stop drs, dwrite low
224            -- drs_dwrite <= '0';
225            -- start reading of drs stop cell
226            drs_read_s_cell <= '1';
227            -- enable adc output
228            adc_oeb <= '0';
229            -- switch on ADC_CLK
230            adc_clk_en <= '1';
231            start_addr <= ram_start_addr;
232            state_generate <= WRITE_HEADER;
233            evnt_cntr <= evnt_cntr + 1;
234          end if;
235                                when WRITE_HEADER =>
236                                  write_ea <= "1";
237          data_out <= X"000" & pll_lock & PACKAGE_VERSION & PACKAGE_SUB_VERSION & package_length & X"FB01";
238                                        addr_cntr <= addr_cntr + 1; 
239                                        state_generate <= WRITE_FTM_INFO;
240                                       
241                                when WRITE_FTM_INFO =>
242                                        -- here we do not write the FTM info ... just jump over it.
243                                        addr_cntr <= addr_cntr + 1; 
244                                        state_generate <= WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER;
245                                       
246                                when WRITE_EVENTCOUNTER_AND_REFCLK_COUNTER =>
247                                data_out <= X"0000" &
248                                                                                        refclk_too_high & refclk_too_low & "00" & refclk_counter & 
249                                                fad_event_counter(15 downto 0) & 
250                                                fad_event_counter(31 downto 16) ;
251                                addr_cntr <= addr_cntr + 1;
252                                state_generate <= WRITE_BOARD_ID;
253                                -- crate ID & board ID
254                                -- and a lot more...
255                                        -- info about the phase shifter
256                                        -- status of the trigger generator
257        when WRITE_BOARD_ID =>     
258          data_out <= TRG_GEN_div & X"0000" & X"00" & DCM_PS_status & "000000" & crate_id & "1000" & board_id;
259          addr_cntr <= addr_cntr + 1;
260          state_generate <= WRITE_DNA;
261         
262        when WRITE_DNA =>
263                                data_out <= X"00" & dna(55 downto 0);
264          addr_cntr <= addr_cntr + 1;
265          state_generate <= WRITE_TIMER;
266         
267        when WRITE_TIMER =>
268                data_out <= X"0000" & X"0000" & timer_value; -- 2times 16bit reserved for additional status info
269                        addr_cntr <= addr_cntr + 1;
270                        state_generate <= WRITE_TEMPERATURES;
271
272        when WRITE_TEMPERATURES =>     -- temperatures
273          if (sensor_ready = '1') then
274            data_out <= conv_std_logic_vector (sensor_array (3), 16)
275                      & conv_std_logic_vector (sensor_array (2), 16)
276                      & conv_std_logic_vector (sensor_array (1), 16)
277                      & conv_std_logic_vector (sensor_array (0), 16);
278            addr_cntr <= addr_cntr + 1;
279            state_generate <= WRITE_DAC1;
280          end if;
281
282        when WRITE_DAC1 =>
283          sig_drs_readout_started <= '0'; -- is set to '1' in state WRITE_DATA_IDLE
284          data_out <= conv_std_logic_vector (dac_array (3), 16)
285                    & conv_std_logic_vector (dac_array (2), 16)
286                    & conv_std_logic_vector (dac_array (1), 16)
287                    & conv_std_logic_vector (dac_array (0), 16);
288          addr_cntr <= addr_cntr + 1;
289          state_generate <= WRITE_DAC2;
290        when WRITE_DAC2 =>
291          data_out <= conv_std_logic_vector (dac_array (7), 16)
292                    & conv_std_logic_vector (dac_array (6), 16)
293                    & conv_std_logic_vector (dac_array (5), 16)
294                    & conv_std_logic_vector (dac_array (4), 16);
295          addr_cntr <= addr_cntr + 1;
296          state_generate <= WAIT_FOR_STOP_CELL;
297
298        when WAIT_FOR_STOP_CELL =>
299          drs_read_s_cell <= '0';
300          if (drs_read_s_cell_ready = '1') then
301            state_generate <= START_DRS_READING;
302          end if;
303       
304        when START_DRS_READING =>
305          --drs channel number
306          drs_channel_id <= conv_std_logic_vector (channel_id, 4);
307          --starte drs-clocking
308          --adc_oeb <= '0'; -- nur für Emulator
309          drs_clk_en <= '1';
310          adc_wait_cnt <= 0;
311          state_generate <= WRITE_CHANNEL_ID;
312
313        when WRITE_CHANNEL_ID =>    -- write DRS and Channel IDs
314          data_out <=  conv_std_logic_vector(3,12) & conv_std_logic_vector(channel_id,4) 
315                    &  conv_std_logic_vector(2,12) & conv_std_logic_vector(channel_id,4)
316                    &  conv_std_logic_vector(1,12) & conv_std_logic_vector(channel_id,4)
317                    &  conv_std_logic_vector(0,12) & conv_std_logic_vector(channel_id,4);
318          addr_cntr <= addr_cntr + 1;
319          state_generate <= WRITE_START_CELL;
320        when WRITE_START_CELL =>    -- write start cells
321          data_out <= "000000" & drs_s_cell_array (3)
322                    & "000000" & drs_s_cell_array (2)
323                    & "000000" & drs_s_cell_array (1)
324                    & "000000" & drs_s_cell_array (0); 
325          addr_cntr <= addr_cntr + 1;
326          state_generate <= WRITE_ROI;
327        when WRITE_ROI =>    -- write ROI
328          data_out <= "00000" & conv_std_logic_vector (roi_array((3) * 9 + channel_id), 11) 
329                    & "00000" & conv_std_logic_vector (roi_array((2) * 9 + channel_id), 11)
330                    & "00000" & conv_std_logic_vector (roi_array((1) * 9 + channel_id), 11)
331                    & "00000" & conv_std_logic_vector (roi_array((0) * 9 + channel_id), 11);
332          addr_cntr <= addr_cntr + 1;
333          state_generate <= WRITE_FILLING;
334         
335                when WRITE_FILLING =>    -- write FILLING
336                                                data_out <= conv_std_logic_vector(0,64); -- filling
337                                                addr_cntr <= addr_cntr + 1;
338                                                state_generate <= WAIT_FOR_ADC;
339 
340        when WAIT_FOR_ADC =>
341          -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
342          if (adc_wait_cnt < (4 + 3)) then -- anpassen!!!! -- 3 für Simulation, 4 für FPGA???
343            adc_wait_cnt <= adc_wait_cnt + 1;
344          else
345            state_generate <= WRITE_ADC_DATA;
346          end if;
347        when WRITE_ADC_DATA =>
348          if (data_cntr < roi_max (channel_id)) then
349            data_out <= "000" & adc_otr(3) & adc_data_array(3)
350                      & "000" & adc_otr(2) & adc_data_array(2)
351                      & "000" & adc_otr(1) & adc_data_array(1)
352                      & "000" & adc_otr(0) & adc_data_array(0);
353--             data_out <= "00000" & conv_std_logic_vector (data_cntr, 11)
354--                          & "00010" & conv_std_logic_vector (data_cntr, 11)
355--                          & "00100" & conv_std_logic_vector (data_cntr, 11)
356--                          & "00110" & conv_std_logic_vector (data_cntr, 11) ;
357            addr_cntr <= addr_cntr + 1;
358            state_generate <= WRITE_ADC_DATA;
359            data_cntr <= data_cntr + 1;
360          else
361            drs_clk_en <= '0';
362            --adc_oeb <= '1'; -- nur für Emulator
363            if (channel_id = 8) then
364              state_generate <= WRITE_EXTERNAL_TRIGGER;
365              adc_oeb <= '1';
366              -- switch off ADC_CLK
367              adc_clk_en <= '0';
368            else
369              channel_id <= channel_id + 1;     -- increment channel_id
370              state_generate <= START_DRS_READING;
371              data_cntr <= 0;
372            end if;
373          end if;
374         
375        when WRITE_EXTERNAL_TRIGGER =>    -- external trigger ID
376          addr_out <= start_addr + conv_std_logic_vector(1, RAM_ADDR_WIDTH);
377          data_out <=           FTM_trigger_info(15 downto 0) 
378                                                                                                & FTM_trigger_info(31 downto 16) 
379                                                                                                & FTM_trigger_info(47 downto 32) 
380                                                                                                & X"00" & FTM_trigger_info(55 downto 48);
381          state_generate <= WRITE_END_FLAG;
382       
383                                when WRITE_END_FLAG =>
384          data_out <= (63 downto 32 => '0') & X"04FE" & X"4242";
385          addr_cntr <= addr_cntr + 1;
386          state_generate <= WRITE_DATA_END;
387                                when WRITE_DATA_END =>
388                                  write_ea <= "0";
389                                        ram_write_ready <= '1';
390                                        state_generate <= WRITE_DATA_END_WAIT;
391                                when WRITE_DATA_END_WAIT =>
392          -- --
393                                  if (ram_write_ready_ack = '1') then
394                                    state_generate <= WRITE_DATA_STOP;
395                                    -- --
396            ram_write_ready <= '0';
397            -- --
398                                  end if;
399                                  -- --
400                when WRITE_DATA_STOP =>
401                  -- --
402                  if (ram_write_ready_ack = '0') then
403                  -- --
404--            drs_dwrite <= '1';
405            drs_readout_ready <= '1';
406                                          data_cntr <= 0;
407                                          addr_cntr <= 0;
408                                          channel_id <= 0;
409                                          state_generate <= WRITE_DATA_STOP1;
410                                        -- --
411                                        end if;
412                                  -- --
413                                when WRITE_DATA_STOP1 =>
414                                  if (drs_readout_ready_ack = '1') then
415                                    drs_readout_ready <= '0';
416                                    state_generate <= WRITE_DATA_IDLE;
417                                  end if;
418                                when others =>
419                                        null;
420                                       
421                        end case; -- state_generate
422                end if; -- rising_edge (clk)
423        end process generate_data;
424
425end Behavioral;
426
427
Note: See TracBrowser for help on using the repository browser.