Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Verilog - problem z nietypowym multiplekserem

Moderatorzy: Jacek Bogusz, Moderatorzy

bolilol_4
-
-
Posty: 2
Rejestracja: 13 kwie 2009, o 11:59
Lokalizacja: Gliwice

Verilog - problem z nietypowym multiplekserem

Postautor: bolilol_4 » 13 kwie 2009, o 12:06

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:)

Kod: Zaznacz cały

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:)

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.
Ostatnio zmieniony 13 kwie 2009, o 14:07 przez bolilol_4, łącznie zmieniany 1 raz.

ziggy
-
-
Posty: 25
Rejestracja: 2 cze 2006, o 21:44
Lokalizacja: Podkarpacie
Kontaktowanie:

Postautor: ziggy » 14 kwie 2009, o 12:22

Proponuję taki, bardzo prosty, opis:

Kod: Zaznacz cały

module mux_inout(input select, input [15:0] daneARM, output [15:0] daneFPGA, inout [15:0] danePAMIECI); assign danePAMIECI=select?16'hz:daneARM; assign daneFPGA=select?danePAMIECI:16'hx; endmodule
Jednak warto zwrócić uwagę, że stosowanie portów dwukierunkowych dla większości narzędzi syntezy i układów FPGA jest możliwe tylko w module znajdującym się na szczycie hierarchii. Jeśli moduł mux_inout ma być jednym z modułów podrzędnych najprawdowpodobniej narzędzia syntezy zasygnalizują błąd. Wtedy trzeba nieco zmienić koncepcję, ale dalej wszystko da się zrobić :604:
I jeszcze jedno. Nie określiłeś jak ma zachować się wyjście daneFPGA dla select=0. W opisie założyłem więc, że w takim przypadku wyjście to może przyjmować stan dowolny.

bolilol_4
-
-
Posty: 2
Rejestracja: 13 kwie 2009, o 11:59
Lokalizacja: Gliwice

Postautor: bolilol_4 » 14 kwie 2009, o 21:07

Dziękuje bardzo za pomoc i kompiluje się bez błędu pomimo iż jest to moduł podrzędny, dane FPGA maja być tylko danymi dla matrycy LCD generowanymi przez FPGA czyli zgodnie z Twoimi założeniami mogą to być dowolne dane gdyż na select=0 wyświetlanie będzie wyłączone a tylko ARM będzie zapisywał dane do PAMIECI

Musiałem tylko wprowadzić jedna modyfikacje zmienna select zamienić na sel gdyż, select jest jakąś zarezerwowaną nazwą i zgłaszało błąd.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 35 gości