logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zrealizować konwerter z 4 liczników mod 10 na 4 wyświetlacze 7-segmentowe?

pandaci 26 Lut 2008 10:41 5480 22
REKLAMA
  • #1 4847092
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Hejka

    Mam do napisania konwerter z 4 liczników mod 10 na 4 wyświetlacze 7 segmentowe (wyświetlane cyfry dynamicznie) Bo liczników dołączony CLK1 oraz do wyświetlaczów 7-seg CLK 2.

    Jak do tego sie zabrać, prosiłbym o jakąś wskazówkę, pomoc.
  • REKLAMA
  • Pomocny post
    #2 4847315
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    Jak do tego sie zabrać

    trzeba chyba zaczac do czytania podrecznikow ?

    znajdz jakikolwiek program napisany w ahdl, zeby zobaczyc
    jak sie go zaczyna, jak sie deklaruje we/wy, stale i zmnienne,
    w ktorym miejscu zaczyna sie opis algorytmu;

    potem napisz licznik mod10, to calkiem proste:
    jesli 'zegar' to:
    jesli licznik=9 to licznik = 0
    jesli nie to licznik = licznik + 1

    QUARTUS HELP jesli nie wiesz, jak poprawnie napisac taki 'IF';
    potem powiel ten licznik 4 razy;
    =========
    wlasnie sprawdzilem HELP, nie ma w ahdl linijki "jesli 'zegar'"
    jesli otworzysz help, znajdz "creating counters';
    =========
    potem musisz zrobic 4 razy CASE lub IF taki mniej wiecej:

    case
    stan licznika X1 - stan WY polaczonych z wysw. Y1
    stan licznika X2 - stan WY polaczonych z wysw. Y2

    tak by dla stanu licznika np. '4' na wyswietlaczu zapalaly
    sie diody przedstawiajaca 4;

    i tyle, powodzenia;

    J.A
  • REKLAMA
  • #3 4857667
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Zrobiłem licznik korzystając z Helpa

    Wygląda tak:
    SUBDESIGN ahdlcnt
    (
    clk, load, ena, clr, d[4..0] : INPUT;
    q[4..0] : OUTPUT;
    )
    VARIABLE
    count[4..0] : DFF;
    BEGIN
    count[].clk = clk;
    count[].clrn = !clr;

    IF load THEN
    count[].d = d[];
    ELSIF ena THEN
    count[].d = count[].q + 1;
    ELSE
    count[].d = count[].q;
    END IF;

    q[] = count[];
    END;


    Mam pytanie jak wygenerować przebiegi tak aby to wyglądało jak licznik??
  • Pomocny post
    #4 4858235
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    jak wygenerować przebiegi tak aby to wyglądało jak licznik?

    licznik jest ok, jedyna uwaga to taka, ze asynchroniczne
    zerowanie DFF jest aktywne LOW, wiec zapis:
    count[].clrn = !clr;
    oznacza, ze zerujesz przerzutniki stanem wysokim,
    tak na wszelki wypadek, jakbys sie nie doczytal tego szczegolu
    w dokumentacji;
    nie umiem ci odpowiedziec na pytanie o przebiegi, bo go
    nie rozumiem, co to znaczy: "wygenerowac przebiegi" ?
    chodzi ci o symulacje ?

    J.A
  • REKLAMA
  • #5 4858247
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    O własnie źle się wyraziłem. Chodzi mi aby to zasymulować.

    A jak wrzucić tutaj kolejne 3 liczniki i jak wyjście z licznika wrzucić na wyświetlacz 7 segmentowy?
  • Pomocny post
    #6 4858355
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    Chodzi mi aby to zasymulować.

    ModelSim albo manual/help quartusa ...

    OK, masz tu skrocona instrukcja symulatora quartusa:
    klikasz ikonke z biala kartka "New"
    w oknie ktore sie pojawi zakladka "Other Files"
    i z listy wybierasz Vector Waveform File;

    w lewym polu pod "Name" dwuklik mysza i w oknie
    ktore wyskoczylo guzik: "Node Finder"
    w kolejnym oknie masz pole "Named", gdzie zostaw
    gwiazdke, w polu "Filter" pewnie na poczatku powinienes
    miec "Pins: all";
    jesli klikniesz "List" w lewym polu bedziesz mial liste
    wszystkich pinow, te ktore chcesz miec w symulatorze
    trzeba przeniesc na prawo i kliknac "Ok;
    teraz musisz 'narysowac' zadane poziomy/przebiegi na
    wejsciach, zaznaczasz albo nazwe wejscia po lewej,
    albo odcinek przebiegu w polu po prawej i korzystajac
    z ikonek na gorze uzyskujesz wymagane przebiegi wejsciowe;
    aby dostac np. zegar uzyj ikonki z zegarkiem :)

    Cytat:
    A jak wrzucic tutaj kolejne 3 liczniki


    tak samo;
    powtorz to, co napisales jeszcze trzy razy, tyle ze zmnien:
    count[4..0] : DFF; na
    countA[4:0] ...
    countB[4:0]
    itd;

    ale na poczatek zrob moze jeden licznik i jeden dekoder na wyswietlacz;

    Cytat:
    jak wyjscie z licznika wrzucic na wyswietlacz 7 segmentowy?

    po drodze chyba powinien byc jeszcze jakis dekoder,
    ktory stan licznika zamieni na odpowiednie 8 sygnalow
    wyswietlacza ?

    zrob w help quartusa search na: "case statement ahdl"
    i z listy znalezionych wybierz: "Case Statement (AHDL)"

    J.A
  • #7 4858394
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Okej Co do tych liczników to mam wygląda to tak:
    SUBDESIGN projekt
    (
    clk, load, ena, clr, d[4..0] : INPUT;
    q[4..0], qb[4..0], qc[4..0], qd[4..0] : OUTPUT;
    )
    VARIABLE
    licz[4..0] : DFF;
    liczb[4..0] : DFF;
    liczc[4..0] : DFF;
    liczd[4..0] : DFF;
    BEGIN
    licz[].clk = clk;
    licz[].clrn = !clr;

    liczb[].clk = clk;
    liczb[].clrn = !clr;

    liczc[].clk = clk;
    liczc[].clrn = !clr;

    liczd[].clk = clk;
    liczd[].clrn = !clr;

    IF load THEN
    licz[].d = d[];
    liczb[].d = d[];
    liczc[].d = d[];
    liczd[].d = d[];
    ELSIF ena THEN
    licz[].d = licz[].q + 1;
    liczb[].d = liczb[].q + 1;
    liczc[].d = liczc[].q + 1;
    liczd[].d = liczd[].q + 1;
    ELSE
    licz[].d = licz[].q;
    liczb[].d = liczb[].q;
    liczc[].d = liczc[].q;
    liczd[].d = liczd[].q;
    END IF;
    q[] = licz[];
    qb[] = liczb[];
    qc[] = liczc[];
    qd[] = liczd[];
    END;


    Teraz co z tymi CASA-ami ??
    Czy to ma wygladac tak??
    I gdzie je umiescic za wszystkimi licznikami czy jak??
    CASE q[] IS
    WHEN 0 => out[] = B"1111110";
    WHEN 1 => out[] = B"0110000";
    WHEN 2 => out[] = B"1101101";
    WHEN 3 => out[] = B"1111001";

    ......
    END CASE;
  • Pomocny post
    #8 4858478
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:

    wyglada niezle :)
    zarowno liczniki, jak i case;
    case obojetnie czy za, czy przed licznikami,
    w fpga kolejnosc nie ma znaczenia, wszystkie
    'instrukcje' wykonuja sie rownolegle;
    ale ze wzgledu na logike i przejrzystosc ja
    umiescilbym case za licznikami;

    jesli masz liczb, liczc itd, to - ze wzgledu
    na logike znow - licz zamienilbym na licza,
    a dla wiekszej przejrzystosci napisalbym jakos tak:
    licz_A, licz_B itd;
    milego symulowania :)

    J.A
  • #9 4858496
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Dzięki wielkie będę symulować jak co to napisze czy poszło i ewentualne problemy.
  • #10 4858645
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    będę symulować

    zapomnielismy o jednym, ze to maja byc liczniki mod10;

    musisz zmodyfikowac odrobine ten fragment:
    
    ELSIF ena THEN
      licz[].d = licz[].q + 1;
        ....
    

    na cos takiego:
    
    ELSIF ena THEN
      IF   licz[].d == 9 THEN ....
      ELSE                    ....  END IF
        ....
    


    jeszcze uwaga do 'case'
    zamiast: CASE q[] IS
    powinno chyba byc: CASE licz[].q IS ??

    J.A
  • #11 4863776
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Mam jeszcze pytanie, jak przerobić liczniki, żeby działały na zasadzie zliczania od 0 do 9999. Jak powiązać wyświetlacz 7 segmentowy, tak aby w danym momencie wyświetlać naprzemiennie jeden po drugim.
  • #12 4863842
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    jak przerobić liczniki, żeby działały na zasadzie zliczania od 0 do 9999

    chyba trzeba zwiekszyc odpowiednio liczbe bitow
    w deklaracji: "licz[X..0] : DFF;
    i dodac zapis:
    
    ELSIF ena THEN
      IF   licz[].d == 9999 THEN ....
      ELSE                       ....  END IF


    pandaci napisał:
    Jak powiązać wyświetlacz 7 segmentowy, tak aby w danym
    momencie wyświetlać naprzemiennie jeden po drugim.

    znow nie bardzo wiem, o co pytasz :(
    chcesz miec jeden wyswietlacz, ktory co np. sekunde wyswietla
    wartosc kolejnej pozycji licznika ?
    czyli, dla przykladu, licznik ma wartosc 4321, wyswietlacz
    pokazuje przez sekunde '1', potem '2', dalej '3' itd ?


    J.A
  • #13 4863890
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Nie nie.... Chcę mieć 4 wyświetlacze 7 segmentowe.
  • #14 4863930
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    Chcę mieć 4 wyświetlacze 7 segmentowe

    musisz mi to wytlumaczyc tak, bym zrozumial;
    co ma oznaczac wymaganie;
    Cytat:
    aby w danym momencie wyświetlać naprzemiennie jeden po drugim

    moja rada jest taka [o ile cie dobrze rozumiem]
    zbuduj uklad licznik - 'case', ktory zamienia wartosci
    licznika na odpowiednie sterowanie wyswietlacza, a potem w prosty
    sposob powielimy go 4 razy;

    a poza tym - znajdz moze w helpie quartusa "lpm_counter",
    to by ci oszczedzilo wiele pisania;
    choc moze byloby lepiej zainteresowac sie tym w nastepnym kroku;
    a tak z ciekawosci, kto wymaga od ciebie pisania w ahdl ?
    zamiast w standardowych jezykach vhdl lub verilog ?

    J.A

    Dodano po 3 [godziny] 10 [minuty]:

    masz tu przyklad, jak zrobic 4 liczniki 4 bitowe w ahdl bez nadmiernego
    rozpisywania sie;
    
    
    INCLUDE "lpm_counter";
    
    subdesign cnt_dec
    (
       clk, clr           : input;
       q_out[3..0][3..0]  : output;
    )
    
    variable  cnt[3..0] :             -- 4 obiekty
            lpm_counter with          -- typu licznik
            ( lpm_width = 4,          -- kazdy 4 bitowy
              lpm_direction = "UP",   -- liczace 'w gore'
              lpm_modulus = 9 );      -- modulo 9
    
    begin
    
    FOR i IN 3 to 0 GENERATE
       cnt[i].clock = clk;
       cnt[i].aclr  = clr;
       q_out[i][]   = cnt[i].q[];
    END GENERATE;
    
    
    end; 


    J.A
  • #15 4878855
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Chodzi mi dokładnie oto że:

    Mam mieć cztery liczniki mod 10 w przypadku gdy licznik 1 zliczy do końca resetuje się i uruchamia licznik 2 w którym zmienia się stan z 0 na 1. I tak dalej. Później zmiana z 9 na 0 na liczniku 2 zmienia stan licznika 3 no i analogicznie zmiana na 3 z 9 na 0 zmienia stan licznika 4.

    Każdy z liczników podłączony do osobnego wyświetlacza 7-segmentowego.

    Te wyświetlacze muszą pracować naprzemiennie tzn w danym momencie uruchomiony jest tylko jeden.
  • #16 4878953
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    Chodzi mi dokładnie oto/.../

    ok, teraz jasne;
    robisz uklad 'licznik-dekoder' i implementujesz go
    4 razy jak w przykladzie, ktory ci podalem wyzej;
    dodatkowo robisz 4 bitowy rejestr, ktory sluzy
    za 'count_enable';
    po reset ten rejestr ma stan b"0001", czyli pozwala
    liczyc licznikowi pierwszemu;
    stan pierwszego licznika = 9 ustawia [synchronicznie]
    'count_enable' w stan b"0010", czyli uaktywnia licznik
    nr. dwa;
    itd.;
    musisz sie chwile zastanowic, jak to zrobic poprawnie,
    bo nie wystarczy po prostu polaczyc bity '9' licznikow
    z odpowiednimi bitami rejestru;
    [bo juz w nastepnym cyklu zegara stal licznika bedzie '0'];
    innym rozwiazaniem, bardziej intuicyjnym, jest 4-stanowa
    maszyna stanow, ktora przechodzi do stanu nastepnego
    gdy stan odpowiedniego licznika jest = '9';
    dzieki czemu bedziesz mial mozliwosc nauczenia sie, jak w ahdl
    robi sie fsm :);

    do opisu licznika musisz dodac port clk_en, czyli trzymajac
    sie przykladu powyzej miedzy "for generate', a 'end generate'
    powinno byc:
    cnt[i].cnt_en = count_enable[i];
    zmienilbym jeszcze cnt[i].aclr na *.sclr,
    czyli reset asynchroniczny na synchroniczny;

    innym rozwiazaniem jest stworzenie jednego rejestru
    na 4x7 bitow z tzw. 'kroczaca jedynka' i polaczenie
    odpowiednio 7 bitowych segmentow do 4 dekoderow wyswietlaczy;

    i na koniec - jeden licznik mod9, jeden dekoder, jeden licznik
    2 bitowy i cos w rodzaju multipleksera, laczacego uklad:
    "licznik - dekoder" do odpowiedniego wyswietlacza ...

    i jeszcze z ciekawosci, czemu ahdl ?

    J.A
  • #17 4879040
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    O kurde. Przeczytałem i nic z tego nie kumam. Może tak po koleji zaczniemy od tych liczników. Jak to stworzyć i który kod.

    Czemu AHDL?
    Wymysł prowadzącego żeby umilić studentowi życie. Generalnie mam tylko ten jeden projekt do zrobienia...
  • #18 4879251
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    /.../nic z tego nie kumam/.../

    niedobrze ...
    albo ja nie mam talentu jasnego wyrazania sie, albo ty
    nie przykladasz sie do nauki :(;
    chetnie pomagam, jesli akurat umiem pomoc, co widac chyba
    po stosunku moich postow do punktow 'pomogl' [dzieki i za twoje],
    ale gotowcow nie daje, nawet za przyznane punkty;
    napisz cos sam od poczatku do konca;
    napisz czego konkretnie nie rozumiesz w moim poscie powyzej
    - nie wiesz, co to fsm, co to kroczaca jedynka ?
    inaczej musisz liczyc na pomoc kogos innego;

    J.A
  • #19 4879284
    pandaci
    Poziom 14  
    Posty: 179
    Pomógł: 1
    Nie no nie liczę na to że mi napiszesz. TO to ja wiem.

    Okej to będę się starał zrozumieć to co będziesz pisać.

    Chwilowo to nie wiem jak przerobić te liczniki.

    Skończyłem na licznikach
    
    BEGIN
    	licza[].clk = clk;
    	licza[].clrn = !clr;
    
    	liczb[].clk = clk;
    	liczb[].clrn = !clr;
    
    	liczc[].clk = clk;
    	liczc[].clrn = !clr;
    
    	liczd[].clk = clk;
    	liczd[].clrn = !clr;
    
    	IF load THEN
    		licza[].d = d[];
    		liczb[].d = d[];
    		liczc[].d = d[];
    		liczd[].d = d[];
    
    	ELSIF ena THEN
    
    		licza[].d = licza[].q + 1;
    		liczb[].d = liczb[].q + 1;
    		liczc[].d = liczc[].q + 1;
    		liczd[].d = liczd[].q + 1;
    	ELSE
    		licza[].d = licza[].q;
    		liczb[].d = liczb[].q;
    		liczc[].d = liczc[].q;
    		liczd[].d = liczd[].q;
    
    	END IF;
    	qa[] = licza[];
    	qb[] = liczb[];
    	qc[] = liczc[];
    	qd[] = liczd[];
    


    Pisałeś że muszę zmodyfikować tak aby przy 9 załączał się nastęny czyli chodzi oto: ??
    
    ELSIF ena THEN
    
    licza[].d = licza[].q + 1;
    IF licza[].d == 9 THEN
    liczb[].d = liczb[].q + 1;
    END IF
    
    IF liczb[].d == 9 THEN
    liczc[].d = liczc[].q + 1;
    END IF
    
    IF liczc[].d == 9 THEN
    liczd[].d = liczd[].q + 1;
    END IF
    
  • #20 4879456
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    pandaci napisał:
    /.../

    1. potrzebujesz ladowac te liczniki ?
    jesli nie, to wywal:
    IF load THEN
    liczba[].d = d[];


    2.twoje liczniki jak na razie nie sa modulo 9;
    [a przy okazji, wyswietlacz led ma 7 segmentow, ew.
    8 jesli jest jeszcze kropka, na pewno powinienes miec
    liczniki mod9 a nie mod7 ?]
    jak zrobic licznik mod_X masz w mojej odpowiedzi mniej
    wiecej w polowie tego watku;

    3.
    Cytat:
    tak aby przy 9 załączał się nastęny czyli chodzi oto:
    
      IF licza[].d == 9 THEN 
      liczb[].d = liczb[].q + 1; 
    END IF 

    nie, po jednym cyklu zegara licza nie bedzie juz mial wartosci 9,
    wiec liczb przestanie liczyc;

    a poza tym: if licza[].q == 9 then
    zamiast if licza[].d == 9 then

    musisz zrobic osobny licznik, powiedzmy selektor,
    ktory bedzie wybieral ktory licznik jest aktywny;
    
    variable  selektor[1..0]  : dff;
     ....
    
    selektor[].clk = clk;
    
      jesli <ktorykolwiek z licza/b/c/d == 9> to
         selektor[].clk_en = 1;
      inaczej
         selektor[].clk_en = 0; 


    teraz w twoich licznikach musisz linijke:
    ELSIF ena THEN
    zamienic na taka:
    ELSIF selector[].q == 0 THEN -- dla licza
    ELSIF selector[].q == 1 THEN -- dla liczb
    itd.

    no i zobacz raz jeszcze na przyklad z uzyciem lpm_counter,
    ile to moze zaoszczedzic pisania;

    J.A

    Dodano po 12 [minuty]:

    ew. jesli nie chcesz lpm_counter zamiast deklarowac
    licza, liczb itd,
    zadeklaruj: licznik[3..0][4..0] : dff; -- czyli 4 obiekty 5 bitowe typu dff

    wtedy polaczenie do zegara zrobisz jednym przypisaniem:
    licznik[][].clk = clk;
    zamiast pisania czterech linijek;
  • #21 4882327
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    ===================

    troche nie chce mi sie zabrac za robote, to masz tu 'ascii art' rozwiazania,
    ktore mi sie wydaje najbardziej 'dowcipne' i wymagajace najmniej
    extra logiki sterujacej, w poprzednim poscie pisalem o nim jako
    o 'kroczacej jedynce';
    
                 ---------------      -------      -------    -------
                 |   LCD DISP  |      |     |      |     |    |     |
                 ---------------      -------      -------    -------
                        ^                ^            ^          ^
                        |                |            |          | 
                _________________       ____        ____        ____
               /                 \     /    \      /    \      /    \ 
              /      DEKODER      \   /      \    /      \    /      \
              ---------------------   --------    --------    --------
               ^    ^    ^       ^    ^      ^    ^      ^    ^       ^ 
               |    |    |       |    |      |    |      |    |       |
              ---  ---  ---     ---  ---    ---  ---    ---  ---     ---
         |--> |F|->|F|->|F|->   |F|->|F|->  |F|->|F|->  |F|->|F|->   |F|---|
         |    ---  ---  ---  .. ---  ---  ..---  ---  ..---  ---  .. ---   |
         |     0    1    3       9    10     19   20     29   30      39   |
         |-----------------------------------------------------------------|
    



    |F| to FlipFlop, czyli przerzutnik,
    masz ich 4[liczba wyswietlaczy] x 10[liczba cyfr do wyswietlenia],
    polaczone sa tak, ze wejscie FF 'n' jest polaczone do wyjscia FF 'n-1';
    te przypisania FF_n.d do FF_(n-1).q mozna zrobic uzywajac inteligentnie
    petli FOR GENERATE bez koniecznosci pisania 40 linijek;
    kazde 10 wyjsc FF wchodzi na kolejny dekoder, ktory steruje
    wyswietlaczem LED, dekoder to oczywiscie znany ci juz CASE;

    reset musi ustawiac ten 40 bitowy rejestr w stan H"1", jesli tego
    nie zrobisz, poczatkowy stan bedzie "000...000", wiec nie bedzie jedynki,
    ktora przemieszcza sie od przerzutnika do przerzutnika;
    proste, prawda ?
    J.A
  • REKLAMA
  • #22 4882497
    adam.tarn
    Poziom 11  
    Posty: 23
    Pomógł: 1
    Rzeczywiscie dowcipne :), mnie sie podoba.
    Mam 2 pytania, wcześniej w tym wątku piszesz, że liczniki powinny być
    mod7 - to bląd, czy ja czegoś nie rozumiem ?
    I czy 40 przerzutników zamiast 16 to nie za wysoka cena ?
    pozdrawiam.
    adam
  • #23 4882580
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    adam.tarn napisał:
    wcześniej w tym wątku piszesz, że liczniki powinny być mod7 - to bląd?

    blad oczywiscie, pomylilem liczbe ledow z liczba stanow ... :);
    Cytat:
    czy 40 przerzutników zamiast 16 to nie za wysoka cena ?

    zalezy co jest wazne;
    generalnie uwazam, ze jesli mozna zmniejszyc liczbe 'if-ow', 'case-ow'
    czyli logike kombinacyjna kosztem wiekszej ilosci FF to jest to zawsze
    dobry ruch, i to nie tylko ze wzgledu na szybkosc dzialania, ale i na
    niezawodnosc;
    a zeby porownac zuzyte zasoby, trzebaby skompilowac obie
    wersje i porownac liczby w raporcie kompilatora, wersja z kroczaca
    jedynka wcale nie musi pochlaniac znaczaco wiekszej ilosci
    komorek fpga, 4 bitowy licznik modX to przeciez nie tylko 4 FF;

    J.A

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy realizacji konwertera z czterech liczników modulo 10 na cztery wyświetlacze 7-segmentowe, wyświetlające cyfry dynamicznie. Wskazano, że liczniki mod10 można zaimplementować w AHDL, stosując warunki inkrementacji i zerowania po osiągnięciu wartości 9. Przedstawiono przykładowy kod liczników oraz omówiono sposób ich symulacji w środowisku Quartus i ModelSim, w tym tworzenie plików przebiegów wektorowych (Vector Waveform File). Podkreślono, że w FPGA kolejność instrukcji nie ma znaczenia, a logikę dekodera cyfr na wyświetlacze 7-segmentowe realizuje się za pomocą instrukcji CASE lub IF, które mapują stan licznika na segmenty wyświetlacza.

Omówiono również sposób łączenia liczników w kaskadę, gdzie przejście licznika z 9 na 0 powoduje włączenie kolejnego licznika, co umożliwia zliczanie od 0 do 9999. Zaproponowano implementację sterowania liczeniem za pomocą rejestru lub maszyny stanów (FSM) z sygnałem enable dla poszczególnych liczników. Wskazano, że wyświetlacze 7-segmentowe powinny pracować naprzemiennie (multiplexing), czyli w danym momencie aktywny jest tylko jeden wyświetlacz, co wymaga odpowiedniego sterowania czasowego.

Zwrócono uwagę na poprawne użycie sygnałów zerowania asynchronicznego (aktywny LOW) oraz konieczność modyfikacji liczników do pracy modulo 10. Podano sugestię użycia gotowych komponentów lpm_counter dostępnych w Quartus, co może uprościć implementację. Dyskusja zawierała także przykłady kodu AHDL oraz porady dotyczące organizacji kodu i symulacji.

Podsumowując, rozwiązanie polega na implementacji czterech liczników mod10 z sygnałami enable sterowanymi kaskadowo, dekoderze cyfr na wyświetlacze 7-segmentowe realizowanym instrukcjami CASE, oraz dynamicznym, naprzemiennym sterowaniu wyświetlaczami w celu uzyskania efektu wyświetlania czterocyfrowej liczby.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA