Advertisement
bkyziol

Untitled

May 27th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.45 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. Use IEEE.std_logic_arith.all;
  4. USE IEEE.NUMERIC_STD.ALL;
  5.  
  6. entity encoder_module is
  7.     generic (
  8.               ROZDZIELCZOSC_ENCODERA     : integer := 20;
  9.               ILOSC_TAKTOW_ZEGARA_NA_SEK : integer := 10000;
  10.               ILOSC_POMIAROW_NA_SEK      : integer := 10
  11.              );
  12.     Port (
  13.              clk            : in  STD_LOGIC;
  14.              A              : in  STD_LOGIC;
  15.              B              : in  STD_LOGIC;
  16.              obrot_w_prawo  : out STD_LOGIC := '0'; --obrót zgodnie z ruchem wskazówek zegara
  17.              obrot_w_lewo   : out STD_LOGIC := '0'; --obrót przeciwnie do ruchu wskazówek zegara
  18.              obroty_na_sek   : out STD_LOGIC_VECTOR(7 downto 0) := "00000000"
  19.           );
  20. end encoder_module;
  21.  
  22. architecture Behavioral of encoder_module is
  23.  
  24.     signal AB              : STD_LOGIC_VECTOR(1 downto 0) := "00";
  25.     signal AB_poprzednie   : STD_LOGIC_VECTOR(1 downto 0) := "00";
  26.     signal takty           : integer := 0;
  27.     signal stopien_obrotu  : integer :=0 ;
  28.  
  29. begin
  30.    
  31.     process(clk)
  32.     begin
  33.  
  34.         if (clk'event and clk='1') then
  35.             takty <= takty + 1;
  36.            
  37.             if takty >= ILOSC_TAKTOW_ZEGARA_NA_SEK / ILOSC_POMIAROW_NA_SEK    then
  38.                 obroty_na_sek <= conv_std_logic_vector(abs(
  39.                     stopien_obrotu*(2/(ROZDZIELCZOSC_ENCODERA*4))/2*ILOSC_POMIAROW_NA_SEK
  40.                  -- obroty_na_sek =(stopien_obrotu / (ROZDZIELCZOSC_ENCODERA *4)*ILOSC_POMIAROW_NA_SEK)
  41.                 ),8);
  42.                 takty <= 0;
  43.                 stopien_obrotu <= 0;
  44.             end if;
  45.            
  46.           AB_poprzednie <= AB;
  47.           AB(0) <= A;
  48.           AB(1) <= B;
  49.           if (AB(0) = '1' and AB_poprzednie(0) = '0') then -- A zbocze rosnące
  50.               if (B='0') then -- obrót w prawo
  51.                  obrot_w_prawo <= '1';
  52.                  obrot_w_lewo <= '0';
  53.                       stopien_obrotu <= stopien_obrotu + 1;
  54.               elsif (B='1') then -- obrót w lewo
  55.                  obrot_w_prawo <= '0';
  56.                  obrot_w_lewo <= '1';
  57.                       stopien_obrotu <= stopien_obrotu - 1;
  58.               end if;
  59.           elsif (AB(1) = '1' and AB_poprzednie(1) = '0') then -- B zbocze rosnące
  60.               if (A='1') then -- obrót w prawo
  61.                  obrot_w_prawo <= '1';
  62.                  obrot_w_lewo <= '0';
  63.                       stopien_obrotu <= stopien_obrotu + 1;
  64.               elsif (A='0') then -- obrót w lewo
  65.                  obrot_w_prawo <= '0';
  66.                  obrot_w_lewo <= '1';
  67.                       stopien_obrotu <= stopien_obrotu - 1;
  68.               end if;
  69.           elsif (AB(0) = '0' and AB_poprzednie(0) = '1') then -- A zbocze opadające
  70.               if (B='1') then -- obrót w prawo
  71.                  obrot_w_prawo <= '1';
  72.                  obrot_w_lewo <= '0';
  73.                       stopien_obrotu <= stopien_obrotu + 1;
  74.               elsif (B='0') then -- obrót w lewo
  75.                  obrot_w_prawo <= '0';
  76.                  obrot_w_lewo <= '1';
  77.                       stopien_obrotu <= stopien_obrotu - 1;
  78.               end if;
  79.           elsif (AB(1) = '0' and AB_poprzednie(1) = '1') then -- B zbocze opadające
  80.               if (A='0') then -- obrót w prawo
  81.                  obrot_w_prawo <= '1';
  82.                  obrot_w_lewo <= '0';
  83.                       stopien_obrotu <= stopien_obrotu + 1;
  84.               elsif (A='1') then -- obrót w lewo
  85.                  obrot_w_prawo <= '0';
  86.                  obrot_w_lewo <= '1';
  87.                       stopien_obrotu <= stopien_obrotu - 1;
  88.               end if;
  89.           else
  90.               obrot_w_prawo <= '0';
  91.               obrot_w_lewo <= '0';
  92.           end if;          
  93.            
  94.         end if;
  95.  
  96.     end process;
  97.  
  98. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement