You are on page 1of 8

LIBRARY IEEE;

USE IEEE.std_logic_1164.ALL;
ENTITY count_coincidence IS
PORT (
CLOCK_50
SW2
SW
RST
COMPA1
COMPA2
COMPA3
COMPA4
COMPB1
COMPB2
COMPB3
COMPB4
COMPGR1
COMPGR2

: IN STD_LOGIC ;
: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;
: IN STD_LOGIC ;

Count_affout1: OUT STD_LOGIC_VECTOR (31 DOWNTO 0


);
Count_affout2: OUT STD_LOGIC_VECTOR (31 DOWNTO 0
);
Count_affout3: OUT STD_LOGIC_VECTOR (31 DOWNTO 0
);
test : OUT STD_LOGIC
);
END count_coincidence;
ARCHITECTURE rtl OF count_coincidence IS
COMPONENT lpmcnt24
PORT (clock : IN STD_LOGIC ;
cnt_en : IN STD_LOGIC ;
sclr : IN STD_LOGIC ;
aclr : IN STD_LOGIC ;
q
: OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
END COMPONENT;
-- freq_cnt_* : compteur de front du signal *
signal freq_cnt_Signal_A : std_logic_vector(31 downto 0);
signal freq_cnt_Signal_B : std_logic_vector(31 downto 0);
signal Signal_A : std_logic;
signal Signal_B : std_logic;
-- *_d1 et *_d2 : copies de deux tats successifs de * pour detecter un front po
sitif
signal Signal_A_d1
: std_logic;
signal Signal_A_d2
: std_logic;
signal Signal_B_d1
signal Signal_B_d2

: std_logic;
: std_logic;

-- posedge_* : tat haut lors d'un front positif


signal posedge_Signal_A : std_logic;
signal posedge_Signal_B : std_logic;

-- cnt_coincidence : compteur de coincidence entre les deux signaux


signal cnt_coincidence : std_logic_vector(31 downto 0);
-- cnt_coincidence_old : buffer de la valeur precedente du compteur cnt_coinci
dence
signal cnt_coincidence_old : std_logic_vector(31 downto 0);
-- cnt_coincidence_enable : enable du compteur de coincidence
signal cnt_coincidence_enable : std_logic;
-- fenetre_cnt : compteur pour la taille de la fenetre de coincidence
signal fenetre_cnt : std_logic_vector(31 downto 0);
-- fenetre_enable : enable de la fenetre de coincidence
signal fenetre_enable : std_logic;
-- rst_fenetre_cnt : reset du compteur de la fenetre de coincidence
signal rst_fenetre_cnt : std_logic;
-- fenetre_out : indicateur de fin de la fenetre de coincidence
signal fenetre_out : std_logic;
-- freq_cnt_Signal_A_old : buffer de la valeur precedente du compteur freq_cnt
_Signal_A
signal freq_cnt_Signal_A_old : std_logic_vector(31 downto 0);
signal taille_fenetre : std_logic_vector(31 downto 0);
signal reset : std_logic;
signal
signal
signal
signal
signal
signal
signal
signal
signal
signal

low
: std_logic;
high : std_logic;
rst_test : std_logic;
reset_cnt : std_logic_vector (31 downto 0);
nb_test_cnt : std_logic_vector (31 downto 0);
rst_reset_cnt : std_logic;
flag_reset : std_logic;
Count_affout1_int : std_logic_vector(31 downto 0);
Count_affout2_int : std_logic_vector(31 downto 0);
Count_affout3_int : std_logic_vector(31 downto 0);

BEGIN
low <= '0';
high <= '1';
------------------------------------------------------------------------------------------------ Gestion du switch SW2 pour le choix des signaux d'entre
----------------------------------------------------------------------------------------------p_Choix_input : process (SW2, COMPA1, COMPA2, COMPA3, COMPA4, COMPB1, COMPB2, C
OMPB3, COMPB4)
begin
case SW2 is
when "0000"
when "0001"
when "0010"
when "0011"

=>
=>
=>
=>

Signal_A
Signal_A
Signal_A
Signal_A

<=
<=
<=
<=

COMPA1
COMPA2
COMPA3
COMPA4

;
;
;
;

Signal_B
Signal_B
Signal_B
Signal_B

<=
<=
<=
<=

COMPB1;
COMPB2;
COMPB3;
COMPB4;

-----

A1
A2
A3
A4

et
et
et
et

B1
B2
B3
B4

when "0100"
when "0101"
when "0110"

=> Signal_A <= COMPA1 ; Signal_B <= COMPA2; -- A1 et A2


=> Signal_A <= COMPA1 ; Signal_B <= COMPA3; -- A1 et A3
=> Signal_A <= COMPA1
; Signal_B <= COMPA4; -- A1 et

A4
when "0111"

=> Signal_A <= COMPA2 ; Signal_B <= COMPA3; -- A2

when "1000"

=> Signal_A <= COMPA2 ; Signal_B <= COMPA4; -- A2

et A3
et A4
when "1001"
when
when
when
when
when

=> Signal_A <= COMPA3 ; Signal_B <= COMPA4; -- A3 et A4

"1010" => Signal_A <= COMPB1


"1011" => Signal_A <= COMPB1
"1100" => Signal_A <= COMPB1
"1101" => Signal_A <= COMPB2
"1110" => Signal_A <= COMPB2
when others => Signal_A

; Signal_B <= COMPB2; -- B1 et


; Signal_B <= COMPB3; -- B1 et
; Signal_B <= COMPB4; -- B1 et
; Signal_B <= COMPB3; -- B2 et
; Signal_B <= COMPB4; -- B2 et
<= COMPB3 ; Signal_B <= COMPB4;

B2
B3
B4
B3
B4
-- B3

et B4
end case;
end process p_Choix_input;
------------------------------------------------------------------------------------------------ Gestion du switch SW pour la determination de la taille de la fenetre de coin
cidence
----------------------------------------------------------------------------------------------p_SW : process (SW)
begin
case SW is
when
0"; -- 1s
when
0"; -- 2s
when
0"; -- 5s
when
0"; -- 10s
-when
0"; -- 20s
when
0"; -- 30s
when
0"; -- 50s
when
00"; -- 1ms
end case;

"000" => taille_fenetre <= "0000000000000000000000000011001


"001" => taille_fenetre <= "0000000000000000000000000110010
"010" => taille_fenetre <= "0000000000000000000000001111101
"011" => taille_fenetre <= "0000000000000000000000011111010
/!\ mettre 100s la plage de 30s
"100" => taille_fenetre <= "0000000000000000000000111110100
"101" => taille_fenetre <= "0000000000000000000001011101110
"110" => taille_fenetre <= "0000000000000000000010011100010
others => taille_fenetre <= "000000000000000011000011010100

end process p_SW;


------------------------------------------------------------------------------------------------ Detection des fronts positifs
----------------------------------------------------------------------------------------------r_edge_signal : process (CLOCK_50, RST)

begin
if (RST = '1') then
Signal_A_d1 <= '0';
---------------Signal_A_d2 <= '0';
s de front si -Signal_B_d1 <= '0';
-Signal_B_d2 <= '0';
---------------elsif (CLOCK_50'event and CLOCK_50= '1') then
Signal_A_d1 <= Signal_A;
---------------Signal_A_d2 <= Signal_A_d1;
eux tats en -Signal_B_d1 <= Signal_B;
pour chacun des signaux -Signal_B_d2 <= Signal_B_d1;
---------------end if;
end process r_edge_signal;

----------------------- RESET des detecteur


-- rst = '1'
-------------------------------------------- Actualisation des d
-- d1 et d2
----------------------

------------------------------------posedge_Signal_A <= Signal_A_d1 and not Signal_A_d2;


positif sur -posedge_Signal_B <= Signal_B_d1 and not Signal_B_d2;
et B
--

-- Detection de front
-- les deux signaux A
----------------------

--------------------------------------------------------------------------------------------------------------- Cration des 6 compteurs


------------------------------------------------------------------------------------------------ i_freq_cnt_Signal_A : compteur de front du signal A
-- i_freq_cnt_Signal_B : compteur de front du signal B
-- i_cnt_coincidence : compteur des coincidences
-- i_fenetre_co : compteur pour le timer de la fenetre de coincidence
-- i_reset : Compteur pour le timer du reset
-- i_nb_test : Compteur test
----------------------------------------------------------------------------------------------i_freq_cnt_Signal_A : lpmcnt24 PORT MAP(
clock => Signal_A,
---------------cnt_en => high,
du signal A -sclr => low,
---------------aclr => reset or RST,
q
=> freq_cnt_Signal_A
);
i_freq_cnt_Signal_B : lpmcnt24 PORT MAP(
clock => Signal_B,
---------------cnt_en => high,
du signal B --

----------------------- Compteur de fronts


----------------------

----------------------- Compteur de fronts

sclr => low,


---------------aclr => reset or RST,
q
=> freq_cnt_Signal_B
);
i_cnt_coincidence : lpmcnt24 PORT MAP(
clock => Signal_B,
---------------cnt_en => cnt_coincidence_enable,
ncidences
-sclr => low,
---------------aclr => reset or RST,
q
=> cnt_coincidence
);
i_fenetre_co : lpmcnt24 PORT MAP(
clock => CLOCK_50,
---------------cnt_en => fenetre_enable,
timer de la -sclr => low,
dences
-aclr => rst_fenetre_cnt or reset or RST,
---------------q
=> fenetre_cnt
);
i_reset : lpmcnt24 PORT MAP(
clock => CLOCK_50,
---------------cnt_en => high,
mer du reset -sclr => low,
---------------aclr => reset or RST,
q
=> reset_cnt
);

----------------------

-----------------------

Compteur des coi

----------------------

-----------------------

Compteur pour le

--

fenetre de coinci

----------------------

----------------------- Compteur pour le ti


----------------------

----------------------------------------------i_nb_test : lpmcnt24 PORT MAP(


clock => CLOCK_50,
---------------cnt_en => high,
est
-sclr => low,
---------------aclr => rst_test or reset or RST,
q
=> nb_test_cnt
);

-----------------------

Compteur t

----------------------

----------------------------------------------------------------------------------------------- Process de count des coincidences


----------------------------------------------------------------------------------------------- Gestion de :
-- - cnt_coincidence_enable

-- - rst_fenetre_cnt
-- - fenetre_enable
---------------------------------------------------------------------------------------------p_cnt_coincidence : process (CLOCK_50, freq_cnt_Signal_A, cnt_coincidence, fen
etre_out, posedge_Signal_A)
begin
if(posedge_Signal_A='1') then
cnt_coincidence_enable <= '1';

--------------------- Si front sur A

-rst_fenetre_cnt <= '1';

------------------

-fenetre_enable <='1';
elsif(fenetre_out='1') then

------------------

cnt_coincidence_enable <= '0';

-- Si fenetre fini

rst_fenetre_cnt <='1';

------------------

-----fenetre_enable <='0';
elsif(cnt_coincidence/=cnt_coincidence_old) then
--------cnt_coincidence_enable <='0';
compt -rst_fenetre_cnt <='1';
--------fenetre_enable <='0';

------------------- Si coincidence

else
cnt_coincidence_enable <= cnt_coincidence_enable;
rst_fenetre_cnt <='0';
fenetre_enable <= fenetre_enable;

------------------

------------ Sinon ------------

end if;
cnt_coincidence_old <= cnt_coincidence;
end process p_cnt_coincidence;

--------------------------------------------------------------------------------------- Process de fin de la fenetre de coincidence


-------------------------------------------------------------------------------------p_end_window : process (fenetre_cnt)
begin
if (fenetre_cnt = taille_fenetre) then
----------fenetre_out <= '1';
in -else
--

------------------------ taille_fenetre est determ


-- par SW, envoy par USB par

fenetre_out <= '0';


-end if;
-----------

--

le soft

-----------------------

end process p_end_window;

--------------------------------------------------------------------------------------- Process de test


--------------------------------------------------------------------------------------p_test : process (nb_test_cnt)
begin
if (nb_test_cnt = taille_fenetre) then
rst_test <= '1';
else
rst_test <= '0';
end if;
end process p_test;
--------------------------------------------------------------------------------------- Process pour la fenetre d'acquisition toutes les 100ms et la sauvegardes des
valeurs
-------------------------------------------------------------------------------------p_100ms : process (CLOCK_50)
begin
if (reset_cnt = "00000000010011000100101100111111") then
-- avant 100ms
Count_affout1_int <= freq_cnt_Signal_A;
Count_affout2_int <= freq_cnt_Signal_B;
Count_affout3_int <= cnt_coincidence;
elsif (reset_cnt = "00000000010011000100101101000000") t
hen -- 100ms
reset <= '1';
else
if(CLOCK_50='1') then
reset <= '0';
else
reset <= reset;
end if;
end if;
end process p_100ms;

--------------------------------------------------------------------------------- Assign Outputs


-------------------------------------------------------------------------------Count_affout1 <= Count_affout1_int;
Count_affout2 <= Count_affout2_int;
Count_affout3 <= Count_affout3_int;
test <= rst_test;
END rtl;

You might also like