source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/w5300_modul2.vhd @ 10891

Last change on this file since 10891 was 10891, checked in by neise, 9 years ago
completed w5300_interface implementation. needs testing now
File size: 50.7 KB
Line 
1-- Module Name:    w5300_modul2 - Behavioral
2library IEEE;
3use IEEE.STD_LOGIC_1164.ALL;
4use IEEE.STD_LOGIC_ARITH.ALL;
5use IEEE.STD_LOGIC_UNSIGNED.ALL;
6library FACT_FAD_lib;
7use FACT_FAD_lib.fad_definitions.ALL;
8
9ENTITY w5300_modul2 IS
10
11   PORT( 
12      state          : OUT    std_logic_vector (7 DOWNTO 0);  -- state is encoded here ... useful for debugging.
13          debug_data_ram_empty : OUT    std_logic;
14          debug_data_valid : OUT    std_logic;
15          data_generator_idle_i : IN std_logic;
16     
17      clk            : IN     std_logic;
18     
19          wiz_reset      : OUT    std_logic                     := '1';
20      addr           : OUT    std_logic_vector (9 DOWNTO 0);
21      data           : INOUT  std_logic_vector (15 DOWNTO 0);
22      cs             : OUT    std_logic                     := '1';
23      wr             : OUT    std_logic                     := '1';
24          rd             : OUT    std_logic                     := '1';
25         
26     
27      int            : IN     std_logic;
28      write_length   : IN     std_logic_vector (16 DOWNTO 0);
29      ram_start_addr : IN     std_logic_vector (W5300_RAM_ADDR_WIDTH-1 DOWNTO 0);
30      ram_data       : IN     std_logic_vector (15 DOWNTO 0);
31      ram_addr       : OUT    std_logic_vector (W5300_RAM_ADDR_WIDTH-1 DOWNTO 0);
32      data_valid     : IN     std_logic;
33      data_valid_ack : OUT    std_logic := '0';
34      busy           : OUT    std_logic                     := '1';
35      write_header_flag, write_end_flag : IN std_logic;
36      fifo_channels : IN std_logic_vector (3 downto 0);
37      -- softtrigger:
38      s_trigger : OUT std_logic := '0';
39      c_trigger_enable: out std_logic := '0';
40      c_trigger_mult: out std_logic_vector (15 DOWNTO 0) := conv_std_logic_vector(0 ,16); --subject to changes
41     
42     
43
44          -- FAD configuration signals:
45          ------------------------------------------------------------------------------
46                memory_manager_config_start_o   : out std_logic := '0';
47                memory_manager_config_valid_i   : in std_logic;
48               
49                spi_interface_config_start_o    : out std_logic := '0';
50                spi_interface_config_valid_i    : in std_logic;
51               
52                --data_generator_config_start_o : out std_logic := '0';
53                --data_generator_config_valid_i : in std_logic;
54               
55                dac_setting                                             : out dac_array_type := DEFAULT_DAC;            --<<-- default defined in fad_definitions.vhd
56                roi_setting                                             : out roi_array_type := DEFAULT_ROI;            --<<-- default defined in fad_definitions.vhd
57               
58                runnumber                                               : out std_logic_vector (31 DOWNTO 0) := conv_std_logic_vector(0 ,32); 
59                reset_trigger_id                                : out std_logic := '0';
60
61                data_ram_empty                                  : IN std_logic;
62               
63          ------------------------------------------------------------------------------
64     
65          -- MAC/IP calculation signals:
66          ------------------------------------------------------------------------------
67      MAC_jumper : in std_logic_vector (1 downto 0);
68      BoardID : in std_logic_vector (3 downto 0);
69      CrateID : in std_logic_vector (1 downto 0);
70          ------------------------------------------------------------------------------
71     
72          -- user controllable enable signals
73          ------------------------------------------------------------------------------
74          trigger_enable : out std_logic; 
75         
76      denable : out std_logic := '0'; -- default domino wave on. ... in case if REFCLK error ... REFCLK counter will override.
77      dwrite_enable : out std_logic := '1'; -- default DWRITE low.
78      sclk_enable : out std_logic := '1'; -- default DWRITE HIGH.
79      srclk_enable : out std_logic := '1'; -- default SRCLK on.
80          ------------------------------------------------------------------------------
81         
82          -- ADC CLK generator, is able to shift phase with respect to X_50M
83          -- these signals control the behavior of the digital clock manager (DCM)
84          ------------------------------------------------------------------------------
85          ps_direction : out std_logic := '1'; -- default phase shift upwards
86      ps_do_phase_shift : out std_logic := '0'; --pulse this to phase shift once
87      ps_reset : out std_logic := '0'; -- pulse this to reset the variable phase shift
88      ps_ready : in std_logic;
89      ------------------------------------------------------------------------------
90         
91          -- signals used to control FAD LED bahavior:
92          -- one of the three LEDs is used for com-status info
93          ------------------------------------------------------------------------------
94      socks_waiting : out std_logic;
95      socks_connected: out std_logic
96          ------------------------------------------------------------------------------
97       
98       
99         
100   );
101END w5300_modul2 ;
102
103architecture Behavioral of w5300_modul2 is 
104
105type state_init_type is (
106        INTERRUPT, RESET, WAIT_FOR_RESET,
107        WRITE_REG, READ_REG, 
108        WRITE_DATA,
109        INIT, LOCATE, IM, MT, 
110        STX0, STX1, STX2, STX3, 
111        SRX0, SRX1, SRX2, SRX3, 
112        MAC0, MAC1, MAC2, 
113        GW0, GW1, 
114        SNM0, SNM1, 
115        IP0, IP1, 
116        --TIMEOUT,
117        RETRY,
118        SI_MR, SI_IMR, SI_PORTOR, SI_PORT, SI_SSR, SI_CR_OPEN, SI_IS_OPEN, SI_CR_LISTEN, 
119        SI, SI1, SI1b, SI2, SI3, SI4, SI5, SI6, ESTABLISH, EST1, 
120       
121        CONFIG, WAIT_100NS, WAIT_UNTIL_DG_IDLE, 
122        CONFIG_MEMORY_MANAGER, WAIT_FOR_CONFIG_MEMORY_MANAGER,
123        CONFIG_DATA_GENERATOR, WAIT_FOR_CONFIG_DATA_GENERATOR,
124        CONFIG_DAC_ONLY, WAIT_FOR_CONFIG_DAC_ONLY,
125       
126        MAIN, MAIN1, MAIN2, MAIN3, CHK_RECEIVED, READ_DATA
127);
128
129type state_write_type is (
130        WR_START, 
131        WR_GET_EVT_ID_WAIT1, WR_GET_EVT_ID1, WR_GET_EVT_ID_WAIT2, WR_GET_EVT_ID2,
132        WR_MOD7_STARTED, WR_WAIT_FOR_MOD7,
133        WR_CHECK_FOR_FIFO_SPACE_01, WR_CHECK_FOR_FIFO_SPACE_02, WR_CHECK_FOR_FIFO_SPACE_03, WR_CHECK_FOR_FIFO_SPACE_04, 
134        WR_05_PREPARE_LENGTH_INFO, WR_05_POSTPREPARE_LENGTH_INFO,
135        WR_STRANGE_WAIT,
136        WR_ACK, WR_WAIT_FOR_ACK,
137        WR_HEADER_FETCH, WR_HEADER_WAIT, WR_HEADER,
138        WR_FIFO, WR_FIFO1, WR_ADC, WR_ADC1, WR_ADC2,
139        WR_ENDFLAG, WR_ENDFLAG1, WR_ENDFLAG2
140); 
141type state_interrupt_1_type is (IR1_01, IR1_02, IR1_03, IR1_04);
142type state_interrupt_2_type is (
143        IR2_GET_IR, 
144        IR2_CHECK_WHICH_SN_IRQ, 
145        IR2_GET_SN_IR, 
146        IR2_CLEAR_SN_IR, 
147        IR2_SEND_DISCON, 
148        IR2_GET_SOCKn_STATUS, 
149        IR2_WAIT_SOCKn_CLOSED, 
150        IR2_GOTO_RESET);
151type state_read_data_type is (
152        RD_1, 
153        RD_2, 
154        RD_3, 
155        RD_4, 
156        RD_5,
157        WAIT_FOR_TRIGGER_ID_RESET_1, WAIT_FOR_TRIGGER_ID_RESET_2,
158        RD_6,
159        READ_COMMAND_DATA_SECTION,
160        PUT_COMMAND_DATA_SECTION,
161        RD_END
162);
163signal state_init : state_init_type := RESET;
164signal state_write : state_write_type := WR_START;
165signal state_interrupt_1 : state_interrupt_1_type := IR1_01;
166signal state_interrupt_2 : state_interrupt_2_type := IR2_GET_IR;
167signal state_read_data : state_read_data_type := RD_1;
168
169signal RST_TIME : std_logic_vector(19 downto 0) := X"7A120";    -- 0x7A120=500000 @50MHz --> 10ms
170
171signal wiz_addr : std_logic_vector (9 downto 0) := (OTHERS => '0');
172signal wiz_data : std_logic_vector (15 downto 0) := (OTHERS => '0');
173signal data_read : std_logic_vector (15 downto 0) := (OTHERS => '0');
174signal adc_data_addr : std_logic_vector (W5300_RAM_ADDR_WIDTH-1 DOWNTO 0);
175
176signal interrupt_ignore : std_logic := '1';
177signal int_flag : std_logic := '0';
178
179signal data_cnt : integer range 0 to 7680 := 0; 
180signal data_end : integer range 0 to 7680 := 0;
181signal drs_cnt : integer range 0 to 3 := 0;
182signal channel_cnt : integer range 0 to 9 :=0;
183signal socket_cnt : integer range 0 to 7 := 0;
184signal roi_max : std_logic_vector (10 downto 0) := (others => '0');
185
186
187signal socket_tx_free : std_logic_vector (16 downto 0) := (others => '0');
188signal write_length_bytes : std_logic_vector (16 downto 0);
189
190signal socket_rx_received : std_logic_vector (16 downto 0) := (others => '0');
191signal chk_recv_cntr : integer range 0 to 10000 := 0;
192
193-- --
194signal wait_cntr : integer range 0 to 10000 := 0;
195-- --
196
197signal rx_packets_cnt : std_logic_vector (15 downto 0);
198
199signal update_of_rois : std_logic := '1';
200signal update_of_lessimportant : std_logic := '1';
201
202
203signal trigger_enable_sig : std_logic := '0';
204signal trigger_enable_storage_sig : std_logic;
205
206signal local_write_length   : std_logic_vector (16 DOWNTO 0);
207signal local_ram_start_addr : std_logic_vector (W5300_RAM_ADDR_WIDTH-1 DOWNTO 0);
208signal local_ram_addr       : std_logic_vector (W5300_RAM_ADDR_WIDTH-1 downto 0);
209signal local_socket_nr      : std_logic_vector (2 DOWNTO 0);
210signal local_write_header_flag, local_write_end_flag : std_logic;
211signal local_fifo_channels : std_logic_vector (3 downto 0);
212
213signal wait_100ns_sig : std_logic_vector (2 downto 0) := "000";
214
215signal config_addr : integer range 0 to 44;
216type config_data_type is array (0 to 46) of std_logic_vector(15 downto 0); 
217signal config_setting : config_data_type := (
218--              X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A",                --<<-- ROIs = 10 TESTING ONLY
219--              X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A",                --<<-- ROIs = 10 TESTING ONLY
220--              X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A",                --<<-- ROIs = 10 TESTING ONLY
221--              X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A", X"000A",                --<<-- ROIs = 10 TESTING ONLY
222
223                X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400",                --<<-- ROIs = 1024
224                X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400",                --<<-- ROIs = 1024
225                X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400",                --<<-- ROIs = 1024
226                X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400", X"0400",                --<<-- ROIs = 1024
227
228                X"61A8", X"0000", X"0000", X"0000", X"7080", X"7080", X"7080", X"7080",                                  --<<-- DACs
229                X"0000",
230                X"0000", X"0000"  -- MSword // LSword
231                );
232               
233               
234
235-- signals used for MAC/IP calculation:
236-- these 2 synch in, the jumper state.
237signal FAD_in_cam : std_logic := '0';
238signal FAD_at_ETHZ : std_logic := '0';
239-- these 2 synch in the FMP lines encoding the FAD position in the cam.
240signal bid : std_logic_vector (3 downto 0);
241signal cid : std_logic_vector (1 downto 0);
242-- these are just used as local variables, to make reading easier.
243signal mac_loc : mac_type;
244signal ip_loc : ip_type;
245signal gateway_loc : ip_type;
246signal netmask_loc : ip_type;
247
248        -- signals for synching in asynchronous input signals
249                ------------------------------------------------------------------------------
250                signal w5300_interrupt_sr : std_logic_vector(1 downto 0) := "11";
251                 --?? not sure if this init value is good
252                 -- but should be no problem, because interrupt_ignore is not true during the first 2 clock cycles.
253                 -- I hope!
254                signal data_valid_sr : std_logic_vector(1 downto 0) := "00"; 
255                ------------------------------------------------------------------------------
256                -- synch in CONFIG inputs
257                signal memory_manager_config_valid_i_sr         : std_logic_vector(1 downto 0) := "00";
258                signal spi_interface_config_valid_i_sr          : std_logic_vector(1 downto 0) := "00";
259                --signal data_generator_config_valid_i_sr               : std_logic_vector(1 downto 0) := "00";
260                signal data_ram_empty_sr                                        : std_logic_vector(1 downto 0) := (OTHERS => '0');
261
262
263                signal data_generator_idle_sr : std_logic_vector(2 downto 0) := "000";
264
265-- only for debugging
266--signal error_cnt : std_logic_vector (7 downto 0) := (others => '0');
267--signal last_trigger_id : std_logic_vector (15 downto 0) := (others => '0');
268signal DG_run_mode_temp_storage_signal : std_logic;
269signal data_generator_run_mode_signal : std_logic := '1'; -- default triggers will be accepted
270-- signals for different socket modes: DN 04.01.11
271signal socket_send_mode : std_logic := '0'; -- if 0 data is send via socket 0; if 1 data is send via the other sockets.
272-- signals for Sockek Number calculation
273signal event_number : std_logic_vector(31 downto 0);
274signal mod7_start : std_logic := '0';
275signal mod7_started : std_logic;
276signal mod7_valid : std_logic;
277signal mod7_result : std_logic_vector(2 downto 0);
278
279
280signal state_sig : std_logic_vector(7 downto 0) := X"FF";
281
282signal number_of_words_written_to_fifo :  std_logic_vector(15 downto 0) := (others => '0');
283signal number_of_bytes_written_to_fifo :  std_logic_vector(16 downto 0) := (others => '0');
284
285signal ready_wi_sr : std_logic_vector(1 downto 0) := "00";
286
287signal read_wi : std_logic  := '0';
288signal write_wi : std_logic := '0';
289signal data_out_wi : std_logic_vector (15 downto 0);
290signal ready_wi : std_logic;
291signal reset_wi : std_logic  := '0';
292signal wi_started : std_logic := '0';
293
294
295COMPONENT mod7
296         PORT (
297                        clk       : IN     std_logic;
298                        number    : IN     std_logic_vector (31 DOWNTO 0);
299                        start     : IN     std_logic;
300                        remainder : OUT    std_logic_vector (2 DOWNTO 0) := (others => '0');
301                        started   : OUT    std_logic                     := '0';
302                        valid     : OUT    std_logic                     := '0'
303         );
304         END COMPONENT;
305
306COMPONENT w5300_interface IS
307        PORT(
308                clk                                                     : IN    std_logic;                                              -- expecting 50MHz
309               
310                wiz_reset                                       : OUT   std_logic;
311                cs                                                      : OUT   std_logic;
312                wr                                                      : OUT   std_logic;
313                rd                                                      : OUT   std_logic;
314                int                                                     : IN    std_logic;
315                wiz_data                                        : INOUT std_logic_vector (15 DOWNTO 0);
316                wiz_addr                                        : OUT   std_logic_vector (9 DOWNTO 0);
317               
318                read_i                                          : IN    std_logic;
319                write_i                                         : IN    std_logic;
320                addr_i                                          : IN    std_logic_vector (9 DOWNTO 0);
321                data_o                                          : OUT   std_logic_vector (15 DOWNTO 0)  := (others => '0');
322                data_i                                          : IN    std_logic_vector (15 DOWNTO 0);
323                ready_o                                         : OUT   std_logic := '0';
324                reset_i                                         : IN    std_logic
325               
326        );
327        END COMPONENT;
328         
329
330begin
331       
332        mod7_calculator : mod7
333        PORT MAP (
334                --locals => actuals
335                clk                     =>clk   ,
336                number          =>event_number  ,
337                start           =>mod7_start    ,
338                remainder       =>mod7_result   ,
339                started         =>mod7_started  ,
340                valid           =>mod7_valid
341        );
342       
343        inst_w5300_interface : w5300_interface
344        PORT MAP(
345                clk                             => clk,
346                wiz_reset               => wiz_reset,
347                cs                              => cs,         
348                wr                              => wr,                         
349                rd                              => rd,                                 
350                int                             => int,                                 
351                wiz_data                => data,
352                wiz_addr                => addr,
353                read_i                  => read_wi,
354                write_i                 => write_wi,
355                addr_i                  => wiz_addr,
356                data_o                  => data_read,
357                data_i                  => wiz_data,
358                ready_o                 => ready_wi,
359                reset_i                 => reset_wi
360        );
361
362
363  --synthesis translate_off
364  RST_TIME <= X"00120";
365  --synthesis translate_on
366 
367  -- concurrent statemnets
368 
369-- output config settings as DAC and ROI arrays.
370state <= state_sig;
371debug_data_ram_empty <= int_flag;
372debug_data_valid <= interrupt_ignore;
373--debug_data_ram_empty <= data_ram_empty_sr(1);
374--debug_data_valid <= data_valid_sr(1);
375roi_mapping : for i in 0 to 35 generate
376        roi_setting(i) <= conv_integer(config_setting(i)) when (conv_integer(config_setting(i)) < 1025) else 1024;
377end generate roi_mapping;
378dac_mapping : for i in 0 to 7 generate
379        dac_setting(i) <= conv_integer(config_setting(i+36));
380end generate dac_mapping;
381c_trigger_mult <= config_setting(44);
382
383runnumber <= config_setting(45) & config_setting(46);
384
385trigger_enable <= trigger_enable_sig;
386
387
388        w5300_proc : process (clk)
389        begin
390                if rising_edge (clk) then
391                write_wi <= '0';
392                read_wi <= '0';
393               
394       
395                memory_manager_config_valid_i_sr        <= memory_manager_config_valid_i_sr(0)  & memory_manager_config_valid_i;
396                spi_interface_config_valid_i_sr         <= spi_interface_config_valid_i_sr(0)   & spi_interface_config_valid_i;
397                data_ram_empty_sr                                       <= data_ram_empty_sr(0)                 & data_ram_empty;               
398                data_generator_idle_sr                          <= data_generator_idle_sr( 1 downto 0 ) & data_generator_idle_i;
399               
400                w5300_interrupt_sr <= w5300_interrupt_sr(0) & int;
401                data_valid_sr <= data_valid_sr(0) & data_valid;
402               
403                ready_wi_sr <= ready_wi_sr(0) & ready_wi;
404               
405                        -- interrupt is handled synchronously
406                        -- W5300 pulls low its interrpt line in case of:
407                        --      When Sockets time out and
408                        -- When sockets receive disconnection request.
409                       
410                        if (w5300_interrupt_sr(1) = '0') and (interrupt_ignore = '0') then
411                                case state_interrupt_1 is
412                                        when IR1_01 =>
413                                                int_flag <= '1';
414                                                state_interrupt_1 <= IR1_02;  --wait one cycle
415                                        when IR1_02 =>
416                                                state_interrupt_1 <= IR1_03;
417                                        when IR1_03 =>
418                                                state_init <= INTERRUPT;
419                                                socket_cnt <= 0;
420                                                int_flag <= '0';
421                                                interrupt_ignore <= '1';
422                                                state_interrupt_1 <= IR1_04;  --this state is not existing? bad coding habit???
423                                        when others =>
424                                                null;
425                                end case;
426                        end if; -- int = '0'
427                       
428                        if int_flag = '0' then
429                                case state_init is
430                                        -- Interrupt
431                                        when INTERRUPT =>
432                                                case state_interrupt_2 is
433                                                        when IR2_GET_IR =>
434                                                                if (ready_wi = '1') then
435                                                                        wiz_addr <= W5300_IR;
436                                                                        read_wi <= '1';
437                                                                        state_interrupt_2 <= IR2_CHECK_WHICH_SN_IRQ;
438                                                                end if;
439                                                               
440                                                        -- check if it was a Sx Interrupt of Socket n
441                                                        -- therfor: loop over all channel.
442                                                        -- if the loop ended but no Sx Interrupt was found --> IR2_GOTO_RESET
443                                                        -- if an Sx Interrupt was found go to --> IR2_GET_SN_IR and check what happened.
444                                                        when IR2_CHECK_WHICH_SN_IRQ =>
445                                                                if (ready_wi = '1') then
446                                                                        if (data_read(socket_cnt) = '1') then -- Sx Interrupt
447                                                                                state_interrupt_2 <= IR2_GET_SN_IR;
448                                                                        else
449                                                                                socket_cnt <= socket_cnt + 1;
450                                                                                if (socket_cnt = 7) then
451                                                                                        state_interrupt_2 <= IR2_GOTO_RESET;
452                                                                                else
453                                                                                        state_interrupt_2 <= IR2_CHECK_WHICH_SN_IRQ;  -- go on with loop
454                                                                                end if; 
455                                                                        end if;
456                                                                end if;
457                                                               
458                                                        -- check the Interrupt register of the Socket to be able to clear them
459                                                        when IR2_GET_SN_IR =>
460                                                                if (ready_wi = '1') then
461                                                                        wiz_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC; -- Sx Interrupt Register
462                                                                        read_wi <= '1';
463                                                                        state_interrupt_2 <= IR2_CLEAR_SN_IR;
464                                                                end if;
465                                                        -- clear IRQs by writing ones.
466                                                        when IR2_CLEAR_SN_IR =>
467                                                                if (ready_wi = '1') then
468                                                                        wiz_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC;
469                                                                        wiz_data <= data_read; -- clear Interrupts
470                                                                        write_wi <= '1';
471                                                                        state_interrupt_2 <= IR2_SEND_DISCON;
472                                                                end if;
473                                                               
474                                                        -- send the command to close this socket
475                                                        -- then go back and read the main Interrupt register again,
476                                                        -- if this was not Socket 7 ... if it was Socket 7, we're done anyway.
477                                                        when IR2_SEND_DISCON =>
478                                                                if (ready_wi = '1') then
479                                                                        wiz_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
480                                                                        wiz_data <= X"0008"; -- DISCON  --> W5300 wil send FIN packet
481                                                                        write_wi <= '1';
482                                                                        socket_cnt <= socket_cnt + 1;
483                                                               
484                                                                        if (socket_cnt = 7) then
485                                                                                socket_cnt = 0;
486                                                                                state_interrupt_2 <= IR2_WAIT_UNTIL_SOCKS_CLOSED;
487                                                                        else
488                                                                                state_interrupt_2 <= IR2_GET_IR;
489                                                                        end if; 
490                                                                end if;
491                                                               
492                                                        when IR2_GET_SOCKn_STATUS =>
493                                                                if (ready_wi = '1') then
494                                                                        wiz_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
495                                                                        read_wi = '1';
496                                                                        state_interrupt_2 <= IR2_WAIT_SOCKn_CLOSED;
497                                                                end if;
498                                                               
499                                                        when IR2_WAIT_SOCKn_CLOSED =>
500                                                                if (ready_wi = '1') then
501                                                                        if (data_read = X"0000") then --closed
502                                                                                if (socket_cnt = 7) then
503                                                                                        socket_cnt <= 0;
504                                                                                        state_interrupt_2 <= IR2_GOTO_RESET;
505                                                                                else
506                                                                                        socket_cnt <= socket_cnt + 1;
507                                                                                        state_interrupt_2 <= IR2_GET_SOCKn_STATUS;
508                                                                                end if;
509                                                                        end if;
510                                                                end if;
511                                                       
512                                                               
513                                                       
514                                                        when IR2_GOTO_RESET =>
515                                                        state_sig <= X"F6";
516                                                                state_interrupt_1 <= IR1_01;
517                                                                state_interrupt_2 <= IR2_GET_IR;
518                                                                socket_cnt <= 0;
519                                                                state_init <= RESET;
520                                                        when others =>
521                                                                null;
522                                                        end case;
523                                               
524                                        -- reset W5300
525                                        when RESET =>
526                                                state_sig <= X"01";  --debugging
527                                               
528                                                socket_send_mode <= '0';        -- stuff, not connected to W5300
529                                                busy <= '1';
530                                                socks_waiting <= '0';
531                                                socks_connected <= '0';
532                                                socket_cnt <= 0;
533                                                interrupt_ignore <= '0';
534                                               
535                                                reset_wi <= '1';
536                                                if (ready_wi = '0') then
537                                                        reset_wi <= '0';
538                                                        state_init <= WAIT_FOR_RESET;
539                                                end if;
540                                       
541                                        when WAIT_FOR_RESET =>
542                                                if (ready_wi = '1') then
543                                                        state_init <= INIT;
544                                                end if;
545                                               
546                                        -- Init
547                                        when INIT =>
548                                          state_sig <= X"02";
549                                                -- status of MAC jumpers is synched in
550                                                -- and Board- and CrateID are synched in
551                                                FAD_in_cam <= MAC_jumper(1); -- see position of jumpers in FACT logbook
552                                                FAD_at_ETHZ <= MAC_jumper(0); -- MAC_jumper(1) is where D_T(7) was; MAC_jumper(0) is where D_T(6) was;
553                                                bid <= BoardID;
554                                                cid <= CrateID;
555                                               
556                                                wiz_addr <= W5300_MR;
557                                                wiz_data <= X"0000";
558                                                if (ready_wi = '1') then 
559                                                        write_wi <= '1';
560                                                        state_init <= LOCATE;
561                                                end if;
562                                               
563                                               
564                                        when LOCATE =>
565                                                state_sig <= X"03";                                       
566                                                state_init <= IM;
567
568                                                if (FAD_in_cam = '1') then
569                                                        if (bid = "1111" and cid="11") then
570                                                                -- if BID = "1111" and CID="11" then FAD is not really in cam
571                                                                -- I don't know what to do now.
572                                                                -- I could wait a long time, and then just assume, I was not in cam.
573                                                                -- this should never happen!!!!!
574                                                                -- impossible to find this out, if in cam
575                                                                gateway_loc <= ETHZ_GATEWAY;
576                                                                netmask_loc <= ETHZ_NETMASK;                                           
577                                                                mac_loc <= MAC_FAD2; 
578                                                                ip_loc <= IP_ETHZ_FAD2;
579                                                                --state_init <= INIT;
580                                                        else -- everything is fine
581                                                                -- IP & MAC are calculated from BID & CID
582                                                                -- code here
583                                                                gateway_loc <= CAM_GATEWAY;
584                                                                netmask_loc <= CAM_NETMASK;                                             
585                                                                mac_loc <= (CAM_MAC_prefix (0), CAM_MAC_prefix (1)  , conv_std_logic_vector ( conv_integer(cid)*10+conv_integer(bid)  , 16)   ); 
586                                                                ip_loc <= ( CAM_IP_PREFIX(0) , CAM_IP_PREFIX(1) , IP_offset + conv_integer(cid) , IP_offset + conv_integer(bid) );
587                                                        end if;
588                                                else -- FAD is tested, either at ETHZ or at TUDO AND either with FMP or without.
589                                                        if ( FAD_at_ETHZ = '0' ) then
590                                                                -- easy FAD is at TUDO -> only one choice.
591                                                                mac_loc <= MAC_FAD0;
592                                                                ip_loc <= IP_TUDO;
593                                                                gateway_loc <= TUDO_GATEWAY;
594                                                                netmask_loc <= TUDO_NETMASK;
595                                                        else -- FAD is at ETHZ but not in cam --> IP lookup table is needed.
596                                                                if (bid = "1111" and cid="11") then -- FAD is not in crate
597                                                                        mac_loc <= MAC_FAD0;
598                                                                        ip_loc <= IP_ETHZ_FAD0;
599                                                                        gateway_loc <= ETHZ_GATEWAY;
600                                                                        netmask_loc <= ETHZ_NETMASK;                                           
601                                                                else
602                                                                        -- FAD is at ETHZ and in crate:
603                                                                        -- crate ID is not of importance.
604                                                                        -- we only have 3 MACs and IPs so far, so only the first boardIDs are allowed.
605                                                                        if ( conv_integer(bid) < MAC_LIST'length) then
606                                                                                gateway_loc <= ETHZ_GATEWAY;
607                                                                                netmask_loc <= ETHZ_NETMASK;                                           
608                                                                                mac_loc <= MAC_LIST(conv_integer(bid));
609                                                                                ip_loc <= IP_LIST(conv_integer(bid));
610                                                                        end if; -- conv_integer
611                                                                end if; -- bid=1111 & cid=11
612                                                        end if; --FAD_at_ETHZ = 0
613                                                end if; --FAD_in_cam = 1
614                                               
615                                        -- Interrupt Mask
616                                        when IM =>
617                                                state_sig <= X"04";
618                                                wiz_addr <= W5300_IMR;
619                                                wiz_data <= X"00FF"; -- S0-S7 Interrupts
620                                                if (ready_wi = '1') then 
621                                                        write_wi <= '1';
622                                                        state_init <= MT;
623                                                end if;
624                                               
625                                               
626                                        -- Memory Type
627                                        when MT =>
628                                                wiz_addr <=     W5300_MTYPER;
629                                                wiz_data <= X"7FFF"; -- 8K RX, 120K TX-Buffer
630                                                if (ready_wi = '1') then 
631                                                        write_wi <= '1';
632                                                        state_init <= STX0;
633                                                end if;
634                                         
635                                        -- Socket TX Memory Size
636                                        when STX0 =>
637                                                wiz_addr <= W5300_TMS01R;
638                                                wiz_data <= X"0F0F"; -- 15K TX
639                                                if (ready_wi = '1') then 
640                                                        write_wi <= '1';
641                                                        state_init <= STX1;
642                                                end if;
643                                        when STX1 =>
644                                                wiz_addr <= W5300_TMS23R;
645                                                wiz_data <= X"0F0F"; -- 15K TX
646                                                if (ready_wi = '1') then 
647                                                        write_wi <= '1';
648                                                        state_init <= STX2;
649                                                end if;
650                                                                               
651                                        when STX2 =>
652                                                wiz_addr <= W5300_TMS45R;
653                                                wiz_data <= X"0F0F"; -- 15K TX
654                                                if (ready_wi = '1') then 
655                                                        write_wi <= '1';
656                                                        state_init <= STX3;
657                                                end if;
658
659                                        when STX3 =>
660                                                wiz_addr <= W5300_TMS67R;
661                                                wiz_data <= X"0F0F"; -- 15K TX
662                                                if (ready_wi = '1') then 
663                                                        write_wi <= '1';
664                                                        state_init <= SRX0;
665                                                end if;
666                                       
667                                        -- Socket RX Memory Size
668                                        when SRX0 =>
669                                                wiz_data <= X"0101"; -- 1K RX
670                                                wiz_addr <= W5300_RMS01R;
671                                                if (ready_wi = '1') then 
672                                                        write_wi <= '1';
673                                                        state_init <= SRX1;
674                                                end if;
675                                        when SRX1 =>
676                                                wiz_data <= X"0101"; -- 1K RX
677                                                wiz_addr <= W5300_RMS23R;
678                                                if (ready_wi = '1') then 
679                                                        write_wi <= '1';
680                                                        state_init <= SRX2;
681                                                end if;
682                                        when SRX2 =>
683                                                wiz_data <= X"0101"; -- 1K RX
684                                                wiz_addr <= W5300_RMS45R;
685                                                if (ready_wi = '1') then 
686                                                        write_wi <= '1';
687                                                        state_init <= SRX3;
688                                                end if;
689                                        when SRX3 =>
690                                                wiz_data <= X"0101"; -- 1K RX
691                                                wiz_addr <= W5300_RMS67R;
692                                                if (ready_wi = '1') then 
693                                                        write_wi <= '1';
694                                                        state_init <= MAC0;
695                                                end if;
696
697                                        -- MAC
698                                        when MAC0 =>
699                                                wiz_addr <= W5300_SHAR;
700                                                wiz_data <= mac_loc(0);
701                                                if (ready_wi = '1') then 
702                                                        write_wi <= '1';
703                                                        state_init <= MAC1;
704                                                end if;
705
706                                        when MAC1 =>
707                                                wiz_addr <= W5300_SHAR + 2;
708                                                wiz_data <= mac_loc(1);
709                                                if (ready_wi = '1') then 
710                                                        write_wi <= '1';
711                                                        state_init <= MAC2;
712                                                end if;
713                                        when MAC2 =>
714                                                wiz_addr <= W5300_SHAR + 4;
715                                                wiz_data <= mac_loc(2);
716                                                if (ready_wi = '1') then 
717                                                        write_wi <= '1';
718                                                        state_init <= GW0;
719                                                end if;
720                                               
721                                        -- Gateway
722                                        when GW0 =>
723                                                wiz_addr <= W5300_GAR;
724                                                wiz_data (15 downto 8) <= conv_std_logic_vector(gateway_loc(0),8);
725                                                wiz_data (7 downto 0) <= conv_std_logic_vector(gateway_loc(1),8);
726                                                if (ready_wi = '1') then 
727                                                        write_wi <= '1';
728                                                        state_init <= GW1;
729                                                end if;
730                                               
731                                        when GW1 =>
732                                                wiz_addr <= W5300_GAR + 2;
733                                                wiz_data (15 downto 8) <= conv_std_logic_vector(gateway_loc(2),8);
734                                                wiz_data (7 downto 0) <= conv_std_logic_vector(gateway_loc(3),8);
735                                                if (ready_wi = '1') then 
736                                                        write_wi <= '1';
737                                                        state_init <= SNM0;
738                                                end if;
739                                               
740                                        -- Subnet Mask
741                                        when SNM0 =>
742                                                wiz_addr <= W5300_SUBR;
743                                                wiz_data (15 downto 8) <= conv_std_logic_vector(netmask_loc(0),8);
744                                                wiz_data (7 downto 0) <= conv_std_logic_vector(netmask_loc(1),8);
745                                                if (ready_wi = '1') then 
746                                                        write_wi <= '1';
747                                                        state_init <= SNM1;
748                                                end if;
749                                        when SNM1 =>
750                                                wiz_addr <= W5300_SUBR + 2;
751                                                wiz_data (15 downto 8) <= conv_std_logic_vector(netmask_loc(2),8);
752                                                wiz_data (7 downto 0) <= conv_std_logic_vector(netmask_loc(3),8);
753                                                if (ready_wi = '1') then 
754                                                        write_wi <= '1';
755                                                        state_init <= IP0;
756                                                end if;
757                                        -- Own IP-Address
758                                        when IP0 =>
759                                                wiz_addr <= W5300_SIPR;
760                                                wiz_data (15 downto 8) <= conv_std_logic_vector(ip_loc(0),8);
761                                                wiz_data (7 downto 0) <= conv_std_logic_vector(ip_loc(1),8);
762                                                if (ready_wi = '1') then 
763                                                        write_wi <= '1';
764                                                        state_init <= IP1;
765                                                end if;
766                                        when IP1 =>
767                                                wiz_addr <= W5300_SIPR + 2;
768                                                wiz_data (15 downto 8) <= conv_std_logic_vector(ip_loc(2),8);
769                                                wiz_data (7 downto 0) <= conv_std_logic_vector(ip_loc(3),8);
770                                                if (ready_wi = '1') then 
771                                                        write_wi <= '1';
772                                                        state_init <= SI_MR;
773                                                end if;
774
775                                        -- Socket Init
776                                        when SI_MR =>
777                                          state_sig <= X"05";
778                                                wiz_addr <= W5300_S0_MR + socket_cnt * W5300_S_INC;
779                                                wiz_data <= X"0101"; -- ALIGN, TCP
780                                                if (ready_wi = '1') then 
781                                                        write_wi <= '1';
782                                                        state_init <= SI_IMR;
783                                                end if;
784                                        -- Sx Interrupt Mask
785                                        when SI_IMR =>
786                                                wiz_addr <= W5300_S0_IMR + socket_cnt * W5300_S_INC;
787                                                wiz_data <= X"000A"; -- TIMEOUT, DISCON
788                                                if (ready_wi = '1') then 
789                                                        write_wi <= '1';
790                                                        state_init <= SI_PORTOR;
791                                                end if;
792                                        when SI_PORTOR =>
793                                                wiz_addr <= W5300_S0_PORTOR + socket_cnt * W5300_S_INC;
794                                                wiz_data <= X"0606"; -- send automatic KEEP ALIVE every 30s.
795                                                if (ready_wi = '1') then 
796                                                        write_wi <= '1';
797                                                        state_init <= SI_PORT;
798                                                end if;
799                                        when SI_PORT =>
800                                                wiz_addr <= W5300_S0_PORTR + socket_cnt * W5300_S_INC;
801                                                wiz_data <= conv_std_logic_vector(FIRST_PORT + socket_cnt, 16);
802                                                if (ready_wi = '1') then 
803                                                        write_wi <= '1';
804                                                        state_init <= SI_CR_OPEN;
805                                                end if;
806                                        when SI_CR_OPEN =>
807                                                wiz_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
808                                                wiz_data <= X"0001"; -- OPEN
809                                                if (ready_wi = '1') then 
810                                                        write_wi <= '1';
811                                                        state_init <= SI_SSR;
812                                                end if;
813                                        when SI_SSR =>
814                                                wiz_addr <= W5300_S0_SSR + socket_cnt * W5300_S_INC;
815                                                if (ready_wi = '1') then 
816                                                        read_wi <= '1';
817                                                        state_init <= SI_IS_OPEN;
818                                                end if;
819                                        when SI_IS_OPEN =>
820                                                if (ready_wi = '1') then
821                                                        if (data_read (7 downto 0) = X"13") then -- is open?
822                                                                state_init <= SI_CR_LISTEN;
823                                                        else
824                                                                state_init <= SI_CR_OPEN;
825                                                        end if;
826                                                end if;
827                                        when SI_CR_LISTEN =>
828                                                wiz_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
829                                                wiz_data <= X"0002"; -- LISTEN
830                                                if (ready_wi = '1') then 
831                                                        write_wi <= '1';
832                                                        socket_cnt <= socket_cnt + 1;
833                                                        if (socket_cnt = 7) then
834                                                                socket_cnt <= 0;
835                                                                state_init <= ESTABLISH;
836                                                        else
837                                                                state_init <= SI_MR;
838                                                        end if;
839                                                end if;
840
841                                               
842                                  -- End Socket Init
843                                               
844                                        when ESTABLISH =>
845                                                state_sig <= X"07";
846                                                socks_waiting <= '1';
847                                                socks_connected <= '0';
848                                                wiz_addr <= W5300_S0_SSR + socket_cnt * W5300_S_INC;
849                                                if (ready_wi = '1') then 
850                                                        read_wi <= '1';
851                                                        state_init <= EST1;
852                                                end if;
853                                        when EST1 =>
854                                                state_sig <= X"08";
855                                                if (ready_wi = '1') then
856                                                        case data_read (7 downto 0) is
857                                                                when X"17" => -- established
858                                                                        if (socket_cnt = 7) then
859                                                                          socket_cnt <= 0;
860                                                                          busy <= '0';
861                                                                          state_init <= MAIN;
862                                                                          --state_init <= CONFIG_MEMORY_MANAGER;
863                                                                        else
864                                                                          socket_cnt <= socket_cnt + 1;
865                                                                          state_init <= ESTABLISH;
866                                                                        end if;
867                                                                when others =>
868                                                                        state_init <= ESTABLISH;
869                                                        end case;
870                                                end if;
871                                               
872                                        when CONFIG =>   -- Triggers are disabled here!
873                                          state_sig <= X"06";
874                                                trigger_enable_storage_sig <= trigger_enable_sig;                               -- store last value of this signal.
875                                                trigger_enable_sig <= '0';                                                                              --no triggers must occur, while configurating.
876                                                state_init <= WAIT_100NS;                                                                               
877                                               
878                                        -- this wait for 100ns is not entirely understood, maybe it is not even
879                                        -- necessary, but I guess under certain circumstances
880                                        -- DG might be triggered, just when I pull the trigger enable line low.
881                                        -- when I check no immediatly, if DG is in IDLE, it might *just* be.
882                                        -- but about to go into another state.
883                                        -- DG and WM live in different clock domains.
884                                        -- so I wait 100ns .. in order to let DG make one last transition out of IDLE
885                                        -- then in the next state I wait until Dg returns.
886                                        -- this must always happen, there is no way for DG to stay for a long time in any other state.
887                                                        -- in order to ensure this, the DG MM 'data was just written into RAM' handshake was tweaked!
888                                        when WAIT_100NS =>   
889                                                state_sig <= X"15";
890                                                wait_100ns_sig <= wait_100ns_sig + 1;
891                                                if (wait_100ns_sig = "100") then
892                                                        wait_100ns_sig <= "000";
893                                                        state_init <= WAIT_UNTIL_DG_IDLE;       
894                                                end if;
895                                               
896                                        when WAIT_UNTIL_DG_IDLE =>
897                                                state_sig <= X"16";
898                                                if (data_generator_idle_sr = "111") then
899                                                        state_init <= CONFIG_MEMORY_MANAGER;
900                                                        --state_init <= MAIN;
901                                                end if;
902                                       
903                                        when CONFIG_MEMORY_MANAGER =>
904                                          state_sig <= X"18";
905                                                memory_manager_config_start_o <= '1';
906                                                if (memory_manager_config_valid_i_sr = "00") then
907                                                        state_init <= WAIT_FOR_CONFIG_MEMORY_MANAGER;
908                                                end if;
909                                       
910                                        when WAIT_FOR_CONFIG_MEMORY_MANAGER =>
911                                          state_sig <= X"19";
912                                                memory_manager_config_start_o <= '0';
913                                                if (memory_manager_config_valid_i_sr(1) = '1') then
914                                                        trigger_enable_sig <= trigger_enable_storage_sig;
915                                                        state_init <= MAIN;
916                                                end if;
917                                       
918                                        when CONFIG_DAC_ONLY =>
919                                          state_sig <= X"1C";
920                                                spi_interface_config_start_o <= '1';
921                                                if (spi_interface_config_valid_i_sr ="00") then
922                                                        state_init <= WAIT_FOR_CONFIG_DAC_ONLY;
923                                                end if;
924                                               
925                                        when WAIT_FOR_CONFIG_DAC_ONLY =>
926                                          state_sig <= X"1D";
927                                                spi_interface_config_start_o <= '0';
928                                                if (spi_interface_config_valid_i_sr ="11") then
929                                                        state_init <= MAIN;
930                                                end if;
931                                                       
932----------------------------------------------------------------------------------
933-- MAIN "loop" -------------------------------------------------------------------
934----------------------------------------------------------------------------------
935         
936                                        when MAIN =>
937                                                state_sig <= X"20";
938                                                socks_waiting <= '0';
939                                                socks_connected <= '1';
940                                                ps_do_phase_shift <= '0';
941                                                ps_reset <= '0';
942                                                data_valid_ack <= '0';
943                                       
944                                               
945                                                if (update_of_rois = '1') then
946                                                        update_of_rois <= '0';
947                                                        state_init <= CONFIG;
948--                                                      if (trigger_enable_sig = '1') then
949--                                                              trigger_enable_storage_sig <= trigger_enable_sig;
950--                                                      end if;
951--                                                      trigger_enable_sig <= '0';
952--
953--                                                      update_of_rois <= '0';
954--                                                      state_init <= CONFIG_MEMORY_MANAGER;
955--                                                      if (data_ram_empty_sr(1) = '1') then
956--                                                              update_of_rois <= '0';
957--                                                              state_init <= CONFIG_MEMORY_MANAGER;
958--                                                      else
959--                                                              state_init <= MAIN2;
960--                                                      end if;
961                                                       
962                                                elsif (update_of_lessimportant = '1') then                             
963                                                        update_of_lessimportant <= '0';
964                                                        state_init <= CONFIG_DAC_ONLY;
965                                                else -- update_of_rois='0' and update_of_lessimportant='0'
966                                                        state_init <= MAIN1;
967                                                        --data_valid_int <= data_valid;
968                                                end if;
969                       
970                                        when MAIN1 =>
971                                          state_sig <= X"21";
972                                                if (chk_recv_cntr = 1000) then
973                                                        chk_recv_cntr <= 0;
974                                                        state_init <= READ_DATA;
975                                                        busy <= '1';
976                                                else
977                                                        chk_recv_cntr <= chk_recv_cntr + 1; 
978                                                        state_init <= MAIN2;
979                                                end if;
980                                        when MAIN2 =>
981                                          state_sig <= X"22";
982                                                busy <= '0';
983                                               
984                                                if (data_valid_sr(1) = '1') then
985                                                        busy <= '1';
986                                                        local_write_length <= write_length;
987                                                        local_ram_start_addr <= ram_start_addr;
988                                                        local_ram_addr <= (others => '0');
989                                                        local_write_header_flag <= write_header_flag;
990                                                        local_write_end_flag <= write_end_flag;
991                                                        local_fifo_channels <= fifo_channels;
992                                                        state_init <= MAIN3;
993                                                else
994                                                        state_init <= MAIN1; 
995                                                end if;
996                                        when MAIN3 =>
997                                          state_sig <= X"23";
998                                                -- needed for the check: if there is enough space in W5300 FIFO
999                                                write_length_bytes <= (local_write_length (15 downto 0) & '0')   ; -- shift left (*2)
1000                                                state_init <= WRITE_DATA;
1001                                               
1002                                               
1003----------------------------------------------------------------------------------
1004-- END OF MAIN         -----------------------------------------------------------
1005----------------------------------------------------------------------------------
1006
1007                                        -- read data from socket 0 
1008                                        when READ_DATA =>
1009                                                case state_read_data is
1010                                                when RD_1 =>
1011                                                  state_sig <= X"30";
1012                                                        if (ready_wi = '1') then 
1013                                                                wiz_addr <= W5300_S0_RX_RSR;
1014                                                                read_wi <= '1';
1015                                                                state_read_data <= RD_2;
1016                                                        end if;
1017                                                       
1018                                                when RD_2 =>
1019                                                  state_sig <= X"31";
1020                                                        if (ready_wi = '1') then
1021                                                                wiz_addr <= W5300_S0_RX_RSR + X"2";
1022                                                                read_wi <= '1';
1023                                                                socket_rx_received (16) <= data_read(0);
1024                                                                state_read_data <= RD_3;
1025                                                        end if;
1026                                                when RD_3 =>
1027                                                  state_sig <= X"32";
1028                                                        if (ready_wi = '1') then
1029                                                                socket_rx_received (15 downto 0) <= data_read;
1030                                                                state_read_data <= RD_4;
1031                                                        end if;
1032                                                       
1033                                                when RD_4 =>
1034                                                  state_sig <= X"33";
1035                                                        if (socket_rx_received (16 downto 0) > ('0' & X"000")) then
1036                                                                rx_packets_cnt <= socket_rx_received (16 downto 1); -- socket_rx_received / 2
1037                                                                state_read_data <= RD_5;
1038                                                        else
1039                                                                busy <= '0';
1040                                                                state_read_data <= RD_1;
1041                                                                state_init <= MAIN;
1042                                                        end if;
1043                                               
1044                                                when RD_5 =>
1045                                                  state_sig <= X"34";
1046                                                        s_trigger <= '0';
1047                                                        ps_do_phase_shift <= '0';
1048                                                        reset_trigger_id <= '0';
1049                                                       
1050                                                        if (rx_packets_cnt > 0) then
1051                                                                if (ready_wi = '1') then
1052                                                                        wiz_addr <= W5300_S0_RX_FIFOR;
1053                                                                        read_wi <= '1';
1054                                                                        rx_packets_cnt <= rx_packets_cnt - '1';
1055                                                                        state_read_data <= RD_6;
1056                                                                end if;
1057                                                        else
1058                                                                state_read_data <= RD_END;
1059                                                        end if;
1060                                                       
1061                                                when RD_6 =>
1062                                                  state_sig <= X"35";
1063                                                  if (ready_wi = '1') then
1064                                                                -- The next 16bit word is assumed to contain a 'command' so it is
1065                                                                -- beeing parsed in this state
1066                                                                case data_read (15 downto 8) is
1067                                                                when CMD_START =>
1068                                                                       
1069                                                                        state_read_data <= RD_5;
1070                                                                when CMD_STOP => 
1071                                                                       
1072                                                                        state_read_data <= RD_5;
1073                                                                when CMD_MODE_ALL_SOCKETS =>  -- all data will be send via socket 1..7
1074                                                                        socket_send_mode <= '1';
1075                                                                        state_read_data <= RD_5;
1076                                                                when CMD_MODE_COMMAND => -- all data will be send via socket 0
1077                                                                        socket_send_mode <= '0';
1078                                                                        state_read_data <= RD_5;   
1079                                                                when CMD_TRIGGER =>
1080                                                                        s_trigger <= '1';
1081                                                                        state_read_data <= RD_5;
1082                                                                when CMD_DWRITE_RUN =>
1083                                                                        dwrite_enable <= '1';
1084                                                                        state_read_data <= RD_5;
1085                                                                when CMD_DWRITE_STOP =>
1086                                                                        dwrite_enable <= '0';
1087                                                                        state_read_data <= RD_5;
1088                                                                when CMD_SCLK_ON =>
1089                                                                        sclk_enable <= '1';
1090                                                                        state_read_data <= RD_5;
1091                                                                when CMD_SCLK_OFF =>
1092                                                                        sclk_enable <= '0';
1093                                                                        state_read_data <= RD_5;
1094                                                                when CMD_DENABLE =>
1095                                                                        denable <= '1';
1096                                                                        state_read_data <= RD_5;
1097                                                                when CMD_DDISABLE =>
1098                                                                        denable <= '0';
1099                                                                        state_read_data <= RD_5;
1100                                                                when CMD_TRIGGER_C =>
1101                                                                        c_trigger_enable <= '1';
1102                                                                        state_read_data <= RD_5;
1103                                                                when CMD_TRIGGER_S =>
1104                                                                  c_trigger_enable <= '0';
1105                                                                  state_read_data <= RD_5;
1106
1107                                                                -- phase shift commands here:
1108                                                                when CMD_PS_DO =>
1109                                                                  ps_do_phase_shift <= '1';
1110                                                                  state_read_data <= RD_5;
1111                                                                when CMD_PS_DIRINC =>
1112                                                                  ps_direction <= '1';
1113                                                                  state_read_data <= RD_5;
1114                                                                when CMD_PS_RESET =>
1115                                                                  ps_reset <= '1';
1116                                                                  state_read_data <= RD_5;
1117                                                                when CMD_SRCLK_ON =>
1118                                                                  srclk_enable <= '1';
1119                                                                  state_read_data <= RD_5;
1120                                                                when CMD_SRCLK_OFF =>
1121                                                                  srclk_enable <= '0';
1122                                                                  state_read_data <= RD_5;
1123                                                                when CMD_TRIGGERS_ON =>
1124                                                                  trigger_enable_sig <= '1';
1125                                                                  state_read_data <= RD_5;
1126                                                                when CMD_TRIGGERS_OFF =>
1127                                                                  trigger_enable_sig <= '0';
1128                                                                  state_read_data <= RD_5;
1129                                                                when CMD_PS_DIRDEC =>
1130                                                                  ps_direction <= '0';
1131                                                                  state_read_data <= RD_5;
1132                                                                 
1133                                                                when CMD_RESET_TRIGGER_ID =>
1134                                                                        reset_trigger_id <= '1';
1135                                                                        state_read_data <= WAIT_FOR_TRIGGER_ID_RESET_1;
1136                                                                       
1137                                                                when CMD_WRITE =>
1138                                                                        config_addr <= conv_integer(data_read (7 downto 0));
1139                                                                        state_read_data <= READ_COMMAND_DATA_SECTION;
1140                                                                when others =>
1141                                                                        state_read_data <= RD_5;
1142                                                                end case;
1143                                                        end if;
1144                                                       
1145                                                when WAIT_FOR_TRIGGER_ID_RESET_1 =>
1146                                                  state_sig <= X"36";
1147                                                        state_read_data <= WAIT_FOR_TRIGGER_ID_RESET_2;
1148                                                when WAIT_FOR_TRIGGER_ID_RESET_2 =>
1149                                                  state_sig <= X"37";
1150                                                        state_read_data <= RD_5;
1151                                                -- these states are beeing processed, if the 'command' was a 'write command'
1152                                                --      so it is assumed, that some data in config RAM changed, and we need full (re)config
1153                                                when READ_COMMAND_DATA_SECTION =>
1154                                                  state_sig <= X"38";
1155                                                        if (rx_packets_cnt > 0) then
1156                                                                if (ready_wi = '1') then
1157                                                                        rx_packets_cnt <= rx_packets_cnt - '1';
1158                                                                        wiz_addr <= W5300_S0_RX_FIFOR;
1159                                                                        state_read_data <= PUT_COMMAND_DATA_SECTION;
1160                                                                end if;
1161                                                        else
1162                                                                state_read_data <= RD_END;
1163                                                        end if;
1164                       
1165                                                when PUT_COMMAND_DATA_SECTION =>
1166                                                        state_sig <= X"39";
1167                                                        if (ready_wi = '1') then
1168                                                                config_setting(config_addr) <= data_read;
1169                                                                if (config_addr < 36) then
1170                                                                        update_of_rois <= '1';
1171                                                                else 
1172                                                                        if (config_addr < 45 ) then
1173                                                                                update_of_lessimportant <= '1';
1174                                                                        end if;
1175                                                                end if;
1176                                                                state_read_data <= RD_5;
1177                                                        end if;
1178
1179                                                when RD_END =>
1180                                                        state_sig <= X"3A";
1181                                                       
1182                                                        if (ready_wi = '1') then
1183                                                                wiz_addr <= W5300_S0_CR;
1184                                                                wiz_data <= X"0040"; -- RECV
1185                                                                write_wi <= '1';
1186                                                                state_read_data <= RD_1;
1187                                                                state_init <= MAIN;
1188                                                        end if;
1189
1190                                                when others =>
1191                                                        state_sig <= X"3F";
1192                                                end case; -- state_data_read
1193               
1194-----------------------------------------------------------------------------------------------
1195-----------------------------------------------------------------------------------------------
1196-- WRITE DATA
1197-----------------------------------------------------------------------------------------------
1198-----------------------------------------------------------------------------------------------
1199
1200                                        when WRITE_DATA =>
1201                                                case state_write is
1202                                                       
1203                                                when WR_START =>
1204                                                    state_sig <= X"40";
1205                                                    if (local_write_header_flag = '1') then
1206                                                                ram_addr <= local_ram_start_addr + 6; -- Address of HIGH word of Event ID
1207                                                                state_write <= WR_GET_EVT_ID_WAIT1;
1208                                                        else
1209                                                        state_write <= WR_CHECK_FOR_FIFO_SPACE_01;
1210                                                    end if;
1211                                                     
1212                                                when WR_GET_EVT_ID_WAIT1 =>
1213                                                    state_sig <= X"41";
1214                                                    state_write <= WR_GET_EVT_ID1;
1215                                                when WR_GET_EVT_ID1 =>
1216                                                    state_sig <= X"42";
1217                                                        event_number(31 downto 16) <= ram_data;
1218                                                        ram_addr <= local_ram_start_addr + 9; -- Address of LOW word of Event ID
1219                                                        state_write <= WR_GET_EVT_ID_WAIT2;
1220                                                when WR_GET_EVT_ID_WAIT2 =>
1221                                                        state_write <= WR_GET_EVT_ID2;
1222                                                when WR_GET_EVT_ID2 =>
1223                                                        state_sig <= X"43";
1224                                                        event_number(15 downto 0) <= ram_data;
1225                                                        mod7_start <= '1';
1226                                                        if (mod7_valid = '0') then
1227                                                                state_write <= WR_MOD7_STARTED;
1228                                                        else
1229                                                                state_write <= WR_GET_EVT_ID2;
1230                                                        end if;
1231                                                when WR_MOD7_STARTED =>
1232                                                        state_sig <= X"44";
1233                                                        if (mod7_started = '1') then
1234                                                                mod7_start <= '0';
1235                                                                state_write <= WR_WAIT_FOR_MOD7;
1236                                                        end if;
1237                                                when WR_WAIT_FOR_MOD7 =>
1238                                                        state_sig <= X"45";
1239                                                        if (mod7_valid = '1') then
1240                                                                if (socket_send_mode = '1') then -- send via all sockets
1241                                                                        local_socket_nr <= mod7_result + 1;
1242                                                                else -- only send via socket 0\
1243                                                                        local_socket_nr <= "000";
1244                                                                end if;
1245                                                                data_cnt <= 0;
1246                                                                state_write <= WR_CHECK_FOR_FIFO_SPACE_01; 
1247                                                        else 
1248                                                                state_write <= WR_WAIT_FOR_MOD7;
1249                                                        end if;
1250                                                               
1251                                                        -- Check FIFO Size
1252                                                when WR_CHECK_FOR_FIFO_SPACE_01 =>
1253                                                        state_sig <= X"46";
1254                                                        if (ready_wi = '1') then
1255                                                                wiz_addr <= W5300_S0_TX_FSR + local_socket_nr * W5300_S_INC;
1256                                                                read_wi <= '1';
1257                                                                state_write <= WR_CHECK_FOR_FIFO_SPACE_02;
1258                                                        end if;
1259                                                       
1260                                                when WR_CHECK_FOR_FIFO_SPACE_02 =>
1261                                                        state_sig <= X"47";
1262                                                        if (ready_wi = '1') then
1263                                                                socket_tx_free (16) <= data_read(0);
1264                                                                wiz_addr <= W5300_S0_TX_FSR + (local_socket_nr * W5300_S_INC) + X"2";
1265                                                                state_write <= WR_CHECK_FOR_FIFO_SPACE_03;
1266                                                                read_wi <= '1';
1267                                                        end if
1268                                                       
1269                                                when WR_CHECK_FOR_FIFO_SPACE_03 =>
1270                                                        state_sig <= X"48";
1271                                                        if (ready_wi = '1') then
1272                                                                socket_tx_free (15 downto 0) <= data_read;
1273                                                                state_write <= WR_CHECK_FOR_FIFO_SPACE_04;
1274                                                        end if;
1275                                                       
1276                                                when WR_CHECK_FOR_FIFO_SPACE_04 =>
1277                                                        state_sig <= X"49";
1278--                                                              if (socket_tx_free (16 downto 0) < write_length_bytes) then
1279                                                        if (socket_tx_free (16 downto 0) < W5300_TX_FIFO_SIZE_8B) then
1280                                                       
1281                                                                state_write <= WR_CHECK_FOR_FIFO_SPACE_01;
1282                                                        else
1283                                                                if (local_write_header_flag = '1') then
1284                                                                        state_write <= WR_HEADER_FETCH_1ST;
1285                                                                else
1286                                                                        state_write <= WR_ADC;
1287                                                                end if; 
1288                                                        end if;
1289                                                       
1290                                                        -- Fill FIFO
1291
1292                                                ------------------------------------------------
1293                                                -- Write Header
1294                                                ------------------------------------------------
1295                                                -- at this point we will write data from RAM directly into the W5300 TX FIFO
1296                                                -- after the we got the data from RAM
1297                                                --      and we made sure wi is ready to transmit
1298                                                --      we give the order to transmit: write_wi <= '1'
1299                                                -- after giving this order we can immediatly ask new data from RAM and
1300                                                -- return to WR_HEADER
1301                                                when WR_HEADER_FETCH =>
1302                                                        state_sig <= X"4A";
1303                                                        ram_addr <= local_ram_start_addr + local_ram_addr;
1304                                                        state_write <= WR_HEADER_WAIT_1ST;
1305                                               
1306                                                when WR_HEADER_WAIT =>
1307                                                        state_write <= WR_HEADER;
1308                                                       
1309                                                when WR_HEADER =>
1310                                                        state_sig <= X"4B";
1311                                                        if (ready_wi = '1') then
1312                                                                wiz_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1313                                                                wiz_data <= ram_data;
1314                                                                number_of_words_written_to_fifo <= number_of_words_written_to_fifo + 1;
1315                                                                data_cnt <= data_cnt + 1;
1316                                                                local_ram_addr <= local_ram_addr + 1;
1317                                                                write_wi <= '1';
1318                                                               
1319                                                                if (data_cnt < PACKAGE_HEADER_LENGTH) then
1320                                                                        state_write <= WR_HEADER_FETCH;
1321                                                                else
1322                                                                        state_write <= WR_ADC;
1323                                                                end if;
1324                                                        end if;
1325                                                        -- End Write Header
1326                                                       
1327                                                ------------------------------------------------
1328                                                -- Write ADC
1329                                                ------------------------------------------------
1330                                                -- Writing of ADC data is performed in a manner such that, groups of DRS channels
1331                                                -- with equal channel indices fit completely into W5300 FIFO
1332                                                -- note:
1333                                                        -- drs index            : counts from 0 to 3
1334                                                        -- channel index        : counts from 0 to 9
1335                                                -- e.g. when the ROI is large, not the whole event data fits completly
1336                                                -- into the FIFO
1337                                                -- in this case the Header is written first,
1338                                                -- followed by the channels with index = 0 of all 4 DRS chips.
1339                                                -- and further followed by the channels, having index = 1 of all DRS chips.
1340                                                -- the channels are written 'side-by-side' into the data ram, using the 64bit input.
1341                                                -- but they are read out 'as if written consecutivly'
1342                                                -- so the address needs to be calculated like this
1343                                                -- addr(n+1) = addr(n) + 4; instead of
1344                                                -- addr(n+1) = addr(n) + 1 in case of the header.
1345                                               
1346                                                when WR_ADC =>
1347                                                        state_sig <= X"4C";
1348                                                       
1349                                                        -- when this line is executed for the first time adc_data_address points
1350                                                        -- to the beginning of a channel header. e.g. to 0x0000 or 0x0039
1351                                                        adc_data_addr <= local_ram_start_addr + local_ram_addr;
1352                                                       
1353                                                        drs_cnt <= 0;           -- counts the chis form 0..3
1354                                                        data_cnt <= 0;          -- counts the words in the ADC data channel group
1355                                                        channel_cnt <= 1;       -- counts the number of channels which fit into W5300 FIFO at once.
1356                                                       
1357                                                        roi_max <= (others => '0');
1358                                                        data_end <= POSITION_OF_ROI_IN_CHANNEL_HEADER;
1359                                                        state_write <= WR_ADC1;
1360
1361                                                ---- Write Channel
1362                                                when WR_ADC1 =>
1363                                                        state_sig <= X"4D";
1364                                                        -- read ROI and set end of Channel-Data
1365                                                       
1366                                                        -- when this line is executed for the first time it points to
1367                                                        -- the beginning of a channel header, as well.
1368                                                        ram_addr <= adc_data_addr + drs_cnt + (data_cnt * 4);
1369                                                        if (data_cnt = POSITION_OF_ROI_IN_CHANNEL_HEADER) then
1370                                                                data_end <= conv_integer (ram_data) + CHANNEL_HEADER_SIZE;
1371                                                                if (ram_data > roi_max) then
1372                                                                        roi_max <= ram_data (10 downto 0);
1373                                                                end if;
1374                                                        end if;
1375                                                        state_write <= WR_ADC2;
1376                                                       
1377                                                when WR_ADC2 =>
1378                                                        if (data_cnt < data_end) then
1379                                                                if (ready_wi = '1') then
1380                                                                        wiz_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1381                                                                        wiz_data <= ram_data;
1382                                                                        write_wi = '1';
1383                                                                        number_of_words_written_to_fifo <= number_of_words_written_to_fifo + 1;
1384                                                                        data_cnt <= data_cnt + 1;
1385                                                                        state_write <= WR_ADC1;
1386                                                                end if;
1387                                                        else
1388                                                                -- Next DRS
1389                                                                if (drs_cnt < 3) then
1390                                                                        drs_cnt <= drs_cnt + 1;
1391                                                                        data_cnt <= 0;
1392                                                                        data_end <= POSITION_OF_ROI_IN_CHANNEL_HEADER;
1393                                                                        state_write <= WR_ADC1;
1394                                                                else
1395                                                                        -- Next Channel
1396                                                                        if (channel_cnt < local_fifo_channels) then
1397                                                                                channel_cnt <= channel_cnt + 1;
1398                                                                                roi_max <= (others => '0');
1399                                                                                drs_cnt <= 0;
1400                                                                                data_cnt <= 0;
1401                                                                                data_end <= POSITION_OF_ROI_IN_CHANNEL_HEADER;
1402                                                                                adc_data_addr <= adc_data_addr + ((conv_integer(roi_max) + CHANNEL_HEADER_SIZE) * 4);
1403                                                                                state_write <= WR_ADC1;
1404                                                                        else
1405                                                                                -- Ready
1406                                                                                if (local_write_end_flag = '1') then
1407                                                                                        ram_addr <= adc_data_addr + ((conv_integer(roi_max) + CHANNEL_HEADER_SIZE) * 4);
1408                                                                                        state_write <= WR_ENDFLAG_WAIT;
1409                                                                                else
1410                                                                                        state_write <= WR_STRANGE_WAIT;
1411                                                                                end if;
1412                                                                        end if;
1413                                                                end if;   
1414                                                        end if;
1415                                                        -- End Write ADC-Data
1416
1417                                                -- Write End Package Flag
1418                                                when WR_ENDFLAG_WAIT =>
1419                                                        state_write <= WR_ENDFLAG;
1420                                                when WR_ENDFLAG =>                             
1421                                                        if (ready_wi = '1') then
1422                                                                wiz_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1423                                                                wiz_data <= ram_data;
1424                                                                write_wi = '1';
1425                                                                number_of_words_written_to_fifo <= number_of_words_written_to_fifo + 1;                                 
1426                                                                ram_addr <= adc_data_addr + ((conv_integer(roi_max) + CHANNEL_HEADER_SIZE) * 4) + 1;
1427                                                                state_write <= WR_ENDFLAG2_WAIT;
1428                                                        end if;
1429                                                when WR_ENDFLAG2_WAIT =>
1430                                                        state_write <= WR_ENDFLAG2;
1431                               
1432                                                when WR_ENDFLAG2 =>
1433                                                        if (ready_wi = '1') then
1434                                                                wiz_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1435                                                                wiz_data <= ram_data;
1436                                                                write_wi = '1';
1437                                                                number_of_words_written_to_fifo <= number_of_words_written_to_fifo + 1;
1438                                                                state_write <= WR_STRANGE_WAIT;
1439                                                        end if;
1440             
1441                                                when WR_STRANGE_WAIT =>
1442                                                        if (wait_cntr < 10) then -- 3000 works???
1443                                                                wait_cntr <= wait_cntr + 1;
1444                                                        else
1445                                                                wait_cntr <= 0;
1446                                                                state_write <= WR_05_PREPARE_LENGTH_INFO;
1447                                                        end if;
1448                                                --Send FIFO     
1449                                                when WR_05_PREPARE_LENGTH_INFO =>
1450                                                        --number_of_words_written_to_fifo <= number_of_words_written_to_fifo - 1;
1451                                                        state_write <= WR_05_POSTPREPARE_LENGTH_INFO;
1452                                                when WR_05_POSTPREPARE_LENGTH_INFO =>
1453                                                        number_of_bytes_written_to_fifo <= number_of_words_written_to_fifo(15 downto 0) & '0';   
1454                                                        state_write <= WR_MESSAGE_LEN_HIGH_WORD;
1455                                                       
1456                                                when WR_MESSAGE_LEN_HIGH_WORD =>
1457                                                        if (ready_i = '1') then
1458                                                                wiz_addr <= W5300_S0_TX_WRSR + local_socket_nr * W5300_S_INC;
1459                                                                wiz_data <= (0 => write_length_bytes (16), others => '0');
1460                                                                --wiz_data <= (0 => number_of_bytes_written_to_fifo(16), others => '0');
1461                                                                state_write <= WR_MESSAGE_LEN_LOW_WORD;
1462                                                        end if;
1463                                                               
1464                                                when WR_MESSAGE_LEN_LOW_WORD =>
1465                                                        if (ready_wi= '1') then
1466                                                                wiz_addr <= W5300_S0_TX_WRSR + (local_socket_nr * W5300_S_INC) + X"2";
1467                                                                wiz_data <= write_length_bytes (15 downto 0);
1468                                                                --wiz_data <= number_of_bytes_written_to_fifo(15 downto 0);
1469                                                                state_write <= WR_SEND_COMMAND;
1470                                                        end if;
1471
1472                                                when WR_SEND_COMMAND =>
1473                                                        number_of_words_written_to_fifo <= (others => '0');
1474                                                        if (ready_wi <= '1') then
1475                                                                wiz_addr <= W5300_S0_CR + local_socket_nr * W5300_S_INC;
1476                                                                wiz_data <= X"0020"; -- Send
1477                                                                write_wi <= '1';
1478                                                        end if
1479                                                        state_write <= WR_ACK;
1480                                               
1481                                                when WR_ACK =>
1482                                                        data_valid_ack <= '1';
1483                                                        state_write <= WR_WAIT_FOR_ACK;
1484                                               
1485                                                when WR_WAIT_FOR_ACK =>
1486                                                        state_write <= WR_WAIT_FOR_ACK;
1487                                                        if (data_valid_sr(1) = '0') then
1488                                                                data_valid_ack <= '0';
1489                                                               
1490                                                                state_write <= WR_START;
1491                                                                state_init <= MAIN;
1492                                                                -- maybe MAIN1 is better ?!
1493                                                        end if;
1494                                                       
1495                                               
1496                                                when others =>
1497                                                        null;
1498                                                end case;
1499                                                -- End WRITE_DATA
1500                                               
1501                               
1502                                        when others =>
1503                                                null;
1504                                end case;
1505                        end if; -- int_flag = '0'
1506
1507                end if; -- rising_edge (clk)
1508
1509        end process w5300_proc;
1510
1511end Behavioral;
1512
Note: See TracBrowser for help on using the repository browser.