1
0
Fork 0
mirror of https://github.com/RobotechLille/cdf2018-principal synced 2024-11-16 21:36:04 +01:00
cdf2018-principal/fpga/hedm.vhd

79 lines
2.6 KiB
VHDL
Raw Normal View History

2018-02-07 17:57:01 +01:00
-- Process signals from HEDM-550X encoder
-- and output the value read
-- TODO Quelques modifications apportées depuis test avec les vraies codeuses
-- un nouveau test sera nécessaire (vérifier notamment le sens de parcours)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
entity hedm is
Port (
clk : in STD_LOGIC; -- Horloge, la fréquence n'importe pas
chA : in STD_LOGIC; -- Canal A
chB : in STD_LOGIC; -- Canal B
2018-02-27 10:41:33 +01:00
reset : in STD_LOGIC; -- Hard reset
zero : in STD_LOGIC; -- Force la valeur à zéro sans réinitialiser le fonctionnement
counts : out integer
2018-02-07 17:57:01 +01:00
);
end hedm;
architecture Behavioral of hedm is
2018-02-24 16:56:57 +01:00
signal Ap, Bp : STD_LOGIC := '0'; -- Précédentes valeurs de A et B pour détecter les front montant
2018-02-07 17:57:01 +01:00
begin
2018-02-24 16:56:57 +01:00
processInput : process(clk, reset)
2018-02-27 10:41:33 +01:00
variable counter : integer := 0;
2018-02-07 17:57:01 +01:00
begin
2018-02-24 16:56:57 +01:00
if reset = '1' then
2018-02-27 10:41:33 +01:00
counter := 0;
counts <= 0;
2018-02-24 16:56:57 +01:00
Ap <= '0';
Bp <= '0';
elsif rising_edge(clk) then
2018-02-07 17:57:01 +01:00
2018-02-27 10:41:33 +01:00
if zero = '1' then
counter := 0;
end if;
-- On pourrait optimiser la logique avec un tableau de Karnaugh ou autres méthodes
-- de simplification d'algèbre de Boole, mais le synthétiseur pour FPGA fera un
-- tout aussi bon travail, on garde donc le code suivant pour la lisibilité
2018-02-07 17:57:01 +01:00
if (Ap = '0' and chA = '1') then -- Front montant A
if (chB = '0') then
2018-02-27 10:41:33 +01:00
counter := counter + 1;
2018-02-07 17:57:01 +01:00
else
2018-02-27 10:41:33 +01:00
counter := counter - 1;
2018-02-07 17:57:01 +01:00
end if;
elsif (Ap = '1' and chA = '0') then -- Front descendant A
if (chB = '1') then
2018-02-27 10:41:33 +01:00
counter := counter + 1;
2018-02-07 17:57:01 +01:00
else
2018-02-27 10:41:33 +01:00
counter := counter - 1;
2018-02-07 17:57:01 +01:00
end if;
elsif (Bp = '0' and chB = '1') then -- Front montant B
if (chA = '1') then
2018-02-27 10:41:33 +01:00
counter := counter + 1;
2018-02-07 17:57:01 +01:00
else
2018-02-27 10:41:33 +01:00
counter := counter - 1;
2018-02-07 17:57:01 +01:00
end if;
elsif (Bp = '1' and chB = '0') then -- Front descendant B
if (chA = '0') then
2018-02-27 10:41:33 +01:00
counter := counter + 1;
2018-02-07 17:57:01 +01:00
else
2018-02-27 10:41:33 +01:00
counter := counter - 1;
2018-02-07 17:57:01 +01:00
end if;
end if;
2018-02-27 10:41:33 +01:00
Ap <= chA;
Bp <= chB;
2018-02-27 10:41:33 +01:00
counts <= counter;
2018-02-07 17:57:01 +01:00
end if;
end process;
end Behavioral;