Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

VHDL - kierunek, położenie oraz prędkość

ttas 17 Nov 2008 10:11 2328 6
  • #1
    ttas
    Level 1  
    Witam serdecznie !
    Pisze program który na podstawie sygnałów z enkodera ma wyznaczyć kierunek obrotu , położenie oraz prędkość.
    Tak więc kierunek i położenie zrobiłem na podstawie licznika rewersyjnego (i to działa) .
    Ale mam problem z pomiarem prędkości.
    Układ ma zliczać impulsy z enkodera w czasie zadanym przez generator(gdy G ='1')
    napisałem coś takiego:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    -- Uncomment the following lines to use the declarations that are
    -- provided for instantiating Xilinx primitive components.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity predkosc is
    Port ( G : in bit;
    E : in bit;
    Q : out std_logic_vector(5 downto 0));
    end predkosc;

    architecture Behavioral of predkosc is
    signal zand : std_logic;
    signal zlicznik : std_logic_vector (5 downto 0);


    begin
    if G<='1' and rising_edge(E) then zand <= E ;
    else null;
    end if;

    process (zand)
    variable licznik : std_logic_vector (5 downto 0);
    begin
    if rising_edge(zand) then licznik := licznik+1;
    else null;
    end if;
    if G'event and G = '0' then licznik := "000000" ;
    else null;
    end if;
    zlicznik <= licznik ;
    end process;
    process (G,zlicznik)
    begin
    if rising_edge (G) then Q <= zlicznik ; --gdy narastajace to przypisz wart. licznik do Q
    else null;
    end if;
    end process;

    end Behavioral;

    Po kompilacji wyrzuca to:
    Compiling vhdl file C:/Xilinx/bin/tomek/predkosc.vhd in Library work.
    ERROR:HDLParsers:164 - C:/Xilinx/bin/tomek/predkosc.vhd Line 23. parse error, unexpected IF

    więc próbowałem

    :if G<='1' and rising_edge(E) then zand <= E ;
    else null;
    end if;

    zrealizować w procesie ale z mizernym skutkiem

    Jeżeli ktoś ma jakiś pomysł to proszę o podpowiedź
  • #2
    obinobi
    Level 15  
    Witam
    Moim zdaniem powinieneś spróbować wrzucić poniższe linijki w proces z parametrem E w liście czułości.

    begin
    if G<='1' and rising_edge(E) then zand <= E ;
    else null;
    end if;

    Poza tym konstrukcje if G<='1'jest niepoprawna ponieważ jest to przypisanie, a nie sprawdzenie czy G równa się 1.
  • #3
    enkoder
    Level 10  
    Witam!
    Poniżej podaje link do schematu , może to coś pomoże w rozwiązaniu tematu.

    https://obrazki.elektroda.pl/4_1227134496.jpg
    Z góry dziękuję za każdą sugestie.

    Dodano po 6 [minuty]:

    Ps. Dzięki "obinobi" za rade ale niestety kompilacja sie nieudała.
    Próbowałem to jeszcze jakoś pozmieniać ale nie potrafię zrealizować tej bramki AND na wejściu i potem przypisać do sygnału "zand".
    Aha , zmieniłem login ponieważ zapomniałem hasła a nowe nie chciało działać .
  • #4
    Dr.Vee
    VIP Meritorious for electroda.pl
    Po co kombinować?
    zand <= E and G;
    Oczywiście kod umieścić poza procesem.

    Jak rozumiem licznik ma zliczać impulsy E bramkowane sygnałem G - ale za każdym bramkowaniem od zera. Proponuję zrobić to tak:
    architecture behavioral of predkosc is
    
    -- przydałby się globalny sygnał reset...
    
    signal poprzednie_g : bit;
    signal g_narastajacy : bit;
    signal g_opadajacy : bit;
    signal licznik : bit_vector(5 downto 0);
    
    begin
    
    process (E)
    begin
        if rising_edge(E) then
          poprzednie_g <= G;
        end if
    end;
    
    g_narastajacy <= not poprzednie_g and G;
    g_opadajacy <= poprzednie_g and not G;
    
    process (E)
    begin
        if rising_edge(E) then
            if g_narastajacy = '1' then
                licznik <= "000001";
            else
                licznik <= licznik + 1;
            end if;
    
            if g_opadajacy = '1' then
                Q <= licznik;
            end if;
        end if;
    end process;
    
    end;

    Pozdrawiam,
    Dr.Vee
  • #5
    J.A
    Level 28  
    Dr.Vee wrote:

    mala uwaga do podanego kodu:

     /.../
       g_narastajacy <= not poprzednie_g and G; 
       g_opadajacy   <= poprzednie_g and not G;
     /.../


    takie rozwiazanie bedzie od czasu do czasu pracowac
    blednie, jesli sygnal bramki 'G' jest
    asynchroniczny wzgledem sygnalu 'E' uzytego
    tutaj jako zegar;

    zeby to naprawic, oba g_narastajacy/opadajacy
    powinny byc rejestrami [czyli w procesie czulym na E];

    ponizej symulacja w quartusie obu przypadkow,
    na gorze tak jak w przykladzie doktora Vee,
    ponizej po zamianie g_na/op na rejestry;
    [pop_g to poprzedne_g]

    VHDL - kierunek, położenie oraz prędkość

    i jeszcze uwaga - mozesz dwukrotnie zwiekszyc rozdzielczosc
    pomiaru jesli bedziesz mial 2 liczniki - jeden liczacy narastajace E,
    drugi opadajace E, i sumator dodajacy obie wartosci;

    J.A
  • #6
    enkoder
    Level 10  
    witam

    Dzięki dr.vee za pomoc.
    Teraz staram się zrozumieć o co chodzi(wiem jak działa kod) ale przyznam szczerze ,że nie za bardzo rozumiem jak miałby wyglądać schemat takiego programu.

    Na wszelki wypadek opisze dokładniej co chciałbym osiągnąć:
    Licznik ma zliczać impulsy z enkodera E w zadanym czasie przez generator G
    tzn. gdy na G='1' to licznik zlicza jeśli '0' to reset i wyrzucenie wartości na wyjście.

    Jeśli ktoś jeszcze ma jakiś pomysł to zapraszam do dyskusji.

    Ps.Ja w tym czasie postaram się sam przekonać kompilator do zatwierdzenia kodu.
    pozdrawiam

    Dodano po 1 [godziny] 17 [minuty]:

    Witam!
    Kolejna dobra rada!
    Wielkie dzięki !!!
    Być może dzięki temu forum już niedługo skończę projekt :)))
    Ps. Podobno dobre uczynki wracają do człowieka.
    Nieraz pomagałem innym ,teraz ktoś pomógł mnie ,wiec chyba to prawda :)
    i o to chodzi.
    Pozdrawiam :D
  • #7
    Dr.Vee
    VIP Meritorious for electroda.pl
    J.A oczwiście, synchronizacja wejść asynchronicznych jest konieczna w takim układzie. W swoim opisie milcząco przyjąłem, że sygnały "z zewnątrz" zostały już zsynchronizowane z zegarem.

    Pozdrawiam,
    Dr.Vee