ktoś podpowie co jest żle?

Sep 29, 2015 7 Replies

Witam W ramach zapoznawania się z Verilogiem chciałem zrobić w FPGA prosty licznik. Przykłady które znalazłem działały w oparciu o jedno wejście zegarowe i wejście definiujące kierunek zliczania. Ja chcę zrobić coś jak



74193 czyli dwa wejściami zegarowe odpowiednio 'clkup' i 'clkdown'. Wymyśliłem coś takiego:

always @(posedge pom_przy1 or posedge pom_przy2) if (pom_przy2==1) licz_wysw <= licz_wysw - 1; else if (pom_przy1==1) licz_wysw <= licz_wysw + 1;



Niestety licznik ten poprawnie liczy tylko 'w górę' a przy liczeniu 'w dół' przeskakuje po kilka stanów. Wydaje mi się że problem drgań przycisków można pominąć ponieważ oba przyciski są filtrowane w taki sam sposób. Na wszelki wypadek pokaże jak 'odkłócam' przyciski.



prosty_przy przy1(.but(but0),.zegar(pom_clk),.wy(pom_przy1)); prosty_przy przy2(.but(but1),.zegar(pom_clk),.wy(pom_przy2));



Jeśli dobrze rozumuję to tworzę dwie instancje (tak się to chyba nazywa) modułu 'prosty_przy', czyli oba przyciski są traktowane tak samo. To może jeszcze na koniec moduł 'prosty_przy'



module prosty_przy( input but,zegar, output wy ); reg r0,r1,r2,r3,r4,r5;



always @(posedge zegar) begin r5=r4; r4=r3; r3=r2; r2=r1; r1=r0; r0=but; end assign wy = r0 & r1 & r2 & r3 & r4 & r5; endmodule



Nie jest to może najładniejszy przykład 'debouncera' ale chyba powinien działać. Całość jest napędzana zegarem około 760 Hz. Czekam na jakieś podpowiedzi.



MArek


Cześć,

A teraz zastanów się co jest wejściem zegarowym a co sygnałem mówiącym o kierunku zliczania. A może są dwa wejścia zegarowe ?

A może nie ma przerzutników z dwoma sygnałami zegarowymi w Twoim sprzęcie?

Typowy problem początkujących. Pamiętaj zawsze na końcu występują bramki i przerzutniki ( fpga ) , koniec i kropka. Pisząc w verilogu czy VHDL trzeba o tym pamiętać.

Poniżej tak jak to powinno wyglądać :

always @( jakiś_zegar) if (pom_przy2==1) licz_wysw <= licz_wysw - 1; else if (pom_przy1==1) licz_wysw <= licz_wysw + 1;

Jakiś zegar taktuje przerzutniki a sygnały informujące o zliczaniu w górę czy dół jedynie aktywują zmianę stanu ( lub nie )

Może trochę duże uproszczenie ale wydaje mi się że niedaleko odbiega. Pomijam problem odbijania przycisków i synchronizacji sygnałów pom_przy1 i 2 do sygnału zegarowego jakiś_zegar.

Pzdr.

Adam

Tu powinno byc:

r5<=r4; r4<=r3; r3<=r2; r2<=r1; r1<=r0; r0<=but;

Dziękuję za zainteresowanie ale to chyba nie jest odpowiedz na mój problem. Przykładów z jednym wejściem zegara i wejściami wybierającymi kierunek zliczania uruchomiłem kilka. Ale teraz zechciałem emulować licznik 74193. A on ma DWA wejścia zegarowe. Bardzo możliwe że nie są one podawane wprost na jego przerzutniki. To że przerzutniki "D" ma tylko jeden zegar doskonale rozumiem. Mnie interesuje jak w Verilogu opisać układ który ma dwa wejścia i w zależności od tego na które wejście podamy impuls układ zliczy 'w górę' bądź 'w dół'. Chyba można coś takiego zrobić ponieważ wymieniany już wcześniej licznik 74193 istnieje w rzeczywistości i działa, o czym przekonałem się osobiście.

MArek

Jeszcze nie do końca rozumiem różnicę między blocking i nonblocking assigment. Niestety po zamienieniu przypisania "=" na "<=" układ działa tak samo źle. Właśnie sprawdziłem na płytce "spartan-3" (chyba digilent)

MArek

Jak się dokładnie przyjrzysz to 74193 nie jest wcale aż taki "dual clock" ;-) Przerzutniki są taktowanie sumą logiczną sygnałów (UP or DN). Zrób podobnie u siebie.

Twoim celem było zrobienie rejestru przesuwnego, a użycie blocking zwinie to do jednego przerzutnika:

Tu jest to ładnie opisane (strona 3):

formatting link

Nie idź tą drogą. Chyba że masz duże doświadczenie. Jeżeli chcesz żeby Twoje układy działały poprawnie używaj:

- konstrukcji synchronicznych ( nie używaj asynchronicznych - chyba że wiesz co robisz )

- synchronizuj sygnały wejściowe ( w tym reset )

- unikaj dzielników sygnału zegarowego

Pzdr

Adam

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required