-
1. Data: 2015-09-29 11:47:36
Temat: podstawy Verilog ktoś podpowie co jest żle?
Od: ToTylkoJa <m...@n...chce.tego.poczta.fm>
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
-
2. Data: 2015-09-29 12:13:29
Temat: Re: podstawy Verilog ktoś podpowie co jest żle?
Od: Adam Górski <g...@w...pl>
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
>
-
3. Data: 2015-09-29 12:18:29
Temat: Re: podstawy Verilog ktoś podpowie co jest żle?
Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>
> 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
-
4. Data: 2015-09-29 12:35:39
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: ToTylkoJa <m...@n...chce.tego.poczta.fm>
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
-
5. Data: 2015-09-29 12:46:34
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: ToTylkoJa <m...@n...chce.tego.poczta.fm>
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
-
6. Data: 2015-09-29 12:50:01
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>
> 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" ;-)
Przerzutniki są taktowanie sumą logiczną sygnałów (UP or DN). Zrób
podobnie u siebie.
--
Pozdrawiam
Grzegorz
-
7. Data: 2015-09-29 12:54:58
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>
W dniu 29.09.2015 o 12:46, ToTylkoJa pisze:
> 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
-
8. Data: 2015-09-29 13:12:10
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: Adam Górski <gorskiamalpawpkropkapeel_@xx>
On 2015-09-29 12:35, ToTylkoJa wrote:
> 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
-
9. Data: 2015-09-29 13:12:33
Temat: Re: podstawy Verilog ktoc59b podpowie co jest c5bcle3f
Od: "J.F." <j...@p...onet.pl>
Użytkownik "ToTylkoJa" napisał w wiadomości grup
dyskusyjnych:mudpdb$g4r$...@u...news.interia.pl...
Adam Gc3b3rski wrote:
>> 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.
>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-T
I
Co nie znaczy, ze musisz to robic dokladnie tak samo.
>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.