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

Projekt w easyAbel: Konwersja 8-bit na HEX na GAL20V8 i wyświetlacz 7-segmentowy

kat85 21 Maj 2007 20:58 3389 6
REKLAMA
  • #1 3907642
    kat85
    Poziom 11  
    Posty: 32
    Ocena: 2
    Witam.
    Na zajęcia laboratoryjne muszę zrobić projekt na układzie GAL20V8 realizujący zamianę liczby 8bitowej na jej odpowiednik szesnastkowy, którego wynik ma być przedstawiony na wyświetlaczu 7segmentowym. Z racji, że do dyspozycji jest tylko jeden wyświetlacz zadanie polega na naprzemiennym wyświetlaniu starczej i młodszej 4bitowej części liczby zadanej (dla rozróżnienia przy starszej części pali sie kropka wyświetlacza). Układ może być sekwencyjny-zmieniać pokazywaną liczbę w takt sygnału zegarowego, bądź kombinacyjny, w którym zmianę wyświetlanej "połówki liczby zadanej" realizuje się ręcznie podając 0 lub 1 na jedno z wejść. Mój problem polega na tym, że nie bardzo wiem jak to zrobić, a prowadzący laboratorium z kolei nie bardzo chce mi pomóc. Nie napisałem wielu programów w tym języku i nie znam jego możliwości. W C++ lub chociażby Bascomie program można by napisać w kilku linijkach, ale na Abela po prostu nie mam pomysłu.

    Prosiłbym o pomoc bardziej doświadczonych Kolegów. Jak ugryźć ten problem? Poniżej przedstawiam moje koncepcje.
    ===============================
    module nkb2hex
    title 'nkb2hex'
    nkb2hex device 'P20V8';
    clk,b7,b6,b5,b4,b3,b2,b1,b0 pin 1,2,3,4,5,6,7,8,9;
    h7,h6,h5,h4,h3,h2,h1,h0 pin 22,21,20,19,18,17,16,15 istype 'reg';

    bin2=[b7,b6,b5,b4];
    bin1=[b3,b2,b1,b0];
    hex=[h7,h6,h5,h4,h3,h2,h1,h0];
    i=[0];

    disp(0)=[0,0,0,0,0,0,1,0];
    disp(1)=[1,0,0,1,1,1,1,0];
    disp(2)=[0,0,1,0,0,1,0,0];
    disp(3)=[0,0,0,0,1,1,0,0];
    disp(4)=[1,0,0,1,1,0,0,0];
    disp(5)=[0,1,0,0,1,0,0,0];
    disp(6)=[0,1,0,0,0,0,0,0];
    disp(7)=[0,0,0,1,1,1,1,0];
    disp(8)=[0,0,0,0,0,0,0,0];
    disp(9)=[0,0,0,0,1,0,0,0];
    disp(10)=[0,0,0,1,0,0,0,0];
    disp(11)=[1,1,0,0,0,0,0,0];
    disp(12)=[0,1,1,0,0,0,1,0];
    disp(13)=[1,0,0,0,0,1,0,0];
    disp(14)=[0,1,1,0,0,0,0,0];
    disp(15)=[0,1,1,1,0,0,0,0];

    equations
    hex.clk=clk;
    hex:=(disp(bin2) & i==0) # ((disp(bin1) # [0,0,0,0,0,0,0,1]) & i==1);
    i:=!i.fb;

    end nkb2hex

    Program polega na tym, że w zależności od zmiennej i program wyświetla jedną z części zadanej liczby korzystając z zakodowanych liczb. No ale podobno takiej sztuczki w Abelu nie można zrobić.

    =======================================
    module bcd2hex
    title 'bcd2hex'
    bcd2hex device 'P20V8';
    mode,b7,b6,b5,b4,b3,b2,b1,b0 pin 10,2,3,4,5,6,7,8,9;
    h7,h6,h5,h4,h3,h2,h1,h0 pin 22,21,20,19,18,17,16,15 istype 'com';
    bcd2=[b3,b2,b1,b0];
    bcd1=[b7,b6,b5,b4];
    hex=[h7,h6,h5,h4,h3,h2,h1,h0];

    equations
    when (mode==0) then
    truth_table(bcd2->hex)
    0->2;
    1->158;
    2->36;
    3->12;
    4->152;
    5->72;
    6->64;
    7->30;
    8->0;
    9->8;
    10->16;
    11->192;
    12->98;
    13->132;
    14->96;
    15->112;

    when (mode==1) then
    truth_table(bcd1->hex)
    0->3;
    1->159;
    2->37;
    3->13;
    4->153;
    5->73;
    6->65;
    7->31;
    8->1;
    9->9;
    10->17;
    11->193;
    12->99;
    13->133;
    14->97;
    15->113;

    end bcd2hex

    Natomiast ten program ma działać tak, że w zależności od wartości wejścia sterującego mode program korzysta z jednej z dwu tablic prawdy.

    Niestety oba programy działają ale tylko w teorii... To jest trzeci program, który musze napisać aby zaliczyć laboratorium, 2 pozostałe juz napisałem. Bardzo prośbę o jakąkolwiek pomoc. Dołączam jeszcze zdjęcie płyty na której ma być uruchomiony program.
    Dziękuje.
    Załączniki:
    • Projekt w easyAbel: Konwersja 8-bit na HEX na GAL20V8 i wyświetlacz 7-segmentowy GAL20V8.jpg (162.56 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 3908804
    Mirko51
    Poziom 15  
    Posty: 156
    Pomógł: 20
    Ocena: 7
    na stronce znajduje jest kilka przykładów z Abla i jego specyfikacja
    http://neo.dmcs.p.lodz.pl/jhdl/index.html

    co do zadania to: dekoder 7-seg należy opisać w sposób jak poniżej. Piny mają mieć nazwy zgodnie z funkcją, np. segmenty a, b... poprawia to znacznie czytelność kodu.
    Dekoder 7-seg należy uzupełnić o mux 8-bit na 4-bit, który wybiera starszą lub młodszą część bajtu (konstrukcja WHEN else) i jest sterowany sygnalem I. Dalej 4-bity trafiają na dekoder. Sterowanie kropką - stan sygnału I.
    Gotowca raczej się nie spodziewaj, jeśli chcesz być inżynierem to swoje musisz przecierpieć, nikt inny za ciebie się tego nie nauczy. Pokombinuj z kodem, popatrz na przykłady zadań w necie, poczytaj o języku. Jeśli sam dojdziesz do rozwiązania to satysfakcja będzie znacznie większa, niż gdybyś kupił gotowca za przysłowiowego browara.

    Module bcd2led
    Title '7-segment display decoder'

    " a
    " --- BCD-to-seven-segment decoder similar to the 7449
    " f| g |b
    " --- segment identification
    " e| d |c
    " ---

    Declarations

    D3,D2,D1,D0 pin;
    a,b,c,d,e,f,g pin istype 'com';

    bcd = [D3,D2,D1,D0];
    led = [a,b,c,d,e,f,g];

    ON,OFF = 0,1; " for common anode LEDs
    L,H,X,Z = 0,1,.X.,.Z.;

    @dcset
    Truth_table (bcd -> [ a , b , c , d , e , f , g ])
    0 -> [ ON, ON, ON, ON, ON, ON, OFF];
    1 -> [OFF, ON, ON, OFF, OFF, OFF, OFF];
    2 -> [ ON, ON, OFF, ON, ON, OFF, ON];
    3 -> [ ON, ON, ON, ON, OFF, OFF, ON];
    4 -> [OFF, ON, ON, OFF, OFF, ON, ON];
    5 -> [ ON, OFF, ON, ON, OFF, ON, ON];
    6 -> [ ON, OFF, ON, ON, ON, ON, ON];
    7 -> [ ON, ON, ON, OFF, OFF, OFF, OFF];
    8 -> [ ON, ON, ON, ON, ON, ON, ON];
    9 -> [ ON, ON, ON, ON, OFF, ON, ON];

    End bcd2led;
  • REKLAMA
  • #3 3909398
    kat85
    Poziom 11  
    Posty: 32
    Ocena: 2
    @Mirko51
    Laboratoria mam w instytucie, którego stronę podałeś :P To są materiały dla studentów 8 semestru więc jeszcze mi troche brakuje. Ale pomysł z multiplexerem jest fajny. Same materiały również przejrzę.

    Koncepcje rozumiem następująco:
    Liczba wejściowa ośmiobitowa jest dzielona na dwie 4bitowe połówki w multiplekserze. Następnie sygnały z wyjścia multiplexera są realizowane przez funkcje opisaną tablicą prawdy. Rozumiem więc, że cały opis działania układu może być realizowany równocześnie przez podanie tablicy prawdy i równań (do tej pory myślałem ze jedno lub drugie).
    W każdym razie dziękuje za pomoc i zabieram sie do pisania programu.

    Gotowca nie chcę, bo i tak będę musiał napisać jeszcze kolokwium z Abela na zajęciach, więc sam musze umieć to zrobić.

    A inżynierem mam być.... podobno :P
    PZDR
  • #4 3930100
    kat85
    Poziom 11  
    Posty: 32
    Ocena: 2
    Witam.
    Oto program. Przetestowany. Działa tj należy. Może komuś sie przyda.
    PZDR

    kod:

    module nkb2led
    title 'nkb2led'
    nkb2led device 'P20V8';

    b7,b6,b5,b4, b3,b2,b1,b0, mode pin 2,3,4,5, 6,7,8,9, 10;
    h6,h5,h4,h3,h2,h1,h0, dot pin 22,21,20,19,18,17,16, 15 istype 'com';

    bin2=[b3,b2,b1,b0];
    bin1=[b7,b6,b5,b4];
    led=[h6,h5,h4,h3,h2,h1,h0];
    "Y=[y3,y2,y1,y0];

    equations
    dot=mode;

    truth_table(((bin2 & mode) # (bin1 & !mode))->led) "Rownanie odpowiadajace za multiplexowe wybieranie polowek liczby 8-bitowej
    0->1;
    1->79;
    2->18;
    3->6;
    4->76;
    5->36;
    6->32;
    7->15;
    8->0;
    9->4;
    10->8;
    11->96;
    12->49;
    13->66;
    14->48;
    15->56;

    test_vectors
    ([bin2,bin1,mode]->[led,dot])

    [0,0,0]->[1,0];
    [10,0,0]->[1,0];
    [10,0,1]->[8,1];
    [3,2,0]->[18,0];
    [3,3,1]->[6,1];

    end nkb2led
  • REKLAMA
  • #5 6032449
    marvin82
    Poziom 13  
    Posty: 151
    Ocena: 5
    Sory za odgrzebywanie tematu ale czy ktoś mógłby mi powiedzieć jak napisać w języku Abel następujące programy sterujące:

    1. Układ, który odczytuje 3-bitową liczbę w naturalnym kodzie binarnym i zależnie od zmiennej sterującej MODE prezentuje jej wartość przeciwną w kodzie U2 oraz kodzie znak-moduł.

    2. Układ służący do wyznaczania kwadratu 3-bitowej liczby w naturalnym kodzie binarnym podanej przez użytkownika i wyświetlający dwucyfrowy wynik na wyświetlaczu LED.

    3. Licznik BCD (2-cyfrowy) zliczający w przód co 1 lub co 2 (w zależności od wejścia MODE) z wejściem RESET.

    Układ ten sam co wyżej.
  • REKLAMA
  • #6 6033277
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    marvin82 napisał:
    Sory za odgrzebywanie tematu ale czy ktoś mógłby mi powiedzieć jak napisać w języku Abel następujące programy sterujące:
    Usiąść i napisać, nawet szkielet programu masz wyżej. Spróbuj dokładniej sprecyzować problem.
  • #7 6155098
    marvin82
    Poziom 13  
    Posty: 151
    Ocena: 5
    ok, dwa pierwsze zadania zrobilem... a w 3 moglby mi ktos pomoc??

    Dodano po 2 [godziny] 18 [minuty]:

    module zad3
    title "licznik 0->99'
    zad3 device 'P20V8';

    clk, mode, reset, !oe pin 1,2,3,13;
    A7,A6,A5,A4,A3,A2,A1A0 pin 22,21,20,19,18,17,16,15 istype 'reg';
    j = [A3,A2,A1,A0];
    d = [A7,A6,A5,A4];

    equations

    j.oe=oe;
    d.oe=oe;
    j.clk=clk;
    d.clk=clk;

    j:=[0,0,0,0]; //wstępne wyzerowanie wyjść
    d:=[0,0,0,0];

    j:=(j.fb+1)&(j.fb<9) # [0,0,0,0]&(j.fb==9)&!mode&!reset //Zliczanie w góre co 1 jeśli mode=0
    #(j.fb+2)&(j.fb<9) # [0,0,0,0]&(j.fb==8)&mode&!reset //Zliczanie w gore co 2 jesli mode =1
    #[0,0,0,0]&reset; //RESET

    d:=(d.fb+1)&(d.fb<9)&!reset&(j.fb==9) //Zliczanie w gore jak j=9
    #(d=d.fb)&!reset&(j.fb<9) // utrzymywanie stanu jak ‘j’ mniejsze od 9
    #[0,0,0,0]&(d.fb==9)&!reset&(j.fb==8) //Zerowanie jak dojdzie do 98
    #[0,0,0,0]&reset; //RESET

    end zad3;



    ma zliczac w gore co jeden lub co dwa w zaleznosci od wejscia 'mode', z wejsciem reset,
    bedzie dzialalo tak jak powinno??

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji projektu na układzie GAL20V8, który ma konwertować 8-bitową liczbę binarną na jej reprezentację szesnastkową wyświetlaną na pojedynczym wyświetlaczu 7-segmentowym. Ze względu na jeden wyświetlacz, rozwiązanie polega na naprzemiennym wyświetlaniu starszej i młodszej 4-bitowej części liczby, z sygnalizacją kropką przy starszej części. Proponowane podejście wykorzystuje multiplekser 8-bit na 4-bit sterowany sygnałem wyboru (mode), który wybiera odpowiednią połówkę liczby, a następnie dekoder 7-segmentowy realizowany za pomocą tablicy prawdy w języku Abel. Przykładowy, przetestowany kod modułu w Abelu został udostępniony, zawierający definicję pinów, sterowanie kropką oraz tablicę prawdy dla dekodera 7-segmentowego. W dyskusji pojawiły się także pytania o inne programy w języku Abel, takie jak układy do konwersji kodów binarnych, wyznaczania kwadratu liczby oraz licznik BCD z różnymi trybami zliczania, wraz z fragmentami kodu i sugestiami dotyczącymi implementacji. Podkreślono znaczenie samodzielnej nauki i eksperymentowania z kodem w Abelu, aby zdobyć praktyczne umiejętności inżynierskie.
Wygenerowane przez model językowy.
REKLAMA