RTV forum PL | NewsGroups PL

Jak poprawnie zaimplementować licznik rewersyjny asynchroniczny w VHDL?

VHDL - pomocy

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zaimplementować licznik rewersyjny asynchroniczny w VHDL?

Goto page 1, 2  Next

Quazar
Guest

Mon Jan 16, 2006 6:13 am   



Witam...

Jestem mocno początkujący i mam mały problem...
próbuje zamodelowac licznik rewersyjny asynchroniczny,
tzn. mam 2 wejścia pod które mam wpięte 2 przyciski. Jednym przyciskiem chce
inkrementowac liczni a drugim dekrementować.

Nie mam problemu z 1 wejściem...

dodając drugi wyrzuca błąd że operuje na tych samych danych - co oczywiście
jest prawda...

Problem napewno należy do gatunku trywialnych, ale niestety pomimo że google
moim przyjacielem jest nie mogę tego ugryźć...

Pomożecie ?


Quazar

Paweł Cern
Guest

Mon Jan 16, 2006 6:50 am   



Quote:
Jestem mocno początkujący i mam mały problem...
próbuje zamodelowac licznik rewersyjny asynchroniczny,
tzn. mam 2 wejścia pod które mam wpięte 2 przyciski. Jednym przyciskiem chce
inkrementowac liczni a drugim dekrementować.

Nie mam problemu z 1 wejściem...

dodając drugi wyrzuca błąd że operuje na tych samych danych - co oczywiście
jest prawda...

Problem napewno należy do gatunku trywialnych, ale niestety pomimo że google
moim przyjacielem jest nie mogę tego ugryźć...

Pomożecie ?

A możesz podać obecną architekturę?

Paweł Cern
Guest

Mon Jan 16, 2006 7:06 am   



Paweł Cern napisał(a):
Quote:
Jestem mocno początkujący i mam mały problem...
próbuje zamodelowac licznik rewersyjny asynchroniczny,
tzn. mam 2 wejścia pod które mam wpięte 2 przyciski. Jednym
przyciskiem chce inkrementowac liczni a drugim dekrementować.

Nie mam problemu z 1 wejściem...

dodając drugi wyrzuca błąd że operuje na tych samych danych - co
oczywiście jest prawda...

Problem napewno należy do gatunku trywialnych, ale niestety pomimo że
google moim przyjacielem jest nie mogę tego ugryźć...

Pomożecie ?

A możesz podać obecną architekturę?

Nieważne, chyba wiem jak było to zrobione. Pomijam problem iskrzenia
styków w przyciskach. Może spróbuj zrealizować to jako dwa liczniki
asynchroniczne do przodu, i asynchroniczny układ liczący różnicę. Będzie
to dobrze działać jeśli liczniki będą chodziły w pełnym zakresie
(modulo 2 ^ liczba bitów). Z grubsza powinno to być jakoś tak (dla
danych 32-bitowych):

entity updown_async_counter is
port(
clk_up : in std_logic;
clk_dn : in std_logic;
clear : in std_logic;
value : out integer
);
end;

architecture structure of updown_async_counter is

signal positive : integer;
signal negative : integer;

begin
value <= positive - negative;
process(clear)
begin
if(clear='1') then
positive <= 0;
negative <= 0;
end if;
end process;
process(clk_up)
begin
if(clk_up'event and clk_up='1') then
positive <= positive + 1;
end if;
end process;
process(clk_dn)
begin
if(clk_dn'event and clk_dn='1') then
negative <= negative + 1;
end if;
end process;
end;

Quazar
Guest

Mon Jan 16, 2006 8:24 am   



Może spróbuj zrealizować to jako dwa liczniki
Quote:
asynchroniczne do przodu, i asynchroniczny układ liczący różnicę. Będzie
to dobrze działać jeśli liczniki będą chodziły w pełnym zakresie (modulo
2 ^ liczba bitów). Z grubsza powinno to być jakoś tak (dla danych
32-bitowych):

entity updown_async_counter is
port(
clk_up : in std_logic;
clk_dn : in std_logic;
clear : in std_logic;
value : out integer
);
end;

architecture structure of updown_async_counter is

signal positive : integer;
signal negative : integer;

begin
value <= positive - negative;
process(clear)
begin
if(clear='1') then
positive <= 0;
negative <= 0;
end if;
end process;
process(clk_up)
begin
if(clk_up'event and clk_up='1') then
positive <= positive + 1;
end if;
end process;
process(clk_dn)
begin
if(clk_dn'event and clk_dn='1') then
negative <= negative + 1;
end if;
end process;
end;


Heh, dziala ;)

Pomyślałem o tym rozwiązaniu ale nie wiedziec dlaczego uznałem że będą błędy
przy przepełnieniach 'positiva' i negativa' Wink
Swoją drogą (początkuje więc pewnie dlatego) myślałem że to jakoś prościej
można... ;)

dzięki serdeczne,

Quazar

fly
Guest

Mon Jan 16, 2006 8:27 am   



Quazar napisał(a):
Quote:
dzięki serdeczne,
Quazar
-

Mozna zapytac z jakich materialow korzystasz? ze Skahill'a ??

pozd.fly

Quazar
Guest

Mon Jan 16, 2006 8:30 am   



Użytkownik "fly" <ylfly@NOSPAMo2.pl> napisał w wiadomości
news:dqelqq$bs8$1@nemesis.news.tpi.pl...
Quote:
Quazar napisał(a):
dzięki serdeczne,
Quazar
-
Mozna zapytac z jakich materialow korzystasz? ze Skahill'a ??

pozd.fly

Korzystam z uproszczonego Macajewa Wink ;)

Tzn. google + met. prób&błędów.

Dysponuje LiveDesign Altiuma + Designer - super sprawa

Technike cyfrową w jakiś sposób już znam, więc problemem póki co jest tylko
modelowanie VHDL.

Pozdrawiam

Quazar
Guest

Mon Jan 16, 2006 8:31 am   



Quote:
-
Mozna zapytac z jakich materialow korzystasz? ze Skahill'a ??

A'propos - co polecacie jako kompendium VHDL ?

Quazar

Paweł Cern
Guest

Mon Jan 16, 2006 3:45 pm   



Quazar napisał(a):
Quote:
Może spróbuj zrealizować to jako dwa liczniki
asynchroniczne do przodu, i asynchroniczny układ liczący różnicę. Będzie
to dobrze działać jeśli liczniki będą chodziły w pełnym zakresie (modulo
2 ^ liczba bitów). Z grubsza powinno to być jakoś tak (dla danych
32-bitowych):

entity updown_async_counter is
port(
clk_up : in std_logic;
clk_dn : in std_logic;
clear : in std_logic;
value : out integer
);
end;

architecture structure of updown_async_counter is

signal positive : integer;
signal negative : integer;

begin
value <= positive - negative;
process(clear)
begin
if(clear='1') then
positive <= 0;
negative <= 0;
end if;
end process;
process(clk_up)
begin
if(clk_up'event and clk_up='1') then
positive <= positive + 1;
end if;
end process;
process(clk_dn)
begin
if(clk_dn'event and clk_dn='1') then
negative <= negative + 1;
end if;
end process;
end;


Heh, dziala ;)

Pomyślałem o tym rozwiązaniu ale nie wiedziec dlaczego uznałem że będą błędy
przy przepełnieniach 'positiva' i negativa' Wink
Swoją drogą (początkuje więc pewnie dlatego) myślałem że to jakoś prościej
można... ;)

dzięki serdeczne,

Quazar



I tak będą błędy. Taki licznik powinien operować kodem graya.
W końcu jeśli poza zastosowaniem edukacyjnym chcesz go gdzieś użyć
(podłączyć do czegoś większego, prawdopodobnie synchronicznego), to
zjawisko zmieniających się wielu bitów naraz podczas inkrementacji /
dekrementacji w standartowym systemie dwójkowym w połączeniu ze
zjawiskiem wyścigu dyskwalifikują to rozwiązanie.

Paweł

Paweł Cern
Guest

Mon Jan 16, 2006 3:47 pm   



Quazar napisał(a):
Quote:
-
Mozna zapytac z jakich materialow korzystasz? ze Skahill'a ??

A'propos - co polecacie jako kompendium VHDL ?

Quazar



Nie szukaj może nic więcej o VHDL-u bo z jakiejkolwiek książki
wszystkiego się dowiesz. Poczytaj może ogólnie o sztuce projektowania
układów cyfrowych. To jest podstawa. No i polecam najpierw SYMULACJE
układu. Potrafi to Protel naturalnie, a jeśli już ta miesięczna licencja
się skończy, to płytka ewaluacyjna Altium działa też z Quartusem Altery.

Paweł

Paweł Cern
Guest

Mon Jan 16, 2006 3:54 pm   



Quote:

Heh, dziala ;)

Pomyślałem o tym rozwiązaniu ale nie wiedziec dlaczego uznałem że będą błędy
przy przepełnieniach 'positiva' i negativa' Wink
Swoją drogą (początkuje więc pewnie dlatego) myślałem że to jakoś prościej
można... ;)

dzięki serdeczne,

Quazar



Będzie działać, tylko trzeba pilnować żeby słowo różnicy miało taki sam
rozmiar jak dane wyjściowe liczników. Zresztą kiedyś na matematyce obiło
mi się o uszy nazwisko "Galois" i parę ciekawostek, jeśli dobrze mi się
kojarzy, to możnaby to dopasować do tego problemu.

Paweł

JA
Guest

Mon Jan 16, 2006 10:02 pm   



"Quazar":

/.../
Quote:
Swoją drogą myślałem, że to jakoś prościej można... Wink


nie wiem, czy tak bedzie prosciej, ale moim zdaniem
dowcipniej :)

napisane jest w verilogu, mam nadzieje, ze
przetlumaczenie tego na vhdl nie bedzie stanowic
problemu;

=================================
module counter
(
cnt_out, // wyjscie licznika
down, // licz w dol
up, // licz w gore
res // reset
);

input down, up, res;
output [3:0] cnt_out;

reg [3:0] cnt;
wire loc_clk;
reg c_up, c_dn; // 2 rejestry definiujace kierunek liczenia

/*
trik polega na tym, ze narastajace zbocze syg, up 'zapala' rejestr
c_up, [licz w gore] a wysoki poziom syg. up resetuje asynchronicznie
rejestr c_dn [licz w dol];
to samo z sygnalem down i rejestrem c_up,
sam licznik cnt liczy w dol, bodz w gore na opadajacym zboczu up OR down
*/

always @(posedge up or posedge down) //always to tyle, co process w vhdl
if (down) c_up <= 0; // jesli down jest HIGH wyzeruj c_up, asyn. clear
else c_up <= 1;

always @(posedge down or posedge up)
if (up) c_dn <= 0;
else c_dn <= 1;


assign loc_clk = up || down; // zegar dla licznika bedacy OR syg. up i down

always @(negedge loc_clk or posedge res)
if (res) cnt <= 0;
else if (c_up) cnt <= cnt + 1;
else if (c_dn) cnt <= cnt - 1;

assign cnt_out = cnt;

endmodule
=================================

Quote:
Quazar


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

J.F.
Guest

Mon Jan 16, 2006 10:05 pm   



On Mon, 16 Jan 2006 07:45:05 +0100, Paweł Cern wrote:
Quote:
Quazar napisał(a):
Może spróbuj zrealizować to jako dwa liczniki
asynchroniczne do przodu, i asynchroniczny układ liczący różnicę.

I tak będą błędy. Taki licznik powinien operować kodem graya.

Dobrze piszesz.
Tylko bedzie problem to zrealizowac :-)

J>

J.F.
Guest

Mon Jan 16, 2006 10:05 pm   



On Mon, 16 Jan 2006 00:24:43 +0100, Quazar wrote:
Quote:
Pomyślałem o tym rozwiązaniu ale nie wiedziec dlaczego uznałem że będą błędy
przy przepełnieniach 'positiva' i negativa' Wink
Swoją drogą (początkuje więc pewnie dlatego) myślałem że to jakoś prościej
można... Wink

Zapisac w VHDL to sie powinno dac prosciej.
Tzn opisac behawioralnie.

A jak to zrealizowac praktycznie .. oj, to wiekszy problem.

Pomysl z dwoma licznikami jest chyba jednym z lepszych

J.

Paweł Cern
Guest

Mon Jan 16, 2006 10:27 pm   



Quote:


nie wiem, czy tak bedzie prosciej, ale moim zdaniem
dowcipniej :)

=================================
module counter
(
cnt_out, // wyjscie licznika
down, // licz w dol
up, // licz w gore
res // reset
);


Trąci licznikiem synchronicznym.

JA
Guest

Mon Jan 16, 2006 10:42 pm   



"Paweł Cern":

Quote:
Trąci licznikiem synchronicznym.

i co z tego ?
to jakas wada ?

a poza tym, bardziej traci niz to ponizae ?

**************
process(clk_up)
begin
if(clk_up'event and clk_up='1') then
positive <= positive + 1;
end if;
end process;
****************

JA


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Goto page 1, 2  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zaimplementować licznik rewersyjny asynchroniczny w VHDL?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map