ktoś podpowie co jest żle?

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

Reply to
ToTylkoJa
Loading thread data ...

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

Reply to
Adam Górski

Tu powinno byc:

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

Reply to
Grzegorz Kurczyk

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

Reply to
ToTylkoJa

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

Reply to
ToTylkoJa

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.

Reply to
Grzegorz Kurczyk

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

Reply to
Grzegorz Kurczyk

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

Reply to
Adam Górski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.