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

Last change on this file since 10072 was 10072, checked in by neise, 10 years ago
block to block communication debugged - part 1
File size: 13.0 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      package_length : in std_logic_vector (15 downto 0);
48      board_id       : in std_logic_vector (3 downto 0);
49      crate_id       : in std_logic_vector (1 downto 0);
50      trigger_id     : in std_logic_vector (47 downto 0);
51      trigger        : in std_logic;
52--      s_trigger      : in std_logic;
53      new_config     : in std_logic;
54      config_started : out std_logic := '0';
55      adc_data_array : in adc_data_array_type;
56      adc_oeb : out std_logic := '1';
57      adc_clk_en : out std_logic := '0';
58      adc_otr : in std_logic_vector (3 downto 0);
59      drs_channel_id : out std_logic_vector (3 downto 0) := (others => '0');
60      drs_dwrite : out std_logic := '1';
61      drs_clk_en, drs_read_s_cell : out std_logic := '0';
62
63      drs_srin_write_8b : out std_logic := '0';
64      drs_srin_write_ack : in std_logic;
65      drs_srin_data : out std_logic_vector (7 downto 0) := (others => '0');
66      drs_srin_write_ready : in std_logic;
67
68      drs_read_s_cell_ready : in std_logic;
69      drs_s_cell_array : in drs_s_cell_array_type
70      );
71end data_generator ;
72
73architecture Behavioral of data_generator is
74
75type state_generate_type is (INIT, CONFIG, CONFIG1, CONFIG2,CONFIG3, CONFIG4, CONFIG5, CONFIG6, WRITE_HEADER, WRITE_EXTERNAL_TRIGGER, WRITE_INTERNAL_TRIGGER, WRITE_BOARD_ID, WRITE_TEMPERATURES,
76                             WRITE_DAC1, WRITE_DAC2, WRITE_CHANNEL_ID, WRITE_START_CELL, WRITE_ROI, WRITE_ADC_DATA, WRITE_DATA_END, WRITE_DATA_END_WAIT,
77                             WRITE_END_FLAG, WRITE_DATA_STOP,
78                             WRITE_DATA_IDLE, WAIT_FOR_ADC, WAIT_FOR_STOP_CELL, START_DRS_READING);
79
80signal state_generate : state_generate_type := INIT;
81signal start_addr : std_logic_vector (RAM_ADDR_WIDTH-1 downto 0) := (others => '0');
82
83signal data_cntr : integer  range 0 to 1024 := 0;
84signal evnt_cntr : std_logic_vector (31 downto 0) := (others => '0');
85signal addr_cntr : integer range 0 to RAM_SIZE_64B := 0;    -- counts 64 bit words
86signal channel_id : integer range 0 to 9 := 0;
87signal adc_wait_cnt : integer range 0 to 7 := 0;
88
89signal trigger_flag :std_logic := '0';
90signal ram_write_ea_flag : std_logic := '0';
91signal new_config_int : std_logic := '0';
92
93signal roi_max_int : roi_max_type;
94
95begin
96 
97 
98        generate_data : process (clk)
99        begin
100                if rising_edge (clk) then
101                  trigger_flag <= trigger;
102                 
103      addr_out <= start_addr + conv_std_logic_vector(addr_cntr, RAM_ADDR_WIDTH);
104       
105                        case state_generate is
106                          when INIT =>
107                            state_generate <= CONFIG;
108
109        when CONFIG =>
110          config_started <= '1';
111          if (new_config = '0') then
112            config_started <= '0';
113            -- config config manager
114            config_start_cm <= '1';
115            if (config_started_cm = '1') then
116              config_start_cm <= '0';
117              state_generate <= CONFIG1;
118            end if;
119          end if;
120        when CONFIG1 =>
121          if (config_ready_cm = '1') then
122            config_start_mm <= '1';
123          end if;
124          if (config_started_mm = '1') then
125            config_start_mm <= '0';
126            state_generate <= CONFIG2;
127          end if;
128        when CONFIG2 =>
129          if (config_ready_mm = '1') then
130            config_start_spi <= '1';
131          end if;
132          if (config_started_spi = '1') then
133            config_start_spi <= '0';
134            state_generate <= CONFIG3;
135          end if;
136        when CONFIG3 =>
137          if (config_ready_spi = '1') then
138            state_generate <= CONFIG4;
139--            state_generate <= WRITE_DATA_IDLE;
140          end if;
141        -- configure DRS
142        when CONFIG4 =>
143          drs_channel_id <= DRS_WRITE_SHIFT_REG;
144          drs_srin_data <= "10101010";
145          drs_srin_write_8b <= '1';
146          if (drs_srin_write_ack = '1') then
147            drs_srin_write_8b <= '0';
148            state_generate <= CONFIG5;
149          end if;
150        when CONFIG5 =>
151          if (drs_srin_write_ready = '1') then
152            roi_max_int <= roi_max;
153            state_generate <= WRITE_DATA_IDLE;
154          end if;
155        -- end configure DRS
156
157        when WRITE_DATA_IDLE =>
158          if (new_config = '1') then
159            state_generate <= CONFIG;
160          end if;
161--          if (ram_write_ea = '1' and (trigger_flag = '1' or s_trigger = '1')) then
162          if (ram_write_ea = '1' and trigger_flag = '1') then
163            -- stop drs, dwrite low
164            drs_dwrite <= '0';
165            -- start reading of drs stop cell
166            drs_read_s_cell <= '1';
167            -- enable adc output
168            adc_oeb <= '0';
169            -- switch on ADC_CLK
170            adc_clk_en <= '1';
171            start_addr <= ram_start_addr;
172            state_generate <= WRITE_HEADER;
173            evnt_cntr <= evnt_cntr + 1;
174          end if;
175                                when WRITE_HEADER =>
176                                  write_ea <= "1";
177          data_out <= X"0000" & PACKAGE_VERSION & PACKAGE_SUB_VERSION & package_length & X"FB01";
178                                        addr_cntr <= addr_cntr + 3;
179                                        state_generate <= WRITE_BOARD_ID;
180        when WRITE_BOARD_ID =>     -- crate ID & board ID
181          data_out <= (63 downto 10 => '0') & crate_id & "1000" & board_id;
182          addr_cntr <= addr_cntr + 1;
183          state_generate <= WRITE_TEMPERATURES;
184        when WRITE_TEMPERATURES =>     -- temperatures
185          if (sensor_ready = '1') then
186            data_out <= conv_std_logic_vector (sensor_array (3), 16)
187                      & conv_std_logic_vector (sensor_array (2), 16)
188                      & conv_std_logic_vector (sensor_array (1), 16)
189                      & conv_std_logic_vector (sensor_array (0), 16);
190            addr_cntr <= addr_cntr + 1;
191            state_generate <= WRITE_DAC1;
192          end if;
193
194        when WRITE_DAC1 =>
195          data_out <= conv_std_logic_vector (dac_array (3), 16)
196                    & conv_std_logic_vector (dac_array (2), 16)
197                    & conv_std_logic_vector (dac_array (1), 16)
198                    & conv_std_logic_vector (dac_array (0), 16);
199          addr_cntr <= addr_cntr + 1;
200          state_generate <= WRITE_DAC2;
201        when WRITE_DAC2 =>
202          data_out <= conv_std_logic_vector (dac_array (7), 16)
203                    & conv_std_logic_vector (dac_array (6), 16)
204                    & conv_std_logic_vector (dac_array (5), 16)
205                    & conv_std_logic_vector (dac_array (4), 16);
206          addr_cntr <= addr_cntr + 1;
207          state_generate <= WAIT_FOR_STOP_CELL;
208
209        when WAIT_FOR_STOP_CELL =>
210          drs_read_s_cell <= '0';
211          if (drs_read_s_cell_ready = '1') then
212            state_generate <= START_DRS_READING;
213          end if;
214       
215        when START_DRS_READING =>
216          --drs channel number
217          drs_channel_id <= conv_std_logic_vector (channel_id, 4);
218          --starte drs-clocking
219          --adc_oeb <= '0'; -- nur für Emulator
220          drs_clk_en <= '1';
221          adc_wait_cnt <= 0;
222          state_generate <= WRITE_CHANNEL_ID;
223
224        when WRITE_CHANNEL_ID =>    -- write DRS and Channel IDs
225          data_out <= conv_std_logic_vector(0,10) & conv_std_logic_vector(3,2) & conv_std_logic_vector(channel_id,4)
226                    & conv_std_logic_vector(0,10) & conv_std_logic_vector(2,2) & conv_std_logic_vector(channel_id,4)
227                    & conv_std_logic_vector(0,10) & conv_std_logic_vector(1,2) & conv_std_logic_vector(channel_id,4)
228                    & conv_std_logic_vector(0,10) & conv_std_logic_vector(0,2) & conv_std_logic_vector(channel_id,4);
229          addr_cntr <= addr_cntr + 1;
230          state_generate <= WRITE_START_CELL;
231        when WRITE_START_CELL =>    -- write start cells
232          data_out <= "000000" & drs_s_cell_array (3)
233                    & "000000" & drs_s_cell_array (2)
234                    & "000000" & drs_s_cell_array (1)
235                    & "000000" & drs_s_cell_array (0); 
236          addr_cntr <= addr_cntr + 1;
237          state_generate <= WRITE_ROI;
238        when WRITE_ROI =>    -- write ROI
239          data_out <= "00000" & conv_std_logic_vector (roi_array((3) * 9 + channel_id), 11) 
240                    & "00000" & conv_std_logic_vector (roi_array((2) * 9 + channel_id), 11)
241                    & "00000" & conv_std_logic_vector (roi_array((1) * 9 + channel_id), 11)
242                    & "00000" & conv_std_logic_vector (roi_array((0) * 9 + channel_id), 11);
243          addr_cntr <= addr_cntr + 1;
244          state_generate <= WAIT_FOR_ADC;
245        when WAIT_FOR_ADC =>
246          -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
247          if (adc_wait_cnt < (4 + 3)) then -- anpassen!!!! -- 3 für Simulation, 4 für FPGA???
248            adc_wait_cnt <= adc_wait_cnt + 1;
249          else
250            state_generate <= WRITE_ADC_DATA;
251          end if;
252        when WRITE_ADC_DATA =>
253          if (data_cntr < roi_max (channel_id)) then
254            data_out <= "000" & adc_otr(3) & adc_data_array(3)
255                      & "000" & adc_otr(2) & adc_data_array(2)
256                      & "000" & adc_otr(1) & adc_data_array(1)
257                      & "000" & adc_otr(0) & adc_data_array(0);
258--              data_out <= "00000" & conv_std_logic_vector (data_cntr, 11)
259--                          & "00010" & conv_std_logic_vector (data_cntr, 11)
260--                          & "00100" & conv_std_logic_vector (data_cntr, 11)
261--                          & "00110" & conv_std_logic_vector (data_cntr, 11) ;
262            addr_cntr <= addr_cntr + 1;
263            state_generate <= WRITE_ADC_DATA;
264            data_cntr <= data_cntr + 1;
265          else
266            drs_clk_en <= '0';
267            --adc_oeb <= '1'; -- nur für Emulator
268            if (channel_id = 8) then
269              state_generate <= WRITE_EXTERNAL_TRIGGER;
270              adc_oeb <= '1';
271              -- switch off ADC_CLK
272              adc_clk_en <= '0';
273            else
274              channel_id <= channel_id + 1;     -- increment channel_id
275              state_generate <= START_DRS_READING;
276              data_cntr <= 0;
277            end if;
278          end if;
279         
280         
281        when WRITE_EXTERNAL_TRIGGER =>    -- external trigger ID
282          addr_out <= start_addr + conv_std_logic_vector(1, RAM_ADDR_WIDTH);
283--          data_out <= X"0000" & trigger_id(39 downto 32) & trigger_id(47 downto 40) & trigger_id(15 downto 0) & trigger_id(31 downto 16);
284          data_out <= X"0000" & trigger_id(39 downto 32) & trigger_id(47 downto 40) & evnt_cntr(15 downto 0) & evnt_cntr(31 downto 16);
285          state_generate <= WRITE_INTERNAL_TRIGGER;
286        when WRITE_INTERNAL_TRIGGER =>    -- internal trigger ID
287          addr_out <= start_addr + conv_std_logic_vector(2, RAM_ADDR_WIDTH);
288          data_out <= X"0000" & trigger_id(39 downto 32) & trigger_id(47 downto 40) & evnt_cntr(15 downto 0) & evnt_cntr(31 downto 16);
289          state_generate <= WRITE_END_FLAG;
290                                when WRITE_END_FLAG =>
291          data_out <= (63 downto 32 => '0') & X"04FE" & X"4242";
292          addr_cntr <= addr_cntr + 1;
293          state_generate <= WRITE_DATA_END;
294                                when WRITE_DATA_END =>
295                                  write_ea <= "0";
296                                        ram_write_ready <= '1';
297                                        state_generate <= WRITE_DATA_END_WAIT;
298                                when WRITE_DATA_END_WAIT =>
299          -- --
300                                  if (ram_write_ready_ack = '1') then
301                                    state_generate <= WRITE_DATA_STOP;
302                                    -- --
303            ram_write_ready <= '0';
304            -- --
305                                  end if;
306                                  -- --
307                when WRITE_DATA_STOP =>
308                  -- --
309                  if (ram_write_ready_ack = '0') then
310                  -- --
311            drs_dwrite <= '1';
312                                          data_cntr <= 0;
313                                          addr_cntr <= 0;
314                                          channel_id <= 0;
315                                          state_generate <= WRITE_DATA_IDLE;
316                                        -- --
317                                        end if;
318                                  -- --
319                                when others =>
320                                        null;
321                                       
322                        end case; -- state_generate
323                end if; -- rising_edge (clk)
324        end process generate_data;
325
326end Behavioral;
327
328
Note: See TracBrowser for help on using the repository browser.