Kostka do gry
Realizacja w układzie PLD
(opis w języku VHDL)
Białystok, styczeń 2015
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -2/12-
Copyright (C) 2015, Andrzej Pawluczuk. email: apawluczuk@vp.pl
Wszystkie prawa zastrzeżone.
Redystrybucja i używanie, czy to w formie tekstu zródłowego, czy w formie kodu
wykonywalnego, są dozwolone pod warunkiem spełnienia poniższych warunków:
1. Redystrybucja tekstu zródłowego musi zawierać powyższe zastrzeżenie
własności praw autorskich, niniejszą listę warunków oraz poniższe oświadczenie
o wyłączeniu odpowiedzialności.
2. Redystrybucja kodu wykonywalnego musi zawierać w dokumentacji lub w
innych materiałach dostarczanych wraz z kopią oprogramowania powyższe
zastrzeżenie własności praw autorskich, niniejszą listę warunków oraz poniższe
oświadczenie o wyłączeniu odpowiedzialności.
3. Nazwisko autora nie może być użyte celem sygnowania lub promowania
produktów pochodzących od tego opracowania, bez szczególnego, wyrażonego
na piśmie zezwolenia.
To opracowanie jest dostarczone przez posiadacza praw autorskich takim, jakie jest .
Każda, dorozumiana lub bezpośrednio wyrażona gwarancja, nie wyłączając dorozumianej
gwarancji przydatności handlowej i przydatności do określonego zastosowania, jest
wyłączona. W żadnym wypadku posiadacz praw autorskich nie może być odpowiedzialny
za jakiekolwiek bezpośrednie, pośrednie, incydentalne, specjalne, uboczne i wtórne
szkody (nie wyłączając obowiązku dostarczenia produktu zastępczego lub serwisu,
odpowiedzialności z tytułu utraty walorów użytkowych, utraty danych lub korzyści, a
także przerw w pracy przedsiębiorstwa) spowodowane w jakikolwiek sposób i na
podstawie istniejącej w torii odpowiedzialności kontraktowej, całkowitej lub deliktowej
(wynikłej zarówno z niedbalstwa, jak i innych postaci winy), powstałe w jakikolwiek
sposób w wyniku używania lub mające związek z używaniem oprogramowania, nawet
jeśli o możliwości powstania takich szkód ostrzeżono.
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -3/12-
ealizacja kostki do gry nie należy do zbyt skomplikowanych. W naturalny
sposób narzuca się zastosowanie licznika, który liczy do 5 (po osiągnięciu tej
R
wartości w następnym cyklu wyzeruje się), co daje możliwość rozróżnienia 6
stanów. W odpowiednim momencie gracz naciskając odpowiedni przycisk powoduje
zapisanie stanu licznika (który z punktu widzenia gracza można uważać za
przypadkowy) do odpowiedniego rejestru. Zapisana w rejestrze liczba poprzez
odpowiedni układ kombinacyjny jest zobrazowana na diodach LED. Używając 7
LED'ów odpowiednio rozmieszczonych można na nich zobrazować wylosowany stan
w identyczny sposób jaki występuje w rzeczywistych kostkach do gry.
Jednak takie rozwiązanie posiada jedną wadę związaną z przyciskiem
oznaczającym wylosowanie wyniku. Powszechnie wiadomo, że w momencie zwarcia
oraz rozwarcia styków generowanych jest ileś krótkich impulsów. To zjawisko
nazywa się dzwonieniem styków i często w układach logicznych (cyfrowych) jest
niepożądane. Jedną z metod eliminacji skutków dzwonienia styków jest odczekanie
pewnego czasu. Rozwiązanie to można również zastosować w kostce. Układy PLD z
racji sporych zasobów różnych bramek i przerzutników, doskonale nadają się do
zastosowania w/w sposobu rozwiązania eliminacji dzwonienia styków. W tym celu
zostaje zbudowany synchroniczny automat (Moore'a). Dla automatu przewidziano
sześć stanów:
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -4/12-
Idle (stan 1 na rysunku grafu) stan bezczynności,
StartDelay (stan 2 na rysunku grafu) stan rozpoczęcia odmierzania czasu,
TimeDelay (stan 3 na rysunku grafu) stan oczekiwania na upłynięcia czasu,
StopDelay (stan 4 na rysunku grafu) stan zakończenia odmierzania czasu,
WaitOnFree (stan 5 na rysunku grafu) stan oczekiwania na zwolnienie
przycisku,
FreeDelay (stan 6 na rysunku grafu) stan odmierzania czasu do eliminacji
drgań związanych ze zwolnieniem przycisku).
W stanie 1 automat może przejść do stanu 2 w przypadku wykrycia przyciśnięcia
przycisku lub pozostać w stanie 1 (jeżeli nie wykryto aktywnego stany przycisku). W
stanie 2 generowane są odpowiednie sygnały sterujące (zerowanie pomocniczego 4-
bitowego licznika) i automat bezwarunkowo przechodzi do stanu 3. W stanie 3
automat rozpoczyna odliczanie czasu (aktywowane jest odliczanie impulsów w
pomocniczym liczniku) oraz bada, czy pomocniczy licznik nie osiągnął stanu samych
jedynek. Jeżeli ten warunek jest prawdziwy, to automat przechodzi do stanu 4, co
oznacza, że stan przycisku przez odpowiedni czas nie uległ zmianie, co należy uznać
że przycisk osiągnął stan stabilny. W przeciwnym czasie (nie upłynął odpowiedni
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -5/12-
czas) badany jest stan przycisku. Jeżeli przycisk został zwolniony, to automat
przechodzi do stanu 1 (jednocześnie przestaje odmierzać czas) lub jeżeli przycisk jest
nadal naciśnięty, pozostaje w stanie 3. W stanie 4, generowany jest impuls strobu
wpisu stanu licznika do rejestru wynikający z naciśnięcia przycisku, zeruje
pomocniczy licznik odmierzający czas (przygotowanie licznika do operacji
odmierzania czasu przy zwolnieniu przycisku) oraz bezwarunkowo przechodzi do
stanu 5. W stanie 5, automat oczekuje na zwolnienie przycisku. Jeżeli zostanie
wykryte zwolnienie przycisku, automat przechodzi do stanu 6 lub pozostaje nadal w
stanie 5. W stanie 6 ponownie aktywowane jest odmierzanie czasu pozwalające
pominąć fazę dzwonienia styków w trakcie zwolnienia przycisku. W upłynięciu
właściwego czasu, automat przechodzi do stanu 1.
Implementacja powyższej kostki do gry w języku VHDL jest następująca:
---------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity kostka is
Port ( Clk : in std_logic ;
StartKey : in std_logic ;
Reset : in std_logic ;
Qout : out std_logic_vector ( 6 downto 0 ) ) ;
end kostka ;
architecture Behavioral of kostka is
component Keyb Port ( Clk : in std_logic ;
Reset : in std_logic ;
KeyIn : in std_logic ;
KeyOut : out std_logic ) ;
end component ;
signal Counter : std_logic_vector ( 2 downto 0 ) ;
signal Number : std_logic_vector ( 2 downto 0 ) ;
signal DispEnable : std_logic ;
signal LEDData : std_logic_vector ( 6 downto 0 ) ;
signal Start : std_logic ;
begin
KeybInst : Keyb port map ( Clk => Clk ,
Reset => Reset,
KeyIn => StartKey ,
KeyOut => Start ) ;
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -6/12-
process ( Start , Reset )
begin
if ( Start = '0' ) then
DispEnable <= '1' ;
elsif ( Reset = '0' ) then
DispEnable <= '0' ;
end if ;
end process ;
process ( Clk , Reset )
begin
if ( Reset = '0' ) then
Counter <= "000" ;
else
if ( Clk'event and Clk = '1' ) then
if ( Counter = "101" ) then
Counter <= "000" ;
else
Counter <= Counter + "001" ;
end if ;
end if ;
end if ;
end process ;
process ( Start )
begin
if ( Start'event and Start = '0' ) then
Number <= Counter ;
end if ;
end process ;
-- O O 1 5
-- O O O 2 4 6
-- O O 3 7
with Number select
LEDData <= "1110111" when "000", --1
"1011101" when "001", --2
"1010101" when "010", --3
"0101010" when "011", --4
"0100010" when "100", --5
"0001000" when "101", --6
"1111111" when others ;
with DispEnable select
Qout <= LEDData when '1' ,
"1111111" when others ;
end Behavioral ;
Użyty komponent do obsługi przycisku (implementacja automatu) jest
następujący:
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -7/12-
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Keyb is
Port ( Clk : in std_logic ;
Reset : in std_logic ;
KeyIn : in std_logic ;
KeyOut : out std_logic ) ;
end Keyb ;
architecture Behavioral of Keyb is
type KeybStateType is ( Idle , StartDelay , TimeDelay , StopDelay ,
WaitOnFree , FreeDelay ) ;
signal KeybState : KeybStateType ;
signal Key : std_logic ;
signal TimerEnable : std_logic ;
signal TimerReset : std_logic ;
signal TimeUp : std_logic ;
signal TimerCnt : std_logic_vector ( 5 downto 0 ) ;
begin
process ( Clk , Reset , TimerReset )
begin
if Reset = '0' or TimerReset = '0' then
TimerCnt <= "000000" ;
else
if TimerEnable = '1' then
if ( Clk'event and Clk = '0' ) then
TimerCnt <= TimerCnt + "000001" ;
end if ;
end if ;
end if ;
end process ;
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -8/12-
with TimerCnt select
TimeUp <= '1' when "111111",
'0' when others ;
process ( Clk , Reset )
begin
if Reset = '0' then
KeybState <= Idle ;
else
if Clk'event and Clk = '1' then
case KeybState is
when Idle =>
TimerEnable <= '0' ;
TimerReset <= '1' ;
Key <= '1' ;
if KeyIn = '0' then
KeybState <= StartDelay ;
end if ;
when StartDelay =>
TimerEnable <= '0' ;
TimerReset <= '0' ;
Key <= '1' ;
KeybState <= TimeDelay ;
when TimeDelay =>
TimerEnable <= '1' ;
TimerReset <= '1' ;
Key <= '1' ;
if TimeUp = '1' then
KeybState <= StopDelay ;
else
if KeyIn = '0' then
KeybState <= TimeDelay ;
else
KeybState <= Idle ;
end if ;
end if ;
when StopDelay =>
TimerEnable <= '0' ;
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -9/12-
TimerReset <= '0' ;
Key <= '0' ;
KeybState <= WaitOnFree ;
when WaitOnFree =>
TimerEnable <= '0' ;
TimerReset <= '1' ;
Key <= '1' ;
if KeyIn = '1' then
KeybState <= FreeDelay ;
else
KeybState <= WaitOnFree ;
end if ;
when FreeDelay =>
TimerEnable <= '1' ;
TimerReset <= '1' ;
Key <= '1' ;
if TimeUp = '1' then
KeybState <= Idle ;
else
KeybState <= FreeDelay ;
end if ;
when others =>
KeybState <= Idle ;
end case;
end if ;
end if ;
end process ;
KeyOut <= Key ;
end Behavioral ;
Określenie wyprowadzeń układu:
#
NET "Clk" LOC = "P2" ;
NET "Qout<0>" LOC = "P24" ;
NET "Qout<1>" LOC = "P25" ;
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -10/12-
NET "Qout<2>" LOC = "P26" ;
NET "Qout<3>" LOC = "P27" ;
NET "Qout<4>" LOC = "P28" ;
NET "Qout<5>" LOC = "P29" ;
NET "Qout<6>" LOC = "P31" ;
NET "StartKey" LOC = "P4" | PULLUP ;
NET "Reset" LOC = "P6" | PULLUP ;
#
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -11/12-
Kilka wylosowanych wyników:
Andrzej Pawluczuk: Kostka do gry realizacja w układzie PLD, opis w języku VHDL -12/12-
Wyszukiwarka
Podobne podstrony:
JMLAB SIB&CUBcubwięcej podobnych podstron