AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Variables
trigger_gen.vhd
1 ------------------------------------------------------
2 -- remove CMC slink status word until the first Header on L0 & L1 before each event
3 --
4 -- Ver 1.00
5 --
6 -- Dominique Gigi Jan 2011
7 ------------------------------------------------------
8 --
9 --
10 --
11 --
12 ------------------------------------------------------
13 LIBRARY ieee;
14 --LIBRARY altera_mf;
15 --LIBRARY altera;
16 
17 
18 USE ieee.std_logic_1164.all;
19 use ieee.numeric_std.all;
20 use ieee.std_logic_unsigned.all;
21 --LIBRARY lpm;
22 --USE lpm.lpm_components.all;
23 --USE altera_mf.altera_mf_components.all;
24 --USE altera.altera_primitives_components.all;
25 
26 entity trigger_gen is
27 
28 port (
29  Rst_Pciclk : IN std_logic;
30  PCIe_clk : IN std_logic;
31  PCIe_func : IN std_logic_vector(15 downto 0);
32  PCIe_wen : IN std_logic;
33  PCIe_dti : IN std_logic_vector(31 downto 0);
34  PCIe_dto : OUT std_logic_vector(31 downto 0);
35  PCIe_cs : IN std_logic;
36 
37  ttc_trigger : IN std_logic;
38  Rst_Evtclk : IN std_logic;
39  evt_clk : IN std_logic;
40  ena_PCIe : OUT std_logic;
41  run_mode : OUT std_logic;
42  trig_nb : OUT std_logic_vector(23 downto 0);
43  trigger : OUT std_logic;
44  end_evt : IN std_logic;
45  Back_p : IN std_logic
46  );
47 end trigger_gen;
48 
49 architecture behavioral of trigger_gen is
50 
51 component resync
52 port (
53  reset : in std_logic;
54  Free_clki : in std_logic;
55  clocki : in std_logic;
56  clocko : in std_logic;
57  input : in std_logic;
58  output : out std_logic
59  );
60 end component;
61 signal delay_end_evt : std_logic_vector(3 downto 0);
62 signal pre_trig_loop : std_logic;
63 signal pre_trig_TTC : std_logic;
64 signal delay_pre_trg_TTC : std_logic;
65 signal trigger_mux : std_logic;
66 signal trig_sync : std_logic;
67 signal trigger_cnt : std_logic_vector(8 downto 0);
68 signal evt_cnt : std_logic_vector(63 downto 0);
69 signal check_trig : std_logic;
70 signal evt_working : std_logic;
71 signal pulse_trigger : std_logic;
72 signal mem_evt_num : std_logic_vector(23 downto 0);
73 signal pcie_ld : std_logic;
74 signal ld_evt_nm : std_logic;
75 signal start : std_logic;
76 signal ena_PCI_trigger : std_logic;
77 signal go_round : std_logic;
78 signal reset_func : std_logic;
79 signal PCI_trig : std_logic;
80 signal Start_rsync : std_logic_vector(1 downto 0);
81 signal Loop_rsync : std_logic;
82 --*********************************************************************
83 --**********************<< BEGIN >>***********************************
84 --*********************************************************************
85 begin
86 
87 -- PCIe decoding function
88 process(Rst_Pciclk,PCIe_clk)
89 begin
90  if Rst_Pciclk = '0' then
91  go_round <= '0';
92  ena_PCI_trigger <= '0';
93  start <= '0';
94 
95  pre_trig_loop <= '0';
96  pre_trig_TTC <= '0';
97  elsif rising_edge(PCIe_clk) then
98  -- set the loop trigger mode
99  if PCIe_cs = '1' and PCIe_func(0) = '1' and PCIe_dti(1) = '1' AND PCIe_wen = '1' then
100  go_round <= '1';
101  elsif PCIe_cs = '1' and PCIe_func(0) = '1' and PCIe_dti(2) = '1' AND PCIe_wen = '1' then
102  go_round <= '0';
103  end if;
104  -- select the trigger
105  if PCIe_cs = '1' and PCIe_func(0) = '1' AND PCIe_wen = '1' then
106  ena_PCI_trigger <= PCIe_dti(3);
107  end if;
108  -- generate a PCI trigger
109  PCI_trig <= '0';
110  if PCIe_cs = '1' and PCIe_func(0) = '1' and PCIe_dti(0) = '1' AND PCIe_wen = '1' then
111  PCI_trig <= '1';
112  end if;
113  -- start to generate triggers
114  if PCIe_cs = '1' and PCIe_func(0) = '1' AND PCIe_wen = '1' then
115  start <= PCIe_dti(4);
116  end if;
117 
118  pre_trig_loop <= '0'; -- pre trigger when loop mode
119  if PCIe_cs = '1' and PCIe_func(0) = '1' and PCIe_dti(1) = '1' AND PCIe_wen = '1' then
120  pre_trig_loop <= '1';
121  end if;
122 
123  delay_pre_trg_TTC <= pre_trig_TTC;
124  pre_trig_TTC <= '0'; -- pre trigger when TTC trigger used
125  if PCIe_cs = '1' and PCIe_func(0) = '1' and PCIe_dti(4) = '1' AND PCIe_wen = '1' then
126  pre_trig_TTC <= '1';
127  end if;
128 
129  pcie_ld <= '0';
130  if PCIe_cs = '1' and PCIe_func(1) = '1' AND PCIe_wen = '1' then
131  pcie_ld <= '1';
132  mem_evt_num <= PCIe_dti(23 downto 0);
133  end if;
134  end if;
135 end process;
136 
137 
138 process(PCIe_clk)
139 begin
140  if rising_edge(PCIe_clk) then
141  PCIe_dto <= (others => '0');
142  if PCIe_func(0) = '1' then
143  PCIe_dto(0) <= '0';
144  PCIe_dto(1) <= go_round;
145  PCIe_dto(2) <= go_round;
146  PCIe_dto(3) <= ena_PCI_trigger;
147  PCIe_dto(4) <= start;
148  PCIe_dto(5) <= '0';
149  PCIe_dto(7 downto 6) <= (others => '0');
150  PCIe_dto(8) <= evt_working;
151  PCIe_dto(9) <= Back_p;
152  PCIe_dto(31 downto 10) <= (others => '0');
153  elsif PCIe_func(1) = '1' then
154  PCIe_dto(31 downto 0) <= evt_cnt(31 downto 0);
155  elsif PCIe_func(2) = '1' then
156  PCIe_dto(31 downto 0) <= evt_cnt(63 downto 32);
157  elsif PCIe_func(7) = '1' then
158  PCIe_dto(8 downto 0) <= trigger_cnt; -- pending triggers
159  end if;
160 
161  end if;
162 end process;
163 
164 
165 -- if '1' the trigger and wc are from PCIe access (if '0' trigger s and WC comes form FIFO memory_RND)
166 ena_PCIe <= ena_PCI_trigger;
167 -- specify that the event can be generated (all parametes should be set before going to this mode
168 run_mode <= start ;
169 
170 trigger_mux <= '1' when start = '1' and ((PCI_trig = '1' AND ena_PCI_trigger= '1') or ( (ttc_trigger = '1' or delay_pre_trg_TTC = '1') AND ena_PCI_trigger= '0')) else '0';
171 
172 trg_gen:resync
173 port map(
174  reset => Rst_Pciclk,
175  Free_clki => '1',
176  clocki => PCIe_clk,
177  input => trigger_mux,
178  clocko => evt_clk,
179  output => trig_sync
180  );
181 
182  -- resync two signals to Evt_CK
183 Process(evt_clk)
184 begin
185  if rising_edge(evt_clk) then
186  Start_rsync(1) <= Start_rsync(0);
187  Start_rsync(0) <= start;
188  end if;
189 end process;
190 
191 -- trigger counter
192 process(Rst_Evtclk,Start_rsync(1),evt_clk)
193 begin
194  if Rst_Evtclk = '0' or Start_rsync(1) = '0' then
195  trigger_cnt <= (others => '0');
196  elsif rising_edge(evt_clk) then
197  if trig_sync = '1' and end_evt = '0' then
198  trigger_cnt <= trigger_cnt + "1";
199  elsif trig_sync = '0' and end_evt = '1' then
200  trigger_cnt <= trigger_cnt - "1";
201  end if;
202  end if;
203 end process;
204 
205 pre_trig_loop_i1:resync
206 port map(
207  reset => Rst_PCIclk,
208  Free_clki => '1',
209  clocki => PCIe_clk,
210  input => pre_trig_loop,
211  clocko => evt_clk,
212  output => Loop_rsync
213  );
214 -- create a delay at the end of the event before starting the new one's
215 process(evt_clk)
216 begin
217  if rising_edge(evt_clk) then
218  delay_end_evt(3 downto 1) <= delay_end_evt(2 downto 0);
219  delay_end_evt(0) <= end_evt or Loop_rsync;
220  end if;
221 end process;
222 
223 process(Rst_Evtclk,evt_clk)
224 begin
225 if Rst_Evtclk = '0' then
226  check_trig <= '0';
227  evt_working <= '0';
228  pulse_trigger <= '0';
229 elsif rising_edge(evt_clk) then
230  check_trig <= '0';
231  if start = '1' AND check_trig = '0' AND evt_working = '0' AND trigger_cnt /= "000000000" AND Back_p = '1' then
232  check_trig <= '1';
233  end if;
234 
235  pulse_trigger <= evt_working;
236  if (delay_end_evt(3) = '1' AND go_round = '1' AND start = '1' ) OR (go_round = '0' AND check_trig = '1' ) then
237  evt_working <= '1' ;
238  elsif end_evt = '1' then
239  evt_working <= '0' ;
240  end if;
241 
242 end if;
243 end process;
244 ld_evt_sync:resync
245 port map(
246  reset => Rst_Pciclk,
247  Free_clki => '1',
248  clocki => PCIe_clk,
249  input => pcie_ld,
250  clocko => evt_clk,
251  output => ld_evt_nm
252  );
253 
254 -- event counter managment
255 process(Rst_Evtclk,evt_clk)
256 begin
257 if Rst_Evtclk = '0' then
258  evt_cnt <= (others => '0');
259 elsif rising_edge(evt_clk) then
260  if ld_evt_nm = '1' then
261  evt_cnt(63 downto 24) <= (others => '0');
262  evt_cnt(23 downto 00) <= mem_evt_num;
263  elsif end_evt = '1' then
264  evt_cnt <= evt_cnt + "1";
265  end if;
266 end if;
267 end process;
268 
269 trigger <= '1' when evt_working = '1' AND pulse_trigger = '0' else '0';
270 trig_nb <= evt_cnt(23 downto 0);
271 
272 
273 
274 end behavioral;