source: firmware/FTU/FTU_top.vhd@ 9880

Last change on this file since 9880 was 9880, checked in by weitzel, 14 years ago
FTU_rate_counter added and FTU_control state machine extended
File size: 11.8 KB
Line 
1----------------------------------------------------------------------------------
2-- Company: ETH Zurich, Institute for Particle Physics
3-- Engineer: Q. Weitzel, P. Vogler
4--
5-- Create Date: 11:59:40 01/19/2010
6-- Design Name:
7-- Module Name: FTU_top - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description: Top level entity of FACT FTU board
12--
13-- Dependencies:
14--
15-- Revision:
16-- Revision 0.01 - File Created
17-- Revision 0.02 - New design of FTU firmware, 12.07.2010, Q. Weitzel
18-- Additional Comments:
19--
20----------------------------------------------------------------------------------
21
22library IEEE;
23use IEEE.STD_LOGIC_1164.ALL;
24use IEEE.STD_LOGIC_ARITH.ALL;
25use IEEE.STD_LOGIC_UNSIGNED.ALL;
26
27library ftu_definitions;
28USE ftu_definitions.ftu_array_types.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 FTU_top is
36 port(
37 -- global control
38 ext_clk : IN STD_LOGIC; -- external clock from FTU board
39 brd_add : IN STD_LOGIC_VECTOR(5 downto 0); -- geographic board/slot address
40 brd_id : IN STD_LOGIC_VECTOR(7 downto 0); -- local solder-programmable board ID
41
42 -- rate counters LVDS inputs
43 -- use IBUFDS differential input buffer
44 patch_A_p : IN STD_LOGIC; -- logic signal from first trigger patch
45 patch_A_n : IN STD_LOGIC;
46 patch_B_p : IN STD_LOGIC; -- logic signal from second trigger patch
47 patch_B_n : IN STD_LOGIC;
48 patch_C_p : IN STD_LOGIC; -- logic signal from third trigger patch
49 patch_C_n : IN STD_LOGIC;
50 patch_D_p : IN STD_LOGIC; -- logic signal from fourth trigger patch
51 patch_D_n : IN STD_LOGIC;
52 trig_prim_p : IN STD_LOGIC; -- logic signal from n-out-of-4 circuit
53 trig_prim_n : IN STD_LOGIC;
54
55 -- DAC interface
56 sck : OUT STD_LOGIC; -- serial clock to DAC
57 mosi : OUT STD_LOGIC; -- serial data to DAC, master-out-slave-in
58 clr : OUT STD_LOGIC; -- clear signal to DAC
59 cs_ld : OUT STD_LOGIC; -- chip select or load to DAC
60
61 -- RS-485 interface to FTM
62 rx : IN STD_LOGIC; -- serial data from FTM
63 tx : OUT STD_LOGIC; -- serial data to FTM
64 rx_en : OUT STD_LOGIC; -- enable RS-485 receiver
65 tx_en : OUT STD_LOGIC; -- enable RS-485 transmitter
66
67 -- analog buffer enable
68 enables_A : OUT STD_LOGIC_VECTOR(8 downto 0); -- individual enables for analog inputs
69 enables_B : OUT STD_LOGIC_VECTOR(8 downto 0); -- individual enables for analog inputs
70 enables_C : OUT STD_LOGIC_VECTOR(8 downto 0); -- individual enables for analog inputs
71 enables_D : OUT STD_LOGIC_VECTOR(8 downto 0); -- individual enables for analog inputs
72
73 -- testpoints
74 TP_A : OUT STD_LOGIC_VECTOR(11 downto 0) -- testpoints
75 );
76end FTU_top;
77
78architecture Behavioral of FTU_top is
79
80 signal reset_sig : STD_LOGIC; -- initialized in FTU_control
81 signal dac_clr_sig : STD_LOGIC := '1'; -- not used in hardware, initialize to 1 at power up
82
83 --single-ended trigger signals for rate counter
84 signal patch_A_sig : STD_LOGIC := '0';
85 signal patch_B_sig : STD_LOGIC := '0';
86 signal patch_C_sig : STD_LOGIC := '0';
87 signal patch_D_sig : STD_LOGIC := '0';
88 signal trigger_sig : STD_LOGIC := '0';
89
90 --DAC/SPI interface
91 signal config_start_sig : STD_LOGIC; -- initialized in FTU_control
92 signal config_started_sig : STD_LOGIC; -- initialized in spi_interface
93 signal config_ready_sig : STD_LOGIC; -- initialized in spi_interface
94 signal dac_array_sig : dac_array_type; -- initialized in FTU_control
95
96 signal enable_array_sig : enable_array_type; -- initialized in FTU_control
97
98 --rate counter signals
99 signal cntr_reset_sig : STD_LOGIC; -- initialized in FTU_control
100 signal rate_array_sig : rate_array_type := (0,0,0,0,0);
101 signal prescaling_sig : STD_LOGIC_VECTOR(7 downto 0);
102 signal overflow_array : STD_LOGIC_VECTOR(7 downto 0) := "00000000";
103
104 signal clk_50M_sig : STD_LOGIC; -- generated by internal DCM
105 signal clk_ready_sig : STD_LOGIC := '0'; -- set high by FTU_clk_gen when DCMs have locked
106
107 --signals for RAM control, all initialized in FTU_control
108 signal ram_ena_sig : STD_LOGIC;
109 signal ram_enb_sig : STD_LOGIC;
110 signal ram_wea_sig : STD_LOGIC_VECTOR(0 downto 0);
111 signal ram_web_sig : STD_LOGIC_VECTOR(0 downto 0);
112 signal ram_ada_sig : STD_LOGIC_VECTOR(4 downto 0);
113 signal ram_adb_sig : STD_LOGIC_VECTOR(3 downto 0);
114 signal ram_dia_sig : STD_LOGIC_VECTOR(7 downto 0);
115 signal ram_dib_sig : STD_LOGIC_VECTOR(15 downto 0);
116 signal ram_doa_sig : STD_LOGIC_VECTOR(7 downto 0);
117 signal ram_dob_sig : STD_LOGIC_VECTOR(15 downto 0);
118
119 component FTU_clk_gen
120 port(
121 clk : IN STD_LOGIC;
122 rst : IN STD_LOGIC;
123 clk_50 : OUT STD_LOGIC;
124 ready : OUT STD_LOGIC
125 );
126 end component;
127
128 component FTU_rate_counter is
129 port(
130 clk : in std_logic;
131 cntr_reset : in std_logic;
132 trigger : in std_logic;
133 prescaling : in std_logic_vector(7 downto 0);
134 counts : out integer range 0 to 2**16 - 1;
135 overflow : out std_logic
136 );
137 end component;
138
139 component FTU_control
140 port(
141 clk_50MHz : IN std_logic;
142 clk_ready : IN std_logic;
143 config_started : IN std_logic;
144 config_ready : IN std_logic;
145 ram_doa : IN STD_LOGIC_VECTOR(7 downto 0);
146 ram_dob : IN STD_LOGIC_VECTOR(15 downto 0);
147 rate_array : IN rate_array_type;
148 reset : OUT std_logic;
149 config_start : OUT std_logic;
150 ram_ena : OUT std_logic;
151 ram_enb : OUT std_logic;
152 ram_wea : OUT STD_LOGIC_VECTOR(0 downto 0);
153 ram_web : OUT STD_LOGIC_VECTOR(0 downto 0);
154 ram_ada : OUT STD_LOGIC_VECTOR(4 downto 0);
155 ram_adb : OUT STD_LOGIC_VECTOR(3 downto 0);
156 ram_dia : OUT STD_LOGIC_VECTOR(7 downto 0);
157 ram_dib : OUT STD_LOGIC_VECTOR(15 downto 0);
158 dac_array : OUT dac_array_type;
159 enable_array : OUT enable_array_type;
160 cntr_reset : OUT STD_LOGIC;
161 prescaling : OUT STD_LOGIC_VECTOR(7 downto 0)
162 );
163 end component;
164
165 component FTU_spi_interface
166 port(
167 clk_50MHz : IN std_logic;
168 config_start : IN std_logic;
169 dac_array : IN dac_array_type;
170 config_ready : OUT std_logic;
171 config_started : OUT std_logic;
172 dac_cs : OUT std_logic;
173 mosi : OUT std_logic;
174 sclk : OUT std_logic
175 );
176 end component;
177
178 component FTU_dual_port_ram
179 port(
180 clka : IN std_logic;
181 ena : IN std_logic;
182 wea : IN std_logic_VECTOR(0 downto 0);
183 addra : IN std_logic_VECTOR(4 downto 0);
184 dina : IN std_logic_VECTOR(7 downto 0);
185 douta : OUT std_logic_VECTOR(7 downto 0);
186 clkb : IN std_logic;
187 enb : IN std_logic;
188 web : IN std_logic_VECTOR(0 downto 0);
189 addrb : IN std_logic_VECTOR(3 downto 0);
190 dinb : IN std_logic_VECTOR(15 downto 0);
191 doutb : OUT std_logic_VECTOR(15 downto 0)
192 );
193 end component;
194
195 -- Synplicity black box declaration
196 attribute syn_black_box : boolean;
197 attribute syn_black_box of FTU_dual_port_ram: component is true;
198
199begin
200
201 clr <= dac_clr_sig;
202
203 enables_A <= enable_array_sig(0)(8 downto 0);
204 enables_B <= enable_array_sig(1)(8 downto 0);
205 enables_C <= enable_array_sig(2)(8 downto 0);
206 enables_D <= enable_array_sig(3)(8 downto 0);
207
208 --differential input buffer for patch A
209 IBUFDS_LVDS_33_A : IBUFDS_LVDS_33
210 port map(
211 O => patch_A_sig,
212 I => patch_A_p,
213 IB => patch_A_n
214 );
215
216 --differential input buffer for patch B
217 IBUFDS_LVDS_33_B : IBUFDS_LVDS_33
218 port map(
219 O => patch_B_sig,
220 I => patch_B_p,
221 IB => patch_B_n
222 );
223
224 --differential input buffer for patch C
225 IBUFDS_LVDS_33_C : IBUFDS_LVDS_33
226 port map(
227 O => patch_C_sig,
228 I => patch_C_p,
229 IB => patch_C_n
230 );
231
232 --differential input buffer for patch D
233 IBUFDS_LVDS_33_D : IBUFDS_LVDS_33
234 port map(
235 O => patch_D_sig,
236 I => patch_D_p,
237 IB => patch_D_n
238 );
239
240 --differential input buffer for trigger
241 IBUFDS_LVDS_33_t : IBUFDS_LVDS_33
242 port map(
243 O => trigger_sig,
244 I => trig_prim_p,
245 IB => trig_prim_n
246 );
247
248 Inst_FTU_clk_gen : FTU_clk_gen
249 port map(
250 clk => ext_clk,
251 rst => reset_sig,
252 clk_50 => clk_50M_sig,
253 ready => clk_ready_sig
254 );
255
256 Inst_FTU_rate_counter_A : FTU_rate_counter
257 port map(
258 clk => clk_50M_sig,
259 cntr_reset => cntr_reset_sig,
260 trigger => patch_A_sig,
261 prescaling => prescaling_sig,
262 counts => rate_array_sig(0),
263 overflow => overflow_array(0)
264 );
265
266 Inst_FTU_rate_counter_B : FTU_rate_counter
267 port map(
268 clk => clk_50M_sig,
269 cntr_reset => cntr_reset_sig,
270 trigger => patch_B_sig,
271 prescaling => prescaling_sig,
272 counts => rate_array_sig(1),
273 overflow => overflow_array(1)
274 );
275
276 Inst_FTU_rate_counter_C : FTU_rate_counter
277 port map(
278 clk => clk_50M_sig,
279 cntr_reset => cntr_reset_sig,
280 trigger => patch_C_sig,
281 prescaling => prescaling_sig,
282 counts => rate_array_sig(2),
283 overflow => overflow_array(2)
284 );
285
286 Inst_FTU_rate_counter_D : FTU_rate_counter
287 port map(
288 clk => clk_50M_sig,
289 cntr_reset => cntr_reset_sig,
290 trigger => patch_D_sig,
291 prescaling => prescaling_sig,
292 counts => rate_array_sig(3),
293 overflow => overflow_array(3)
294 );
295
296 Inst_FTU_rate_counter_t : FTU_rate_counter
297 port map(
298 clk => clk_50M_sig,
299 cntr_reset => cntr_reset_sig,
300 trigger => trigger_sig,
301 prescaling => prescaling_sig,
302 counts => rate_array_sig(4),
303 overflow => overflow_array(4)
304 );
305
306 Inst_FTU_control : FTU_control
307 port map(
308 clk_50MHz => clk_50M_sig,
309 clk_ready => clk_ready_sig,
310 config_started => config_started_sig,
311 config_ready => config_ready_sig,
312 ram_doa => ram_doa_sig,
313 ram_dob => ram_dob_sig,
314 rate_array => rate_array_sig,
315 reset => reset_sig,
316 config_start => config_start_sig,
317 ram_ena => ram_ena_sig,
318 ram_enb => ram_enb_sig,
319 ram_wea => ram_wea_sig,
320 ram_web => ram_web_sig,
321 ram_ada => ram_ada_sig,
322 ram_adb => ram_adb_sig,
323 ram_dia => ram_dia_sig,
324 ram_dib => ram_dib_sig,
325 dac_array => dac_array_sig,
326 enable_array => enable_array_sig,
327 cntr_reset => cntr_reset_sig,
328 prescaling => prescaling_sig
329 );
330
331 Inst_FTU_spi_interface : FTU_spi_interface
332 port map(
333 clk_50MHz => clk_50M_sig,
334 config_start => config_start_sig,
335 dac_array => dac_array_sig,
336 config_ready => config_ready_sig,
337 config_started => config_started_sig,
338 dac_cs => cs_ld,
339 mosi => mosi,
340 sclk => sck
341 );
342
343 Inst_FTU_dual_port_ram : FTU_dual_port_ram
344 port map(
345 clka => clk_50M_sig,
346 ena => ram_ena_sig,
347 wea => ram_wea_sig,
348 addra => ram_ada_sig,
349 dina => ram_dia_sig,
350 douta => ram_doa_sig,
351 clkb => clk_50M_sig,
352 enb => ram_enb_sig,
353 web => ram_web_sig,
354 addrb => ram_adb_sig,
355 dinb => ram_dib_sig,
356 doutb => ram_dob_sig
357 );
358
359end Behavioral;
Note: See TracBrowser for help on using the repository browser.