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

;)
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'
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'
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...
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'
Swoją drogą (początkuje więc pewnie dlatego) myślałem że to jakoś prościej
można...
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