source: firmware/FTU/FTU_control.vhd@ 9882

Last change on this file since 9882 was 9880, checked in by weitzel, 14 years ago
FTU_rate_counter added and FTU_control state machine extended
File size: 12.8 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 reset : OUT std_logic;
45 config_start : OUT std_logic;
46 ram_ena : OUT std_logic;
47 ram_enb : OUT std_logic;
48 ram_wea : OUT STD_LOGIC_VECTOR(0 downto 0);
49 ram_web : OUT STD_LOGIC_VECTOR(0 downto 0);
50 ram_ada : OUT STD_LOGIC_VECTOR(4 downto 0);
51 ram_adb : OUT STD_LOGIC_VECTOR(3 downto 0);
52 ram_dia : OUT STD_LOGIC_VECTOR(7 downto 0);
53 ram_dib : OUT STD_LOGIC_VECTOR(15 downto 0);
54 dac_array : OUT dac_array_type;
55 enable_array : OUT enable_array_type;
56 cntr_reset : OUT STD_LOGIC;
57 prescaling : OUT STD_LOGIC_VECTOR(7 downto 0)
58 );
59end FTU_control;
60
61architecture Behavioral of FTU_control is
62
63 signal reset_sig : STD_LOGIC := '0'; --initialize reset to 0 at power up
64
65 --DAC/SPI interface, default DACs come from RAM during INIT
66 signal config_start_sig : STD_LOGIC := '0';
67 signal dac_array_sig : dac_array_type := (0,0,0,0,0,0,0,0);
68
69 --enable signals for pixels in trigger, default values come from RAM during INIT
70 signal enable_array_sig : enable_array_type := ("0000000000000000", --patch A
71 "0000000000000000", --patch B
72 "0000000000000000", --patch C
73 "0000000000000000");--patch D
74
75 signal rate_array_sig : rate_array_type; -- initialized in FTU_top
76 signal cntr_reset_sig : STD_LOGIC := '0';
77 signal prescaling_sig : STD_LOGIC_VECTOR(7 downto 0) := "00000000";
78
79 signal ram_ena_sig : STD_LOGIC := '0'; -- RAM enable for port A
80 signal ram_enb_sig : STD_LOGIC := '0'; -- RAM enable for port B
81 signal ram_wea_sig : STD_LOGIC_VECTOR(0 downto 0) := "0"; -- RAM write enable for port A
82 signal ram_web_sig : STD_LOGIC_VECTOR(0 downto 0) := "0"; -- RAM write enable for port B
83 signal ram_ada_sig : STD_LOGIC_VECTOR(4 downto 0) := (others => '0'); --RAM port A address
84 signal ram_adb_sig : STD_LOGIC_VECTOR(3 downto 0) := (others => '0'); --RAM port B address
85 signal ram_dia_sig : STD_LOGIC_VECTOR(7 downto 0) := (others => '0'); --RAM data in A
86 signal ram_dib_sig : STD_LOGIC_VECTOR(15 downto 0) := (others => '0'); --RAM data in B
87
88 --counter to loop through RAM
89 signal ram_ada_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_A := 0;
90 signal ram_adb_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_B := 0;
91 signal ram_dac_cntr : INTEGER range 0 to (NO_OF_DAC - NO_OF_DAC_NOT_USED + 2) := 0;
92 signal ram_enable_cntr : INTEGER range 0 to (NO_OF_ENABLE + 1) := 0;
93
94 signal wait_cntr : INTEGER range 0 to 2**RAM_ADDR_WIDTH_A := 0;
95
96 signal new_DACs_in_RAM : STD_LOGIC := '0';
97 signal new_enables_in_RAM : STD_LOGIC := '0';
98 signal new_prescaling_in_RAM : STD_LOGIC := '0';
99
100 type FTU_control_StateType is (IDLE, INIT, RUNNING, CONFIG_ENABLE, CONFIG_DAC, CONFIG_COUNTER, RESET_ALL);
101 signal FTU_control_State : FTU_control_StateType;
102
103begin
104
105 --FTU control finite state machine
106
107 FTU_control_FSM: process (clk_50MHz)
108
109 begin
110
111 if Rising_edge(clk_50MHz) then
112
113 case FTU_control_State is
114
115 when IDLE => -- wait for DCMs to lock
116 reset_sig <= '0';
117 config_start_sig <= '0';
118 ram_ena_sig <= '0';
119 ram_wea_sig <= "0";
120 if (clk_ready = '1') then
121 FTU_control_State <= INIT;
122 end if;
123
124 when INIT => -- load default config data to RAM, see also ftu_definitions.vhd for more info
125 reset_sig <= '0';
126 config_start_sig <= '0';
127 ram_ena_sig <= '1';
128 ram_wea_sig <= "1";
129 ram_ada_cntr <= ram_ada_cntr + 1;
130 ram_ada_sig <= conv_std_logic_vector(ram_ada_cntr, RAM_ADDR_WIDTH_A);
131 if (ram_ada_cntr < NO_OF_ENABLE*RAM_ADDR_RATIO) then -- default enables
132 if (ram_ada_cntr mod 2 = 0) then
133 ram_dia_sig <= DEFAULT_ENABLE(ram_ada_cntr / 2)(7 downto 0);
134 else
135 ram_dia_sig <= DEFAULT_ENABLE(ram_ada_cntr / 2)(15 downto 8);
136 end if;
137 FTU_control_State <= INIT;
138 elsif (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) then -- default counter values
139 ram_dia_sig <= (others => '0');
140 FTU_control_State <= INIT;
141 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
142 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
143 if (ram_ada_cntr mod 2 = 0) then
144 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);
145 else
146 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);
147 end if;
148 else
149 if (ram_ada_cntr mod 2 = 0) then
150 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);
151 else
152 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);
153 end if;
154 end if;
155 FTU_control_State <= INIT;
156 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
157 ram_dia_sig <= conv_std_logic_vector(DEFAULT_PRESCALING,8);
158 FTU_control_State <= INIT;
159 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
160 ram_dia_sig <= (others => '0');
161 FTU_control_State <= INIT;
162 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
163 ram_dia_sig <= (others => '0');
164 FTU_control_State <= INIT;
165 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
166 ram_dia_sig <= (others => '0');
167 FTU_control_State <= INIT;
168 else
169 ram_dia_sig <= (others => '0');
170 ram_ada_cntr <= 0;
171 ram_ada_sig <= (others => '0');
172 ram_ena_sig <= '0';
173 ram_wea_sig <= "0";
174 new_DACs_in_RAM <= '1';
175 new_enables_in_RAM <= '1';
176 new_prescaling_in_RAM <= '1';
177 FTU_control_State <= RUNNING;
178 end if;
179
180 when RUNNING => -- count triggers and react to commands from FTM
181 reset_sig <= '0';
182 config_start_sig <= '0';
183 if (new_DACs_in_RAM = '1') then
184 ram_enb_sig <= '1';
185 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER), RAM_ADDR_WIDTH_B);
186 FTU_control_State <= CONFIG_DAC;
187 elsif (new_DACs_in_RAM = '0' and new_enables_in_RAM = '1') then
188 ram_enb_sig <= '1';
189 ram_adb_sig <= conv_std_logic_vector(0, RAM_ADDR_WIDTH_B);
190 FTU_control_State <= CONFIG_ENABLE;
191 elsif (new_DACs_in_RAM = '0' and new_enables_in_RAM = '0' and new_prescaling_in_RAM = '1') then
192 ram_ena_sig <= '1';
193 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);
194 FTU_control_State <= CONFIG_COUNTER;
195 else
196 FTU_control_State <= RUNNING;
197 end if;
198
199 when CONFIG_COUNTER =>
200 wait_cntr <= wait_cntr + 1;
201 if (wait_cntr = 0) then
202 FTU_control_State <= CONFIG_COUNTER;
203 elsif (wait_cntr = 1) then
204 prescaling_sig <= ram_doa;
205 cntr_reset_sig <= '1';
206 FTU_control_State <= CONFIG_COUNTER;
207 else
208 cntr_reset_sig <= '0';
209 ram_ada_sig <= (others => '0');
210 wait_cntr <= 0;
211 new_prescaling_in_RAM <= '0';
212 ram_ena_sig <= '0';
213 FTU_control_State <= RUNNING;
214 end if;
215
216 when CONFIG_ENABLE =>
217 ram_enable_cntr <= ram_enable_cntr + 1;
218 if (ram_enable_cntr = 0) then
219 ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
220 FTU_control_State <= CONFIG_ENABLE;
221 elsif (ram_enable_cntr > 0 and ram_enable_cntr < NO_OF_ENABLE + 1) then
222 ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
223 enable_array_sig(ram_enable_cntr - 1) <= ram_dob;
224 FTU_control_State <= CONFIG_ENABLE;
225 else
226 ram_adb_sig <= (others => '0');
227 ram_enable_cntr <= 0;
228 new_enables_in_RAM <= '0';
229 ram_enb_sig <= '0';
230 FTU_control_State <= RUNNING;
231 end if;
232
233 when CONFIG_DAC =>
234 if (ram_dac_cntr <= (NO_OF_DAC - NO_OF_DAC_NOT_USED + 2)) then
235 ram_dac_cntr <= ram_dac_cntr + 1;
236 if (ram_dac_cntr = 0) then
237 FTU_control_State <= CONFIG_DAC;
238 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
239 elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED)) then
240 dac_array_sig(ram_dac_cntr - 1) <= conv_integer(unsigned(ram_dob));
241 ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
242 FTU_control_State <= CONFIG_DAC;
243 elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED + 1)) then
244 dac_array_sig(ram_dac_cntr - 1 + NO_OF_DAC_NOT_USED) <= conv_integer(unsigned(ram_dob));
245 ram_adb_sig <= (others => '0');
246 FTU_control_State <= CONFIG_DAC;
247 else
248 ram_adb_sig <= (others => '0');
249 config_start_sig <= '1';
250 FTU_control_State <= CONFIG_DAC;
251 end if;
252 else
253 if (config_ready = '1') then
254 ram_dac_cntr <= 0;
255 new_DACs_in_RAM <= '0';
256 FTU_control_State <= RUNNING;
257 elsif (config_ready = '0' and config_started = '1') then
258 ram_enb_sig <= '0';
259 config_start_sig <= '0';
260 FTU_control_State <= CONFIG_DAC;
261 else
262 FTU_control_State <= CONFIG_DAC;
263 end if;
264 end if;
265
266 when RESET_ALL => -- reset/clear and start from scratch
267 reset_sig <= '1';
268 config_start_sig <= '0';
269 FTU_control_State <= IDLE;
270 end case;
271 end if;
272 end process FTU_control_FSM;
273
274 reset <= reset_sig;
275
276 config_start <= config_start_sig;
277 dac_array <= dac_array_sig;
278
279 enable_array <= enable_array_sig;
280
281 rate_array_sig <= rate_array;
282 cntr_reset <= cntr_reset_sig;
283 prescaling <= prescaling_sig;
284
285 ram_ena <= ram_ena_sig;
286 ram_enb <= ram_enb_sig;
287 ram_wea <= ram_wea_sig;
288 ram_web <= ram_web_sig;
289 ram_ada <= ram_ada_sig;
290 ram_adb <= ram_adb_sig;
291 ram_dia <= ram_dia_sig;
292 ram_dib <= ram_dib_sig;
293
294end Behavioral;
Note: See TracBrowser for help on using the repository browser.