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ę

Proosty sumator w Verilog - pomocy

Moderatorzy: Jacek Bogusz, Moderatorzy

vabian
-
-
Posty: 2
Rejestracja: 27 lis 2008, o 18:47
Lokalizacja: Wroclaw

Proosty sumator w Verilog - pomocy

Postautor: vabian » 27 lis 2008, o 18:57

Witam. To moj pierwszy post na tym forum, wiec prosze o wyrozumialosc.
Otoz mam do zrobienia projekt w Verilogu i staram sie z nim zapoznac. Probowalem napisac posty sumator, jednakze, tylko pierwszy wynik jest prawidlowy. Oto kod i wynik symulacji:

Kod: Zaznacz cały

module sumator_bez(a,b,wykonaj,wynik); input [3:0] a,b; input wykonaj; output [3:0] wynik; reg [3:0] wynik; always @(wykonaj) begin if(a[3:0] > b[3:0]) begin wynik = a - b end else begin wynik = b - a; end end initial begin #130 $finish; end endmodule module test; reg [3:0] a,b; reg wykonaj; wire [3:0] wynik; sumator_bez S (a,b,wykonaj,wynik); initial begin a = 10; b = 5; wykonaj = 1; #50 a = 7; b = 5; wykonaj = 1; #50 a = 3; b = 4; wykonaj = 1; end initial begin $monitor($time, ": %d - %d = %d",a,b,wynik); end endmodule
Symulacja w cver:
Highest level modules:
test

0: 10 - 5 = 5
50: 7 - 5 = 5
100: 3 - 4 = 5
Halted at location **mod.v(27) time 130 from call to $finish.
There were 0 error(s), 0 warning(s), and 4 inform(s).

Dlaczego wynik caly czas jest taki sam, mimo, ze zmienne a i b posiadaja prawidlowe wartosci?

Gdy zmodyfikowalem go w ten sposob: assign wynik = a+b otrzymalem wynik symulacji taki:
Highest level modules:
test

0: 10 - 5 = 5
50: 7 - 5 = 2
100: 3 - 4 = 15

Dlaczego nie zostala rozpatrzona instrukcja if - else?
Dziekuje za wszelka pomoc!!!

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

Postautor: ziggy » 14 sty 2009, o 23:27

Dopiero przed chwilką zauważyłem ten temat. Problem jest banalny. Spójrz na listę wrażliwości procesu always. Instrukcja procesu (w tym przypadku instrukcja warunkowa if-else) wykonywana jest tylko wtedy gdy sygnał znajdujący się na liście wrażliwości zmienia swoją wartość. W Twoim przypadku lista wrażliwości zawiera jeden sygnał, który jest wejściem modułu. Z poziomu jednostki testowej sygnał ten ma cały czas poziom wysoki. Stąd po prostu instrukcja procesu always nie jest wykonywana.
Generalnie źle sformułowałeś listę wrażliwości procesu. Proponuję takie rozwiązanie:

Kod: Zaznacz cały

always @(*) if(wykonaj) wynik=a>b?a - b:b - a;
Powyższy opis modeluje sumator (a dokładnie układ odejmujący) z rejestrem zatrzaskowym. Nie wiem czy taki efekt chciałeś uzyskać - jak ma zachowywać się układ w zależności od wejścia 'wykonaj'?

vabian
-
-
Posty: 2
Rejestracja: 27 lis 2008, o 18:47
Lokalizacja: Wroclaw

Postautor: vabian » 15 sty 2009, o 10:34

Bardzo dziękuję za odpowiedź, jednakże już uporałem się z tym problemem i nie tylko tym :P

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 26 gości