source: firmware/FTU/FTU_top.vhd @ 9928

Last change on this file since 9928 was 9928, checked in by weitzel, 10 years ago
first version of RS485 interface added to FTU firmware; not yet connected to main control state machine
File size: 15.4 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;
29USE ftu_definitions.ftu_constants.all;
30
31---- Uncomment the following library declaration if instantiating
32---- any Xilinx primitives in this code.
33library UNISIM;
34use UNISIM.VComponents.all;
35
36entity FTU_top is
37  port(   
38    -- global control
39    ext_clk   : IN  STD_LOGIC;                      -- external clock from FTU board
40    brd_add   : IN  STD_LOGIC_VECTOR(5 downto 0);   -- geographic board/slot address
41    brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
42   
43    -- rate counters LVDS inputs
44    -- use IBUFDS differential input buffer
45    patch_A_p     : IN  STD_LOGIC;                  -- logic signal from first trigger patch
46    patch_A_n     : IN  STD_LOGIC;           
47    patch_B_p     : IN  STD_LOGIC;                  -- logic signal from second trigger patch
48    patch_B_n     : IN  STD_LOGIC;
49    patch_C_p     : IN  STD_LOGIC;                  -- logic signal from third trigger patch
50    patch_C_n     : IN  STD_LOGIC;
51    patch_D_p     : IN  STD_LOGIC;                  -- logic signal from fourth trigger patch
52    patch_D_n     : IN  STD_LOGIC;
53    trig_prim_p   : IN  STD_LOGIC;                  -- logic signal from n-out-of-4 circuit
54    trig_prim_n   : IN  STD_LOGIC;
55   
56    -- DAC interface
57    sck           : OUT STD_LOGIC;                  -- serial clock to DAC
58    mosi          : OUT STD_LOGIC;                  -- serial data to DAC, master-out-slave-in
59    clr           : OUT STD_LOGIC;                  -- clear signal to DAC
60    cs_ld         : OUT STD_LOGIC;                  -- chip select or load to DAC
61   
62    -- RS-485 interface to FTM
63    rx            : IN  STD_LOGIC;                  -- serial data from FTM
64    tx            : OUT STD_LOGIC;                  -- serial data to FTM
65    rx_en         : OUT STD_LOGIC;                  -- enable RS-485 receiver
66    tx_en         : OUT STD_LOGIC;                  -- enable RS-485 transmitter
67
68    -- analog buffer enable
69    enables_A   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
70    enables_B   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
71    enables_C   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
72    enables_D   : OUT STD_LOGIC_VECTOR(8 downto 0);  -- individual enables for analog inputs
73
74    -- testpoints
75    TP_A        : OUT STD_LOGIC_VECTOR(11 downto 0)   -- testpoints   
76  );
77end FTU_top;
78
79architecture Behavioral of FTU_top is
80
81  signal reset_sig   : STD_LOGIC;         -- initialized in FTU_control
82  signal dac_clr_sig : STD_LOGIC := '1';  -- not used in hardware, initialize to 1 at power up
83
84  --single-ended trigger signals for rate counter
85  signal patch_A_sig : STD_LOGIC := '0';
86  signal patch_B_sig : STD_LOGIC := '0';
87  signal patch_C_sig : STD_LOGIC := '0';
88  signal patch_D_sig : STD_LOGIC := '0';
89  signal trigger_sig : STD_LOGIC := '0';
90 
91  --DAC/SPI interface
92  signal config_start_sig   : STD_LOGIC;  -- initialized in FTU_control
93  signal config_started_sig : STD_LOGIC;  -- initialized in spi_interface
94  signal config_ready_sig   : STD_LOGIC;  -- initialized in spi_interface
95  signal dac_array_sig      : dac_array_type;  -- initialized in FTU_control
96
97  signal enable_array_sig : enable_array_type;  -- initialized in FTU_control
98
99  --rate counter signals
100  signal cntr_reset_sig : STD_LOGIC;  -- initialized in FTU_control
101  signal rate_array_sig : rate_array_type;  -- initialized by counters
102  signal prescaling_sig : STD_LOGIC_VECTOR(7 downto 0);  -- initialized in FTU_control 
103  signal overflow_array : STD_LOGIC_VECTOR(7 downto 0) := "00000000";
104  signal new_rate_A_sig : STD_LOGIC;  -- initialized by patch A counter
105  signal new_rate_B_sig : STD_LOGIC;  -- initialized by patch B counter
106  signal new_rate_C_sig : STD_LOGIC;  -- initialized by patch C counter
107  signal new_rate_D_sig : STD_LOGIC;  -- initialized by patch D counter
108  signal new_rate_t_sig : STD_LOGIC;  -- initialized by trigger counter
109  signal new_rates_sig  : STD_LOGIC := '0';
110 
111  signal clk_50M_sig   : STD_LOGIC;         -- generated by internal DCM
112  signal clk_ready_sig : STD_LOGIC := '0';  -- set high by FTU_clk_gen when DCMs have locked
113
114  --signals for RAM control, all initialized in FTU_control
115  signal ram_ena_sig : STD_LOGIC;
116  signal ram_enb_sig : STD_LOGIC;
117  signal ram_wea_sig : STD_LOGIC_VECTOR(0 downto 0);
118  signal ram_web_sig : STD_LOGIC_VECTOR(0 downto 0); 
119  signal ram_ada_sig : STD_LOGIC_VECTOR(4 downto 0);
120  signal ram_adb_sig : STD_LOGIC_VECTOR(3 downto 0);
121  signal ram_dia_sig : STD_LOGIC_VECTOR(7 downto 0);
122  signal ram_dib_sig : STD_LOGIC_VECTOR(15 downto 0);
123  signal ram_doa_sig : STD_LOGIC_VECTOR(7 downto 0);
124  signal ram_dob_sig : STD_LOGIC_VECTOR(15 downto 0);
125
126  component FTU_clk_gen
127    port(
128      clk    : IN  STD_LOGIC;
129      rst    : IN  STD_LOGIC;
130      clk_50 : OUT STD_LOGIC;
131      ready  : OUT STD_LOGIC
132    );
133  end component;
134
135  component FTU_rate_counter is
136    port(
137      clk        : in  std_logic;
138      cntr_reset : in  std_logic;
139      trigger    : in  std_logic;
140      prescaling : in  std_logic_vector(7 downto 0);
141      counts     : out integer range 0 to 2**16 - 1;
142      overflow   : out std_logic;
143      new_rate   : out std_logic
144      );
145  end component;
146 
147  component FTU_control
148    port(
149      clk_50MHz      : IN  std_logic;
150      clk_ready      : IN  std_logic;
151      config_started : IN  std_logic;
152      config_ready   : IN  std_logic;
153      ram_doa        : IN  STD_LOGIC_VECTOR(7 downto 0);
154      ram_dob        : IN  STD_LOGIC_VECTOR(15 downto 0);
155      rate_array     : IN  rate_array_type;
156      overflow_array : in  STD_LOGIC_VECTOR(7 downto 0);
157      new_rates      : IN  std_logic;
158      reset          : OUT std_logic;
159      config_start   : OUT std_logic;
160      ram_ena        : OUT std_logic;
161      ram_enb        : OUT std_logic;
162      ram_wea        : OUT STD_LOGIC_VECTOR(0 downto 0);
163      ram_web        : OUT STD_LOGIC_VECTOR(0 downto 0);
164      ram_ada        : OUT STD_LOGIC_VECTOR(4 downto 0);
165      ram_adb        : OUT STD_LOGIC_VECTOR(3 downto 0);
166      ram_dia        : OUT STD_LOGIC_VECTOR(7 downto 0);
167      ram_dib        : OUT STD_LOGIC_VECTOR(15 downto 0);
168      dac_array      : OUT dac_array_type;
169      enable_array   : OUT enable_array_type;
170      cntr_reset     : OUT STD_LOGIC;
171      prescaling     : OUT STD_LOGIC_VECTOR(7 downto 0)
172    );
173  end component;
174   
175  component FTU_spi_interface
176    port(
177      clk_50MHz      : IN  std_logic;
178      config_start   : IN  std_logic;
179      dac_array      : IN  dac_array_type;
180      config_ready   : OUT std_logic;
181      config_started : OUT std_logic;
182      dac_cs         : OUT std_logic;
183      mosi           : OUT std_logic;
184      sclk           : OUT std_logic
185    );
186  end component;
187
188  component FTU_rs485_control
189    port(
190      main_clk                : IN  std_logic;
191      brd_add                 : IN  std_logic_vector(5 downto 0);
192      rx_d                    : IN  std_logic;
193      rates_ready             : IN  std_logic; 
194      DACs_ready              : IN  std_logic; 
195      enables_ready           : IN  std_logic; 
196      prescaling_ready        : IN  std_logic; 
197      rate_array_rs485        : IN  rate_array_type;
198      overflow_array_rs485_in : IN  STD_LOGIC_VECTOR(7 downto 0);
199      dac_array_rs485_in      : IN  dac_array_type;
200      enable_array_rs485_in   : IN  enable_array_type;
201      prescaling_rs485_in     : IN  STD_LOGIC_VECTOR(7 downto 0);
202      rx_en                   : OUT std_logic;
203      tx_d                    : OUT std_logic;
204      tx_en                   : OUT std_logic;
205      new_DACs                : OUT std_logic;
206      new_enables             : OUT std_logic;
207      new_prescaling          : OUT std_logic;
208      read_rates              : OUT std_logic;
209      read_DACs               : OUT std_logic;
210      read_enables            : OUT std_logic;
211      read_prescaling         : OUT std_logic;
212      --rs485_error           : OUT std_logic;  -- to be discussed!
213      dac_array_rs485_out     : OUT dac_array_type;
214      enable_array_rs485_out  : OUT enable_array_type;
215      prescaling_rs485_out    : OUT STD_LOGIC_VECTOR(7 downto 0)
216    );
217  end component;
218   
219  component FTU_dual_port_ram
220    port(
221      clka  : IN  std_logic;
222      ena   : IN  std_logic;
223      wea   : IN  std_logic_VECTOR(0 downto 0);
224      addra : IN  std_logic_VECTOR(4 downto 0);
225      dina  : IN  std_logic_VECTOR(7 downto 0);
226      douta : OUT std_logic_VECTOR(7 downto 0);
227      clkb  : IN  std_logic;
228      enb   : IN  std_logic;
229      web   : IN  std_logic_VECTOR(0 downto 0);
230      addrb : IN  std_logic_VECTOR(3 downto 0);
231      dinb  : IN  std_logic_VECTOR(15 downto 0);
232      doutb : OUT std_logic_VECTOR(15 downto 0)
233    );
234  end component;
235
236  -- Synplicity black box declaration
237  attribute syn_black_box : boolean;
238  attribute syn_black_box of FTU_dual_port_ram: component is true;
239  -- avoid "black box" warning during synthesis
240  attribute box_type : string;
241  attribute box_type of FTU_dual_port_ram: component is "black_box";
242 
243begin
244
245  clr <= dac_clr_sig;
246
247  enables_A <= enable_array_sig(0)(8 downto 0);
248  enables_B <= enable_array_sig(1)(8 downto 0);
249  enables_C <= enable_array_sig(2)(8 downto 0);
250  enables_D <= enable_array_sig(3)(8 downto 0);
251
252  new_rates_sig <= new_rate_A_sig and new_rate_B_sig and new_rate_C_sig and new_rate_D_sig and new_rate_t_sig;
253 
254  --differential input buffer for patch A
255  IBUFDS_LVDS_33_A : IBUFDS_LVDS_33
256    port map(
257      O  => patch_A_sig,
258      I  => patch_A_p,
259      IB => patch_A_n
260    );
261
262  --differential input buffer for patch B
263  IBUFDS_LVDS_33_B : IBUFDS_LVDS_33
264    port map(
265      O  => patch_B_sig,
266      I  => patch_B_p,
267      IB => patch_B_n
268    );
269
270  --differential input buffer for patch C
271  IBUFDS_LVDS_33_C : IBUFDS_LVDS_33
272    port map(
273      O  => patch_C_sig,
274      I  => patch_C_p,
275      IB => patch_C_n
276    );
277
278  --differential input buffer for patch D
279  IBUFDS_LVDS_33_D : IBUFDS_LVDS_33
280    port map(
281      O  => patch_D_sig,
282      I  => patch_D_p,
283      IB => patch_D_n
284    );
285
286  --differential input buffer for trigger
287  IBUFDS_LVDS_33_t : IBUFDS_LVDS_33
288    port map(
289      O  => trigger_sig,
290      I  => trig_prim_p,
291      IB => trig_prim_n
292    );
293 
294  Inst_FTU_clk_gen : FTU_clk_gen
295    port map(
296      clk    => ext_clk,
297      rst    => reset_sig,
298      clk_50 => clk_50M_sig,
299      ready  => clk_ready_sig
300    );
301
302  Inst_FTU_rate_counter_A : FTU_rate_counter
303    port map(
304      clk        => clk_50M_sig,
305      cntr_reset => cntr_reset_sig,
306      trigger    => patch_A_sig,
307      prescaling => prescaling_sig,
308      counts     => rate_array_sig(0),
309      overflow   => overflow_array(0),
310      new_rate   => new_rate_A_sig
311    );
312
313  Inst_FTU_rate_counter_B : FTU_rate_counter
314    port map(
315      clk        => clk_50M_sig,
316      cntr_reset => cntr_reset_sig,
317      trigger    => patch_B_sig,
318      prescaling => prescaling_sig,
319      counts     => rate_array_sig(1),
320      overflow   => overflow_array(1),
321      new_rate   => new_rate_B_sig
322    );
323
324  Inst_FTU_rate_counter_C : FTU_rate_counter
325    port map(
326      clk        => clk_50M_sig,
327      cntr_reset => cntr_reset_sig,
328      trigger    => patch_C_sig,
329      prescaling => prescaling_sig,
330      counts     => rate_array_sig(2),
331      overflow   => overflow_array(2),
332      new_rate   => new_rate_C_sig
333    );
334
335  Inst_FTU_rate_counter_D : FTU_rate_counter
336    port map(
337      clk        => clk_50M_sig,
338      cntr_reset => cntr_reset_sig,
339      trigger    => patch_D_sig,
340      prescaling => prescaling_sig,
341      counts     => rate_array_sig(3),
342      overflow   => overflow_array(3),
343      new_rate   => new_rate_D_sig
344    );
345
346  Inst_FTU_rate_counter_t : FTU_rate_counter
347    port map(
348      clk        => clk_50M_sig,
349      cntr_reset => cntr_reset_sig,
350      trigger    => trigger_sig,
351      prescaling => prescaling_sig,
352      counts     => rate_array_sig(4),
353      overflow   => overflow_array(4),
354      new_rate   => new_rate_t_sig
355    );
356 
357  Inst_FTU_control : FTU_control
358    port map(
359      clk_50MHz      => clk_50M_sig,
360      clk_ready      => clk_ready_sig,
361      config_started => config_started_sig,
362      config_ready   => config_ready_sig,
363      ram_doa        => ram_doa_sig,
364      ram_dob        => ram_dob_sig,
365      rate_array     => rate_array_sig,
366      overflow_array => overflow_array,
367      new_rates      => new_rates_sig,
368      reset          => reset_sig,
369      config_start   => config_start_sig,
370      ram_ena        => ram_ena_sig,
371      ram_enb        => ram_enb_sig,
372      ram_wea        => ram_wea_sig,
373      ram_web        => ram_web_sig,
374      ram_ada        => ram_ada_sig,
375      ram_adb        => ram_adb_sig,
376      ram_dia        => ram_dia_sig,
377      ram_dib        => ram_dib_sig,
378      dac_array      => dac_array_sig,
379      enable_array   => enable_array_sig,
380      cntr_reset     => cntr_reset_sig,
381      prescaling     => prescaling_sig
382    );
383 
384  Inst_FTU_spi_interface : FTU_spi_interface
385    port map(
386      clk_50MHz      => clk_50M_sig,
387      config_start   => config_start_sig,
388      dac_array      => dac_array_sig,
389      config_ready   => config_ready_sig,
390      config_started => config_started_sig,
391      dac_cs         => cs_ld,
392      mosi           => mosi,
393      sclk           => sck
394    );
395
396  Inst_FTU_rs485_control : FTU_rs485_control
397    port map(
398      main_clk                => clk_50M_sig,
399      brd_add                 => brd_add,
400      rx_d                    => rx,
401      rates_ready             => '0',
402      DACs_ready              => '0',
403      enables_ready           => '0',
404      prescaling_ready        => '0',
405      rate_array_rs485        => (0,0,0,0,0),
406      overflow_array_rs485_in => "00000000",
407      dac_array_rs485_in      => DEFAULT_DAC,
408      enable_array_rs485_in   => DEFAULT_ENABLE,
409      prescaling_rs485_in     => conv_std_logic_vector(DEFAULT_PRESCALING,8),
410      rx_en                   => rx_en,
411      tx_d                    => tx,
412      tx_en                   => tx_en,
413      new_DACs                => open,
414      new_enables             => open,
415      new_prescaling          => open,
416      read_rates              => open,
417      read_DACs               => open,
418      read_enables            => open,
419      read_prescaling         => open,
420      --rs485_error           =>,  -- to be discussed!
421      dac_array_rs485_out     => open,
422      enable_array_rs485_out  => open,
423      prescaling_rs485_out    => open
424    );
425 
426  Inst_FTU_dual_port_ram : FTU_dual_port_ram
427    port map(
428      clka  => clk_50M_sig,
429      ena   => ram_ena_sig,
430      wea   => ram_wea_sig,
431      addra => ram_ada_sig,
432      dina  => ram_dia_sig,
433      douta => ram_doa_sig,
434      clkb  => clk_50M_sig,
435      enb   => ram_enb_sig,
436      web   => ram_web_sig,
437      addrb => ram_adb_sig,
438      dinb  => ram_dib_sig,
439      doutb => ram_dob_sig
440    );
441 
442end Behavioral;
Note: See TracBrowser for help on using the repository browser.