Archiwum pl.misc.elektronika na elektroda.pl



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści


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 _at_nospam_(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 _at_nospam_(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 _at_nospam_(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;

endmodul