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

Verilog - jak stworzyć 16-bitowy multiplekser z nietypowym kierunkiem danych?

bolilol_4 11 Kwi 2009 23:14 1397 9
REKLAMA
  • #1 6403977
    bolilol_4
    Poziom 10  
    Posty: 22
    Ocena: 1
    Witam

    Jako iż dopiero zaczynam zabawę z tym językiem pojawił mi się problem potrzebuję zrobić nietypowy multiplekser gdyż - ma on być 16bitowy przy czym chcę sprawić aby przy wyborze SELECT raz mi dane przechodziły z daneARM do danePAMIECI, a przy niewybranym SELECT kierunek odwrotny czyli z danePAMIECI do daneFPGA

    czyli najprościej:
    SELECT=1 to danePAMIECI -> daneFPGA
    SELECT=0 to daneARM -> danePAMIECI

    zamieszczam tutaj mój program a raczej to co wyszło z prób jego napisania:)
    Cytat:
    module mux_inout(daneFPGA, daneARM, danePAMIECI, select);
    output [0:15] daneFPGA;
    input [0:15] daneARM;
    inout [0:15] danePAMIECI;
    input select;

    reg [0:15] daneFPGA;
    reg [0:15] danePAMIECI;

    always @(select or danePAMIECI or daneARM)
    if(select)
    daneFPGA = danePAMIECI;
    else
    danePAMIECI = daneARM;

    endmodule


    jak pisałem dopiero zaczynam zabawę i myślałem, że da się to zrobić na zasadzie nietypowego muxa ale jak widać nie jest to takie proste wyskakuje mi bowiem tam ERROR:
    Illegal redeclaration of inout 'danePAMIECI' as a reg

    próbowałem zmienić deklarację
    reg [0:15] danePAMIECI; na wire [0:15] danePAMIECI;

    ale wtedy występuje mi nie dość ze ten sam problem z deklaracja to jeszcze dochodzą następne:
    -Illegal left hand side of blocking assignment
    lub jego odpowiednik gdy próbowałem zamieniać na nieblokujące:
    -Illegal left hand side of nonblocking assignment

    Nie wiem dlaczego ten wspaniały program nie rozumie moich intencji :)
    Byłbym wdzięczny za pomoc w rozwiązaniu tego problemu gdyż domyślam się iż dla kogoś wprawionego to błahostka :)
  • REKLAMA
  • #2 6404375
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    Ten mux to nie mux a bardziej coś jakby latch, w zależności od sygnału select dane są przepisywane albo do rejestru pośredniego albo z rejestru pośredniego na wyjście. Wydaje mi się że najlepiej będzie to opisać przy pomocy logiki synchronicznej, która co impuls zegara sprawdza stan sygnału sterującego i przepisuje wartość.
  • #3 6404719
    bolilol_4
    Poziom 10  
    Posty: 22
    Ocena: 1
    w sumie idea jest bardzo prosta tak jak mówisz w zależności od sygnału SELECT=0 dane maja być przesyłane albo z magistrali A do B, albo gdy SELECT=1 przesył ma być w innym kierunku z magistrali B do C.

    Wydaje mi się, iż jest to możliwe do wykonania nawet na zasadzie opisu asynchronicznego na czym właśnie mi zależy, gdyż nie mogę sobie pozwolić na wprowadzenie dodatkowego sygnału zegarowego ponieważ układ i tak już pędzi 40Mhz, a chcąc sterować ten przesył synchronicznie musiałbym wprowadzić kolejny zegar tyle ze 80MHz, a to trochę więcej i większe problemy z liniami długimi na płytce.

    Mój problem polega tylko ona tym, iż nie wiem jak zadeklarować i opisać taką kostkę - z tym że ja bym powiedział, iż ma to być nie o tyle nietypowy mux co połączenie w jednym multipleksera z demultiplekserem.

    Próbowałem jeszcze zmienić deklarację wszystkich we/wy na typu inout lecz też niepomaga - problem z tym iż przy danej typu inout nie może być użyta deklaracja typu reg - a ja nie wiem w jaki sposób rozwiązać ten problem.
  • REKLAMA
  • #4 6406629
    Szymon Tarnowski
    Poziom 27  
    Posty: 1292
    Pomógł: 61
    Ocena: 181
    bolilol_4 napisał:
    Wydaje mi się, iż jest to możliwe do wykonania nawet na zasadzie opisu asynchronicznego na czym właśnie mi zależy
    Jeśli to miałby by być asynchronicznie to wg mnie nie zadziała. Rejestr 'danePamieci' musi przechowywać informację w momencie kiedy dane mają być przekazane do rejestru 'daneFPGA'.
    Napisz dokładnie jaką funkcję ma pełnić ten rejestr, bo może czegoś nie rozumiem.
  • REKLAMA
  • #5 6407671
    bolilol_4
    Poziom 10  
    Posty: 22
    Ocena: 1
    Potrzeba wynikła ze stworzenia zwykłej karty graficznej na bazie FPGA i danePamieci to tylko dane w zwykłej pamięci RAM z której FPGA ma wyświetlać zawartość na ekran (czyli potrzeba przesłania danePAMIECI->daneFPGA)

    Mux mi po to gdyż jakoś trzeba zapisywać co jakiś czas dane do pamięci RAM z mikrokontrolera ARM i tu potrzebny jest ten 2gi kierunek daneARM->danePAMIECI

    Mój tok myślenia jest dość prosty aczkolwiek nie wiem czy przyswajalny przez Verilog - mianowicie teoretycznie mógłbym zastosować w 1dna stronę muxa choćby 2na1 i używać tylko 1we i 1wy, a w 2gim kierunku stworzyć demux 2na1 i również używać tylko1we i 1wy - w takim przypadku rozwiązanie nawet asynchroniczne nie byłoby chyba większym problemem - tylko właśnie Verilog wydawał mi się zawsze dość elastycznym programem i myślałem że da się to zrobić za pomocą jednej kostki - jeżeli nie to trudno wtedy zrobię to w sposób jaki opisałem aczkolwiek wolałbym w ramach samodoskonalenia poznać optymalniejsze rozwiązanie o ile takie istnieje.

    W ramach sprecyzowania pamięć RAM mam w najprostszej postaci czyli w zależności od WE (ja podepnę tam mój SELECT) albo zapisuje dane pod podana komórkę pamięci albo odczytuję wiec dane w przypadku 2giego kierunku będą już dostępne na wyjściu i gotowe do odczytania.
  • #6 6412070
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    bolilol_4 napisał:
    musiałbym wprowadzić kolejny zegar tyle ze 80MHz, a to trochę więcej i większe problemy z liniami długimi na płytce.

    Z ciekawosci zapytam jak duza jest ta plytka? Z pobieznych obliczen wyszlo mi ze fala o czestotliowsci 80 MHz bedzie miala (co prawda w prozni, a nie w falowodzie) dlugosc 3,75m :D

    Cos mi swita ze do generacji obrazu VGA w przyzwoitej rozdzielczosci starczal zegar 50MHz(tylko nie pamietam czy nie co drugi cykl odczyt). Zreszta widzialem na sieci kalkulator (zapewne nie jedyny) z opisem calego zagadnienia.

    Verilog to tylko narzedzie.

    Dodano po 4 [minuty]:

    http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html

    Przepraszam ze nie przeczytalem calosci twojego watku, ale za bardzo komplikujesz proste przeciez rzeczy i nie piszesz o sednie problemu np. co to za pamiec, jaka kosc docelowo itp. itd.

    Dodano po 3 [minuty]:

    Acha, taka pamiec z ktorej mozna jednoczesnie czytac i pisac po niej nazywa sie czasem dwuportowa, sa nawet takie w FPGA, jesli dostepna jest jedynie pamiec jednoportowa to taki multiplekser o ktorym piszesz moze jak najbardziej sie przydac.
  • Pomocny post
    #7 6412238
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    bolilol_4 napisał:
    /.../Byłbym wdzięczny za pomoc w rozwiązaniu/.../


    chyba chodzi Ci o cos takiego:

    module mux
    (
       input         select,
       input  [15:0] daneARM,
       output [15:0] daneFPGA,
       inout  [15:0] danePAMIECI
    );
    
    assign daneFPGA = danePAMIECI;
    assign danePAMIECI = select ? 16'HZ : daneARM;
    
    endmodule

    to jest przyklad, jak to poprawnie napisac w verilogu;
    to czy bedzie dzialac jak zalozyles, to oczywiscie
    inna sprawa ...
    JA
  • #8 6412245
    bolilol_4
    Poziom 10  
    Posty: 22
    Ocena: 1
    Hmm wg. mnie sedno problemu opisałem bardzo prosto - czyli co chciałbym zrobić w Verilogu (konstrukcje tego mux/demux), a do tego informacje jaki to typ pamięci są całkowicie zbędne :)

    Co do pamięci to zgadza się pamięć która pozwala dwóm niezależnym "zespołom" dostęp do operacji zapisu i odczytu to pamięć zwana dwubramową lub dwuportową - jak dla mnie nie ma znaczenia czy byłaby to pamięć 1dno czy 2bramowa (słyszałem gdzieś ze ponoć pamięć której chce użyć jest akurat dwubramowa ale nic takiego ze specyfikacji nie wynika) dla mnie to akurat bez znaczenia, a tu Link do pamięci

    Zgadza się do generacji obrazu wystarczy 50MHz - ja będę moja matrycę taktował 40MHz co pozwoli mi na uzyskanie obrazu o częstotliwości 63Hz - ale to akurat zależy do rozdzielczości matrycy im większa tym szybszy musi być zegar aby otrzymać dobrą częstotliwość odświeżania - przykładowo aby uzyskać 60Hz na matrycy 640x480 starcza 25MHz, a na 800x600 już 38MHz - przy odczytywaniu danych co takt.

    Dziękuje za uświadomienie odnośnie długości tej fali bo fakt nie przeliczałem tego wcześniej aczkolwiek wolałbym pozostać przy jednym zegarze gdyż po co wkładać kolejny gdy wystarczy jeden.

    Masz całkowitą rację Verilog to tylko narzędzie ale akurat mój problem dotyczy właśnie tego narzędzia a nie wyboru elementów - z tym borykałem się wcześniej :)

    Cytat:
    Przepraszam ze nie przeczytalem calosci twojego watku, ale za bardzo komplikujesz proste przeciez rzeczy i nie piszesz o sednie problemu np. co to za pamiec, jaka kosc docelowo itp. itd.

    hmm z tym to się nie zgadzam nie wiem w którym momencie wg. Ciebie komplikuję te proste rzeczy rozumiem że dla kogoś opis w Verilogu wspomnianego przeze mnie elementu może być prosty w takim razie bardzo bym prosił aby użyczył mi swojej wiedzy i podpowiedział jak tego dokonać.

    @J.A
    Dziękuje ślicznie za pomoc o takie właśnie rozwiązanie mi chodziło :) i szczególnie podoba mi się ten stan wysokiej impedancji :) jak zaimplementuje w układzie powiem czy działa zgodnie z założeniami
  • #9 6416079
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    [g.d.] napisał:
    bolilol_4 napisał:
    musiałbym wprowadzić kolejny zegar tyle ze 80MHz,
    a to trochę więcej i większe problemy z liniami długimi na płytce.

    Z ciekawosci zapytam jak duza jest ta plytka? Z pobieznych obliczen wyszlo mi ze fala
    o czestotliowsci 80 MHz bedzie miala (co prawda w prozni, a nie w falowodzie) dlugosc 3,75m :D

    troche nie trafiona ironia ... :);
    problemy z dlugimi liniami wywoluje nie tyle czestotliwosc,
    co czas narastania/opadania zbocza; 2-krotnie wieksza czestotliwosc
    zegara to dwakroc mniej czasu na ustabilizowanie sie poziomu
    napiecia w liniach, czyli z grubsza dwa razy precyzyjniej trzeba
    dobrac faze zegara w stosunku do zmian na liniach danych/sterujacych;
    na plytkach 'amatorskich' 80MHz to juz calkiem duza predkosc;
    J.A
  • REKLAMA
  • #10 6416332
    [g.d.]
    Poziom 18  
    Posty: 174
    Pomógł: 31
    J.A napisał:

    problemy z dlugimi liniami wywoluje nie tyle czestotliwosc,
    co czas narastania/opadania zbocza; 2-krotnie wieksza czestotliwosc
    zegara to dwakroc mniej czasu na ustabilizowanie sie poziomu
    napiecia w liniach, czyli z grubsza dwa razy precyzyjniej trzeba
    dobrac faze zegara w stosunku do zmian na liniach danych/sterujacych;
    na plytkach 'amatorskich' 80MHz to juz calkiem duza predkosc;
    J.A

    Nie bede dyskutowal bo moj poprzedni post faktycznie byl jakis taki chybiony. Niemniej tak jak napisales opoznienie na liniach danych/sterujacych wynika raczej z ograniczonej wydajnosci pradowej bufforow wyjsciowych niz "propagacji fali" na poziomie "miedzi".

    Pozdrawiam :-)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje pomocy w stworzeniu 16-bitowego multipleksera w języku Verilog o nietypowym, dwukierunkowym przepływie danych, sterowanym sygnałem SELECT. Docelowo układ ma realizować przepływ danych z ARM do PAMIECI, gdy SELECT=0, oraz z PAMIECI do FPGA, gdy SELECT=1. Problem dotyczy poprawnej deklaracji portu dwukierunkowego (inout) oraz warunkowego przypisania wartości w Verilogu. Dyskutowano możliwość realizacji asynchronicznej ze względu na taktowanie 40MHz i uniknięcie wyższej częstotliwości. Kontekstem jest projekt prostej karty graficznej na bazie FPGA wykorzystującej zewnętrzną pamięć RAM. Zaproponowano implementację logiki dwukierunkowej przy użyciu operatora warunkowego i polecenia assign dla portu inout, co rozwiązuje problem składniowy w Verilogu. Poruszono również kwestię pamięci dwuportowej w kontekście jednoczesnego dostępu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA