source: firmware/FTM/ethernet/w5300_modul.vhd@ 10930

Last change on this file since 10930 was 10803, checked in by weitzel, 14 years ago
FTM: crate reset implemented
File size: 51.4 KB
Line 
1----------------------------------------------------------------------------------
2-- Company:
3-- Engineer:
4--
5-- Create Date: 11:48:48 11/10/2009
6-- Design Name:
7-- Module Name: w5300_modul - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description:
12--
13-- Dependencies:
14--
15-- Revision:
16-- Revision 0.01 - File Created
17-- Additional Comments:
18--
19----------------------------------------------------------------------------------
20
21LIBRARY IEEE;
22USE IEEE.STD_LOGIC_1164.all;
23USE IEEE.STD_LOGIC_ARITH.all;
24USE IEEE.STD_LOGIC_UNSIGNED.all;
25
26library ftm_definitions;
27USE ftm_definitions.ftm_array_types.all;
28USE ftm_definitions.ftm_constants.all;
29
30-- Uncomment the following library declaration if instantiating
31-- any Xilinx primitives in this code.
32library UNISIM;
33use UNISIM.VComponents.all;
34
35ENTITY w5300_modul IS
36 PORT(
37 clk : IN std_logic;
38 wiz_reset : OUT std_logic := '1';
39 addr : OUT std_logic_vector (9 DOWNTO 0);
40 data : INOUT std_logic_vector (15 DOWNTO 0);
41 cs : OUT std_logic := '1';
42 wr : OUT std_logic := '1';
43 led : OUT std_logic_vector (7 DOWNTO 0) := (others => '0');
44 rd : OUT std_logic := '1';
45 int : IN std_logic;
46 busy : OUT std_logic := '1';
47 new_config : OUT std_logic := '0';
48 config_started : IN std_logic;
49 config_started_ack : OUT std_logic := '0';
50 --
51 ping_ftu_start : OUT std_logic := '0';
52 ping_ftu_started : IN std_logic;
53 ping_ftu_ready : IN std_logic;
54 --
55 sd_addr : OUT std_logic_vector (11 DOWNTO 0);
56 sd_data_out : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
57 sd_data_in : IN std_logic_vector (15 DOWNTO 0);
58 sd_write : OUT std_logic := '0';
59 sd_read : OUT std_logic := '0';
60 sd_started : IN std_logic;
61 sd_ready : IN std_logic;
62 sd_busy : IN std_logic;
63 --
64 dd_block_start : OUT std_logic := '0';
65 dd_block_start_ack : IN std_logic;
66 dd_block_ready : OUT std_logic := '1';
67 dd_send : IN std_logic;
68 dd_send_ack : OUT std_logic := '1';
69 dd_send_ready : OUT std_logic := '1';
70 dd_addr : OUT std_logic_vector (11 DOWNTO 0);
71 dd_data_in : IN std_logic_vector (15 DOWNTO 0);
72 dd_read : OUT std_logic := '0';
73 dd_started : IN std_logic;
74 dd_ready : IN std_logic;
75 dd_busy : IN std_logic;
76 dd_write_general : OUT std_logic := '0';
77 dd_write_general_started : IN std_logic;
78 dd_write_general_ready : IN std_logic;
79 --
80 fl_addr : OUT std_logic_vector (11 DOWNTO 0);
81 fl_data_in : IN std_logic_vector (15 DOWNTO 0);
82 fl_read : OUT std_logic := '0';
83 fl_started : IN std_logic;
84 fl_ready : IN std_logic;
85 fl_busy : IN std_logic;
86 --
87 ftu_error_send : IN std_logic;
88 ftu_error_send_ack : OUT std_logic := '1';
89 ftu_error_send_ready : OUT std_logic := '1';
90 ftu_error_calls : IN std_logic_vector (15 DOWNTO 0);
91 ftu_error_data : IN std_logic_vector (223 DOWNTO 0); -- (28 * 8) - 1
92 --
93 get_header : OUT std_logic := '0';
94 get_header_started : IN std_logic;
95 get_header_ready : IN std_logic;
96 header_board_id : IN std_logic_vector (63 DOWNTO 0);
97 header_firmware_id : IN std_logic_vector (15 DOWNTO 0);
98 header_trigger_counter : IN std_logic_vector (31 DOWNTO 0);
99 header_timestamp_counter : IN std_logic_vector (47 DOWNTO 0);
100 header_current_state : IN std_logic_vector (15 DOWNTO 0);
101 --
102 start_run : OUT std_logic := '0';
103 start_run_ack : IN std_logic;
104 start_run_param : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
105 start_run_num_events : OUT std_logic_vector (31 DOWNTO 0) := (others => '0');
106 stop_run : OUT std_logic := '0';
107 stop_run_ack : IN std_logic;
108 crate_reset : OUT std_logic := '0';
109 crate_reset_ack : IN std_logic;
110 crate_reset_param : OUT std_logic_vector (15 DOWNTO 0) := (others => '0')
111 );
112END w5300_modul ;
113
114architecture Behavioral of w5300_modul is
115
116 type state_init_type is (INTERRUPT, RESET, WRITE_REG, READ_REG, WRITE_DATA,
117 INIT, IM, MT, STX, STX1, STX2, STX3, SRX, SRX1, SRX2, SRX3, MAC, MAC1, MAC2, GW, GW1, SNM, SNM1, IP, IP1, TIMEOUT, RETRY,
118 SI, SI0, SI1, SI2, SI3, SI4, SI5, SI6, ESTABLISH, EST1, CONFIG, MAIN, MAIN1, MAIN2, MAIN3, CHK_RECEIVED, SEND_FTU_ERROR,
119 READ_DATA, WRITE_TO_SD_ADDR, READ_FTU_ERROR, READ_DD_BLOCK, READ_FROM_SD_ADDR, READ_FROM_DD_ADDR, READ_FROM_FL_ADDR, READ_FROM_HEADER_MODUL);
120 type state_write_type is (WR_START, WR_LENGTH, WR_01, WR_02, WR_03, WR_04, WR_05, WR_06, WR_07, WR_08,
121 WR_WRITE_START_DEL, WR_GET_HEADER, WR_GET_HEADER_WAIT, WR_SD_ADDR, WR_FIFO_DATA, WR_FIFO_DATA_01, WR_FIFO_HEADER, WR_FIFO_HEADER_01, WR_WRITE_END_DEL);
122 type state_interrupt_1_type is (IR1_01, IR1_02, IR1_03, IR1_04);
123 type state_interrupt_2_type is (IR2_01, IR2_02, IR2_03, IR2_04, IR2_05, IR2_06);
124 type state_read_data_type is (RD_1, RD_2, RD_3, RD_4, RD_5, RD_CMD, RD_CMD_PARSE, RD_PING, RD_WRITE_SD_ADDR, RD_READ_SD_ADDR, RD_READ_SD_BLOCK, RD_WRITE_SD_BLOCK, RD_X_EVNTS,RD_END);
125 type state_write_sd_type is (WRITE_SD_START, WRITE_SD_WAIT, WRITE_SD_END);
126 type state_read_sd_type is (READ_SD_START, READ_SD_WAIT, READ_SD_END);
127 type state_read_fl_type is (READ_FL_START, READ_FL_WAIT, READ_FL_END);
128 type state_ping_type is (PING_START, PING_WAIT, PING_WRITE_LIST);
129 type state_read_dd_type is (READ_DD_START, READ_DD_WAIT, READ_DD_END);
130 type state_read_dd_block_type is (READ_DD_BLOCK_START, READ_DD_BLOCK_WRITE_GENERAL, READ_DD_BLOCK_WRITE, READ_DD_BLOCK_END, READ_DD_BLOCK_INTERN);
131 type state_send_ftu_error_type is (SFE_START, SFE_END);
132 type state_rd_x_evnts_type is (RD_X_01, RD_X_02, RD_X_03);
133
134 signal RST_TIME : std_logic_vector(19 downto 0) := X"7A120";
135
136 signal par_addr : std_logic_vector (9 downto 0) := (others => '0');
137 signal par_data : std_logic_vector (15 downto 0) := (others => '0');
138 signal data_read : std_logic_vector (15 downto 0) := (others => '0');
139
140 signal state_init, next_state , next_state_tmp : state_init_type := RESET;
141 signal read_addr_state : state_init_type := RESET;
142 signal count : std_logic_vector (2 downto 0) := "000";
143 signal state_write : state_write_type := WR_START;
144 signal state_interrupt_1 : state_interrupt_1_type := IR1_01;
145 signal state_interrupt_2 : state_interrupt_2_type := IR2_01;
146 signal state_read_data : state_read_data_type := RD_1;
147 signal next_state_read_data : state_read_data_type := RD_CMD;
148 signal state_write_sd : state_write_sd_type := WRITE_SD_START;
149 signal state_read_sd : state_read_sd_type := READ_SD_START;
150 signal state_read_fl : state_read_fl_type := READ_FL_START;
151 signal state_ping : state_ping_type := PING_START;
152 signal state_read_dd : state_read_dd_type := READ_DD_START;
153 signal state_read_dd_block : state_read_dd_block_type := READ_DD_BLOCK_START;
154 signal state_send_ftu_error : state_send_ftu_error_type := SFE_START;
155 signal state_rd_x_evnts : state_rd_x_evnts_type := RD_X_01;
156
157 signal interrupt_ignore : std_logic := '1';
158 signal int_flag : std_logic := '0';
159
160 signal zaehler : std_logic_vector (19 downto 0) := (others => '0');
161 signal data_cnt : integer := 0;
162 signal header_cnt : std_logic_vector (7 DOWNTO 0) := X"00";
163 signal socket_cnt : std_logic_vector (2 downto 0) := "000";
164
165 signal socket_tx_free : std_logic_vector (31 downto 0) := (others => '0');
166 signal write_length_bytes : std_logic_vector (16 downto 0);
167
168 signal socket_rx_received : std_logic_vector (31 downto 0) := (others => '0');
169 signal chk_recv_cntr : integer range 0 to 10000 := 0;
170
171 signal next_packet_data_cnt : integer range 0 to 4095 := 0;
172 signal rx_packets_cnt : std_logic_vector (15 downto 0) := X"0000";
173 signal new_config_flag : std_logic := '0';
174
175 signal local_write_length : std_logic_vector (16 downto 0);
176 signal local_socket_nr : std_logic_vector (2 downto 0);
177
178 type cmd_array_type is array (0 to 4) of std_logic_vector (15 downto 0);
179 signal cmd_array : cmd_array_type;
180 signal internal_cmd : std_logic := '0';
181 signal wait_for_data_flag : std_logic := '0';
182
183 signal autosend_flag : std_logic := '1';
184
185 -- -- --
186 signal led_int : std_logic_vector (7 downto 0) := X"00";
187 signal led_cnt : integer range 0 to 2**22 := 0;
188 -- -- --
189
190 signal local_sd_addr : std_logic_vector (11 downto 0);
191 signal local_sd_data : std_logic_vector (15 downto 0);
192
193 signal data_package_type : std_logic_vector (15 downto 0) := X"0000";
194 signal data_package_length : std_logic_vector (15 downto 0) := X"0000";
195
196
197begin
198
199 --synthesis translate_off
200 RST_TIME <= X"00120";
201 --synthesis translate_on
202
203
204 w5300_init_proc : process (clk, int)
205 begin
206
207 if rising_edge (clk) then
208
209 -- -- --
210 led <= led_int;
211 -- -- --
212
213 -- Interrupt low
214 if (int = '0') and (interrupt_ignore = '0') then
215 case state_interrupt_1 is
216 when IR1_01 =>
217 int_flag <= '1';
218 busy <= '1';
219 state_interrupt_1 <= IR1_02;
220 when IR1_02 =>
221 state_interrupt_1 <= IR1_03;
222 when IR1_03 =>
223 state_init <= INTERRUPT;
224 socket_cnt <= "000";
225 zaehler <= X"00000";
226 count <= "000";
227 int_flag <= '0';
228 interrupt_ignore <= '1';
229 state_interrupt_1 <= IR1_04;
230 when others =>
231 null;
232 end case;
233 end if; -- int = '0'
234
235 if int_flag = '0' then
236 case state_init is
237 -- Interrupt
238 when INTERRUPT =>
239 case state_interrupt_2 is
240 when IR2_01 =>
241 par_addr <= W5300_IR;
242 state_init <= READ_REG;
243 next_state <= INTERRUPT;
244 state_interrupt_2 <= IR2_02;
245 when IR2_02 =>
246 if (data_read (conv_integer(socket_cnt)) = '1') then -- Sx Interrupt
247 state_interrupt_2 <= IR2_03;
248 else
249 socket_cnt <= socket_cnt + 1;
250 if (socket_cnt = W5300_LAST_SOCKET) then
251 state_interrupt_2 <= IR2_06;
252 else
253 state_interrupt_2 <= IR2_02;
254 end if;
255 end if;
256 when IR2_03 =>
257 par_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC; -- Sx Interrupt Register
258 state_init <= READ_REG;
259 next_state <= INTERRUPT;
260 state_interrupt_2 <= IR2_04;
261 when IR2_04 =>
262 par_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC;
263 par_data <= data_read; -- clear Interrupts
264 state_init <= WRITE_REG;
265 next_state <= INTERRUPT;
266 state_interrupt_2 <= IR2_05;
267 when IR2_05 =>
268 par_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
269 par_data <= X"0010"; -- CLOSE
270 state_init <= WRITE_REG;
271 next_state <= INTERRUPT;
272 socket_cnt <= socket_cnt + 1;
273 if (socket_cnt = W5300_LAST_SOCKET) then
274 state_interrupt_2 <= IR2_06;
275 else
276 state_interrupt_2 <= IR2_01;
277 end if;
278
279 when IR2_06 =>
280 state_interrupt_1 <= IR1_01;
281 state_interrupt_2 <= IR2_01;
282 socket_cnt <= "000";
283 state_init <= RESET;
284 end case;
285
286 -- reset W5300
287 when RESET =>
288 busy <= '1';
289 zaehler <= zaehler + 1;
290 wiz_reset <= '0';
291 if (zaehler >= X"00064") then -- wait 2µs
292 wiz_reset <= '1';
293 end if;
294 if (zaehler = RST_TIME) then -- wait 10ms
295 zaehler <= X"00000";
296 socket_cnt <= "000";
297 count <= "000";
298 interrupt_ignore <= '0';
299 rd <= '1';
300 wr <= '1';
301 cs <= '1';
302 -- reset states
303 state_write <= WR_START;
304 state_init <= INIT;
305 state_read_data <= RD_1;
306 next_state_read_data <= RD_CMD;
307 state_write_sd <= WRITE_SD_START;
308 state_read_sd <= READ_SD_START;
309 state_read_fl <= READ_FL_START;
310 state_ping <= PING_START;
311 state_read_dd <= READ_DD_START;
312 state_read_dd_block <= READ_DD_BLOCK_START;
313 state_send_ftu_error <= SFE_START;
314 -- reset output signals
315 new_config <= '0';
316 config_started_ack <= '1';
317 ping_ftu_start <= '0';
318 sd_write <= '0';
319 sd_read <= '0';
320 dd_block_start <= '0';
321 dd_block_ready <= '1';
322 dd_send_ack <= '1';
323 dd_send_ready <= '1';
324 dd_read <= '0';
325 dd_write_general <= '0';
326 fl_read <= '0';
327 ftu_error_send_ack <= '1';
328 ftu_error_send_ready <= '1';
329 -- set internal signals
330 new_config_flag <= '0';
331 chk_recv_cntr <= 0;
332 next_packet_data_cnt <= 0;
333 internal_cmd <= '0';
334 -- -- --
335 led_int <= X"00";
336 -- -- --
337 end if;
338
339 -- Init
340 when INIT =>
341 par_addr <= W5300_MR;
342 par_data <= X"0000";
343 state_init <= WRITE_REG;
344 next_state <= IM;
345
346 -- Interrupt Mask
347 when IM =>
348 par_addr <= W5300_IMR;
349 par_data <= X"00FF"; -- S0-S7 Interrupts
350 state_init <= WRITE_REG;
351 next_state <= MT;
352
353 -- Memory Type
354 when MT =>
355 par_addr <= W5300_MTYPER;
356 par_data <= X"00FF"; -- 64K RX, 64K TX-Buffer
357 state_init <= WRITE_REG;
358 next_state <= STX;
359
360 -- Socket TX Memory Size
361 when STX =>
362 par_data <= X"4000"; -- 64K TX for socket 0, others 0
363
364 par_addr <= W5300_TMS01R;
365 state_init <= WRITE_REG;
366 next_state <= STX1;
367 when STX1 =>
368 par_data <= X"0000";
369 par_addr <= W5300_TMS23R;
370 state_init <= WRITE_REG;
371 next_state <= STX2;
372 when STX2 =>
373 par_addr <= W5300_TMS45R;
374 state_init <= WRITE_REG;
375 next_state <= STX3;
376 when STX3 =>
377 par_addr <= W5300_TMS67R;
378 state_init <= WRITE_REG;
379 next_state <= SRX;
380
381 -- Socket RX Memory Size
382 when SRX =>
383 par_data <= X"4000"; -- 64K RX for socket 0, others 0
384
385 par_addr <= W5300_RMS01R;
386 state_init <= WRITE_REG;
387 next_state <= SRX1;
388 when SRX1 =>
389 par_data <= X"0000";
390 par_addr <= W5300_RMS23R;
391 state_init <= WRITE_REG;
392 next_state <= SRX2;
393 when SRX2 =>
394 par_addr <= W5300_RMS45R;
395 state_init <= WRITE_REG;
396 next_state <= SRX3;
397 when SRX3 =>
398 par_addr <= W5300_RMS67R;
399 state_init <= WRITE_REG;
400 next_state <= MAC;
401
402 -- MAC
403 when MAC =>
404 par_addr <= W5300_SHAR;
405 par_data <= MAC_ADDRESS (0);
406 state_init <= WRITE_REG;
407 next_state <= MAC1;
408 when MAC1 =>
409 par_addr <= W5300_SHAR + 2;
410 par_data <= MAC_ADDRESS (1);
411 state_init <= WRITE_REG;
412 next_state <= MAC2;
413 when MAC2 =>
414 par_addr <= W5300_SHAR + 4;
415 par_data <= MAC_ADDRESS (2);
416 state_init <= WRITE_REG;
417 next_state <= GW;
418
419 -- Gateway
420 when GW =>
421 par_addr <= W5300_GAR;
422 par_data (15 downto 8) <= conv_std_logic_vector(GATEWAY (0), 8);
423 par_data (7 downto 0) <= conv_std_logic_vector(GATEWAY (1), 8);
424 state_init <= WRITE_REG;
425 next_state <= GW1;
426 when GW1 =>
427 par_addr <= W5300_GAR + 2;
428 par_data (15 downto 8) <= conv_std_logic_vector(GATEWAY (2), 8);
429 par_data (7 downto 0) <= conv_std_logic_vector(GATEWAY (3), 8);
430 state_init <= WRITE_REG;
431 next_state <= SNM;
432
433 -- Subnet Mask
434 when SNM =>
435 par_addr <= W5300_SUBR;
436 par_data (15 downto 8) <= conv_std_logic_vector(NETMASK (0), 8);
437 par_data (7 downto 0) <= conv_std_logic_vector(NETMASK (1), 8);
438 state_init <= WRITE_REG;
439 next_state <= SNM1;
440 when SNM1 =>
441 par_addr <= W5300_SUBR + 2;
442 par_data (15 downto 8) <= conv_std_logic_vector(NETMASK (2), 8);
443 par_data (7 downto 0) <= conv_std_logic_vector(NETMASK (3), 8);
444 state_init <= WRITE_REG;
445 next_state <= IP;
446 -- Own IP-Address
447 when IP =>
448 par_addr <= W5300_SIPR;
449 par_data (15 downto 8) <= conv_std_logic_vector(IP_ADDRESS (0), 8);
450 par_data (7 downto 0) <= conv_std_logic_vector(IP_ADDRESS (1), 8);
451 state_init <= WRITE_REG;
452 next_state <= IP1;
453 when IP1 =>
454 par_addr <= W5300_SIPR + 2;
455 par_data (15 downto 8) <= conv_std_logic_vector(IP_ADDRESS (2), 8);
456 par_data (7 downto 0) <= conv_std_logic_vector(IP_ADDRESS (3), 8);
457 state_init <= WRITE_REG;
458 next_state <= SI;
459 -- Socket Init
460 when SI =>
461 par_addr <= W5300_S0_MR + socket_cnt * W5300_S_INC;
462 par_data <= X"0101"; -- 0x0101: ALIGN, TCP
463 state_init <= WRITE_REG;
464 next_state <= SI0;
465 -- keep alive
466 when SI0 =>
467 par_addr <= W5300_S0_KPALVTR + socket_cnt * W5300_S_INC;
468 par_data <= X"0C00"; -- 12 * 5s = 60s
469 state_init <= WRITE_REG;
470 next_state <= SI1;
471 -- Sx Interrupt Mask
472 when SI1 =>
473 par_addr <= W5300_S0_IMR + socket_cnt * W5300_S_INC;
474 par_data <= X"000A"; -- TIMEOUT, DISCON
475 state_init <= WRITE_REG;
476 next_state <= SI2;
477 when SI2 =>
478 par_addr <= W5300_S0_PORTR + socket_cnt * W5300_S_INC;
479 par_data <= conv_std_logic_vector(FIRST_PORT + unsigned (socket_cnt), 16);
480 state_init <= WRITE_REG;
481 next_state <= SI3;
482 when SI3 =>
483 par_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
484 par_data <= X"0001"; -- OPEN
485 state_init <= WRITE_REG;
486 next_state <= SI4;
487 when SI4 =>
488 par_addr <= W5300_S0_SSR + socket_cnt * W5300_S_INC;
489 state_init <= READ_REG;
490 next_state <= SI5;
491 when SI5 =>
492 if (data_read (7 downto 0) = X"13") then -- is open?
493 state_init <= SI6;
494 else
495 state_init <= SI4;
496 end if;
497 when SI6 =>
498 par_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
499 par_data <= X"0002"; -- LISTEN
500 state_init <= WRITE_REG;
501 socket_cnt <= socket_cnt + 1;
502 if (socket_cnt = W5300_LAST_SOCKET) then
503 socket_cnt <= "000";
504 next_state <= ESTABLISH; -- All Sockets open
505 else
506 next_state <= SI; -- Next Socket
507 end if;
508 -- End Socket Init
509
510 when ESTABLISH =>
511 par_addr <= W5300_S0_SSR + socket_cnt * W5300_S_INC;
512 state_init <= READ_REG;
513 next_state <= EST1;
514 when EST1 =>
515 case data_read (7 downto 0) is
516 when X"17" => -- established
517 if (socket_cnt = W5300_LAST_SOCKET) then
518 socket_cnt <= "000";
519 busy <= '0';
520 state_init <= MAIN;
521 -- -- --
522 config_started_ack <= '0';
523 dd_block_ready <= '0';
524 dd_send_ack <= '0';
525 dd_send_ready <= '0';
526 ftu_error_send_ack <= '0';
527 ftu_error_send_ready <= '0';
528 led_int <= X"00";
529 wait_for_data_flag <= '0';
530 -- -- --
531 else
532 socket_cnt <= socket_cnt + 1;
533 state_init <= ESTABLISH;
534 end if;
535 when others =>
536 state_init <= ESTABLISH;
537 -- -- --
538 -- Just for fun...
539 if (led_cnt = 1100000) then
540 if (led_int = X"00") then
541 led_int <= X"18";
542 else
543 led_int (7 downto 4) <= led_int (6 downto 4) & '0';
544 led_int (3 downto 0) <= '0' & led_int (3 downto 1);
545 end if;
546 led_cnt <= 0;
547 else
548 led_cnt <= led_cnt + 1;
549 end if;
550 -- -- --
551 end case;
552
553 when CONFIG =>
554 new_config <= '1';
555 config_started_ack <= '0';
556 state_init <= MAIN;
557
558 -- main "loop"
559 when MAIN =>
560 if (config_started = '1') then
561 new_config <= '0';
562 config_started_ack <= '1';
563 end if;
564 chk_recv_cntr <= chk_recv_cntr + 1;
565 if (chk_recv_cntr = 1000) then
566 chk_recv_cntr <= 0;
567 state_init <= READ_DATA;
568 busy <= '1';
569 elsif ((dd_send = '1') and (wait_for_data_flag = '0')) then
570 internal_cmd <= '1';
571 dd_send_ack <= '1';
572 dd_send_ready <= '0';
573 if (autosend_flag = '0') then
574 state_read_dd_block <= READ_DD_BLOCK_END;
575 end if;
576 state_init <= READ_DD_BLOCK;
577 elsif ((ftu_error_send = '1') and (wait_for_data_flag = '0')) then
578 ftu_error_send_ack <= '1';
579 ftu_error_send_ready <= '0';
580 if (autosend_flag = '0') then
581 state_send_ftu_error <= SFE_END;
582 end if;
583 state_init <= SEND_FTU_ERROR;
584 end if;
585
586
587 -- read dynamic data block and write it to ethernet
588 when READ_DD_BLOCK =>
589 case state_read_dd_block is
590 when READ_DD_BLOCK_START =>
591 dd_block_start <= '1';
592 dd_block_ready <= '0';
593 if (dd_block_start_ack = '1') then
594 dd_block_start <= '0';
595 state_read_dd_block <= READ_DD_BLOCK_WRITE_GENERAL;
596 end if;
597 -- write on-time counter and tempertures to dd-block
598 when READ_DD_BLOCK_WRITE_GENERAL =>
599 dd_write_general <= '1';
600 if (dd_write_general_started = '1') then
601 dd_write_general <= '0';
602 state_read_dd_block <= READ_DD_BLOCK_WRITE;
603 end if;
604 -- write dd-block to ethernet when on-time counter and temperatures are ready
605 when READ_DD_BLOCK_WRITE =>
606 if (dd_write_general_ready = '1') then
607 data_package_type <= FTM_PACKAGE_TYPE_DD;
608 data_package_length <= X"0" & (DD_BLOCK_SIZE + 1); -- +1 := package end
609 read_addr_state <= READ_FROM_DD_ADDR;
610 local_sd_addr <= X"000"; -- start at address 0x000
611 local_write_length <= "00000" & DD_BLOCK_SIZE;
612 state_read_dd_block <= READ_DD_BLOCK_END;
613 next_state <= READ_DD_BLOCK;
614 state_init <= WRITE_DATA;
615 end if;
616 when READ_DD_BLOCK_END =>
617 dd_block_ready <= '1';
618 if (internal_cmd = '1') then
619 state_read_dd_block <= READ_DD_BLOCK_INTERN;
620 else
621 next_state_read_data <= RD_CMD;
622 state_read_dd_block <= READ_DD_BLOCK_START;
623 state_init <= READ_DATA;
624 state_read_data <= RD_5;
625 end if;
626 when READ_DD_BLOCK_INTERN =>
627 if (dd_send = '0') then
628 dd_send_ready <= '1';
629 dd_send_ack <= '0';
630 internal_cmd <= '0';
631 state_read_dd_block <= READ_DD_BLOCK_START;
632 state_init <= MAIN;
633 end if;
634 end case; -- state_read_dd_block
635
636 -- send FTU error message
637 when SEND_FTU_ERROR =>
638 case state_send_ftu_error is
639 when SFE_START =>
640 next_state <= SEND_FTU_ERROR;
641 data_package_type <= FTM_PACKAGE_TYPE_FTU_ERR;
642 data_package_length <= X"0" & (FTU_ERROR_LENGTH + 1); -- +1 := package end
643 read_addr_state <= READ_FTU_ERROR;
644 local_sd_addr <= X"000";
645 local_write_length <= "00000" & FTU_ERROR_LENGTH;
646 state_send_ftu_error <= SFE_END;
647 state_init <= WRITE_DATA;
648 when SFE_END =>
649 if (ftu_error_send = '0') then
650 ftu_error_send_ack <= '0';
651 ftu_error_send_ready <= '1';
652 state_send_ftu_error <= SFE_START;
653 state_init <= MAIN;
654 end if;
655 end case;
656
657
658 -- read data from socket 0
659 when READ_DATA =>
660 case state_read_data is
661 when RD_1 =>
662 par_addr <= W5300_S0_RX_RSR;
663 state_init <= READ_REG;
664 next_state <= READ_DATA;
665 state_read_data <= RD_2;
666 when RD_2 =>
667 socket_rx_received (31 downto 16) <= data_read;
668 par_addr <= W5300_S0_RX_RSR + X"2";
669 state_init <= READ_REG;
670 next_state <= READ_DATA;
671 state_read_data <= RD_3;
672 when RD_3 =>
673 socket_rx_received (15 downto 0) <= data_read;
674 state_read_data <= RD_4;
675 when RD_4 =>
676 if (socket_rx_received (16 downto 0) > ('0' & X"000")) then
677 rx_packets_cnt <= socket_rx_received (16 downto 1); -- socket_rx_received / 2
678 state_read_data <= RD_5;
679 else
680 busy <= '0';
681 state_read_data <= RD_1;
682 state_init <= MAIN;
683 end if;
684 when RD_5 =>
685 if (rx_packets_cnt > 0) then
686 rx_packets_cnt <= rx_packets_cnt - '1';
687 par_addr <= W5300_S0_RX_FIFOR;
688 state_init <= READ_REG;
689 next_state <= READ_DATA;
690 state_read_data <= next_state_read_data;
691 else
692 state_read_data <= RD_END;
693 end if;
694
695 when RD_END =>
696 state_read_data <= RD_1;
697 if (new_config_flag = '1') then
698 new_config_flag <= '0';
699 next_state <= CONFIG;
700 else
701 next_state <= MAIN;
702 end if;
703 par_addr <= W5300_S0_CR;
704 par_data <= X"0040"; -- RECV
705 state_init <= WRITE_REG;
706
707
708 -------------------------
709 -- command handling
710 -------------------------
711
712 -- read command (5 words)
713 when RD_CMD =>
714 cmd_array (next_packet_data_cnt) <= data_read;
715 next_packet_data_cnt <= next_packet_data_cnt + 1;
716 -- look for command start
717 if (next_packet_data_cnt = 0) then
718 if (data_read /= CMD_START_DELIMITER) then
719 next_packet_data_cnt <= 0;
720 end if;
721 end if;
722 -- last command-word
723 if (next_packet_data_cnt = 4) then
724 next_packet_data_cnt <= 0;
725 state_read_data <= RD_CMD_PARSE;
726 else
727 state_read_data <= RD_5;
728 end if;
729
730 -- process commands and parameters
731 when RD_CMD_PARSE =>
732 case cmd_array (1) is
733
734 when CMD_TLED =>
735 led_int <= NOT led_int;
736 state_read_data <= RD_5;
737
738 when CMD_START =>
739 case cmd_array (2) is
740 -- start "normal" run
741 when PAR_START_RUN =>
742 start_run <= '1';
743 start_run_param <= cmd_array (2);
744 if (start_run_ack = '1') then
745 start_run <= '0';
746 state_read_data <= RD_5;
747 else
748 state_init <= MAIN;
749 end if;
750 -- start run an take X events
751 when PAR_START_X_EVNTS =>
752 next_state_read_data <= RD_X_EVNTS;
753 wait_for_data_flag <= '1';
754 state_read_data <= RD_5;
755 when others =>
756 state_read_data <= RD_5;
757 end case;
758
759 when CMD_STOP =>
760 stop_run <= '1';
761 if (stop_run_ack = '1') then
762 stop_run <= '0';
763 state_read_data <= RD_5;
764 else
765 state_init <= MAIN;
766 end if;
767
768 when CMD_CRESET =>
769 crate_reset <= '1';
770 crate_reset_param <= cmd_array (2);
771 if (crate_reset_ack = '1') then
772 crate_reset <= '0';
773 state_read_data <= RD_5;
774 else
775 state_init <= MAIN;
776 end if;
777
778 when CMD_WRITE =>
779 case cmd_array (2) is
780 -- write to address in static data block
781 when PAR_WRITE_SD_ADDR =>
782 wait_for_data_flag <= '1';
783 next_state_read_data <= RD_WRITE_SD_ADDR;
784 state_read_data <= RD_5;
785 -- write static data block
786 when PAR_WRITE_SD =>
787 wait_for_data_flag <= '1';
788 next_state_read_data <= RD_WRITE_SD_BLOCK;
789 state_read_data <= RD_5;
790 when others =>
791 state_read_data <= RD_5;
792 end case; -- cmd_array (2)
793
794 when CMD_READ =>
795 case cmd_array (2) is
796 -- read from address in static data block
797 when PAR_READ_SD_ADDR =>
798 wait_for_data_flag <= '1';
799 next_state_read_data <= RD_READ_SD_ADDR;
800 state_read_data <= RD_5;
801 -- read static data block
802 when PAR_READ_SD =>
803 state_read_data <= RD_READ_SD_BLOCK;
804 -- read dynamic data block
805 when PAR_READ_DD =>
806 state_init <= READ_DD_BLOCK;
807 state_read_data <= RD_5;
808 when others =>
809 state_read_data <= RD_5;
810 end case; -- cmd_array (2)
811
812 when CMD_PING =>
813 state_ping <= PING_START;
814 state_read_data <= RD_PING;
815
816 when CMD_AUTOSEND =>
817 state_read_data <= RD_5;
818 case cmd_array (2) is
819 when PAR_AUTOSEND_EA =>
820 autosend_flag <= '1';
821 when PAR_AUTOSEND_DA =>
822 autosend_flag <= '0';
823 when others =>
824 null;
825 end case;
826
827 when others =>
828 state_read_data <= RD_5;
829
830 end case; -- cmd_array (1)
831
832
833 -- ping all FTUs and write FTU-list to ethernet
834 when RD_PING =>
835 case state_ping is
836 when PING_START =>
837 ping_ftu_start <= '1';
838 if (ping_ftu_started = '1') then
839 ping_ftu_start <= '0';
840 state_ping <= PING_WAIT;
841 else
842 state_init <= MAIN;
843 end if;
844 when PING_WAIT =>
845 if (ping_ftu_ready = '1') then
846 state_ping <= PING_WRITE_LIST;
847 else
848 state_init <= MAIN;
849 end if;
850 when PING_WRITE_LIST =>
851 state_read_data <= RD_5;
852 data_package_type <= FTM_PACKAGE_TYPE_FTU_LIST;
853 data_package_length <= X"0" & (FL_BLOCK_SIZE + 1); -- +1 := package end
854 read_addr_state <= READ_FROM_FL_ADDR;
855 local_sd_addr <= X"000"; --start at address 0x000
856 local_write_length <= "00000" & FL_BLOCK_SIZE;
857 next_state_read_data <= RD_CMD;
858 next_state <= READ_DATA;
859 state_init <= WRITE_DATA;
860 end case;
861
862 -- read static data block and write it to ethernet
863 when RD_READ_SD_BLOCK =>
864 data_package_type <= FTM_PACKAGE_TYPE_SD;
865 data_package_length <= X"0" & (SD_BLOCK_SIZE + 1); -- +1 := package end
866 state_read_data <= RD_5;
867 read_addr_state <= READ_FROM_SD_ADDR;
868 local_sd_addr <= X"000"; -- start at address 0x000
869 local_write_length <= "00000" & SD_BLOCK_SIZE;
870 next_state_read_data <= RD_CMD;
871 next_state <= READ_DATA;
872 state_init <= WRITE_DATA;
873
874 -- read from address in static data ram and write data to ethernet
875 when RD_READ_SD_ADDR =>
876 data_package_type <= FTM_PACKAGE_TYPE_SD_WORD;
877 data_package_length <= X"0" & (SD_SINGLE_WORD_SIZE + 1); -- +1 := package end
878 state_read_data <= RD_5;
879 read_addr_state <= READ_FROM_SD_ADDR;
880 local_sd_addr <= data_read (11 downto 0);
881 local_write_length <= '0' & X"0001"; -- one word will be written to ethernet
882 next_state_read_data <= RD_CMD;
883 wait_for_data_flag <= '0';
884 next_state <= READ_DATA;
885 state_init <= WRITE_DATA;
886
887 -- read static data block from ethernet and write it to static data ram
888 when RD_WRITE_SD_BLOCK =>
889 state_read_data <= RD_5;
890 next_packet_data_cnt <= next_packet_data_cnt + 1;
891 local_sd_addr <= conv_std_logic_vector (next_packet_data_cnt, 12);
892 local_sd_data <= data_read;
893 next_state <= READ_DATA;
894 state_init <= WRITE_TO_SD_ADDR;
895 -- last word
896 if (next_packet_data_cnt = (SD_BLOCK_SIZE - 1)) then
897 next_packet_data_cnt <= 0;
898 wait_for_data_flag <= '0';
899 new_config_flag <= '1';
900 next_state_read_data <= RD_CMD;
901 end if;
902
903 -- write to address in static data ram
904 when RD_WRITE_SD_ADDR =>
905 state_read_data <= RD_5;
906 next_packet_data_cnt <= next_packet_data_cnt + 1;
907 if (next_packet_data_cnt = 0) then
908 local_sd_addr <= data_read (11 downto 0);
909 else
910 local_sd_data <= data_read;
911 next_packet_data_cnt <= 0;
912 wait_for_data_flag <= '0';
913 new_config_flag <= '1';
914 next_state_read_data <= RD_CMD;
915 next_state <= READ_DATA;
916 state_init <= WRITE_TO_SD_ADDR;
917 end if;
918
919 -- read X events
920 when RD_X_EVNTS =>
921 case state_rd_x_evnts is
922 when RD_X_01 =>
923 start_run_num_events (31 downto 16) <= data_read;
924 state_read_data <= RD_5;
925 state_rd_x_evnts <= RD_X_02;
926 when RD_X_02 =>
927 start_run_num_events (15 downto 0) <= data_read;
928 start_run_param <= cmd_array (2);
929 start_run <= '1';
930 wait_for_data_flag <= '0';
931 state_rd_x_evnts <= RD_X_03;
932 when RD_X_03 =>
933 if (start_run_ack = '1') then
934 start_run <= '0';
935 state_rd_x_evnts <= RD_X_01;
936 next_state_read_data <= RD_CMD;
937 state_read_data <= RD_5;
938 else
939 state_init <= MAIN;
940 end if;
941 end case;
942
943 end case; -- state_read_data
944
945
946 -- read FTU errors
947 when READ_FTU_ERROR =>
948 state_init <= next_state;
949 if (data_cnt = 0) then
950 local_sd_data <= ftu_error_calls;
951 else
952 local_sd_data <= X"00" & ftu_error_data (((data_cnt * 8) - 1) DOWNTO ((data_cnt * 8) - 8));
953 end if;
954
955
956 -- read from header modul
957 when READ_FROM_HEADER_MODUL =>
958 state_init <= next_state;
959 case header_cnt is
960 when X"00" =>
961 local_sd_data <= data_package_type;
962 when X"01" =>
963 local_sd_data <= data_package_length;
964 when X"02" =>
965 local_sd_data <= header_current_state;
966 when X"03" =>
967 local_sd_data <= header_board_id (63 DOWNTO 48);
968 when X"04" =>
969 local_sd_data <= header_board_id (47 DOWNTO 32);
970 when X"05" =>
971 local_sd_data <= header_board_id (31 DOWNTO 16);
972 when X"06" =>
973 local_sd_data <= header_board_id (15 DOWNTO 0);
974 when X"07" =>
975 local_sd_data <= header_firmware_id;
976 when X"08" =>
977 local_sd_data <= header_trigger_counter (31 DOWNTO 16);
978 when X"09" =>
979 local_sd_data <= header_trigger_counter (15 DOWNTO 0);
980 when X"0A" =>
981 local_sd_data <= X"0000";
982 when X"0B" =>
983 local_sd_data <= header_timestamp_counter (47 DOWNTO 32);
984 when X"0C" =>
985 local_sd_data <= header_timestamp_counter (31 DOWNTO 16);
986 when X"0D" =>
987 local_sd_data <= header_timestamp_counter (15 DOWNTO 0);
988 when others =>
989 null;
990 end case;
991
992 -- read from ftu list ram
993 when READ_FROM_FL_ADDR =>
994 case state_read_fl is
995 when READ_FL_START =>
996 if (fl_busy = '0') then
997 fl_addr <= local_sd_addr;
998 fl_read <= '1';
999 state_read_fl <= READ_FL_WAIT;
1000 end if;
1001 when READ_FL_WAIT =>
1002 if (fl_started = '1') then
1003 state_read_fl <= READ_FL_END;
1004 end if;
1005 when READ_FL_END =>
1006 if (fl_ready = '1') then
1007 local_sd_data <= fl_data_in;
1008 fl_read <= '0';
1009 state_read_fl <= READ_FL_START;
1010 state_init <= next_state;
1011 end if;
1012 end case;
1013
1014 -- read from dynamic data block
1015 when READ_FROM_DD_ADDR =>
1016 case state_read_dd is
1017 when READ_DD_START =>
1018 if (dd_busy = '0') then
1019 dd_addr <= local_sd_addr;
1020 dd_read <= '1';
1021 state_read_dd <= READ_DD_WAIT;
1022 end if;
1023 when READ_DD_WAIT =>
1024 if (dd_started = '1') then
1025 state_read_dd <= READ_DD_END;
1026 end if;
1027 when READ_DD_END =>
1028 if (dd_ready = '1') then
1029 local_sd_data <= dd_data_in;
1030 dd_read <= '0';
1031 state_read_dd <= READ_DD_START;
1032 state_init <= next_state;
1033 end if;
1034 end case;
1035
1036 -- read from static data block
1037 when READ_FROM_SD_ADDR =>
1038 case state_read_sd is
1039 when READ_SD_START =>
1040 if (sd_busy = '0') then
1041 sd_addr <= local_sd_addr;
1042 sd_read <= '1';
1043 state_read_sd <= READ_SD_WAIT;
1044 end if;
1045 when READ_SD_WAIT =>
1046 if (sd_started = '1') then
1047 state_read_sd <= READ_SD_END;
1048 end if;
1049 when READ_SD_END =>
1050 if (sd_ready = '1') then
1051 local_sd_data <= sd_data_in;
1052 sd_read <= '0';
1053 state_read_sd <= READ_SD_START;
1054 state_init <= next_state;
1055 end if;
1056 end case;
1057
1058 -- write to static data block
1059 when WRITE_TO_SD_ADDR =>
1060 case state_write_sd is
1061 when WRITE_SD_START =>
1062 if (sd_busy = '0') then
1063 sd_addr <= local_sd_addr;
1064 sd_data_out <= local_sd_data;
1065 sd_write <= '1';
1066 state_write_sd <= WRITE_SD_WAIT;
1067 end if;
1068 when WRITE_SD_WAIT =>
1069 if (sd_started = '1') then
1070 sd_write <= '0';
1071 state_write_sd <= WRITE_SD_END;
1072 end if;
1073 when WRITE_SD_END =>
1074 if (sd_ready = '1') then
1075 state_write_sd <= WRITE_SD_START;
1076 state_init <= next_state;
1077 end if;
1078 end case;
1079
1080 -- write to ethernet interface
1081 when WRITE_DATA =>
1082 case state_write is
1083 when WR_START =>
1084 state_write <= WR_LENGTH;
1085 when WR_LENGTH =>
1086 local_socket_nr <= "000";
1087 next_state_tmp <= next_state;
1088 -- Write Length: 2 := START and END of package
1089 write_length_bytes <= (2 + FTM_HEADER_LENGTH + local_write_length (15 downto 0)) & '0'; -- shift left (*2)
1090 data_cnt <= 0;
1091 header_cnt <= X"00";
1092 state_write <= WR_01;
1093 -- Check FIFO Size
1094 when WR_01 =>
1095 par_addr <= W5300_S0_TX_FSR + local_socket_nr * W5300_S_INC;
1096 state_init <= READ_REG;
1097 next_state <= WRITE_DATA;
1098 state_write <= WR_02;
1099 when WR_02 =>
1100 socket_tx_free (31 downto 16) <= data_read;
1101 par_addr <= W5300_S0_TX_FSR + (local_socket_nr * W5300_S_INC) + X"2";
1102 state_init <= READ_REG;
1103 next_state <= WRITE_DATA;
1104 state_write <= WR_03;
1105 when WR_03 =>
1106 socket_tx_free (15 downto 0) <= data_read;
1107 state_write <= WR_04;
1108 when WR_04 =>
1109 if (socket_tx_free (16 downto 0) < W5300_TX_FIFO_SIZE_8B) then
1110 state_write <= WR_01;
1111 else
1112 state_write <= WR_WRITE_START_DEL;
1113 end if;
1114
1115 -- write package start delimiter
1116 when WR_WRITE_START_DEL =>
1117 par_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1118 par_data <= FTM_PACKAGE_START;
1119 state_init <= WRITE_REG;
1120 next_state <= WRITE_DATA;
1121 state_write <= WR_GET_HEADER;
1122
1123 -- get header data
1124 when WR_GET_HEADER =>
1125 get_header <= '1';
1126 if (get_header_started = '1') then
1127 get_header <= '0';
1128 state_write <= WR_GET_HEADER_WAIT;
1129 end if;
1130
1131 when WR_GET_HEADER_WAIT =>
1132 if (get_header_ready = '1') then
1133 state_write <= WR_FIFO_HEADER;
1134 end if;
1135
1136 -- Fill FIFO
1137 -- write header
1138 when WR_FIFO_HEADER =>
1139 state_init <= READ_FROM_HEADER_MODUL;
1140 next_state <= WRITE_DATA;
1141 state_write <= WR_FIFO_HEADER_01;
1142
1143 when WR_FIFO_HEADER_01 =>
1144 header_cnt <= header_cnt + 1;
1145 if (header_cnt < FTM_HEADER_LENGTH) then
1146 par_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1147 par_data <= local_sd_data;
1148 state_init <= WRITE_REG;
1149 next_state <= WRITE_DATA;
1150 state_write <= WR_FIFO_HEADER;
1151 else
1152 if (data_package_type = FTM_PACKAGE_TYPE_SD_WORD) then
1153 state_write <= WR_SD_ADDR;
1154 else
1155 state_write <= WR_FIFO_DATA;
1156 end if;
1157 end if;
1158
1159 -- write static data ram address (only for single address request)
1160 when WR_SD_ADDR =>
1161 write_length_bytes <= write_length_bytes + 2; -- one extra word to write
1162 par_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1163 par_data <= "0000" & local_sd_addr;
1164 state_init <= WRITE_REG;
1165 next_state <= WRITE_DATA;
1166 state_write <= WR_FIFO_DATA;
1167
1168 -- write data
1169 when WR_FIFO_DATA =>
1170 state_init <= read_addr_state;
1171 next_state <= WRITE_DATA;
1172 state_write <= WR_FIFO_DATA_01;
1173
1174 when WR_FIFO_DATA_01 =>
1175 data_cnt <= data_cnt + 1;
1176 if (data_cnt < local_write_length) then
1177 local_sd_addr <= local_sd_addr + 1;
1178 par_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1179 par_data <= local_sd_data;
1180 state_init <= WRITE_REG;
1181 next_state <= WRITE_DATA;
1182 state_write <= WR_FIFO_DATA;
1183 else
1184 state_write <= WR_WRITE_END_DEL;
1185 end if;
1186
1187 -- write package end delimiter
1188 when WR_WRITE_END_DEL =>
1189 par_addr <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
1190 par_data <= FTM_PACKAGE_END;
1191 state_init <= WRITE_REG;
1192 next_state <= WRITE_DATA;
1193 state_write <= WR_05;
1194
1195 -- Send FIFO
1196 when WR_05 =>
1197 par_addr <= W5300_S0_TX_WRSR + local_socket_nr * W5300_S_INC;
1198 par_data <= (0 => write_length_bytes (16), others => '0');
1199 state_init <= WRITE_REG;
1200 state_write <= WR_06;
1201 when WR_06 =>
1202 par_addr <= W5300_S0_TX_WRSR + (local_socket_nr * W5300_S_INC) + X"2";
1203 par_data <= write_length_bytes (15 downto 0);
1204 state_init <= WRITE_REG;
1205 state_write <= WR_07;
1206 when WR_07 =>
1207 par_addr <= W5300_S0_CR + local_socket_nr * W5300_S_INC;
1208 par_data <= X"0020"; -- Send
1209 state_init <= WRITE_REG;
1210 state_write <= WR_08;
1211 when others =>
1212 state_init <= next_state_tmp;
1213 state_write <= WR_START;
1214 end case;
1215 -- End WRITE_DATA
1216
1217 when READ_REG =>
1218 case count is
1219 when "000" =>
1220 cs <= '0';
1221 rd <= '0';
1222 wr <= '1';
1223 data <= (others => 'Z'); -- !!!!!!!!!!
1224 count <= "001";
1225 addr <= par_addr;
1226 when "001" =>
1227 count <= "010";
1228 when "010" =>
1229 count <= "100";
1230 when "100" =>
1231 data_read <= data;
1232 count <= "110";
1233 when "110" =>
1234 count <= "111";
1235 when "111" =>
1236 cs <= '1';
1237 rd <= '1';
1238 count <= "000";
1239 state_init <= next_state;
1240 when others =>
1241 null;
1242 end case;
1243
1244 when WRITE_REG =>
1245 case count is
1246 when "000" =>
1247 cs <= '0';
1248 wr <= '0';
1249 rd <= '1';
1250 addr <= par_addr;
1251 data <= par_data;
1252 count <= "100";
1253 when "100" =>
1254 count <= "101";
1255 when "101" =>
1256 count <= "110";
1257 when "110" =>
1258 cs <= '1';
1259 wr <= '1';
1260 state_init <= next_state;
1261 count <= "000";
1262 when others =>
1263 null;
1264 end case;
1265
1266 when others =>
1267 null;
1268 end case;
1269 end if; -- int_flag = '0'
1270
1271 end if; -- rising_edge (clk)
1272
1273 end process w5300_init_proc;
1274
1275end Behavioral;
1276
Note: See TracBrowser for help on using the repository browser.