RTV forum PL | NewsGroups PL

Jak zbudować licznik z dwoma zegarami w Verilogu, aby działał poprawnie?

podstawy Verilog ktoś podpowie co jest żle?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zbudować licznik z dwoma zegarami w Verilogu, aby działał poprawnie?

ToTylkoJa
Guest

Tue Sep 29, 2015 9:47 am   



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

Adam GĂłrski
Guest

Tue Sep 29, 2015 10:13 am   



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


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


Grzegorz Kurczyk
Guest

Tue Sep 29, 2015 10:18 am   



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


Tu powinno byc:

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


--
Pozdrawiam
Grzegorz

ToTylkoJa
Guest

Tue Sep 29, 2015 10:35 am   



Adam Gc3b3rski wrote:

Quote:
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;

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

ToTylkoJa
Guest

Tue Sep 29, 2015 10:46 am   



Grzegorz Kurczyk wrote:

Quote:

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


Tu powinno byc:

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


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

Grzegorz Kurczyk
Guest

Tue Sep 29, 2015 10:50 am   



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



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

--
Pozdrawiam
Grzegorz

Grzegorz Kurczyk
Guest

Tue Sep 29, 2015 10:54 am   



W dniu 29.09.2015 o 12:46, ToTylkoJa pisze:
Quote:
Grzegorz Kurczyk wrote:


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


Tu powinno byc:

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


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


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

Tu jest to ładnie opisane (strona 3):
http://web.mit.edu/6.111/www/f2007/handouts/L06.pdf

--
Pozdrawiam
Grzegorz

Adam GĂłrski
Guest

Tue Sep 29, 2015 11:12 am   



On 2015-09-29 12:35, ToTylkoJa wrote:
Quote:
Adam Gc3b3rski wrote:

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;

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.

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

J.F.
Guest

Tue Sep 29, 2015 11:12 am   



Użytkownik "ToTylkoJa" napisał w wiadomości grup
dyskusyjnych:mudpdb$g4r$1@usenet.news.interia.pl...
Adam Gc3b3rski wrote:
Quote:
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) [...]

Dziękuję za zainteresowanie ale to chyba nie jest odpowiedz na mój
problem.

Poniekad wlasnie jest. Tak wlasnie nalezy to w FPGA zrobic.

Quote:
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.

Jak spojrzysz na jego karte katalogowa, to w srodku jest stosowna
bramka, ktora sumuje oba zegary.
http://www.datasheetbank.com/74LS193-Datasheet-PDF-TI
Co nie znaczy, ze musisz to robic dokladnie tak samo.

Quote:
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.

Ale co z tego ze opiszesz, skoro potem trzeba to jeszcze zrealizowac ?
FPGA promuje rozwiazania, gdzie przerzutniki maja jeden wspolny zegar.

Prawie taka sama funkcjonalnosc mozesz np uzyskac stosujac np dwa
osobne liczniki i wyliczajac roznice obu.
Ale to nadal osobne zegary.

J.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zbudować licznik z dwoma zegarami w Verilogu, aby działał poprawnie?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map