Sprawozdanie 5, aaa, studia 22.10.2014, całe sttudia, Studia1, 1 semestr, laboratorium


Sprawozdanie 5

Układy cyfrowe i systemy wbudowane

Prow.: dr inż. Dariusz Caban

  1. Założenia

Celem laboratorium było stworzenie licznika 8-mio bitowego z wyjściem na diody płytki Spartan. Licznik po wciśnięciu klawisza powinien stać się licznikiem rewersyjnym i zacząć odliczać od miejsca, w którym skończył poprzednio. Sytuacja powinna powtórzyć się po ponownym wciśnięciu klawisza. Układ powinien być odpowiednio zabezpieczony przed migotaniem styków.

  1. Wykonanie

Wykonano językiem VHDL, korzystając ze schematu.

Uznaliśmy, że do wykonania tego zadania potrzebujemy trzech osobnych sygnałów licznika. Jeden z nich to właściwy z wyjściem na diody płytki. Drugi zapewnia odpowiednie opóźnienie, dzięki któremu diody zapalają się i gasną po okresie ok. 1 sekundy, gdyż częstotliwość taktowania zegara na płytce jest zbyt duża, by dostrzec jakiekolwiek miganie diod. Trzeci z liczników odpowiada za zniwelowanie migotania styków do pewnego poziomu, jednak nie zabezpiecza przed dłuższym wciśnięciem klawisza niż normalnie byłoby to wskazane dla płytki.

  1. Schemat układu:

0x08 graphic

  1. Objaśnienia:

Uwzględniono dwa wejścia (klawisz zmiany licznika i zegar) i jedno wyjście rozbite na osiem diodek płytki Spartan. Podukład VHDL to podukład napisany kodem VHDL przedstawionym poniżej.

  1. Kod VHDL:

0x08 graphic

Powyższy kod to definicja sygnałów wejścia i wyjścia oraz utworzenie potrzebnych zmiennych, o których mowa była wcześniej. Dodatkowo stworzono zmienną „zmiana”, przyjmującą wartość 0 lub 1. Założyliśmy, że gdy zmiana=1, licznik ma wykonywać obliczenia do przodu, zaś gdy zmiana=0, ma zmienić się w licznik rewersyjny.

Do procesu przekazujemy sygnał wejściowy z klawisza, który będzie ustawiał zmienną zmianę oraz sygnał zegara.

Sam proces to na razie jedynie licznik jednostronny wykorzystujący zegar z płytki. Efektem było stałe świecenie diodek z powodu wysokiej częstotliwości zegara.

Następnym krokiem było dodanie do procesu licznika rewersyjnego.

0x08 graphic

Dołączono zależność od zmiennej zmiana. W przypadku, gdy zmiana=1, temp ma się zwiększać o 1. W innym przypadku ma się zmniejszać o 1.

W następnym kroku należy dodać możliwość ustawienia zmiennej „zmiana” w zależności od przycisku na płytce.

0x08 graphic

Jeśli sygnał wejściowy klawisza oznaczony nazwą „we” będzie równy 1, czyli zostanie wciśnięty, zmienna „zmiana” ma ulec negacji i zostać wykorzystana w dalszym etapie procesu, w którym wybierany jest rodzaj licznika temp.

Następnym krokiem jest wykonanie opóźnienia, by miganie diodek było widoczne gołym okiem. Użyjemy do tego celu stworzonego już licznika o nazwie „licznik_opoz”.

0x08 graphic

Powyższy kod to dodanie licznika 26-bitowego. W połączeniu z zegarem daje on szybkość około 1 sekundy.

Nadrzędnym licznikiem staje się teraz licznik_opoz, który odlicza jedynie do przodu. W chwili, gdy licznik_opoz osiągnie maksymalną wartość (26 jedynek), ma wrócić do wartości minimalnej (26 zer) oraz pozwolić na odliczenie jednej wartości na liczniku temp.

Następnym krokiem jest zniwelowanie efektu migotania styków.

0x08 graphic

Ponieważ migotanie występuje przy wciśnięciu klawisza, należy wykonać zabezpieczenie właśnie tam, gdzie ustawia się zmienną zależną od przycisku.

Do tego celu wykorzystaliśmy trzeci i ostatni licznik o nazwie „licznik_wej”. Licznik_wej jest 11-bitowym licznikiem, liczącym tylko w przód. Czas osiągnięcia maksymalnej wartości na tym liczniku jest równy mniej więcej czasowi, którego potrzebujemy na wciśnięcie klawisza. Kiedy licznik_wej osiągnie maksymalną wartość, dopiero wtedy zmienna „zmiana” ma ulec negacji. Użytkownik płytki ma tyle samo czasu na puszczenie klawisza, zanim licznik_wej znowu osiągnie maksymalną wartość po wyzerowaniu. Przy tym rozwiązaniu główny licznik temp i licznik_opoz zatrzymują się i czekają na puszczenie klawisza.

Pełny kod układu wygląda następująco:

0x08 graphic

  1. Wyniki końcowe:

Należy wspomnieć, że żeby dało się wykorzystać takie działanie liczników, oparte na funkcjach arytmetycznych, należy przed właściwym kodem programu umieścić odpowiedniego include'a: use IEEE.STD_LOGIC_UNSIGNED.ALL;

Niestety, w czasie laboratorium nie udało się wykonać zabezpieczenia przed zbyt długim przytrzymywaniem klawisza, które można było wykonać tak, by licznik_wej nie zerował się i nie liczył ponownie, kiedy klawisz „we” jest dalej wciśnięty. A zerować licznik dopiero po puszczeniu klawisza.

str. 6

Elżbieta Tchorowska 05-01-2011

Konrad Kukulski

str. 1

entity vhdl is

Port ( we : in STD_LOGIC;

clk : in STD_LOGIC;

wy : out std_logic_vector (7 downto 0));

end vhdl;

architecture Behavioral of vhdl is

signal temp: std_logic_vector (7 downto 0);

signal licznik_opoz: std_logic_vector (25 downto 0);

signal licznik_wej: std_logic_vector (10 downto 0);

signal zmiana: std_logic:='1';

begin

process (clk,we)

begin

if rising_edge (clk) and (clk='1')

then

temp<=temp+"00000001";

end if;

end process;

wy<=temp;

end Behavioral;

if rising_edge (clk) and (clk='1')

then

if (zmiana='1')

then temp<=temp+"00000001";

else

temp<=temp-"00000001";

end if;

end if;

entity vhdl is

Port ( we : in STD_LOGIC;

clk : in STD_LOGIC;

wy : out std_logic_vector (7 downto 0));

end vhdl;

architecture Behavioral of vhdl is

signal temp: std_logic_vector (7 downto 0);

signal licznik: std_logic_vector (25 downto 0);

signal licznik_wej: std_logic_vector (10 downto 0);

signal zmiana: std_logic:='1';

begin

process (clk,we)gvbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj;'/er3hjn…m 4ąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąą

begin

if (we='1') then

if rising_edge (clk)

then licznik_wej<=licznik_wej+1;

if (licznik_wej="11111111111")

then zmiana<=not zmiana;

licznik_wej<="00000000000";

end if;

end if;

end if;

if rising_edge (clk) and (clk='1')

then

if (licznik="11111111111111111111111111")

then licznik<="00000000000000000000000000"; if (zmiana='1')

then temp<=temp+"00000001";

else

temp<=temp-"00000001";

end if;

end if;

licznik<=licznik+1;

end if;

end process;

wy<=temp;

end Behavioral;

if (we='1') then

if rising_edge (clk)

then licznik_wej<=licznik_wej+1;

if (licznik_wej="11111111111")

then zmiana<=not zmiana;

licznik_wej<="00000000000";

end if;

end if;

end if;

if rising_edge (clk) and (clk='1')

then

if (licznik_opoz="11111111111111111111111111")

then licznik_opoz<="00000000000000000000000000"; if (zmiana='1')

then temp<=temp+"00000001";

else

temp<=temp-"00000001";

end if;

end if;

licznik_opoz<=licznik_opoz+1;

end if;

process (clk,we)

begin

if (we='1') then

then zmiana<=not zmiana;

end if;

if rising_edge (clk) and (clk='1')

then

if (zmiana='1')

then temp<=temp+"00000001";

else

temp<=temp-"00000001";

end if;

end if;

end process;



Wyszukiwarka