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

[vhdl] problem z licznikiem na RS

kopytko1234 06 Maj 2009 20:56 1374 4
  • #1 06 Maj 2009 20:56
    kopytko1234
    Poziom 9  

    Witam,
    Mam problem ze zrobieniem synchronicznego licznika modulo 11 na przerzutniku SR. Tabelę dla tego licznika mam zrobiona w zeszycie dlatego będę mógł ją wkleić jutro jak brat przyjedzie z cyfrówką. Otóż, problem polega na tym że mam kod napisany cały w vhdl, wszystkie funkcje opisane i podłaczone zgodnie z zasadami. Problem pojawia sie już po kompilacji. Podłączam do komputera płytkę Cyclone II EP2C35F672C6, jest to płytka na uczelni, także nie mam mozliwości podłączenia jej kiedy chcę. A więc, podłączam płytkę, kompiluję, programuję i cały czas wyświetla się zero. Clocka podłączyłem pod jeden z przycisków na płytce, przy wciskaniu jego nic sie nie zmienia, cały czas zero.
    Przy robieniu funkcji korzystałem z tabeli prawdy przerzutnika RS:
    Q Qt S R
    0 0 0 X
    0 1 1 0
    1 0 0 1
    1 1 X 0

    Wklejam również kod, może jest w nim błąd który przeoczyłem, mi się wydaje układ dobry, ale jednak jest coś nie tak, bardzo prosze o pomoc:

    Code:
    library IEEE;
    
    use IEEE.STD_LOGIC_1164.all;

    ENTITY    licznik11 is
    PORT (x3, x2, x1, x0: in std_logic;
         KEY: in std_logic_vector (0 downto 0); --clock
         HEX0: out std_logic_vector (0 to 6); --wyświetla jedności
         HEX1: out std_logic_vector (0 to 6)); --wyświetla dziesiątki
    end licznik11;

    architecture arch of licznik11 is

    component srff
    port(s, r, clk, clrn, prn :  in  std_logic;
         q:  out std_logic);
    end component;

    component dzies7seg --komponent który wyświetla cyfry od 0 do 9 na wyświetlaczu 7 segmentowym
    port(   f:  in std_logic_vector (3 downto 0);
          W:   out std_logic_vector(0 to 6));
    end component;

    component dec7seg --komponent który wyświetla cyfry od 0 do 1 (dziesiątki) na wyświetlaczu 7 segmentowym
    port(   e:  in std_logic_vector(3 downto 0);
           M:   out std_logic_vector(0 to 6));
    end component;

    signal a1, a2, a3, a4, a5, a6: std_logic;
    signal q1: std_logic_vector(3 downto 0);

    begin
    -- funkcje do podłączenia na S i R wejść przerzutników
    a1<=((NOT x3) and x2 and x1 and x0);
    a2<=(x3 and (NOT x2) and x1 and (NOT x0));
    a3<=((NOT x3) and (NOT x2) and x1 and x0);
    a4<=(((NOT x3) and (NOT x2) and (NOT x1) and x0) or ((NOT x3) and x2 and (NOT x1) and x0) or (x3 and (NOT x2) and (NOT x1) and x0));
    a5<=(((NOT x3) and x1 and x0) or (x3 and (NOT x2) and x1 and (NOT x0)));
    a6<=(((NOT x3) and (NOT x2) and (NOT x0)) or ((NOT x3) and x2 and (NOT x0)) or (x3 and (NOT x2) and (NOT x1) and (NOT x0)));
    --przerzutniki
    prz0:srff port map (a6, x0, KEY(0), '1', '1', q1(0));
    prz1:srff port map (a4, a5, KEY(0), '1', '1', q1(1));
    prz2:srff port map (a3, a1, KEY(0), '1', '1', q1(2));
    prz3:srff port map (a1, a2, KEY(0), '1', '1', q1(3));

    Wysw1:dzies7seg port map(q1,HEX1); --wyświetlanie dziesiątek na 7segmentowym
    Wysw0:dec7seg port map(q1,HEX0); --wyświetlanie jedności na 7segmentowym
    end arch;


    I czemu to nie śmiga? :P Coś źle podłączone? Może chodzi o to że najstarsze bity z przerzutników powinny być podłaczone jako najmłodsze na wejściu wyświetlaczy, dobrze kombinuje czy w ogóle nie w ta stronę?

    0 4
  • #2 08 Maj 2009 15:37
    _greis_
    Poziom 14  

    jeśli chcesz mieć układ kombinacyjny (bez udziału zegara takrująceg) to wejści clk w komponencie srff będzie reagować na każde zbocze pojawiające się na sygnale KEY. jesli podłączysz tam przycisk to będzie on powodować trochę drgań które nie da się wyeliminować. wyjściem jest wejściowy rejestr przesuwny (tzw. debouncer).

    ps. czemu zadeklarowałęś
    KEY: in std_logic_vector (0 downto 0); --clock
    a nie po prostu
    KEY: in std_logic; --clock ??

    0
  • #3 08 Maj 2009 18:04
    kopytko1234
    Poziom 9  

    Ponieważ tylko w ten sposób się kompilowało bez błędów, inaczej nie chciał łapać, myślę, że to kwestia tej konkretnej płytki do tego podłączonej.
    A co do clocka, to chodziło o to aby był to przycisk, i żeby zmiana nastepowała przy każdym przyciśnięciu przycisku, tymczasem wciskam przycisk a cały czas stoi na zerze :(
    Coś źle w kodzie czy po prostu źle podłączone coś jest i jeśli tak to co? Bo ja przyznam szczerze nie mam pomysłu co może być źle. :/
    Proszę o pomoc.

    0
  • #4 08 Maj 2009 19:30
    _greis_
    Poziom 14  

    zamiast używać przycisku jako clocka, proponuję abyś przerzutnik taktował zegarem zewnętrzym a jedynie na wejście zezwolenia zegara (zazwyczaj jest to clock enable CE) podawał sygnał z przycisku.
    wtedy działanie przerzutnika bedzie bramkowane przez przycisk. oczywiście aby układ działał poprawnie należałoby z jednego przyciśniecia przycisku wygenerować jeden impuls na CE.

    0
  • #5 08 Maj 2009 21:06
    kopytko1234
    Poziom 9  

    Tylko że nie tyle o clocka tu chodzi, bo clock w ten sposób działa, bo inny projekt robiłem w ten sposób i działało, problem w tym że po kompilacji tego kodu przy wciskaniu przycisku odpowiedzialnego za clocka nic sie nie dzieje. Stan jest cały czas na zero.
    Chodzi mi o to czy jest tam w kodzie wszystko dobrze podłączone, czy są tam jakieś błedy.
    Poniżej zamieszczam tabelę prawdy z jakiej korzystałem, funkcje jakie wypisałem i schemat w jaki sposób chciałem to podłączyć, i możecie sprawdzić czy samo założenie jest dobrze. Według mnie powinno być dobrze, być może źle podłaczyłem pod sam komponent wyświetlacza 7-segmentowego. Może starsze bity powinny być podłączone w miejsce młodszych bitów, ale teraz to już nie wiem, bo musiałbym to sprawdzić, tak z głowy to trudno mi to stwierdzić.

    [vhdl] problem z licznikiem na RS

    0