source: firmware/FTU/FTU_control.vhd@ 9890

Last change on this file since 9890 was 9890, checked in by weitzel, 14 years ago
overflow register implemented for FTU rate counter
File size: 15.1 KB
Line 
1----------------------------------------------------------------------------------
2-- Company: ETH Zurich, Institute for Particle Physics
3-- Engineer: Q. Weitzel, P. Vogler
4--
5-- Create Date: 08/06/2010
6-- Design Name:
7-- Module Name: FTU_control - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description: Control FSM of FACT FTU board
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_control is
36 port(
37 clk_50MHz : IN std_logic;
38 clk_ready : IN std_logic;
39 config_started : IN std_logic;
40 config_ready : IN std_logic;
41 ram_doa : IN STD_LOGIC_VECTOR(7 downto 0);
42 ram_dob : IN STD_LOGIC_VECTOR(15 downto 0);
43 rate_array : IN rate_array_type;
44 overflow_array : in STD_LOGIC_VECTOR(7 downto 0);
45 new_rates : IN std_logic;
46 reset : OUT std_logic;
47 config_start : OUT std_logic;
48 ram_ena : OUT std_logic;
49 ram_enb : OUT std_logic;
50 ram_wea : OUT STD_LOGIC_VECTOR(0 downto 0);
51 ram_web : OUT STD_LOGIC_VECTOR(0 downto 0);
52 ram_ada : OUT STD_LOGIC_VECTOR(4 downto 0);
53 ram_adb : OUT STD_LOGIC_VECTOR(3 downto 0);
54 ram_dia : OUT STD_LOGIC_VECTOR(7 downto 0);
55 ram_dib : OUT STD_LOGIC_VECTOR(15 downto 0);
56 dac_array : OUT dac_array_type;
57 enable_array : OUT enable_array_type;
58 cntr_reset : OUT STD_LOGIC;
59 prescaling : OUT STD_LOGIC_VECTOR(7 downto 0)
60 );
61end FTU_control;
62
63architecture Behavioral of FTU_control is
64
65 signal reset_sig : STD_LOGIC := '0'; --initialize reset to 0 at power up
66
67 --DAC/SPI interface, default DACs come from RAM during INIT
68 signal config_start_sig : STD_LOGIC := '0';
69 signal dac_array_sig : dac_array_type := (0,0,0,0,0,0,0,0);
70
71 --enable signals for pixels in trigger, default values come from RAM during INIT
72 signal enable_array_sig : enable_array_type := ("0000000000000000", --patch A
73 "0000000000000000", --patch B
74 "0000000000000000", --patch C
75 "0000000000000000");--patch D
76
77 signal rate_array_sig : rate_array_type; -- initialized in FTU_top
78 signal cntr_reset_sig : STD_LOGIC := '0';
79 signal prescaling_sig : STD_LOGIC_VECTOR(7 downto 0) := "00011101"; -- 29
80
81 signal ram_ena_sig : STD_LOGIC := '0'; -- RAM enable for port A
82 signal ram_enb_sig : STD_LOGIC := '0'; -- RAM enable for port B
83 signal ram_wea_sig : STD_LOGIC_VECTOR(0 downto 0) := "0"; -- RAM write enable for port A
84 signal ram_web_sig : STD_LOGIC_VECTOR(0 downto 0) := "0"; -- RAM write enable for port B
85 signal ram_ada_sig : STD_LOGIC_VECTOR(4 downto 0) := (others => '0'); --RAM port A address
86 signal ram_adb_sig : STD_LOGIC_VECTOR(3 downto 0) := (others => '0'); --RAM port B address
87 signal ram_dia_sig : STD_LOGIC_VECTOR(7 downto 0) := (others => '0'); --RAM data in A
88 signal ram_dib_sig : STD_LOGIC_VECTOR(15 downto 0) := (others => '0'); --RAM data in B
89
90 --counter to loop through RAM
91 signal ram_ada_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_A := 0;
92 signal ram_adb_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_B := 0;
93 signal ram_dac_cntr : INTEGER range 0 to (NO_OF_DAC - NO_OF_DAC_NOT_USED + 2) := 0;
94 signal ram_enable_cntr : INTEGER range 0 to (NO_OF_ENABLE + 1) := 0;
95 signal ram_counter_cntr : INTEGER range 0 to (NO_OF_COUNTER + 2) := 0; --includes overflow register
96
97 signal wait_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_A := 0;
98
99 signal new_rates_sig : STD_LOGIC := '0';
100 signal new_rates_busy : STD_LOGIC := '0';
101
102 signal new_DACs_in_RAM : STD_LOGIC := '0';
103 signal new_enables_in_RAM : STD_LOGIC := '0';
104 signal new_prescaling_in_RAM : STD_LOGIC := '0';
105
106 type FTU_control_StateType is (IDLE, INIT, RUNNING, CONFIG_ENABLE, CONFIG_DAC, CONFIG_COUNTER, WRITE_RATES, RESET_ALL);
107 signal FTU_control_State : FTU_control_StateType;
108
109begin
110
111 --FTU control finite state machine
112
113 FTU_control_FSM: process (clk_50MHz)
114
115 begin
116
117 if Rising_edge(clk_50MHz) then
118
119 case FTU_control_State is
120
121 when IDLE => -- wait for DCMs to lock
122 reset_sig <= '0';
123 config_start_sig <= '0';
124 ram_ena_sig <= '0';
125 ram_wea_sig <= "0";
126 if (clk_ready = '1') then
127 FTU_control_State <= INIT;
128 end if;
129
130 when INIT => -- load default config data to RAM, see also ftu_definitions.vhd for more info
131 reset_sig <= '0';
132 new_rates_busy <= '1';
133 config_start_sig <= '0';
134 ram_ena_sig <= '1';
135 ram_wea_sig <= "1";
136 ram_ada_cntr <= ram_ada_cntr + 1;
137 ram_ada_sig <= conv_std_logic_vector(ram_ada_cntr, RAM_ADDR_WIDTH_A);
138 if (ram_ada_cntr < NO_OF_ENABLE*RAM_ADDR_RATIO) then -- default enables
139 if (ram_ada_cntr mod 2 = 0) then
140 ram_dia_sig <= DEFAULT_ENABLE(ram_ada_cntr / 2)(7 downto 0);
141 else
142 ram_dia_sig <= DEFAULT_ENABLE(ram_ada_cntr / 2)(15 downto 8);
143 end if;
144 FTU_control_State <= INIT;
145 elsif (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) then -- default counter values
146 ram_dia_sig <= (others => '0');
147 FTU_control_State <= INIT;
148 elsif (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO)) then -- default DACs
149 if (ram_ada_cntr < NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED - 1)*RAM_ADDR_RATIO) then
150 if (ram_ada_cntr mod 2 = 0) then
151 ram_dia_sig <= conv_std_logic_vector(DEFAULT_DAC((ram_ada_cntr - (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) / 2),16)(7 downto 0);
152 else
153 ram_dia_sig <= conv_std_logic_vector(DEFAULT_DAC((ram_ada_cntr - (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) / 2),16)(15 downto 8);
154 end if;
155 else
156 if (ram_ada_cntr mod 2 = 0) then
157 ram_dia_sig <= conv_std_logic_vector(DEFAULT_DAC(((ram_ada_cntr - (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) / 2) + NO_OF_DAC_NOT_USED),16)(7 downto 0);
158 else
159 ram_dia_sig <= conv_std_logic_vector(DEFAULT_DAC(((ram_ada_cntr - (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) / 2) + NO_OF_DAC_NOT_USED),16)(15 downto 8);
160 end if;
161 end if;
162 FTU_control_State <= INIT;
163 elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO)) then -- default prescaling
164 ram_dia_sig <= conv_std_logic_vector(DEFAULT_PRESCALING,8);
165 FTU_control_State <= INIT;
166 elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 1) then -- default overflow register
167 ram_dia_sig <= (others => '0');
168 FTU_control_State <= INIT;
169 elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 2) then -- default checksum
170 ram_dia_sig <= (others => '0');
171 FTU_control_State <= INIT;
172 elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 3) then -- empty RAM cell
173 ram_dia_sig <= (others => '0');
174 FTU_control_State <= INIT;
175 else
176 ram_dia_sig <= (others => '0');
177 ram_ada_cntr <= 0;
178 ram_ada_sig <= (others => '0');
179 ram_ena_sig <= '0';
180 ram_wea_sig <= "0";
181 new_DACs_in_RAM <= '1';
182 new_enables_in_RAM <= '1';
183 new_prescaling_in_RAM <= '1';
184 cntr_reset_sig <= '1';
185 new_rates_busy <= '0';
186 FTU_control_State <= RUNNING;
187 end if;
188
189 when RUNNING => -- count triggers and react to commands from FTM
190 cntr_reset_sig <= '0';
191 reset_sig <= '0';
192 config_start_sig <= '0';
193 if (new_rates_sig = '1') then
194 FTU_control_State <= WRITE_RATES;
195 else
196 if (new_DACs_in_RAM = '1') then
197 ram_enb_sig <= '1';
198 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER), RAM_ADDR_WIDTH_B);
199 FTU_control_State <= CONFIG_DAC;
200 elsif (new_DACs_in_RAM = '0' and new_enables_in_RAM = '1') then
201 ram_enb_sig <= '1';
202 ram_adb_sig <= conv_std_logic_vector(0, RAM_ADDR_WIDTH_B);
203 FTU_control_State <= CONFIG_ENABLE;
204 elsif (new_DACs_in_RAM = '0' and new_enables_in_RAM = '0' and new_prescaling_in_RAM = '1') then
205 ram_ena_sig <= '1';
206 ram_ada_sig <= conv_std_logic_vector((NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO), RAM_ADDR_WIDTH_A);
207 FTU_control_State <= CONFIG_COUNTER;
208 else
209 FTU_control_State <= RUNNING;
210 end if;
211 end if;
212
213 when CONFIG_COUNTER =>
214 wait_cntr <= wait_cntr + 1;
215 new_rates_busy <= '1';
216 if (wait_cntr = 0) then
217 FTU_control_State <= CONFIG_COUNTER;
218 elsif (wait_cntr = 1) then
219 prescaling_sig <= ram_doa;
220 FTU_control_State <= CONFIG_COUNTER;
221 else
222 cntr_reset_sig <= '1';
223 ram_ada_sig <= (others => '0');
224 wait_cntr <= 0;
225 new_prescaling_in_RAM <= '0';
226 ram_ena_sig <= '0';
227 new_rates_busy <= '0';
228 FTU_control_State <= RUNNING;
229 end if;
230
231 when CONFIG_ENABLE =>
232 ram_enable_cntr <= ram_enable_cntr + 1;
233 new_rates_busy <= '1';
234 if (ram_enable_cntr = 0) then
235 ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
236 FTU_control_State <= CONFIG_ENABLE;
237 elsif (ram_enable_cntr > 0 and ram_enable_cntr < NO_OF_ENABLE + 1) then
238 ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
239 enable_array_sig(ram_enable_cntr - 1) <= ram_dob;
240 FTU_control_State <= CONFIG_ENABLE;
241 else
242 ram_adb_sig <= (others => '0');
243 ram_enable_cntr <= 0;
244 new_enables_in_RAM <= '0';
245 ram_enb_sig <= '0';
246 cntr_reset_sig <= '1';
247 new_rates_busy <= '0';
248 FTU_control_State <= RUNNING;
249 end if;
250
251 when CONFIG_DAC =>
252 new_rates_busy <= '1';
253 if (ram_dac_cntr <= (NO_OF_DAC - NO_OF_DAC_NOT_USED + 2)) then
254 ram_dac_cntr <= ram_dac_cntr + 1;
255 if (ram_dac_cntr = 0) then
256 FTU_control_State <= CONFIG_DAC;
257 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
258 elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED)) then
259 dac_array_sig(ram_dac_cntr - 1) <= conv_integer(unsigned(ram_dob));
260 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
261 FTU_control_State <= CONFIG_DAC;
262 elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED + 1)) then
263 dac_array_sig(ram_dac_cntr - 1 + NO_OF_DAC_NOT_USED) <= conv_integer(unsigned(ram_dob));
264 ram_adb_sig <= (others => '0');
265 FTU_control_State <= CONFIG_DAC;
266 else
267 ram_adb_sig <= (others => '0');
268 config_start_sig <= '1';
269 FTU_control_State <= CONFIG_DAC;
270 end if;
271 else
272 if (config_ready = '1') then
273 ram_dac_cntr <= 0;
274 new_DACs_in_RAM <= '0';
275 cntr_reset_sig <= '1';
276 new_rates_busy <= '0';
277 FTU_control_State <= RUNNING;
278 elsif (config_ready = '0' and config_started = '1') then
279 ram_enb_sig <= '0';
280 config_start_sig <= '0';
281 FTU_control_State <= CONFIG_DAC;
282 else
283 FTU_control_State <= CONFIG_DAC;
284 end if;
285 end if;
286
287 when WRITE_RATES => -- write trigger/patch rates to RAM B and overflow register to RAM A
288 new_rates_busy <= '1';
289 ram_counter_cntr <= ram_counter_cntr + 1;
290 if (ram_counter_cntr < NO_OF_COUNTER) then
291 ram_enb_sig <= '1';
292 ram_web_sig <= "1";
293 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + ram_counter_cntr), RAM_ADDR_WIDTH_B);
294 ram_dib_sig <= conv_std_logic_vector(rate_array_sig(ram_counter_cntr), 16);
295 FTU_control_State <= WRITE_RATES;
296 elsif (ram_counter_cntr = NO_Of_COUNTER) then
297 ram_dib_sig <= (others => '0');
298 ram_adb_sig <= (others => '0');
299 ram_enb_sig <= '0';
300 ram_web_sig <= "0";
301 ram_ena_sig <= '1';
302 ram_wea_sig <= "1";
303 ram_ada_sig <= conv_std_logic_vector(NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO + 1, RAM_ADDR_WIDTH_A);
304 ram_dia_sig <= overflow_array;
305 FTU_control_State <= WRITE_RATES;
306 else
307 ram_ena_sig <= '0';
308 ram_wea_sig <= "0";
309 ram_counter_cntr <= 0;
310 new_rates_busy <= '0';
311 FTU_control_State <= RUNNING;
312 end if;
313
314 when RESET_ALL => -- reset/clear and start from scratch
315 reset_sig <= '1';
316 config_start_sig <= '0';
317 FTU_control_State <= IDLE;
318 end case;
319 end if;
320 end process FTU_control_FSM;
321
322 detect_new_rates: process(new_rates, new_rates_busy)
323 begin
324 if (new_rates_busy = '0' and rising_edge(new_rates)) then
325 new_rates_sig <= '1';
326 else
327 new_rates_sig <= '0';
328 end if;
329 end process detect_new_rates;
330
331 reset <= reset_sig;
332
333 config_start <= config_start_sig;
334 dac_array <= dac_array_sig;
335
336 enable_array <= enable_array_sig;
337
338 rate_array_sig <= rate_array;
339
340 cntr_reset <= cntr_reset_sig;
341 prescaling <= prescaling_sig;
342
343 ram_ena <= ram_ena_sig;
344 ram_enb <= ram_enb_sig;
345 ram_wea <= ram_wea_sig;
346 ram_web <= ram_web_sig;
347 ram_ada <= ram_ada_sig;
348 ram_adb <= ram_adb_sig;
349 ram_dia <= ram_dia_sig;
350 ram_dib <= ram_dib_sig;
351
352end Behavioral;
Note: See TracBrowser for help on using the repository browser.