CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
main_crt_vs.vhd
Go to the documentation of this file.
1 
23 
24 library IEEE;
25 use IEEE.STD_LOGIC_1164.ALL;
26 use IEEE.NUMERIC_STD.ALL;
27 use IEEE.STD_LOGIC_UNSIGNED.ALL;
28 use IEEE.STD_LOGIC_ARITH.CONV_STD_LOGIC_VECTOR;
29 
30 LIBRARY work;
31 use work.CMXpackage.all;
33 
34 
35 
36 entity main_crt is
37  generic(
38  numactchan : integer := 16
39  );
40  port(
41  clk : in std_logic; -- clock
42  thresholds : in arr_16(max_jems*25*4-1 downto 0); -- thresholds
43  datai : in arr_4Xword(max_jems-1 downto 0); -- input data
44  dout_lcl : out T_SLV60; -- local output (multiplicity), excluding parity
45  dout_lcl_ro : out T_SL; -- local overflow
46  par_err_lcl : in T_SL; -- parity error local
47  force : in T_SL; -- force
48  disable_overflow_mask : in std_logic_vector(15 downto 0)
49  );
50 
51 end main_crt;
52 
53 architecture struct of main_crt is
54 
55 
56 -- signal declarations
57 
58  signal sum_internal : T_SLV75;
59  signal thrPat : thPatL_type(max_jems-1 downto 0);
60  signal mult : mult_type(max_jems-1 downto 0);
61  signal threshold_table : threshold_type(max_jems-1 downto 0);
62 
63  signal data_high : High_word(max_jems-1 downto 0):=(others =>(others =>(others => '0')));
64  signal data_low : Low_word(max_jems-1 downto 0):=(others =>(others =>(others => '0')));
65  signal TOBs : arr_TOB((max_jems*max_tobs_pjem)-1 downto 0);
66  signal xpos : xpos_type(max_jems-1 downto 0);
67  signal loc : loc_type(max_jems-1 downto 0);
68 
69  signal overflow : T_SLV16;
70  signal bitofw : T_SL;
71  signal bitofw_del0 : T_SL;
72  signal bitofw_del1 : T_SL;
73 
74  signal par_err_lcl_d0 : T_SL; -- parity error local delayed
75  signal dout_lcl_tmp : T_SLV60;
76 
77 begin
78 
79 -- ==========================================================================================================--
80 -- Data Collector --
81 -- ==========================================================================================================--
82 
83  data_parser_0: for i in 0 to (max_jems-1) generate
84  data_parser_1: for j in 0 to (max_tobs_pjem-1) generate
85  data_low(i)(j) <= datai(i)((24*j)+12 downto (25*j)-j);
86  data_high(i)(j) <= datai(i)((24*j)+23 downto (24*j)+13);
87  end generate data_parser_1;
88  end generate data_parser_0;
89 
90 
91 
92  xpos_i: for i in 0 to (max_jems-1) generate -- 0 to 15 (JEMs)
93  xpos(i) <= xpos_sort(conv_integer(data_low(i)(0)(3 downto 0)));
94  end generate;
95 
96  loc_i: for i in 0 to (max_jems-1) generate -- 0 to 15 (JEMs)
97  loc_j: for j in 0 to (max_tobs_pjem-1) generate -- 0 to 3 (TOBs)
98  loc(i)(j) <= xpos(i)(j) & data_low(i)(j)(11);
99  end generate;
100  end generate;
101 
102 
103  data_map: for i in 0 to (max_jems-1) generate
104 
105  TOBs((4*i)+3).Et2 <= data_high(i)(3)(9 downto 0);
106  TOBs((4*i)+3).Et1 <= data_low(i)(3)(10 downto 2);
107  TOBs((4*i)+2).Et2 <= data_high(i)(2)(9 downto 0);
108  TOBs((4*i)+2).Et1 <= data_low(i)(3)(1 downto 0) & data_low(i)(2)(10 downto 4);
109  TOBs((4*i)+1).Et2 <= data_high(i)(1)(9 downto 0);
110  TOBs((4*i)+1).Et1 <= data_low(i)(2)(3 downto 0) & data_low(i)(1)(10 downto 6);
111  TOBs((4*i)+0).Et2 <= data_high(i)(0)(9 downto 0);
112  TOBs((4*i)+0).Et1 <= data_low(i)(1)(5 downto 0) & data_low(i)(0)(10 downto 8);
113 
114  end generate;
115 
116 
117 --
118 -- Thresholds
119 --
120 --
121  threshold_jems: for i in 0 to (max_jems-1) generate -- 0 to 15 (JEMs)
122  threshold_num: for j in 0 to (thresholds_num-1) generate -- 0 to 24 (Thresholds)
123  threshold_slice: for k in 0 to (max_eta_slices-1) generate -- 0 to 3 (Eta slices)
124  threshold_table(i)(j)(k) <= thresholds(25*k+100*i+j)(10 downto 0);
125  end generate threshold_slice;
126  end generate threshold_num;
127  end generate threshold_jems;
128 
129 
130  process (clk)
131 
132  begin
133  if clk'event and clk = '0' then -- falling clock edge
134 
135  thrPat <= (others => (others => '0'));
136  for i in 0 to (max_jems-1) loop -- 0 to 15 (JEMs)
137  for j in 0 to (max_tobs_pjem-1) loop -- 0 to 3 (TOBs)
138  for k in 0 to (thresholds_num-1) loop -- 0 to 24 (Thresholds)
139 
140  if threshold_table(i)(k)(conv_integer(loc(i)(j)))(10) = '1' then
141  if TOBs((max_tobs_pjem*i)+j).Et1 > threshold_table(i)(k)(conv_integer(loc(i)(j)))(9 downto 0) then
142  thrPat(i)((max_tobs_pjem*k)+j) <= '1';
143  end if;
144 
145  else
146  if TOBs((max_tobs_pjem*i)+j).Et2 > threshold_table(i)(k)(conv_integer(loc(i)(j)))(9 downto 0) then
147  thrPat(i)((max_tobs_pjem*k)+j) <= '1';
148  end if;
149  end if;
150 
151  end loop; -- k
152  end loop; -- j
153  end loop; -- i
154 
155  -- overflow
156 
157  bitofw_del0 <= bitofw;
158 
159  -- parity error local delay
160 
162 
163  end if;
164  end process;
165 
166  g0: for i in 0 to 15 generate -- loop over each JEMs
167  g1: for j in 0 to 24 generate -- loop over each threshold
168  mult(i)(j) <= mult_i(conv_integer(thrPat(i)(4*j+3 downto 4*j)));
169  end generate g1;
170  end generate g0;
171 
172  process (clk)
173 
174  variable xsum : xsum_type(24 downto 0);
175  variable totsum : totsum_type(24 downto 0);
176 
177  begin
178  if clk'event and clk = '1' then -- raising clock edge
179 
180  for i in 0 to 24 loop -- loop over each threshold
181  for j in 0 to 7 loop -- loop over 8 pairs of JEMs
182 
183  xsum(i)(j) := add3x2(mult(2*j)(i),mult(2*j+1)(i));
184 
185  end loop;
186  end loop;
187 
188 
189  for i in 0 to 24 loop -- loop over each threshold
190 
191  totsum(i) := to_integer(unsigned(xsum(i)(0))) -- sum over 8 pairs of JEMs
192  + to_integer(unsigned(xsum(i)(1)))
193  + to_integer(unsigned(xsum(i)(2)))
194  + to_integer(unsigned(xsum(i)(3)))
195  + to_integer(unsigned(xsum(i)(4)))
196  + to_integer(unsigned(xsum(i)(5)))
197  + to_integer(unsigned(xsum(i)(6)))
198  + to_integer(unsigned(xsum(i)(7)));
199 
200  if (totsum(i) >= 7) then
201  sum_internal((3*i)+2 downto 3*i) <= "111";
202  else
203  sum_internal((3*i)+2 downto 3*i) <= std_logic_vector(to_unsigned(totsum(i), 3));
204  end if;
205 
206  end loop;
207 
208  -- overflow delay
210 
211  end if;
212  end process;
213 
214 -- Output
215 
216  dout_lcl_tmp(29 downto 0) <= sum_internal(29 downto 0); -- First 10 3-bit sums are sent as-is
217 
218  Mult_out: for i in 0 to 14 generate -- Second 15 3-bit sums are converted to two-bit sums
219  Conv3to2( sum_internal(30+((3*i)+2) downto (30+(3*i))), dout_lcl_tmp(30+((2*i)+1) downto (30+(2*i))) );
220  end generate Mult_out;
221 
222 
223  dout_lcl <= (others=>'1') when (par_err_lcl_d0 = '1' and force = '1') or bitofw_del1 = '1' else dout_lcl_tmp;
224 
225 
226 -- Overflow
227 
229 
230  overflow_i: for i in 0 to (max_jems-1) generate
231  overflow(i) <= ofwntobs(conv_integer(datai(i)(7 downto 0)))(3);
232  end generate;
233 
234  bitofw <= ( (not disable_overflow_mask(0) ) and overflow(0) ) or
235  ( (not disable_overflow_mask(1) ) and overflow(1) ) or
236  ( (not disable_overflow_mask(2) ) and overflow(2) ) or
237  ( (not disable_overflow_mask(3) ) and overflow(3) ) or
238  ( (not disable_overflow_mask(4) ) and overflow(4) ) or
239  ( (not disable_overflow_mask(5) ) and overflow(5) ) or
240  ( (not disable_overflow_mask(6) ) and overflow(6) ) or
241  ( (not disable_overflow_mask(7) ) and overflow(7) ) or
242  ( (not disable_overflow_mask(8) ) and overflow(8) ) or
243  ( (not disable_overflow_mask(9) ) and overflow(9) ) or
244  ( (not disable_overflow_mask(10) ) and overflow(10) ) or
245  ( (not disable_overflow_mask(11) ) and overflow(11) ) or
246  ( (not disable_overflow_mask(12) ) and overflow(12) ) or
247  ( (not disable_overflow_mask(13) ) and overflow(13) ) or
248  ( (not disable_overflow_mask(14) ) and overflow(14) ) or
249  ( (not disable_overflow_mask(15) ) and overflow(15));
250 
251 end struct;
T_SLV60 dout_lcl_tmp
Definition: main_crt_vs.vhd:75
xpos_type (max_jems - 1 downto 0) xpos
Definition: main_crt_vs.vhd:66
numactchaninteger :=16
Definition: main_crt_vs.vhd:38
loc_type (max_cps - 1 downto 0) loc
out dout_lclT_SLV60
Definition: main_crt_vs.vhd:44
_library_ workwork
Definition: jet_decoder.vhd:19
in par_err_lclT_SL
Definition: main_crt_vs.vhd:46
threshold_type (max_cps - 1 downto 0) threshold_table
thPatL_type (max_cps - 1 downto 0) thrPat
out dout_lcl_roT_SL
Definition: main_crt_vs.vhd:45
arr_TOB (max_cps * max_tobs_pcp - 1 downto 0) TOBs)
Low_word (max_jems - 1 downto 0) :=( others =>( others =>( others =>'0' ) ) ) data_low
Definition: main_crt_vs.vhd:64
in dataiarr_4Xword (max_jems - 1 downto 0)
Definition: main_crt_vs.vhd:43
mult_type (max_cps - 1 downto 0) mult
in clkstd_logic
Definition: main_crt_vs.vhd:41
in thresholdsarr_16 (max_jems * 25 * 4 - 1 downto 0)
Definition: main_crt_vs.vhd:42
High_word (max_jems - 1 downto 0) :=( others =>( others =>( others =>'0' ) ) ) data_high
Definition: main_crt_vs.vhd:63
_library_ IEEEIEEE
Definition: jet_decoder.vhd:14