Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[CPLD][Xilinx ISE] licznik enkodera

30 Gru 2009 10:46 3439 13
  • Poziom 18  
    Witam
    Jestem początkującym w temacie ukł. programowalnych.

    Projektuję sobie układ enkodera kwadraturowego na XC9572XL

    napotkałem pewien problem;

    do wykrycia kierunku ruchu enkodera stosuję takie procesy(wykrywanie ruchu na każdym zboczu)

    Code:


       P1: process(a,b)
          begin
             if rising_edge(a) then
                if b='1' then d1<='0';
                else   d1<='1';
                end if;   
             end if;
       end process;

       P2: process(a,b)
          begin
             if falling_edge(a) then
                if b='1' then d2<='1';
                else   d2<='0';
                end if;   
             end if;
       end process;

       P3: process(a,b)
          begin
             if rising_edge(b) then
                if a='1' then d3<='1';
                else   d3<='0';
                end if;   
             end if;
       end process;
       
       P4: process(a,b)
          begin
             if falling_edge(b) then
                if a='1' then d4<='0';
                else   d4<='1';
                end if;   
             end if;
       end process;   
       
       
       dir<=d1 or d2 or d3 or d4;   



    to ise przełyka bez problemu i na ww. kostce zajmuje to ~2% Pterms.
    jeśli dołożę do tego licznik (25bit) inkrementujący i dekrementujący tylko na 1 zboczu sygnału a



    Code:

       P5: process(a)
       begin
       if rising_edge(a) then
          if dir='1' then
          l<=l+'1';
          else l<=l-'1';
          end if;
       end if;
       end process;

       licznik<=l;


    to Pterms wzrasta do 35%
    jednak ja chcialbym aby licznik "chodził" na każdym zboczu a i b.

    teraz pytanie czy kod który przedstawiłem jest właściwy dla tego co chcę osiągnąć?
    oraz jak napisać kod inkrementujący/dekrementujący licznik na każdym zboczu sygnału a i b , zeby w miarę sensownie miejsca zajęło...

    pozdrawiam
  • Poziom 18  
    Przerzutniki w układach XC95xxXL działają tylko na jedno zbocze sygnału, tak więc musiałbyś zastosować układ który podwoi częstotliwość na wejściu licznika, żeby działał na oba zbocza. W sieci lub w książkach można znaleźć takie układy zrealizowane na kilku przerzutnikach. Innym rozwiązaniem może być zastosowanie nowszego układu z rodziny Coolrunner, który posiada przerzutniki działające na oba zbocza sygnału.

    pozdrawiam
  • Poziom 18  
    jak mogę podwoić częstotliwość ? przecież chodzi mi o zbocza sygnału z enkodera a nie precyzyjnego sygnału zegarowego...
  • Poziom 18  
    Zobacz sobie taki układzik: http://users.otenet.gr/~athsam/frequency_doubler_with_4011.htm
    Nie generuje sygnału o współczynniku wypełnienia 50% ale dla licznika to nie ma znaczenia ponieważ reaguje tylko na jedno zbocze. Częstotliwość podana na wejście nie musi być stała, ale nie można przekroczyć jej górnej wartości określonej przez elementy RC.
  • Poziom 18  
    nie rozumiesz kolego idei enkodera kwadraturowego...
    nie mogę podwoić sobie czestotliwości....
    muszę mieć zliczanie na zboczu opadającym i narastającym
    napisałem 4 identyczne procesy licznikowe takie jak do wykrywania kierunku ruchu....
    tylko mam problem jak połączyć je ze sobą aby inkrementowały/dekrementowały licznik...
  • Poziom 18  
    Nie zagłębiałem się w zasadę działania enkodera kwadraturowego tylko podałem jak można zrealizować licznik reagujący na oba zbocza. W układach XC95xx jest to niesyntezowalne, liczniki mogą reagować tylko na jedno zbocze. Jeżeli w Twoim układzie licznik ma zliczać impulsy z kilku sygnałów i reagować na oba zbocza to musisz te sygnały razem połączyć i wygenerować sygnał o podwojonej częstotliwości albo zmienić układ na Coolrunner'a, w nim licznik może liczyć oba zbocza sygnału wejściowego. Jeśli dla układu XC95xx napiszesz program licznika, który ma reagować na oba zbocza to syntezer wywali błąd, a w np. XC2C64 nie.
  • Poziom 38  
    A po co Ci oba zbocza?
    Wykrywasz jedno- sprawdzasz- (właściwie to wiesz) od którego czujnika- liczysz czas do wykrycia takiego samego zbocza od drugiego czujnika.
    Jak w myszy komputerowej- jeden nadajnik i dwa odbiorniki.
    Między nimi tarcza ze szczelinami.
  • Poziom 18  
    dobra , układ wykrywa zbocze od enkodera , enkoder staje w miejscu...
    i do czego w tym wypadku przyda mi się liczenie czasu do drugiego zbocza?

    Dodano po 3 [minuty]:

    Tantalos napisał:
    Jeśli dla układu XC95xx napiszesz program licznika, który ma reagować na oba zbocza to syntezer wywali błąd,

    to dlaczego przy kodzie który napisałem na początku tematu żadnego błedu mi nie wywala?

    przecież dokładnie jest opisane w 4 procesach badanie każdego ze zbocz sygnału a i b
  • Poziom 18  
    jakoś patrząc na ten kod nie bardzo rozumiem jak miałbym to zrobić w VHDL....
  • Poziom 38  
    To jest Verilog- którego zupełnie nie znam.
    VHDL- też słabo.
    Ale:
    masz pewnie Webpack ISE.
    Robisz w nim schemat.
    Generujesz ze schematu plik w w VHDL.
    Odwrotnie też można- z VHDL do schematu.
    Tylko nie każ mi przypominać sobie jak to się robi.
    Na pewno da się- bo robiłem.
    Ale ponad rok temu.
  • Pomocny post
    Poziom 18  
    W VHDL tak można napisać:
    Code:

    signal FF1 : std_logic;
    signal FF2 : std_logic;
    signal FF3 : std_logic;
    signal FF4 : std_logic;
    signal FF5 : std_logic;
    signal FF6 : std_logic;

    process(clk, quada, quadb)
    begin
        if rising_edge(clk) then
            FF1 <= quada;
            FF2 <= FF1;
            FF3 <= FF2;
            FF4 <= quadb;
            FF5 <= FF4;
            FF6 <= FF5;
        end if;
        count_direction <= FF2 xor FF6;
        count_enable <= FF2 xor FF3 xor FF5 xor FF6;
    end process;


    i podać sygnały count_direction i count_enable na licznik.
  • Poziom 18  
    już mniejwiecej wiem jak to zrealizować....
    podobny kod udało mi sie znaleźć na opencores...
    tutaj wszystko opiera się na tym ,że jest synchronizowane przez clk o f kilkukrotnie wyższej niż fmax enkodera....
    o takim rozwiązaniu nie myślałem ,lecz jeśli ma zająć mniej niż moje wydumki to ok.
  • Poziom 18  
    Witam ponownie

    zastosowałem się do kodu powyżej i wynikowy wyszedł około 4% Pterms
    po dodaniu modułu licznika 26 bit
    Code:
    P2: process(clk)
    
          begin
             if rising_edge(clk) then
                if count_en='1' then
                   if count_dir='1' then
                   tmp<=tmp+'1';
                   else
                   tmp<=tmp-'1';
                   end if;
                end if;
             end if;
          
          error<=tmp;
             
       end process;


    zużycie Pterms wzrasta to 59%...

    czy faktycznie licznik dwu kierunkowy tyle zajmuje czy to ja coś źle implementuje...

    pozdrawiam