00001 --**************************************************************
00002 --* *
00003 --* The source code for the ATLAS BCM "AAA" FPGA is made *
00004 --* available via the GNU General Public License (GPL) *
00005 --* unless otherwise stated below. *
00006 --* *
00007 --* In case of problems/questions/bug reports etc. please *
00008 --* contact michael.niegl@cern.ch *
00009 --* *
00010 --**************************************************************
00011
00012 --**************************************************************
00013 --* *
00014 --* $Source: /local/reps/bcmfpga/bcm_aaa/bcm_aaa/rio/edge_det.vhd,v $ *
00015 --* $Revision: 1.7.2.6 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:47 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023
00024
00025 library ieee;
00026
00027 use ieee.std_logic_1164.all;
00028
00029 use ieee.std_logic_arith.all;
00030
00031 use ieee.std_logic_unsigned.all;
00032
00033 use ieee.numeric_std.all;
00034 library work;
00035 use work.daq_header.all;
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 entity edge_det is
00046 port (
00047 DATA_IN : in (31 downto 0);
00048 CLK : in ;
00049 SUM_RIS : out (5 downto 0);
00050 SUM_FAL : out (5 downto 0);
00051 EDGE_RIS1 : out (4 downto 0);
00052 EDGE_RIS2 : out (4 downto 0);
00053 EDGE_RIS3 : out (4 downto 0);
00054 EDGE_FAL1 : out (4 downto 0);
00055 EDGE_FAL2 : out (4 downto 0);
00056 EDGE_FAL3 : out (4 downto 0);
00057 STATUS_P1 : out ;
00058 STATUS_P2 : out ;
00059 STATUS_P3 : out ;
00060 STATUS_N1 : out ;
00061 STATUS_N2 : out ;
00062 STATUS_N3 : out
00063 );
00064 end edge_det;
00065
00066 ------------------------------------------------------------------------------
00067 ------------------------------------------------------------------------------
00068
00069
00070
00071
00072
00073
00074
00075
00076 architecture new2 of edge_det is
00077
00078 ----------------------------- signals --------------------------------------
00079 signal index_p1_latch : sixteen;
00080 signal index_n1_latch : sixteen;
00081 signal index_p_low : eight;
00082 signal index_n_low : eight;
00083 signal index_p1_latch2 : four;
00084 signal index_n1_latch2 : four;
00085 signal index_p1_latch3 : four;
00086 signal index_n1_latch3 : four;
00087 signal sum1_n : twofour;
00088 signal sum2_n : fivetwo;
00089 signal sum1_p : twofour;
00090 signal sum2_p : fivetwo;
00091 signal data_old : (2 downto 0) := "000";
00092 signal data_i : (34 downto 0) := (others => '0');
00093 signal data_ii : (34 downto 0) := (others => '0');
00094 signal data_i_filt : (34 downto 0) := (others => '0');
00095 signal data_ii_filt : (34 downto 0) := (others => '0');
00096 -- signal data_i2 : std_logic_vector (34 downto 0) := (others => '0');
00097 -- signal data_ii2 : std_logic_vector (34 downto 0) := (others => '0');
00098 signal fdata_i : (34 downto 0) := (others => '0');
00099 signal fdata_ii : (34 downto 0) := (others => '0');
00100 -- signal fdata_i2 : std_logic_vector (34 downto 0) := (others => '0');
00101 -- signal fdata_ii2 : std_logic_vector (34 downto 0) := (others => '0');
00102 signal edge_det_p : (32 downto 1) := (others => '0');
00103 signal edge_det_p2 : (32 downto 1) := (others => '0');
00104 signal edge_det_n : (32 downto 1) := (others => '0');
00105 -- signal edge_det_nh : std_logic_vector (32 downto 1) := (others => '0');
00106 -- signal edge_det_ph : std_logic_vector (32 downto 1) := (others => '0');
00107 -- signal edge_det_nhh : std_logic_vector (32 downto 1) := (others => '0');
00108 -- signal edge_det_phh : std_logic_vector (32 downto 1) := (others => '0');
00109
00110
00111 signal status1_p1 : (8 downto 1) := "00000000";
00112 signal status11_p1 : (4 downto 1) := "0000";
00113 signal status2_p1 : (2 downto 1) := "00";
00114 signal status1_p2 : (2 downto 1) := "00";
00115 signal status12_p2 : := '0';
00116 signal status1_p3 : (2 downto 1) := "00";
00117 signal status12_p3 : := '0';
00118 signal status1_n1 : (8 downto 1) := "00000000";
00119 signal status11_n1 : (4 downto 1) := "0000";
00120 signal status2_n1 : (2 downto 1) := "00";
00121 signal status_i_p1 : := '0';
00122 signal status_i_n1 : := '0';
00123 signal status1_n2 : (2 downto 1) := "00";
00124 signal status12_n2 : := '0';
00125 signal status1_n3 : (2 downto 1) := "00";
00126 signal status12_n3 : := '0';
00127 signal index_p1_latch22 : (1 downto 0) := "00";
00128 signal index_n1_latch22 : (1 downto 0) := "00";
00129 signal index_p1_latch33 : (1 downto 0) := "00";
00130 signal index_n1_latch33 : (1 downto 0) := "00";
00131 signal index_p1_latch4 : := '0';
00132 signal index_n1_latch4 : := '0';
00133 signal index_p2_latch : (1 downto 0) := "00";
00134 signal index_p2_latch3 : (2 downto 0) := "000";
00135 signal index_p2_latch33 : (1 downto 0) := "00";
00136 signal index_p2_latch33_1 : (2 downto 0) := "000";
00137 signal index_p2_out_1 : (1 downto 0) := "00";
00138 signal index_p2_out : (1 downto 0) := "00";
00139 signal index_n2_latch : (1 downto 0) := "00";
00140 signal index_n2_latch3 : (2 downto 0) := "000";
00141 signal index_n2_latch33 : (1 downto 0) := "00";
00142 signal index_n2_latch33_1 : (2 downto 0) := "000";
00143 signal index_n2_out_1 : (1 downto 0) := "00";
00144 signal index_n2_out : (1 downto 0) := "00";
00145 signal index_p3_latch : (1 downto 0) := "00";
00146 signal index_p3_latch3 : (2 downto 0) := "000";
00147 signal index_p3_latch33 : (1 downto 0) := "00";
00148 signal index_p3_latch33_1 : (2 downto 0) := "000";
00149 signal index_p3_out : (1 downto 0) := "00";
00150 signal index_p3_out_1 : (1 downto 0) := "00";
00151 signal index_n3_latch : (1 downto 0) := "00";
00152 signal index_n3_latch3 : (2 downto 0) := "000";
00153 signal index_n3_latch33 : (1 downto 0) := "00";
00154 signal index_n3_latch33_1 : (2 downto 0) := "000";
00155 signal index_n3_out : (1 downto 0) := "00";
00156 signal index_n3_out_1 : (1 downto 0) := "00";
00157 signal sum_p : (5 downto 0) := "000000";
00158 signal sum_n : (5 downto 0) := "000000";
00159 signal SUM_RIS_i : (5 downto 0) := "000000";
00160 signal SUM_FAL_i : (5 downto 0) := "000000";
00161 signal STATUS_P1_i : := '0';
00162 signal STATUS_P2_i : := '0';
00163 signal STATUS_P3_i : := '0';
00164 signal STATUS_N1_i : := '0';
00165 signal STATUS_N2_i : := '0';
00166 signal STATUS_N3_i : := '0';
00167 signal EDGE_RIS1_i : (4 downto 0) := "00000";
00168 signal EDGE_RIS2_i : (4 downto 0) := "00000";
00169 signal EDGE_RIS3_i : (4 downto 0) := "00000";
00170 signal EDGE_FAL1_i : (4 downto 0) := "00000";
00171 signal EDGE_FAL2_i : (4 downto 0) := "00000";
00172 signal EDGE_FAL3_i : (4 downto 0) := "00000";
00173
00174 begin
00175
00176
00177 process(CLK)
00178 ------------------------------- variables -------------------------------------
00179 variable index_p2_latch333 : (1 downto 0) := "00";
00180 variable index_n2_latch333 : (1 downto 0) := "00";
00181 variable index_p3_latch333 : (1 downto 0) := "00";
00182 variable index_n3_latch333 : (1 downto 0) := "00";
00183 variable fill1, fill2 : (34 downto 0) := (others => '0');
00184 variable edge_det_nh : (32 downto 1) := (others => '0');
00185 variable edge_det_ph : (32 downto 1) := (others => '0');
00186 variable edge_det_nhh : (32 downto 1) := (others => '0');
00187 variable edge_det_phh : (32 downto 1) := (others => '0');
00188 variable spike_p : (32 downto 1) := (others => '1');
00189 variable spike_n : (32 downto 1) := (others => '1');
00190 variable a, b, c, e, f, x, k, l, m, n : := '0';
00191
00192 begin
00193
00194 if CLK'event and CLK = '1' then
00195
00196 ------------------------------- default values -------------------------------------
00197 status1_p1 <= (others => '1');
00198 status1_n1 <= (others => '1');
00199 status2_p1 <= (others => '1');
00200 status2_n1 <= (others => '1');
00201 spike_n := (others => '1');
00202 spike_p := (others => '1');
00203 status_i_p1 <= '1';
00204 status_i_n1 <= '1';
00205 status1_p2 <= "11";
00206 status12_p2 <= '1';
00207 index_p2_latch3(2 downto 0) <= "111";
00208 status1_n2 <= "11";
00209 status12_n2 <= '1';
00210 index_n2_latch3(2 downto 0) <= "111";
00211 index_n2_latch33 <= "11";
00212 index_n2_latch333 := "11";
00213 status1_p3 <= "11";
00214 status12_p3 <= '1';
00215 index_p3_latch3(2 downto 0) <= "111";
00216 status1_n3 <= "11";
00217 status12_n3 <= '1';
00218 index_n3_latch3(2 downto 0) <= "111";
00219 index_n3_latch33 <= "11";
00220 index_n3_latch333 := "11";
00221
00222 data_old <= DATA_IN(2 downto 0);
00223 data_i <= data_old & DATA_IN;
00224 data_ii <= data_i(31 downto 0) & DATA_IN(31 downto 29);
00225
00226 ------------------------------ filtering --------------------------------------
00227 for i in (DATA_IN'length+2) downto 3 loop --edge det via pattern matching, ris and fal
00228 edge_det_ph(i-2) := ris_hole_pattern(data_i(i downto i-3));
00229 edge_det_nh(i-2) := fal_hole_pattern(data_i(i downto i-3));
00230 edge_det_phh(i-2) := ris_hole_pattern(data_ii(i downto i-3));
00231 edge_det_nhh(i-2) := fal_hole_pattern(data_ii(i downto i-3));
00232 end loop;
00233
00234 fill1 := ("00" & edge_det_ph & '0') or ('0' & edge_det_nh & "00");
00235 fill2 := ("00" & edge_det_phh & '0') or ('0' & edge_det_nhh & "00");
00236
00237 -- data_i2 <= data_i;
00238 -- data_ii2 <= data_ii;
00239
00240 fdata_i <= data_i or fill1;
00241 fdata_ii <= data_ii or fill2;
00242
00243 ----------------------------- spike suppression -----------------------------------
00244 for i in (DATA_IN'length+2) downto 3 loop
00245 spike_p(i-2) := spike_suppress(fdata_i(i downto i-2));
00246 spike_n(i-2) := spike_suppress(fdata_ii(i downto i-2));
00247 end loop;
00248
00249 -- fdata_i2 <= fdata_i;
00250 -- fdata_ii2 <= fdata_ii;
00251
00252 data_i_filt <= fdata_i and ('1' & spike_p & "11");
00253 data_ii_filt <= fdata_ii and ('1' & spike_n & "11");
00254
00255 ------------------------------- edge det -------------------------------------
00256 for i in (DATA_IN'length+2) downto 3 loop --edge det via pattern matching, ris and fal
00257 edge_det_p2(i-2) <= ris_pattern(data_i_filt(i downto i-3));
00258 edge_det_n(i-2) <= fal_pattern(data_ii_filt(i downto i-3));
00259 end loop;
00260
00261 edge_det_p <= edge_det_p2;
00262
00263 ------------------------------- pos 1 r & f -------------------------------------
00264 for m in 1 to 8 loop -- 8 status bits, LSBs of pos1
00265 if edge_det_p((m*4)) = '1' then
00266 index_p1_latch(m) <= "11";
00267 elsif edge_det_p((m*4)-1) = '1' then
00268 index_p1_latch(m) <= "10";
00269 elsif edge_det_p((m*4)-2) = '1' then
00270 index_p1_latch(m) <= "01";
00271 elsif edge_det_p((m*4)-3) = '1' then
00272 index_p1_latch(m) <= "00";
00273 else
00274 status1_p1(m) <= '0';
00275 end if;
00276
00277 sum1_p(m) <= conv_std_logic_vector((conv_integer(edge_det_p(m*4)) +
00278 conv_integer(edge_det_p((m*4)-1)) +
00279 conv_integer(edge_det_p((m*4)-2)) +
00280 conv_integer(edge_det_p((m*4)-3))),3);
00281
00282 if edge_det_n((m*4)) = '1' then
00283 index_n1_latch(m) <= "11";
00284 elsif edge_det_n((m*4)-1) = '1' then
00285 index_n1_latch(m) <= "10";
00286 elsif edge_det_n((m*4)-2) = '1' then
00287 index_n1_latch(m) <= "01";
00288 elsif edge_det_n((m*4)-3) = '1' then
00289 index_n1_latch(m) <= "00";
00290 else
00291 status1_n1(m) <= '0';
00292 end if;
00293
00294 sum1_n(m) <= conv_std_logic_vector((conv_integer(edge_det_n(m*4)) +
00295 conv_integer(edge_det_n((m*4)-1)) +
00296 conv_integer(edge_det_n((m*4)-2)) +
00297 conv_integer(edge_det_n((m*4)-3))),3);
00298
00299 end loop;
00300
00301 ------------------------------- search top 4 bits for 2nd edge -------------------------------------
00302 a := dec13 (status1_p1(8 downto 6));
00303 c := dec13 (status1_n1(8 downto 6));
00304
00305 if (status1_p1(7) and status1_p1(8)) = '1' then --search top 4 bit for 2nd edge
00306 index_p2_latch3(1 downto 0) <= "10";
00307 index_p2_latch <= index_p1_latch(7);
00308 elsif (status1_p1(6) and
00309 (status1_p1(7) xor status1_p1(8))) = '1' then
00310 index_p2_latch3(1 downto 0) <= "01";
00311 index_p2_latch <= index_p1_latch(6);
00312 elsif (status1_p1(5) and a) = '1' then
00313 index_p2_latch3(1 downto 0) <= "00";
00314 index_p2_latch <= index_p1_latch(5);
00315 else
00316 status12_p2 <= '0';
00317 index_p2_latch3(2 downto 0) <= "000";
00318 index_p2_latch <= "00";
00319 end if;
00320
00321 if (status1_n1(7) and status1_n1(8)) = '1' then
00322 index_n2_latch3(1 downto 0) <= "10";
00323 index_n2_latch <= index_n1_latch(7);
00324 elsif (status1_n1(6) and (status1_n1(7) xor status1_n1(8))) = '1' then
00325 index_n2_latch3(1 downto 0) <= "01";
00326 index_n2_latch <= index_n1_latch(6);
00327 elsif (status1_n1(5) and c) = '1' then
00328 index_n2_latch3(1 downto 0) <= "00";
00329 index_n2_latch <= index_n1_latch(5);
00330 else
00331 status12_n2 <= '0';
00332 index_n2_latch3(2 downto 0) <= "000";
00333 index_n2_latch <= "00";
00334 end if;
00335
00336 --------------------------------- search top 4 bits for 3rd edge -------------------------------------
00337 k := dec23 (status1_p1(8 downto 6));
00338 l := dec23 (status1_n1(8 downto 6));
00339
00340 if (status1_p1(8) and status1_p1(7) and status1_p1(6)) = '1' then --check top 4 bits for 3rd edge
00341 index_p3_latch3(1 downto 0) <= "01";
00342 index_p3_latch <= index_p1_latch(6);
00343 elsif (k and status1_p1(5)) = '1' then
00344 index_p3_latch3(1 downto 0) <= "00";
00345 index_p3_latch <= index_p1_latch(5);
00346 else
00347 status12_p3 <= '0';
00348 index_p3_latch3(2 downto 0) <= "000";
00349 index_p3_latch <= "00";
00350 end if;
00351
00352 if (status1_n1(8) and status1_n1(7) and status1_n1(6)) = '1' then
00353 index_n3_latch3(1 downto 0) <= "01";
00354 index_n3_latch <= index_n1_latch(6);
00355 elsif (l and status1_n1(5)) = '1' then
00356 index_n3_latch3(1 downto 0) <= "00";
00357 index_n3_latch <= index_n1_latch(5);
00358 else
00359 status12_n3 <= '0';
00360 index_n3_latch3(2 downto 0) <= "000";
00361 index_n3_latch <= "00";
00362 end if;
00363
00364 status11_p1 <= status1_p1(4 downto 1);
00365 status11_n1 <= status1_n1(4 downto 1);
00366 for z in 4 downto 1 loop
00367 index_p_low(z) <= index_p1_latch(z);
00368 index_n_low(z) <= index_n1_latch(z);
00369 end loop;
00370
00371 ------------------------------- next bits pos 1 r & f -------------------------------------
00372 for j in 1 to 2 loop -- 2 bit status, middle bits of pos1
00373 if status1_p1((j*4)) = '1' then
00374 index_p1_latch3(j) <= "11";
00375 index_p1_latch2(j) <= index_p1_latch(j*4);
00376 elsif status1_p1((j*4)-1) = '1' then
00377 index_p1_latch3(j) <= "10";
00378 index_p1_latch2(j) <= index_p1_latch((j*4)-1);
00379 elsif status1_p1((j*4)-2) = '1' then
00380 index_p1_latch3(j) <= "01";
00381 index_p1_latch2(j) <= index_p1_latch((j*4)-2);
00382 elsif status1_p1((j*4)-3) = '1' then
00383 index_p1_latch3(j) <= "00";
00384 index_p1_latch2(j) <= index_p1_latch((j*4)-3);
00385 else
00386 status2_p1(j) <= '0';
00387 index_p1_latch2(j) <= "00";
00388 end if;
00389
00390 sum2_p(j) <= conv_std_logic_vector((conv_integer(sum1_p(j*4)) +
00391 conv_integer(sum1_p((j*4)-1)) +
00392 conv_integer(sum1_p((j*4)-2)) +
00393 conv_integer(sum1_p((j*4)-3))),5);
00394
00395 if status1_n1((j*4)) = '1' then
00396 index_n1_latch3(j) <= "11";
00397 index_n1_latch2(j) <= index_n1_latch(j*4);
00398 elsif status1_n1((j*4)-1) = '1' then
00399 index_n1_latch3(j) <= "10";
00400 index_n1_latch2(j) <= index_n1_latch((j*4)-1);
00401 elsif status1_n1((j*4)-2) = '1' then
00402 index_n1_latch3(j) <= "01";
00403 index_n1_latch2(j) <= index_n1_latch((j*4)-2);
00404 elsif status1_n1((j*4)-3) = '1' then
00405 index_n1_latch3(j) <= "00";
00406 index_n1_latch2(j) <= index_n1_latch((j*4)-3);
00407 else
00408 status2_n1(j) <= '0';
00409 index_n1_latch2(j) <= "00";
00410 end if;
00411
00412 sum2_n(j) <= conv_std_logic_vector((conv_integer(sum1_n(j*4)) +
00413 conv_integer(sum1_n((j*4)-1)) +
00414 conv_integer(sum1_n((j*4)-2)) +
00415 conv_integer(sum1_n((j*4)-3))),5);
00416
00417 end loop;
00418
00419 ------------------------------- lower 4 bits 2nd edge -------------------------------------
00420 b := dec13 (status11_p1(4 downto 2));
00421 x := dec13 (status11_n1(4 downto 2));
00422
00423 if status2_p1(2) = '0' then --no edge in top 4 bits, search for 2nd
00424 if (status11_p1(3) and status11_p1(4)) = '1' then
00425 index_p2_latch333(1 downto 0) := "10";
00426 index_p2_out <= index_p_low(3);
00427 elsif (status11_p1(2) and
00428 (status11_p1(3) xor status11_p1(4))) = '1' then
00429 index_p2_latch333(1 downto 0) := "01";
00430 index_p2_out <= index_p_low(2);
00431 elsif (status11_p1(1) and b) = '1' then
00432 index_p2_latch333(1 downto 0) := "00";
00433 index_p2_out <= index_p_low(1);
00434 else
00435 status1_p2(1) <= '0';
00436 index_p2_latch333(1 downto 0) := "00";
00437 index_p2_out <= "00";
00438 end if;
00439 elsif status2_p1(2) = '1' then -- 1 edge in top 4 bits, search for 1st
00440 if status11_p1(4) = '1' then
00441 index_p2_latch333(1 downto 0) := "11";
00442 index_p2_out <= index_p_low(4);
00443 elsif status11_p1(3) = '1' then
00444 index_p2_latch333(1 downto 0) := "10";
00445 index_p2_out <= index_p_low(3);
00446 elsif status11_p1(2) = '1' then
00447 index_p2_latch333(1 downto 0) := "01";
00448 index_p2_out <= index_p_low(2);
00449 elsif status11_p1(1) = '1' then
00450 index_p2_latch333(1 downto 0) := "00";
00451 index_p2_out <= index_p_low(1);
00452 else
00453 status1_p2(1) <= '0';
00454 index_p2_latch333(1 downto 0) := "00";
00455 index_p2_out <= "00";
00456 end if;
00457 else
00458 status1_p2(1) <= '0';
00459 index_p2_latch333(1 downto 0) := "00";
00460 index_p2_out <= "00";
00461 end if;
00462 index_p2_latch33 <= index_p2_latch333;
00463
00464 index_p2_latch33_1 <= index_p2_latch3;
00465 index_p2_out_1 <= index_p2_latch;
00466
00467 if status2_n1(2) = '0' then
00468 if (status11_n1(3) and status11_n1(4)) = '1' then
00469 index_n2_latch333(1 downto 0) := "10";
00470 index_n2_out <= index_n_low(3);
00471 elsif (status11_n1(2) and
00472 (status11_n1(3) xor status11_n1(4))) = '1' then
00473 index_n2_latch333(1 downto 0) := "01";
00474 index_n2_out <= index_n_low(2);
00475 elsif (status11_n1(1) and x) = '1' then
00476 index_n2_latch333(1 downto 0) := "00";
00477 index_n2_out <= index_n_low(1);
00478 else
00479 status1_n2(1) <= '0';
00480 index_n2_latch333(1 downto 0) := "00";
00481 index_n2_out <= "00";
00482 end if;
00483 elsif status2_n1(2) = '1' then
00484 if status11_n1(4) = '1' then
00485 index_n2_latch333(1 downto 0) := "11";
00486 index_n2_out <= index_n_low(4);
00487 elsif status11_n1(3) = '1' then
00488 index_n2_latch333(1 downto 0) := "10";
00489 index_n2_out <= index_n_low(3);
00490 elsif status11_n1(2) = '1' then
00491 index_n2_latch333(1 downto 0) := "01";
00492 index_n2_out <= index_n_low(2);
00493 elsif status11_n1(1) = '1' then
00494 index_n2_latch333(1 downto 0) := "00";
00495 index_n2_out <= index_n_low(1);
00496 else
00497 status1_n2(1) <= '0';
00498 index_n2_latch333(1 downto 0) := "00";
00499 index_n2_out <= "00";
00500 end if;
00501 else
00502 status1_n2(1) <= '0';
00503 index_n2_latch333(1 downto 0) := "00";
00504 index_n2_out <= "00";
00505 end if;
00506 index_n2_latch33 <= index_n2_latch333;
00507
00508 index_n2_latch33_1 <= index_n2_latch3;
00509 index_n2_out_1 <= index_n2_latch;
00510
00511 status1_p2(2) <= status12_p2;
00512 status1_n2(2) <= status12_n2;
00513
00514 --------------------------------- lower 4 bits 3rd edge -------------------------------------
00515 m := dec23 (status11_p1(4 downto 2));
00516 n := dec23 (status11_n1(4 downto 2));
00517
00518 if status2_p1(2) = '1' then --1 edge in top 4 bits, search for 2nd
00519 if (status11_p1(3) and status11_p1(4)) = '1' then
00520 index_p3_latch333(1 downto 0) := "10";
00521 index_p3_out <= index_p_low(3);
00522 elsif (status11_p1(2) and
00523 (status11_p1(3) xor status11_p1(4))) = '1' then
00524 index_p3_latch333(1 downto 0) := "01";
00525 index_p3_out <= index_p_low(2);
00526 elsif (status11_p1(1) and b) = '1' then
00527 index_p3_latch333(1 downto 0) := "00";
00528 index_p3_out <= index_p_low(1);
00529 else
00530 status1_p3(1) <= '0';
00531 index_p3_latch333(1 downto 0) := "00";
00532 index_p3_out <= "00";
00533 end if;
00534 elsif status12_p2 = '1' then --2 edges in top 4 bits, search for 1st
00535 if status11_p1(4) = '1' then
00536 index_p3_latch333(1 downto 0) := "11";
00537 index_p3_out <= index_p_low(4);
00538 elsif status11_p1(3) = '1' then
00539 index_p3_latch333(1 downto 0) := "10";
00540 index_p3_out <= index_p_low(3);
00541 elsif status11_p1(2) = '1' then
00542 index_p3_latch333(1 downto 0) := "01";
00543 index_p3_out <= index_p_low(2);
00544 elsif status11_p1(1) = '1' then
00545 index_p3_latch333(1 downto 0) := "00";
00546 index_p3_out <= index_p_low(1);
00547 else
00548 status1_p3(1) <= '0';
00549 index_p3_latch333(1 downto 0) := "00";
00550 index_p3_out <= "00";
00551 end if;
00552 else --no edges in top 4 bits, search for 3rd
00553 if (status11_p1(4) and status11_p1(3) and status11_p1(2)) = '1' then
00554 index_p3_latch333(1 downto 0) := "01";
00555 index_p3_out <= index_p_low(2);
00556 elsif (m and status11_p1(1)) = '1' then
00557 index_p3_latch333(1 downto 0) := "00";
00558 index_p3_out <= index_p_low(1);
00559 else
00560 status1_p3(1) <= '0';
00561 index_p3_latch333(1 downto 0) := "00";
00562 index_p3_out <= "00";
00563 end if;
00564 end if;
00565 index_p3_latch33 <= index_p3_latch333;
00566
00567 index_p3_latch33_1 <= index_p3_latch3;
00568 index_p3_out_1 <= index_p3_latch;
00569
00570 if status2_n1(2) = '1' then --1 edge in top 4 bits, search for 2nd
00571 if (status11_n1(3) and status11_n1(4)) = '1' then
00572 index_n3_latch333(1 downto 0) := "10";
00573 index_n3_out <= index_n_low(3);
00574 elsif (status11_n1(2) and
00575 (status11_n1(3) xor status11_n1(4))) = '1' then
00576 index_n3_latch333(1 downto 0) := "01";
00577 index_n3_out <= index_n_low(2);
00578 elsif (status11_n1(1) and x) = '1' then
00579 index_n3_latch333(1 downto 0) := "00";
00580 index_n3_out <= index_n_low(1);
00581 else
00582 status1_n3(1) <= '0';
00583 index_n3_latch333(1 downto 0) := "00";
00584 index_n3_out <= "00";
00585 end if;
00586 elsif status12_n2 = '1' then --2 edges in top 4 bits, search for 1st
00587 if status11_n1(4) = '1' then
00588 index_n3_latch333(1 downto 0) := "11";
00589 index_n3_out <= index_n_low(4);
00590 elsif status11_n1(3) = '1' then
00591 index_n3_latch333(1 downto 0) := "10";
00592 index_n3_out <= index_n_low(3);
00593 elsif status11_n1(2) = '1' then
00594 index_n3_latch333(1 downto 0) := "01";
00595 index_n3_out <= index_n_low(2);
00596 elsif status11_n1(1) = '1' then
00597 index_n3_latch333(1 downto 0) := "00";
00598 index_n3_out <= index_n_low(1);
00599 else
00600 status1_n3(1) <= '0';
00601 index_n3_latch333(1 downto 0) := "00";
00602 index_n3_out <= "00";
00603 end if;
00604 else --no edges in top 4 bits, search for 3rd
00605 if (status11_n1(4) and status11_n1(3) and status11_n1(2)) = '1' then
00606 index_n3_latch333(1 downto 0) := "01";
00607 index_n3_out <= index_n_low(2);
00608 elsif (n and status11_p1(1)) = '1' then
00609 index_n3_latch333(1 downto 0) := "00";
00610 index_n3_out <= index_n_low(1);
00611 else
00612 status1_n3(1) <= '0';
00613 index_n3_latch333(1 downto 0) := "00";
00614 index_n3_out <= "00";
00615 end if;
00616 end if;
00617 index_n3_latch33 <= index_n3_latch333;
00618
00619 index_n3_latch33_1 <= index_n3_latch3;
00620 index_n3_out_1 <= index_n3_latch;
00621
00622 status1_p3(2) <= status12_p3;
00623 status1_n3(2) <= status12_n3;
00624
00625 ------------------------------- status, MSB pos1 -------------------------------------
00626 if status2_p1(2) = '1' then --final status flag pos1
00627 index_p1_latch4 <= '1';
00628 index_p1_latch22 <= index_p1_latch2(2);
00629 index_p1_latch33 <= index_p1_latch3(2);
00630 elsif status2_p1(1) = '1' then
00631 index_p1_latch4 <= '0';
00632 index_p1_latch22 <= index_p1_latch2(1);
00633 index_p1_latch33 <= index_p1_latch3(1);
00634 else
00635 status_i_p1 <= '0';
00636 index_p1_latch22 <= "00";
00637 index_p1_latch33 <= "00";
00638 index_p1_latch4 <= '0';
00639 end if;
00640
00641 sum_p <= conv_std_logic_vector((conv_integer(sum2_p(1)) + conv_integer(sum2_p(2))), 6);
00642
00643 if status2_n1(2) = '1' then
00644 index_n1_latch4 <= '1';
00645 index_n1_latch22 <= index_n1_latch2(2);
00646 index_n1_latch33 <= index_n1_latch3(2);
00647 elsif status2_n1(1) = '1' then
00648 index_n1_latch4 <= '0';
00649 index_n1_latch22 <= index_n1_latch2(1);
00650 index_n1_latch33 <= index_n1_latch3(1);
00651 else
00652 status_i_n1 <= '0';
00653 index_n1_latch22 <= "00";
00654 index_n1_latch33 <= "00";
00655 index_n1_latch4 <= '0';
00656 end if;
00657
00658 sum_n <= conv_std_logic_vector((conv_integer(sum2_n(1)) + conv_integer(sum2_n(2))), 6);
00659
00660 ------------------------------- output assignments -------------------------------------
00661 STATUS_P1_i <= status_i_p1;
00662 EDGE_RIS1_i <= index_p1_latch4 & index_p1_latch33 & index_p1_latch22;
00663
00664 STATUS_P2_i <= status1_p2(2) or status1_p2(1);
00665 if status1_p2(2) = '1' then -- take values from upper or lower half of status1
00666 EDGE_RIS2_i <= index_p2_latch33_1 & index_p2_out_1;
00667 else
00668 EDGE_RIS2_i <= '0' & index_p2_latch33 & index_p2_out;
00669 end if;
00670
00671 STATUS_P3_i <= status1_p3(2) or status1_p3(1);
00672 if status1_p3(2) = '1' then
00673 EDGE_RIS3_i <= index_p3_latch33_1 & index_p3_out_1;
00674 else
00675 EDGE_RIS3_i <= '0' & index_p3_latch33 & index_p3_out;
00676 end if;
00677
00678 SUM_RIS_i <= sum_p;
00679
00680 STATUS_N1_i <= status_i_n1;
00681 EDGE_FAL1_i <= index_n1_latch4 & index_n1_latch33 & index_n1_latch22;
00682
00683 STATUS_N2_i <= status1_n2(2) or status1_n2(1);
00684 if status1_n2(2) = '1' then
00685 EDGE_FAL2_i <= index_n2_latch33_1 & index_n2_out_1;
00686 else
00687 EDGE_FAL2_i <= '0' & index_n2_latch33 & index_n2_out;
00688 end if;
00689
00690 STATUS_N3_i <= status1_n3(2) or status1_n3(1);
00691 if status1_n3(2) = '1' then
00692 EDGE_FAL3_i <= index_n3_latch33_1 & index_n3_out_1;
00693 else
00694 EDGE_FAL3_i <= '0' & index_n3_latch33 & index_n3_out;
00695 end if;
00696
00697 SUM_FAL_i <= sum_n;
00698
00699
00700 SUM_RIS <= SUM_RIS_i;
00701 SUM_FAL <= SUM_FAL_i;
00702
00703 if STATUS_N2_i = '1' then
00704 if EDGE_RIS2_i < EDGE_RIS1_i then
00705 EDGE_FAL1 <= EDGE_RIS1_i+2;
00706 EDGE_FAL2 <= EDGE_RIS2_i+2;
00707 else
00708 EDGE_FAL1 <= EDGE_RIS2_i+2;
00709 EDGE_FAL2 <= EDGE_RIS1_i+2;
00710 end if;
00711 STATUS_P1 <= STATUS_N2_i;
00712 if STATUS_P2_i = '0' then
00713 STATUS_P2 <= '0';
00714 else
00715 STATUS_P2 <= STATUS_N1_i;
00716 end if;
00717
00718 else
00719
00720 if STATUS_P1_i = '1' then
00721 EDGE_FAL1 <= EDGE_RIS1_i+2;
00722 STATUS_N1 <= STATUS_P1_i;
00723 else
00724 EDGE_FAL1 <= (others => '0');
00725 STATUS_N1 <= '0';
00726 end if;
00727 STATUS_N2 <= '0';
00728 EDGE_FAL2 <= (others => '0');
00729
00730 if STATUS_P2_i = '1' then
00731 STATUS_P1 <= '1';
00732 else
00733 STATUS_P1 <= '0';
00734 end if;
00735
00736 end if;
00737
00738
00739 if STATUS_P2_i = '1' then
00740 if EDGE_FAL2_i < EDGE_FAL1_i then
00741 EDGE_RIS1 <= EDGE_FAL1_i-1;
00742 EDGE_RIS2 <= EDGE_FAL2_i-1;
00743 else
00744 EDGE_RIS1 <= EDGE_FAL2_i-1;
00745 EDGE_RIS2 <= EDGE_FAL1_i-1;
00746 end if;
00747 STATUS_N1 <= STATUS_P2_i;
00748 if STATUS_N2_i = '0' then
00749 STATUS_N2 <= '0';
00750 else
00751 STATUS_N2 <= STATUS_P1_i;
00752 end if;
00753
00754 else
00755
00756 if STATUS_N1_i = '1' then
00757 EDGE_RIS1 <= EDGE_FAL1_i-1;
00758 STATUS_P1 <= STATUS_N1_i;
00759 else
00760 EDGE_RIS1 <= (others => '0');
00761 STATUS_P1 <= '0';
00762 end if;
00763 STATUS_P2 <= '0';
00764 EDGE_RIS2 <= (others => '0');
00765
00766 if STATUS_N2_i = '0' then
00767 STATUS_N1 <= '1';
00768 else
00769 STATUS_N1 <= '0';
00770 end if;
00771 end if;
00772
00773 EDGE_FAL3 <= (others => '0');
00774 EDGE_RIS3 <= (others => '0');
00775 STATUS_P3 <= '0';
00776 STATUS_N3 <= '0';
00777
00778 end if;
00779 end process;
00780 end new2;