VHDL - pomocy

Jan 15, 2006 16 Replies

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



A możesz podać obecną architekturę?

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;

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

Quazar napisał(a):

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

pozd.fly

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

A'propos - co polecacie jako kompendium VHDL ?

Quazar

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ł

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ł

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ł

"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 );

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

Dobrze piszesz. Tylko bedzie problem to zrealizowac :-)

J>

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.

Trąci licznikiem synchronicznym.

"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

Zgadza się, na przykład możnaby dać wspólną sekcję "process". Będzie krócej.

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