source: firmware/FTU/rs485/FTU_rs485_control.vhd@ 14468

Last change on this file since 14468 was 10238, checked in by weitzel, 14 years ago
change in FTU rs485 module; FTUs answer now one BAUD period later
File size: 63.0 KB
Line 
1----------------------------------------------------------------------------------
2-- Company: ETH Zurich, Institute for Particle Physics
3-- Engineer: Q. Weitzel, P. Vogler
4--
5-- Create Date: 09/13/2010
6-- Design Name:
7-- Module Name: FTU_rs485_control - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description: top level entity of FTU RS485 module
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 ftu_definitions;
27USE ftu_definitions.ftu_array_types.all;
28USE ftu_definitions.ftu_constants.all;
29
30---- Uncomment the following library declaration if instantiating
31---- any Xilinx primitives in this code.
32--library UNISIM;
33--use UNISIM.VComponents.all;
34
35entity FTU_rs485_control is
36 port(
37 main_clk : IN std_logic;
38 brd_add : IN std_logic_vector(5 downto 0);
39 rx_d : IN std_logic;
40 rates_ready : IN std_logic; -- rate_array_rs485 has now valid rates for sending
41 DACs_ready : IN std_logic; -- dac_array_rs485_in is ok for sending
42 enables_ready : IN std_logic; -- enable_array_rs485_in is ok for sending
43 prescaling_ready : IN std_logic; -- prescaling byte is ok for sending
44 ping_pong_ready : IN std_logic; -- ping pong successful
45 rate_array_rs485 : IN rate_array_type;
46 overflow_array_rs485_in : IN STD_LOGIC_VECTOR(7 downto 0);
47 dac_array_rs485_in : IN dac_array_type;
48 enable_array_rs485_in : IN enable_array_type;
49 prescaling_rs485_in : IN STD_LOGIC_VECTOR(7 downto 0);
50 dna : IN STD_LOGIC_VECTOR(63 downto 0);
51 rx_en : OUT std_logic;
52 tx_d : OUT std_logic;
53 tx_en : OUT std_logic;
54 new_DACs : OUT std_logic := '0'; -- new DACs arrived via RS485
55 new_enables : OUT std_logic := '0'; -- new enables arrived via RS485
56 new_prescaling : OUT std_logic := '0'; -- new prescaling arrived via RS485
57 read_rates : OUT std_logic := '0'; -- FTM wants to read rates
58 read_DACs : OUT std_logic := '0'; -- FTM wants to read DACs
59 read_enables : OUT std_logic := '0'; -- FTM wants to read enable pattern
60 read_prescaling : OUT std_logic := '0'; -- FTM wants to read prescaling value
61 ping_pong : OUT std_logic := '0'; -- ping pong command from FTM
62 dac_array_rs485_out : OUT dac_array_type;
63 enable_array_rs485_out : OUT enable_array_type;
64 prescaling_rs485_out : OUT STD_LOGIC_VECTOR(7 downto 0)
65 );
66end FTU_rs485_control;
67
68architecture Behavioral of FTU_rs485_control is
69
70 signal tx_start_sig : std_logic := '0';
71 signal tx_data_sig : std_logic_vector (7 DOWNTO 0) := (others => '0');
72 signal tx_busy_sig : std_logic; -- initialized in FTU_rs485_interface
73
74 signal rx_valid_sig : std_logic; -- initialized in FTU_rs485_interface
75 signal rx_data_sig : std_logic_vector (7 DOWNTO 0); -- initialized in FTU_rs485_interface
76 signal rx_busy_sig : std_logic; -- initialized in FTU_rs485_interface
77
78 signal block_valid_sig : std_logic; -- initialized in FTU_rs485_receiver
79 signal start_interpreter_sig : std_logic := '0';
80 signal data_block_sig : std_logic_vector(RS485_BLOCK_WIDTH - 1 downto 0); -- initialized in FTU_rs485_receiver
81
82 signal int_new_DACs_sig : std_logic; -- initialized in FTU_rs485_interpreter
83 signal int_new_enables_sig : std_logic; -- initialized in FTU_rs485_interpreter
84 signal int_new_prescaling_sig : std_logic; -- initialized in FTU_rs485_interpreter
85 signal int_read_rates_sig : std_logic; -- initialized in FTU_rs485_interpreter
86 signal int_read_DACs_sig : std_logic; -- initialized in FTU_rs485_interpreter
87 signal int_read_enables_sig : std_logic; -- initialized in FTU_rs485_interpreter
88 signal int_read_prescaling_sig : std_logic; -- initialized in FTU_rs485_interpreter
89 signal int_ping_pong_sig : std_logic; -- initialized in FTU_rs485_interpreter
90
91 signal txcnt : integer range 0 to (RS485_BLOCK_WIDTH / 8) := 0; -- count 28 1-byte frames
92
93 signal reset_crc_sig : std_logic := '0';
94 signal crc_enable_sig : std_logic := '0';
95 signal crc_input_sig : std_logic_vector(RS485_BLOCK_WIDTH - 9 downto 0) := (others => '0');
96 signal crc_sig : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0) := (others => '0');
97 signal crc_sig_inv : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0) := (others => '0');
98 signal crc_error_cnt_sig : integer range 0 to 255 := 0;
99
100 component ucrc_par
101 generic(
102 POLYNOMIAL : std_logic_vector;
103 INIT_VALUE : std_logic_vector;
104 DATA_WIDTH : integer range 2 to 256;
105 SYNC_RESET : integer range 0 to 1
106 );
107 port(
108 clk_i : in std_logic;
109 rst_i : in std_logic;
110 clken_i : in std_logic;
111 data_i : in std_logic_vector(DATA_WIDTH - 1 downto 0);
112 match_o : out std_logic;
113 crc_o : out std_logic_vector(POLYNOMIAL'length - 1 downto 0)
114 );
115 end component;
116
117 component FTU_rs485_receiver
118 port(
119 rec_clk : in std_logic;
120 -- rx_busy : in std_logic;
121 rec_din : in std_logic_vector(7 downto 0);
122 rec_den : in std_logic;
123 rec_dout : out std_logic_vector(RS485_BLOCK_WIDTH - 1 downto 0);
124 rec_valid : out std_logic
125 );
126 end component;
127
128 component FTU_rs485_interpreter
129 port(
130 clk : IN std_logic;
131 data_block : IN std_logic_vector(RS485_BLOCK_WIDTH - 1 downto 0);
132 block_valid : IN std_logic;
133 brd_add : IN std_logic_vector(5 downto 0);
134 crc_error_cnt : OUT integer range 0 to 255;
135 int_new_DACs : OUT std_logic;
136 int_new_enables : OUT std_logic;
137 int_new_prescaling : OUT std_logic;
138 int_read_rates : OUT std_logic;
139 int_read_DACs : OUT std_logic;
140 int_read_enables : OUT std_logic;
141 int_read_prescaling : OUT std_logic;
142 int_ping_pong : OUT std_logic;
143 dac_array_rs485_out : OUT dac_array_type;
144 enable_array_rs485_out : OUT enable_array_type;
145 prescaling_rs485_out : OUT STD_LOGIC_VECTOR(7 downto 0)
146 );
147 end component;
148
149 component FTU_rs485_interface
150 port(
151 clk : IN std_logic;
152 -- RS485
153 rx_d : IN std_logic;
154 rx_en : OUT std_logic;
155 tx_d : OUT std_logic;
156 tx_en : OUT std_logic;
157 -- FPGA
158 rx_data : OUT std_logic_vector (7 DOWNTO 0);
159 rx_busy : OUT std_logic := '0';
160 rx_valid : OUT std_logic := '0';
161 tx_data : IN std_logic_vector (7 DOWNTO 0);
162 tx_busy : OUT std_logic := '0';
163 tx_start : IN std_logic
164 );
165 end component;
166
167 type FTU_rs485_control_StateType is (INIT, RECEIVE,
168 READ_RATES_WAIT, READ_DAC_WAIT, READ_ENABLE_WAIT, READ_PRESCALING_WAIT,
169 READ_RATES_WAIT_2, READ_DAC_WAIT_2, READ_ENABLE_WAIT_2, READ_PRESCALING_WAIT_2,
170 SET_DAC_WAIT, SET_ENABLE_WAIT, SET_PRESCALING_WAIT, PING_PONG_WAIT,
171 SET_DAC_WAIT_2, SET_ENABLE_WAIT_2, SET_PRESCALING_WAIT_2, PING_PONG_WAIT_2,
172 READ_RATES_TRANSMIT, READ_DAC_TRANSMIT, READ_ENABLE_TRANSMIT, READ_PRESCALING_TRANSMIT,
173 SET_DAC_TRANSMIT, SET_ENABLE_TRANSMIT, SET_PRESCALING_TRANSMIT, PING_PONG_TRANSMIT);
174 signal FTU_rs485_control_State : FTU_rs485_control_StateType;
175
176begin
177
178 crc_sig <= crc_sig_inv(0) & crc_sig_inv(1) & crc_sig_inv(2) & crc_sig_inv(3) & crc_sig_inv(4) & crc_sig_inv(5) & crc_sig_inv(6) & crc_sig_inv(7);
179 start_interpreter_sig <= block_valid_sig and (not rx_busy_sig); -- avoid answering to early to FTM
180
181 Inst_ucrc_par : ucrc_par
182 generic map(
183 POLYNOMIAL => CRC_POLYNOMIAL,
184 INIT_VALUE => CRC_INIT_VALUE,
185 DATA_WIDTH => 216,
186 SYNC_RESET => 1
187 )
188 port map(
189 clk_i => main_clk,
190 rst_i => reset_crc_sig,
191 clken_i => crc_enable_sig,
192 data_i => crc_input_sig,
193 match_o => open,
194 crc_o => crc_sig_inv
195 );
196
197 Inst_FTU_rs485_receiver : FTU_rs485_receiver
198 port map(
199 rec_clk => main_clk,
200 -- rx_busy => rx_busy_sig,
201 rec_din => rx_data_sig,
202 rec_den => rx_valid_sig,
203 rec_dout => data_block_sig,
204 rec_valid => block_valid_sig
205 );
206
207 Inst_FTU_rs485_interpreter : FTU_rs485_interpreter
208 port map(
209 clk => main_clk,
210 data_block => data_block_sig,
211 block_valid => start_interpreter_sig,
212 brd_add => brd_add,
213 crc_error_cnt => crc_error_cnt_sig,
214 int_new_DACs => int_new_DACs_sig,
215 int_new_enables => int_new_enables_sig,
216 int_new_prescaling => int_new_prescaling_sig,
217 int_read_rates => int_read_rates_sig,
218 int_read_DACs => int_read_DACs_sig,
219 int_read_enables => int_read_enables_sig,
220 int_read_prescaling => int_read_prescaling_sig,
221 int_ping_pong => int_ping_pong_sig,
222 dac_array_rs485_out => dac_array_rs485_out,
223 enable_array_rs485_out => enable_array_rs485_out,
224 prescaling_rs485_out => prescaling_rs485_out
225 );
226
227 Inst_FTU_rs485_interface : FTU_rs485_interface
228 port map(
229 clk => main_clk,
230 -- RS485
231 rx_d => rx_d,
232 rx_en => rx_en,
233 tx_d => tx_d,
234 tx_en => tx_en,
235 -- FPGA
236 rx_data => rx_data_sig,
237 rx_busy => rx_busy_sig,
238 rx_valid => rx_valid_sig,
239 tx_data => tx_data_sig,
240 tx_busy => tx_busy_sig,
241 tx_start => tx_start_sig
242 );
243
244 --FTU RS485 control finite state machine
245
246 FTU_rs485_control_FSM: process (main_clk)
247 begin
248 if Rising_edge(main_clk) then
249 case FTU_rs485_control_State is
250
251 when INIT => -- reset CRC register
252 reset_crc_sig <= '1';
253 FTU_rs485_control_State <= RECEIVE;
254
255 when RECEIVE => -- default state, receiver on, no transmission
256 reset_crc_sig <= '0';
257 crc_enable_sig <= '0';
258 tx_start_sig <= '0';
259 if (int_new_DACs_sig = '1') then
260 new_DACs <= '1';
261 new_enables <= '0';
262 new_prescaling <= '0';
263 read_rates <= '0';
264 read_DACs <= '0';
265 read_enables <= '0';
266 read_prescaling <= '0';
267 ping_pong <= '0';
268 FTU_rs485_control_State <= SET_DAC_WAIT;
269 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '1') then
270 new_DACs <= '0';
271 new_enables <= '1';
272 new_prescaling <= '0';
273 read_rates <= '0';
274 read_DACs <= '0';
275 read_enables <= '0';
276 read_prescaling <= '0';
277 ping_pong <= '0';
278 FTU_rs485_control_State <= SET_ENABLE_WAIT;
279 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '1') then
280 new_DACs <= '0';
281 new_enables <= '0';
282 new_prescaling <= '1';
283 read_rates <= '0';
284 read_DACs <= '0';
285 read_enables <= '0';
286 read_prescaling <= '0';
287 ping_pong <= '0';
288 FTU_rs485_control_State <= SET_PRESCALING_WAIT;
289 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
290 int_read_rates_sig = '1') then
291 new_DACs <= '0';
292 new_enables <= '0';
293 new_prescaling <= '0';
294 read_rates <= '1';
295 read_DACs <= '0';
296 read_enables <= '0';
297 read_prescaling <= '0';
298 ping_pong <= '0';
299 FTU_rs485_control_State <= READ_RATES_WAIT;
300 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
301 int_read_rates_sig = '0' and int_read_DACs_sig = '1') then
302 new_DACs <= '0';
303 new_enables <= '0';
304 new_prescaling <= '0';
305 read_rates <= '0';
306 read_DACs <= '1';
307 read_enables <= '0';
308 read_prescaling <= '0';
309 ping_pong <= '0';
310 FTU_rs485_control_State <= READ_DAC_WAIT;
311 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
312 int_read_rates_sig = '0' and int_read_DACs_sig = '0' and int_read_enables_sig = '1') then
313 new_DACs <= '0';
314 new_enables <= '0';
315 new_prescaling <= '0';
316 read_rates <= '0';
317 read_DACs <= '0';
318 read_enables <= '1';
319 read_prescaling <= '0';
320 ping_pong <= '0';
321 FTU_rs485_control_State <= READ_ENABLE_WAIT;
322 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
323 int_read_rates_sig = '0' and int_read_DACs_sig = '0' and int_read_enables_sig = '0' and int_read_prescaling_sig = '1') then
324 new_DACs <= '0';
325 new_enables <= '0';
326 new_prescaling <= '0';
327 read_rates <= '0';
328 read_DACs <= '0';
329 read_enables <= '0';
330 read_prescaling <= '1';
331 ping_pong <= '0';
332 FTU_rs485_control_State <= READ_PRESCALING_WAIT;
333 elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
334 int_read_rates_sig = '0' and int_read_DACs_sig = '0' and int_read_enables_sig = '0' and int_read_prescaling_sig = '0' and
335 int_ping_pong_sig = '1') then
336 new_DACs <= '0';
337 new_enables <= '0';
338 new_prescaling <= '0';
339 read_rates <= '0';
340 read_DACs <= '0';
341 read_enables <= '0';
342 read_prescaling <= '0';
343 ping_pong <= '1';
344 FTU_rs485_control_State <= PING_PONG_WAIT;
345 else
346 new_DACs <= '0';
347 new_enables <= '0';
348 new_prescaling <= '0';
349 read_rates <= '0';
350 read_DACs <= '0';
351 read_enables <= '0';
352 read_prescaling <= '0';
353 ping_pong <= '0';
354 FTU_rs485_control_State <= RECEIVE;
355 end if;
356
357 when SET_DAC_WAIT=> -- wait until FTU control says "done" and then answer to FTM
358 if (DACs_ready = '1') then
359 new_DACs <= '0';
360 crc_enable_sig <= '1';
361 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
362 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
363 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
364 & "00000000"
365 & conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0)
366 & conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0)
367 & conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0)
368 & conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0)
369 & conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0) & "00000000"
370 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
371 FTU_rs485_control_State <= SET_DAC_WAIT_2;
372 else
373 new_DACs <= '1';
374 FTU_rs485_control_State <= SET_DAC_WAIT;
375 end if;
376
377 when SET_DAC_WAIT_2 => -- wait one cycle for CRC calculation
378 crc_enable_sig <= '0';
379 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
380
381 when SET_ENABLE_WAIT => -- wait until FTU control says "done" and then answer to FTM
382 if (enables_ready = '1') then
383 new_enables <= '0';
384 crc_enable_sig <= '1';
385 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
386 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
387 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
388 & "00000000" & "00000000" & "00000000"
389 & enable_array_rs485_in(3)(15 downto 8) & enable_array_rs485_in(3)(7 downto 0)
390 & enable_array_rs485_in(2)(15 downto 8) & enable_array_rs485_in(2)(7 downto 0)
391 & enable_array_rs485_in(1)(15 downto 8) & enable_array_rs485_in(1)(7 downto 0)
392 & enable_array_rs485_in(0)(15 downto 8) & enable_array_rs485_in(0)(7 downto 0) & "00000011"
393 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
394 FTU_rs485_control_State <= SET_ENABLE_WAIT_2;
395 else
396 new_enables <= '1';
397 FTU_rs485_control_State <= SET_ENABLE_WAIT;
398 end if;
399
400 when SET_ENABLE_WAIT_2 => -- wait one cycle for CRC calculation
401 crc_enable_sig <= '0';
402 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
403
404 when SET_PRESCALING_WAIT => -- wait until FTU control says "done" and then answer to FTM
405 if (prescaling_ready = '1') then
406 new_prescaling <= '0';
407 crc_enable_sig <= '1';
408 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
409 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
410 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
411 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
412 & "00000000" & "00000000" & "00000000" & "00000000"
413 & overflow_array_rs485_in & prescaling_rs485_in & "00000110"
414 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
415 FTU_rs485_control_State <= SET_PRESCALING_WAIT_2;
416 else
417 new_prescaling <= '1';
418 FTU_rs485_control_State <= SET_PRESCALING_WAIT;
419 end if;
420
421 when SET_PRESCALING_WAIT_2 => -- wait one cycle for CRC calculation
422 crc_enable_sig <= '0';
423 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
424
425 when READ_RATES_WAIT => -- wait until FTU control says "done" and then answer to FTM
426 if (rates_ready = '1') then
427 read_rates <= '0';
428 crc_enable_sig <= '1';
429 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
430 & overflow_array_rs485_in
431 & conv_std_logic_vector(rate_array_rs485(4),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(4),32)(23 downto 16)
432 & conv_std_logic_vector(rate_array_rs485(4),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(4),32)(7 downto 0)
433 & conv_std_logic_vector(rate_array_rs485(3),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(3),32)(23 downto 16)
434 & conv_std_logic_vector(rate_array_rs485(3),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(3),32)(7 downto 0)
435 & conv_std_logic_vector(rate_array_rs485(2),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(2),32)(23 downto 16)
436 & conv_std_logic_vector(rate_array_rs485(2),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(2),32)(7 downto 0)
437 & conv_std_logic_vector(rate_array_rs485(1),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(1),32)(23 downto 16)
438 & conv_std_logic_vector(rate_array_rs485(1),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(1),32)(7 downto 0)
439 & conv_std_logic_vector(rate_array_rs485(0),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(0),32)(23 downto 16)
440 & conv_std_logic_vector(rate_array_rs485(0),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(0),32)(7 downto 0) & "00000010"
441 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
442 FTU_rs485_control_State <= READ_RATES_WAIT_2;
443 else
444 read_rates <= '1';
445 FTU_rs485_control_State <= READ_RATES_WAIT;
446 end if;
447
448 when READ_RATES_WAIT_2 => -- wait one cycle for CRC calculation
449 crc_enable_sig <= '0';
450 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
451
452 when READ_DAC_WAIT => -- wait until FTU control says "done" and then answer to FTM
453 if (DACs_ready = '1') then
454 read_DACs <= '0';
455 crc_enable_sig <= '1';
456 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
457 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
458 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
459 & "00000000"
460 & conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0)
461 & conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0)
462 & conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0)
463 & conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0)
464 & conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0) & "00000001"
465 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
466 FTU_rs485_control_State <= READ_DAC_WAIT_2;
467 else
468 read_DACs <= '1';
469 FTU_rs485_control_State <= READ_DAC_WAIT;
470 end if;
471
472 when READ_DAC_WAIT_2 => -- wait one cycle for CRC calculation
473 crc_enable_sig <= '0';
474 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
475
476 when READ_ENABLE_WAIT => -- wait until FTU control says "done" and then answer to FTM
477 if (enables_ready = '1') then
478 read_enables <= '0';
479 crc_enable_sig <= '1';
480 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
481 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
482 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
483 & "00000000" & "00000000" & "00000000"
484 & enable_array_rs485_in(3)(15 downto 8) & enable_array_rs485_in(3)(7 downto 0)
485 & enable_array_rs485_in(2)(15 downto 8) & enable_array_rs485_in(2)(7 downto 0)
486 & enable_array_rs485_in(1)(15 downto 8) & enable_array_rs485_in(1)(7 downto 0)
487 & enable_array_rs485_in(0)(15 downto 8) & enable_array_rs485_in(0)(7 downto 0) & "00000100"
488 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
489 FTU_rs485_control_State <= READ_ENABLE_WAIT_2;
490 else
491 read_enables <= '1';
492 FTU_rs485_control_State <= READ_ENABLE_WAIT;
493 end if;
494
495 when READ_ENABLE_WAIT_2 => -- wait one cycle for CRC calculation
496 crc_enable_sig <= '0';
497 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
498
499 when READ_PRESCALING_WAIT => -- wait until FTU control says "done" and then answer to FTM
500 if (prescaling_ready = '1') then
501 read_prescaling <= '0';
502 crc_enable_sig <= '1';
503 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
504 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
505 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
506 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
507 & "00000000" & "00000000" & "00000000" & "00000000"
508 & overflow_array_rs485_in & prescaling_rs485_in & "00000111"
509 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
510 FTU_rs485_control_State <= READ_PRESCALING_WAIT_2;
511 else
512 read_prescaling <= '1';
513 FTU_rs485_control_State <= READ_PRESCALING_WAIT;
514 end if;
515
516 when READ_PRESCALING_WAIT_2 => -- wait one cycle for CRC calculation
517 crc_enable_sig <= '0';
518 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
519
520 when PING_PONG_WAIT => -- wait until FTU control says "done" and then answer to FTM
521 if (ping_pong_ready = '1') then
522 ping_pong <= '0';
523 crc_enable_sig <= '1';
524 crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
525 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
526 & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
527 & "00000000" & "00000000" & "00000000"
528 & dna(63 downto 0) & "00000101"
529 & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
530 FTU_rs485_control_State <= PING_PONG_WAIT_2;
531 else
532 ping_pong <= '1';
533 FTU_rs485_control_State <= PING_PONG_WAIT;
534 end if;
535
536 when PING_PONG_WAIT_2 => -- wait one cycle for CRC calculation
537 crc_enable_sig <= '0';
538 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
539
540 when SET_DAC_TRANSMIT =>
541 if tx_busy_sig = '0' then
542 if txcnt = 0 then -- start delimiter
543 txcnt <= txcnt + 1;
544 tx_data_sig <= RS485_START_DELIM;
545 tx_start_sig <= '1';
546 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
547 elsif txcnt = 1 then -- FTM address
548 txcnt <= txcnt + 1;
549 tx_data_sig <= FTM_ADDRESS;
550 tx_start_sig <= '1';
551 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
552 elsif txcnt = 2 then -- board address
553 txcnt <= txcnt + 1;
554 tx_data_sig <= "00" & brd_add;
555 tx_start_sig <= '1';
556 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
557 elsif txcnt = 3 then -- firmware ID
558 txcnt <= txcnt + 1;
559 tx_data_sig <= FIRMWARE_ID;
560 tx_start_sig <= '1';
561 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
562 elsif txcnt = 4 then -- mirrored command
563 txcnt <= txcnt + 1;
564 tx_data_sig <= "00000000";
565 tx_start_sig <= '1';
566 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
567 elsif txcnt = 5 then -- data: DAC A low
568 txcnt <= txcnt + 1;
569 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0);
570 tx_start_sig <= '1';
571 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
572 elsif txcnt = 6 then -- data: DAC A high
573 txcnt <= txcnt + 1;
574 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8);
575 tx_start_sig <= '1';
576 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
577 elsif txcnt = 7 then -- data: DAC B low
578 txcnt <= txcnt + 1;
579 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0);
580 tx_start_sig <= '1';
581 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
582 elsif txcnt = 8 then -- data: DAC B high
583 txcnt <= txcnt + 1;
584 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8);
585 tx_start_sig <= '1';
586 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
587 elsif txcnt = 9 then -- data: DAC C low
588 txcnt <= txcnt + 1;
589 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0);
590 tx_start_sig <= '1';
591 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
592 elsif txcnt = 10 then -- data: DAC C high
593 txcnt <= txcnt + 1;
594 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8);
595 tx_start_sig <= '1';
596 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
597 elsif txcnt = 11 then -- data: DAC D low
598 txcnt <= txcnt + 1;
599 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0);
600 tx_start_sig <= '1';
601 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
602 elsif txcnt = 12 then -- data: DAC D high
603 txcnt <= txcnt + 1;
604 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8);
605 tx_start_sig <= '1';
606 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
607 elsif txcnt = 13 then -- data: DAC E low
608 txcnt <= txcnt + 1;
609 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0);
610 tx_start_sig <= '1';
611 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
612 elsif txcnt = 14 then -- data: DAC E high
613 txcnt <= txcnt + 1;
614 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8);
615 tx_start_sig <= '1';
616 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
617 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
618 txcnt <= txcnt + 1;
619 tx_data_sig <= "00000000";
620 tx_start_sig <= '1';
621 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
622 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
623 txcnt <= txcnt + 1;
624 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
625 tx_start_sig <= '1';
626 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
627 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
628 txcnt <= txcnt + 1;
629 tx_data_sig <= crc_sig;
630 tx_start_sig <= '1';
631 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
632 else -- transmission finished
633 txcnt <= 0;
634 reset_crc_sig <= '1';
635 FTU_rs485_control_State <= RECEIVE;
636 end if;
637 else
638 tx_start_sig <= '0';
639 FTU_rs485_control_State <= SET_DAC_TRANSMIT;
640 end if;
641
642 when SET_ENABLE_TRANSMIT =>
643 if tx_busy_sig = '0' then
644 if txcnt = 0 then -- start delimiter
645 txcnt <= txcnt + 1;
646 tx_data_sig <= RS485_START_DELIM;
647 tx_start_sig <= '1';
648 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
649 elsif txcnt = 1 then -- FTM address
650 txcnt <= txcnt + 1;
651 tx_data_sig <= FTM_ADDRESS;
652 tx_start_sig <= '1';
653 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
654 elsif txcnt = 2 then -- board address
655 txcnt <= txcnt + 1;
656 tx_data_sig <= "00" & brd_add;
657 tx_start_sig <= '1';
658 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
659 elsif txcnt = 3 then -- firmware ID
660 txcnt <= txcnt + 1;
661 tx_data_sig <= FIRMWARE_ID;
662 tx_start_sig <= '1';
663 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
664 elsif txcnt = 4 then -- mirrored command
665 txcnt <= txcnt + 1;
666 tx_data_sig <= "00000011";
667 tx_start_sig <= '1';
668 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
669 elsif txcnt = 5 then -- data: enable pattern A7-0
670 txcnt <= txcnt + 1;
671 tx_data_sig <= enable_array_rs485_in(0)(7 downto 0);
672 tx_start_sig <= '1';
673 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
674 elsif txcnt = 6 then -- data: enable pattern A8
675 txcnt <= txcnt + 1;
676 tx_data_sig <= enable_array_rs485_in(0)(15 downto 8);
677 tx_start_sig <= '1';
678 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
679 elsif txcnt = 7 then -- data: enable pattern B7-0
680 txcnt <= txcnt + 1;
681 tx_data_sig <= enable_array_rs485_in(1)(7 downto 0);
682 tx_start_sig <= '1';
683 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
684 elsif txcnt = 8 then -- data: enable pattern B8
685 txcnt <= txcnt + 1;
686 tx_data_sig <= enable_array_rs485_in(1)(15 downto 8);
687 tx_start_sig <= '1';
688 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
689 elsif txcnt = 9 then -- data: enable pattern C7-0
690 txcnt <= txcnt + 1;
691 tx_data_sig <= enable_array_rs485_in(2)(7 downto 0);
692 tx_start_sig <= '1';
693 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
694 elsif txcnt = 10 then -- data: enable pattern C8
695 txcnt <= txcnt + 1;
696 tx_data_sig <= enable_array_rs485_in(2)(15 downto 8);
697 tx_start_sig <= '1';
698 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
699 elsif txcnt = 11 then -- data: enable pattern D7-0
700 txcnt <= txcnt + 1;
701 tx_data_sig <= enable_array_rs485_in(3)(7 downto 0);
702 tx_start_sig <= '1';
703 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
704 elsif txcnt = 12 then -- data: enable pattern D8
705 txcnt <= txcnt + 1;
706 tx_data_sig <= enable_array_rs485_in(3)(15 downto 8);
707 tx_start_sig <= '1';
708 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
709 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
710 txcnt <= txcnt + 1;
711 tx_data_sig <= "00000000";
712 tx_start_sig <= '1';
713 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
714 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
715 txcnt <= txcnt + 1;
716 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
717 tx_start_sig <= '1';
718 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
719 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
720 txcnt <= txcnt + 1;
721 tx_data_sig <= crc_sig;
722 tx_start_sig <= '1';
723 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
724 else -- transmission finished
725 txcnt <= 0;
726 reset_crc_sig <= '1';
727 FTU_rs485_control_State <= RECEIVE;
728 end if;
729 else
730 tx_start_sig <= '0';
731 FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
732 end if;
733
734 when SET_PRESCALING_TRANSMIT =>
735 if tx_busy_sig = '0' then
736 if txcnt = 0 then -- start delimiter
737 txcnt <= txcnt + 1;
738 tx_data_sig <= RS485_START_DELIM;
739 tx_start_sig <= '1';
740 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
741 elsif txcnt = 1 then -- FTM address
742 txcnt <= txcnt + 1;
743 tx_data_sig <= FTM_ADDRESS;
744 tx_start_sig <= '1';
745 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
746 elsif txcnt = 2 then -- board address
747 txcnt <= txcnt + 1;
748 tx_data_sig <= "00" & brd_add;
749 tx_start_sig <= '1';
750 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
751 elsif txcnt = 3 then -- firmware ID
752 txcnt <= txcnt + 1;
753 tx_data_sig <= FIRMWARE_ID;
754 tx_start_sig <= '1';
755 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
756 elsif txcnt = 4 then -- mirrored command
757 txcnt <= txcnt + 1;
758 tx_data_sig <= "00000110";
759 tx_start_sig <= '1';
760 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
761 elsif txcnt = 5 then -- data: prescaling
762 txcnt <= txcnt + 1;
763 tx_data_sig <= prescaling_rs485_in;
764 tx_start_sig <= '1';
765 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
766 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
767 txcnt <= txcnt + 1;
768 tx_data_sig <= "00000000";
769 tx_start_sig <= '1';
770 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
771 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
772 txcnt <= txcnt + 1;
773 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
774 tx_start_sig <= '1';
775 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
776 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
777 txcnt <= txcnt + 1;
778 tx_data_sig <= crc_sig;
779 tx_start_sig <= '1';
780 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
781 else -- transmission finished
782 txcnt <= 0;
783 reset_crc_sig <= '1';
784 FTU_rs485_control_State <= RECEIVE;
785 end if;
786 else
787 tx_start_sig <= '0';
788 FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
789 end if;
790
791 when READ_RATES_TRANSMIT =>
792 if tx_busy_sig = '0' then
793 if txcnt = 0 then -- start delimiter
794 txcnt <= txcnt + 1;
795 tx_data_sig <= RS485_START_DELIM;
796 tx_start_sig <= '1';
797 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
798 elsif txcnt = 1 then -- FTM address
799 txcnt <= txcnt + 1;
800 tx_data_sig <= FTM_ADDRESS;
801 tx_start_sig <= '1';
802 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
803 elsif txcnt = 2 then -- board address
804 txcnt <= txcnt + 1;
805 tx_data_sig <= "00" & brd_add;
806 tx_start_sig <= '1';
807 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
808 elsif txcnt = 3 then -- firmware ID
809 txcnt <= txcnt + 1;
810 tx_data_sig <= FIRMWARE_ID;
811 tx_start_sig <= '1';
812 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
813 elsif txcnt = 4 then -- mirrored command
814 txcnt <= txcnt + 1;
815 tx_data_sig <= "00000010";
816 tx_start_sig <= '1';
817 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
818 elsif txcnt = 5 then -- data: counter A 7...0
819 txcnt <= txcnt + 1;
820 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(0),32)(7 downto 0);
821 tx_start_sig <= '1';
822 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
823 elsif txcnt = 6 then -- data: counter A 15...8
824 txcnt <= txcnt + 1;
825 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(0),32)(15 downto 8);
826 tx_start_sig <= '1';
827 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
828 elsif txcnt = 7 then -- data: counter A 23...16
829 txcnt <= txcnt + 1;
830 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(0),32)(23 downto 16);
831 tx_start_sig <= '1';
832 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
833 elsif txcnt = 8 then -- data: counter A 31...24
834 txcnt <= txcnt + 1;
835 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(0),32)(31 downto 24);
836 tx_start_sig <= '1';
837 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
838 elsif txcnt = 9 then -- data: counter B 7...0
839 txcnt <= txcnt + 1;
840 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(1),32)(7 downto 0);
841 tx_start_sig <= '1';
842 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
843 elsif txcnt = 10 then -- data: counter B 15...8
844 txcnt <= txcnt + 1;
845 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(1),32)(15 downto 8);
846 tx_start_sig <= '1';
847 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
848 elsif txcnt = 11 then -- data: counter B 23...16
849 txcnt <= txcnt + 1;
850 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(1),32)(23 downto 16);
851 tx_start_sig <= '1';
852 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
853 elsif txcnt = 12 then -- data: counter B 31...24
854 txcnt <= txcnt + 1;
855 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(1),32)(31 downto 24);
856 tx_start_sig <= '1';
857 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
858 elsif txcnt = 13 then -- data: counter C 7...0
859 txcnt <= txcnt + 1;
860 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(2),32)(7 downto 0);
861 tx_start_sig <= '1';
862 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
863 elsif txcnt = 14 then -- data: counter C 15...8
864 txcnt <= txcnt + 1;
865 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(2),32)(15 downto 8);
866 tx_start_sig <= '1';
867 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
868 elsif txcnt = 15 then -- data: counter C 23...16
869 txcnt <= txcnt + 1;
870 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(2),32)(23 downto 16);
871 tx_start_sig <= '1';
872 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
873 elsif txcnt = 16 then -- data: counter C 31...24
874 txcnt <= txcnt + 1;
875 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(2),32)(31 downto 24);
876 tx_start_sig <= '1';
877 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
878 elsif txcnt = 17 then -- data: counter D 7...0
879 txcnt <= txcnt + 1;
880 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(3),32)(7 downto 0);
881 tx_start_sig <= '1';
882 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
883 elsif txcnt = 18 then -- data: counter D 15...8
884 txcnt <= txcnt + 1;
885 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(3),32)(15 downto 8);
886 tx_start_sig <= '1';
887 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
888 elsif txcnt = 19 then -- data: counter D 23...16
889 txcnt <= txcnt + 1;
890 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(3),32)(23 downto 16);
891 tx_start_sig <= '1';
892 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
893 elsif txcnt = 20 then -- data: counter D 31...24
894 txcnt <= txcnt + 1;
895 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(3),32)(31 downto 24);
896 tx_start_sig <= '1';
897 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
898 elsif txcnt = 21 then -- data: trigger counter 7...0
899 txcnt <= txcnt + 1;
900 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(4),32)(7 downto 0);
901 tx_start_sig <= '1';
902 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
903 elsif txcnt = 22 then -- data: trigger counter 15...8
904 txcnt <= txcnt + 1;
905 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(4),32)(15 downto 8);
906 tx_start_sig <= '1';
907 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
908 elsif txcnt = 23 then -- data: trigger counter 23...16
909 txcnt <= txcnt + 1;
910 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(4),32)(23 downto 16);
911 tx_start_sig <= '1';
912 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
913 elsif txcnt = 24 then -- data: trigger counter 31...24
914 txcnt <= txcnt + 1;
915 tx_data_sig <= conv_std_logic_vector(rate_array_rs485(4),32)(31 downto 24);
916 tx_start_sig <= '1';
917 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
918 elsif txcnt = 25 then -- data: overflow register
919 txcnt <= txcnt + 1;
920 tx_data_sig <= overflow_array_rs485_in;
921 tx_start_sig <= '1';
922 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
923 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
924 txcnt <= txcnt + 1;
925 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
926 tx_start_sig <= '1';
927 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
928 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
929 txcnt <= txcnt + 1;
930 tx_data_sig <= crc_sig;
931 tx_start_sig <= '1';
932 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
933 else -- transmission finished
934 txcnt <= 0;
935 reset_crc_sig <= '1';
936 FTU_rs485_control_State <= RECEIVE;
937 end if;
938 else
939 tx_start_sig <= '0';
940 FTU_rs485_control_State <= READ_RATES_TRANSMIT;
941 end if;
942
943 when READ_DAC_TRANSMIT =>
944 if tx_busy_sig = '0' then
945 if txcnt = 0 then -- start delimiter
946 txcnt <= txcnt + 1;
947 tx_data_sig <= RS485_START_DELIM;
948 tx_start_sig <= '1';
949 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
950 elsif txcnt = 1 then -- FTM address
951 txcnt <= txcnt + 1;
952 tx_data_sig <= FTM_ADDRESS;
953 tx_start_sig <= '1';
954 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
955 elsif txcnt = 2 then -- board address
956 txcnt <= txcnt + 1;
957 tx_data_sig <= "00" & brd_add;
958 tx_start_sig <= '1';
959 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
960 elsif txcnt = 3 then -- firmware ID
961 txcnt <= txcnt + 1;
962 tx_data_sig <= FIRMWARE_ID;
963 tx_start_sig <= '1';
964 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
965 elsif txcnt = 4 then -- mirrored command
966 txcnt <= txcnt + 1;
967 tx_data_sig <= "00000001";
968 tx_start_sig <= '1';
969 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
970 elsif txcnt = 5 then -- data: DAC A low
971 txcnt <= txcnt + 1;
972 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0);
973 tx_start_sig <= '1';
974 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
975 elsif txcnt = 6 then -- data: DAC A high
976 txcnt <= txcnt + 1;
977 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8);
978 tx_start_sig <= '1';
979 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
980 elsif txcnt = 7 then -- data: DAC B low
981 txcnt <= txcnt + 1;
982 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0);
983 tx_start_sig <= '1';
984 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
985 elsif txcnt = 8 then -- data: DAC B high
986 txcnt <= txcnt + 1;
987 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8);
988 tx_start_sig <= '1';
989 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
990 elsif txcnt = 9 then -- data: DAC C low
991 txcnt <= txcnt + 1;
992 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0);
993 tx_start_sig <= '1';
994 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
995 elsif txcnt = 10 then -- data: DAC C high
996 txcnt <= txcnt + 1;
997 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8);
998 tx_start_sig <= '1';
999 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1000 elsif txcnt = 11 then -- data: DAC D low
1001 txcnt <= txcnt + 1;
1002 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0);
1003 tx_start_sig <= '1';
1004 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1005 elsif txcnt = 12 then -- data: DAC D high
1006 txcnt <= txcnt + 1;
1007 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8);
1008 tx_start_sig <= '1';
1009 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1010 elsif txcnt = 13 then -- data: DAC E low
1011 txcnt <= txcnt + 1;
1012 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0);
1013 tx_start_sig <= '1';
1014 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1015 elsif txcnt = 14 then -- data: DAC E high
1016 txcnt <= txcnt + 1;
1017 tx_data_sig <= conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8);
1018 tx_start_sig <= '1';
1019 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1020 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
1021 txcnt <= txcnt + 1;
1022 tx_data_sig <= "00000000";
1023 tx_start_sig <= '1';
1024 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1025 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
1026 txcnt <= txcnt + 1;
1027 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
1028 tx_start_sig <= '1';
1029 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1030 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
1031 txcnt <= txcnt + 1;
1032 tx_data_sig <= crc_sig;
1033 tx_start_sig <= '1';
1034 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1035 else -- transmission finished
1036 txcnt <= 0;
1037 reset_crc_sig <= '1';
1038 FTU_rs485_control_State <= RECEIVE;
1039 end if;
1040 else
1041 tx_start_sig <= '0';
1042 FTU_rs485_control_State <= READ_DAC_TRANSMIT;
1043 end if;
1044
1045 when READ_ENABLE_TRANSMIT =>
1046 if tx_busy_sig = '0' then
1047 if txcnt = 0 then -- start delimiter
1048 txcnt <= txcnt + 1;
1049 tx_data_sig <= RS485_START_DELIM;
1050 tx_start_sig <= '1';
1051 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1052 elsif txcnt = 1 then -- FTM address
1053 txcnt <= txcnt + 1;
1054 tx_data_sig <= FTM_ADDRESS;
1055 tx_start_sig <= '1';
1056 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1057 elsif txcnt = 2 then -- board address
1058 txcnt <= txcnt + 1;
1059 tx_data_sig <= "00" & brd_add;
1060 tx_start_sig <= '1';
1061 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1062 elsif txcnt = 3 then -- firmware ID
1063 txcnt <= txcnt + 1;
1064 tx_data_sig <= FIRMWARE_ID;
1065 tx_start_sig <= '1';
1066 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1067 elsif txcnt = 4 then -- mirrored command
1068 txcnt <= txcnt + 1;
1069 tx_data_sig <= "00000100";
1070 tx_start_sig <= '1';
1071 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1072 elsif txcnt = 5 then -- data: enable pattern A7-0
1073 txcnt <= txcnt + 1;
1074 tx_data_sig <= enable_array_rs485_in(0)(7 downto 0);
1075 tx_start_sig <= '1';
1076 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1077 elsif txcnt = 6 then -- data: enable pattern A8
1078 txcnt <= txcnt + 1;
1079 tx_data_sig <= enable_array_rs485_in(0)(15 downto 8);
1080 tx_start_sig <= '1';
1081 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1082 elsif txcnt = 7 then -- data: enable pattern B7-0
1083 txcnt <= txcnt + 1;
1084 tx_data_sig <= enable_array_rs485_in(1)(7 downto 0);
1085 tx_start_sig <= '1';
1086 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1087 elsif txcnt = 8 then -- data: enable pattern B8
1088 txcnt <= txcnt + 1;
1089 tx_data_sig <= enable_array_rs485_in(1)(15 downto 8);
1090 tx_start_sig <= '1';
1091 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1092 elsif txcnt = 9 then -- data: enable pattern C7-0
1093 txcnt <= txcnt + 1;
1094 tx_data_sig <= enable_array_rs485_in(2)(7 downto 0);
1095 tx_start_sig <= '1';
1096 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1097 elsif txcnt = 10 then -- data: enable pattern C8
1098 txcnt <= txcnt + 1;
1099 tx_data_sig <= enable_array_rs485_in(2)(15 downto 8);
1100 tx_start_sig <= '1';
1101 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1102 elsif txcnt = 11 then -- data: enable pattern D7-0
1103 txcnt <= txcnt + 1;
1104 tx_data_sig <= enable_array_rs485_in(3)(7 downto 0);
1105 tx_start_sig <= '1';
1106 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1107 elsif txcnt = 12 then -- data: enable pattern D8
1108 txcnt <= txcnt + 1;
1109 tx_data_sig <= enable_array_rs485_in(3)(15 downto 8);
1110 tx_start_sig <= '1';
1111 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1112 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
1113 txcnt <= txcnt + 1;
1114 tx_data_sig <= "00000000";
1115 tx_start_sig <= '1';
1116 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1117 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
1118 txcnt <= txcnt + 1;
1119 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
1120 tx_start_sig <= '1';
1121 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1122 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
1123 txcnt <= txcnt + 1;
1124 tx_data_sig <= crc_sig;
1125 tx_start_sig <= '1';
1126 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1127 else -- transmission finished
1128 txcnt <= 0;
1129 reset_crc_sig <= '1';
1130 FTU_rs485_control_State <= RECEIVE;
1131 end if;
1132 else
1133 tx_start_sig <= '0';
1134 FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
1135 end if;
1136
1137 when READ_PRESCALING_TRANSMIT =>
1138 if tx_busy_sig = '0' then
1139 if txcnt = 0 then -- start delimiter
1140 txcnt <= txcnt + 1;
1141 tx_data_sig <= RS485_START_DELIM;
1142 tx_start_sig <= '1';
1143 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1144 elsif txcnt = 1 then -- FTM address
1145 txcnt <= txcnt + 1;
1146 tx_data_sig <= FTM_ADDRESS;
1147 tx_start_sig <= '1';
1148 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1149 elsif txcnt = 2 then -- board address
1150 txcnt <= txcnt + 1;
1151 tx_data_sig <= "00" & brd_add;
1152 tx_start_sig <= '1';
1153 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1154 elsif txcnt = 3 then -- firmware ID
1155 txcnt <= txcnt + 1;
1156 tx_data_sig <= FIRMWARE_ID;
1157 tx_start_sig <= '1';
1158 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1159 elsif txcnt = 4 then -- mirrored command
1160 txcnt <= txcnt + 1;
1161 tx_data_sig <= "00000111";
1162 tx_start_sig <= '1';
1163 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1164 elsif txcnt = 5 then -- data: prescaling
1165 txcnt <= txcnt + 1;
1166 tx_data_sig <= prescaling_rs485_in;
1167 tx_start_sig <= '1';
1168 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1169 elsif txcnt = 6 then -- data: overflow register
1170 txcnt <= txcnt + 1;
1171 tx_data_sig <= overflow_array_rs485_in;
1172 tx_start_sig <= '1';
1173 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1174 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
1175 txcnt <= txcnt + 1;
1176 tx_data_sig <= "00000000";
1177 tx_start_sig <= '1';
1178 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1179 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
1180 txcnt <= txcnt + 1;
1181 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
1182 tx_start_sig <= '1';
1183 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1184 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
1185 txcnt <= txcnt + 1;
1186 tx_data_sig <= crc_sig;
1187 tx_start_sig <= '1';
1188 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1189 else -- transmission finished
1190 txcnt <= 0;
1191 reset_crc_sig <= '1';
1192 FTU_rs485_control_State <= RECEIVE;
1193 end if;
1194 else
1195 tx_start_sig <= '0';
1196 FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
1197 end if;
1198
1199 when PING_PONG_TRANSMIT =>
1200 crc_enable_sig <= '0';
1201 if tx_busy_sig = '0' then
1202 if txcnt = 0 then -- start delimiter
1203 txcnt <= txcnt + 1;
1204 tx_data_sig <= RS485_START_DELIM;
1205 tx_start_sig <= '1';
1206 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1207 elsif txcnt = 1 then -- FTM address
1208 txcnt <= txcnt + 1;
1209 tx_data_sig <= FTM_ADDRESS;
1210 tx_start_sig <= '1';
1211 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1212 elsif txcnt = 2 then -- board address
1213 txcnt <= txcnt + 1;
1214 tx_data_sig <= "00" & brd_add;
1215 tx_start_sig <= '1';
1216 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1217 elsif txcnt = 3 then -- firmware ID
1218 txcnt <= txcnt + 1;
1219 tx_data_sig <= FIRMWARE_ID;
1220 tx_start_sig <= '1';
1221 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1222 elsif txcnt = 4 then -- mirrored command
1223 txcnt <= txcnt + 1;
1224 tx_data_sig <= "00000101";
1225 tx_start_sig <= '1';
1226 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1227 elsif txcnt = 5 then -- data: device DNA
1228 txcnt <= txcnt + 1;
1229 tx_data_sig <= dna(7 downto 0);
1230 tx_start_sig <= '1';
1231 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1232 elsif txcnt = 6 then -- data: device DNA
1233 txcnt <= txcnt + 1;
1234 tx_data_sig <= dna(15 downto 8);
1235 tx_start_sig <= '1';
1236 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1237 elsif txcnt = 7 then -- data: device DNA
1238 txcnt <= txcnt + 1;
1239 tx_data_sig <= dna(23 downto 16);
1240 tx_start_sig <= '1';
1241 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1242 elsif txcnt = 8 then -- data: device DNA
1243 txcnt <= txcnt + 1;
1244 tx_data_sig <= dna(31 downto 24);
1245 tx_start_sig <= '1';
1246 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1247 elsif txcnt = 9 then -- data: device DNA
1248 txcnt <= txcnt + 1;
1249 tx_data_sig <= dna(39 downto 32);
1250 tx_start_sig <= '1';
1251 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1252 elsif txcnt = 10 then -- data: device DNA
1253 txcnt <= txcnt + 1;
1254 tx_data_sig <= dna(47 downto 40);
1255 tx_start_sig <= '1';
1256 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1257 elsif txcnt = 11 then -- data: device DNA
1258 txcnt <= txcnt + 1;
1259 tx_data_sig <= dna(55 downto 48);
1260 tx_start_sig <= '1';
1261 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1262 elsif txcnt = 12 then -- data: device DNA
1263 txcnt <= txcnt + 1;
1264 tx_data_sig <= dna(63 downto 56);
1265 tx_start_sig <= '1';
1266 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1267 elsif txcnt < ((RS485_BLOCK_WIDTH / 8) - 2) then -- data: not used
1268 txcnt <= txcnt + 1;
1269 tx_data_sig <= "00000000";
1270 tx_start_sig <= '1';
1271 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1272 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then -- CRC error counter
1273 txcnt <= txcnt + 1;
1274 tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
1275 tx_start_sig <= '1';
1276 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1277 elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then -- check sum
1278 txcnt <= txcnt + 1;
1279 tx_data_sig <= crc_sig;
1280 tx_start_sig <= '1';
1281 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1282 else -- transmission finished
1283 txcnt <= 0;
1284 reset_crc_sig <= '1';
1285 FTU_rs485_control_State <= RECEIVE;
1286 end if;
1287 else
1288 tx_start_sig <= '0';
1289 FTU_rs485_control_State <= PING_PONG_TRANSMIT;
1290 end if;
1291
1292 end case;
1293 end if;
1294 end process FTU_rs485_control_FSM;
1295
1296end Behavioral;
1297
Note: See TracBrowser for help on using the repository browser.