Money.plTechnologie dla biznesu Grupy dyskusyjne pl.misc.elektronika podstawy Verilog ktoś podpowie co jest żle?

podstawy Verilog ktoś podpowie co jest żle?

podstawy Verilog ktoś podpowie co jest żle?

ToTylkoJa <m...@nie.chce.tego.poczta.fm> / 2015-09-29 11:47:36
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
 
Czytaj także na forum

Re: podstawy Verilog ktoś podpowie co jest żle

Adam_Górski <g...@wp.pl> / 2015-09-29 12:13:29
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


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

Re: podstawy Verilog ktoś podpowie co jest żle

Grzegorz Kurczyk <g...@control.usun.slupsk.pl> / 2015-09-29 12:18:29

> 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
 

Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f

ToTylkoJa <m...@nie.chce.tego.poczta.fm> / 2015-09-29 12:35:39
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.

MArek

 

Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f

ToTylkoJa <m...@nie.chce.tego.poczta.fm> / 2015-09-29 12:46:34
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
 
wstecz
1 2
Pawel Pawlowicz 2015-08-06 12:20
Paweł_Pawłowicz 2015-07-14 13:55
Pawel O'Pajak 2015-03-25 10:07
Adam 2015-01-24 00:16
Mirek 2014-10-07 20:19
kropelka@gmail.com 2014-07-26 00:40
Adam Górski 2014-06-25 16:58
stchebel@gmail.com 2013-08-16 19:12
Maksymilian Dutka 2012-06-16 10:17
" MH" 2012-05-27 14:27
Konop 2012-04-11 21:45
Michał Smolnik 2012-04-11 09:12
"Heniutek" 2011-10-18 12:02
Maksymilian Dutka 2011-07-09 17:11
ToTylkoJa 2011-05-03 18:59
współpraca