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
Didn't find your answer? Ask the community — no account required.
P
Paweł Cern
A możesz podać obecną architekturę?
P
Paweł Cern
Paweł Cern napisał(a):
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;
Q
Quazar
Mo¿e spróbuj zrealizowaæ to jako dwa liczniki
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
F
fly
Quazar napisał(a):
- Mozna zapytac z jakich materialow korzystasz? ze Skahill'a ??
pozd.fly
Q
Quazar
U¿ytkownik "fly" snipped-for-privacy@NOSPAMo2.pl napisa³ w wiadomo¶ci news:dqelqq$bs8$ snipped-for-privacy@nemesis.news.tpi.pl...
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
Q
Quazar
A'propos - co polecacie jako kompendium VHDL ?
Quazar
P
Paweł Cern
Quazar napisał(a):
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ł
P
Paweł Cern
Quazar napisał(a):
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ł
P
Paweł Cern
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ł
J
JA
"Quazar":
/.../
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 );
/* 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 =================================
J
J.F.
Dobrze piszesz. Tylko bedzie problem to zrealizowac :-)
J>
J
J.F.
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.
P
Paweł Cern
Trąci licznikiem synchronicznym.
J
JA
"Paweł Cern":
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
P
Paweł Cern
Zgadza się, na przykład możnaby dać wspólną sekcję "process". Będzie krócej.
Z
Zbych
J.F. przemówił ludzkim głosem:
Czemu miałby być z tym problem ? Konwertujesz greya na binarny, dodajesz
1, konwertujesz na greya i licznik synchroniczny gotowy :-).
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.