Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Autor: Bartłomiej Popiołek
- -- Nr indeksu: 243195
- -- Układ: Bankomat
- -----------------------------
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
- entity bankomat is
- port(
- clk, reset, karta, pot : in std_logic; -- wejście zegarowe, reset, karata bankomatowa, potwierdzenie
- kod, kwota : in std_logic_vector(3 downto 0); -- wejścia z pliku
- wyplacona_kwota : out std_logic_vector(3 downto 0)); -- wyjście z kwota wyplacona
- end bankomat;
- architecture bankomat_arch of bankomat is
- type STANY is (stan_uspienia, PIN, blokada, wybor_kwoty, wyplata, wydruk_potwierdzenia, plik); -- poszczególne stany
- signal stan, stan_nast : STANY; -- sygnał stanów
- signal srodki : std_logic_vector (3 downto 0) := "1110"; -- sygnał mówiący nam ile mammy środków na koncie
- signal proba : std_logic_vector (1 downto 0) := "01";
- signal kod_pop : std_logic_vector (3 downto 0) := "0101";
- begin
- reg: process(clk, reset)
- begin
- if(reset = '1') then
- stan <= stan_uspienia;
- elsif (clk'event and clk = '1') then
- stan <= stan_nast;
- end if;
- end process reg;
- work:process(stan, karta, kod, kod_pop, proba, kwota, srodki)
- begin
- stan_nast <= stan;
- case stan is
- when stan_uspienia =>
- if(karta = '1') then
- kod_pop <= "0101";
- srodki <= "1110";
- stan_nast <= PIN;
- end if;
- when PIN =>
- if (karta = '1') then
- if (proba = "01") then
- if (kod = kod_pop) then
- stan_nast <= wybor_kwoty;
- elsif (kod /= kod_pop) then
- stan_nast <= PIN;
- end if;
- elsif (proba = "10") then
- if (kod = kod_pop) then
- stan_nast <= wybor_kwoty;
- elsif (kod /= kod_pop) then
- stan_nast <= PIN;
- end if;
- elsif (proba = "11") then
- if (kod = kod_pop) then
- stan_nast <= wybor_kwoty;
- elsif (kod /= kod_pop) then
- stan_nast <= blokada;
- end if;
- end if;
- else
- stan_nast <= stan_uspienia;
- end if;
- when blokada =>
- if(karta = '1') then
- if (kod /= kod_pop) then
- srodki <= "0000";
- kod_pop <= "0000";
- stan_nast <= stan_uspienia;
- elsif (kod = kod_pop) then
- stan_nast <= wybor_kwoty;
- end if;
- else
- stan_nast <= stan_uspienia;
- end if;
- when wybor_kwoty =>
- if (karta = '1') then
- if (kwota = "0000") then
- stan_nast <= wybor_kwoty;
- elsif (kwota >= "0001") then
- stan_nast <= wyplata;
- end if;
- else
- stan_nast <= stan_uspienia;
- end if;
- when wyplata =>
- if(karta = '1') then
- if (srodki < kwota) then
- stan_nast <= wybor_kwoty;
- elsif (srodki >= kwota) then
- stan_nast <= wydruk_potwierdzenia;
- end if;
- else
- stan_nast <= stan_uspienia;
- end if;
- when wydruk_potwierdzenia =>
- if(karta = '1') then
- if (pot = '1') then
- stan_nast <= plik;
- else
- stan_nast <= stan_uspienia;
- end if;
- else
- stan_nast <= stan_uspienia;
- end if;
- when plik =>
- if (karta = '0') then
- stan_nast <= stan_uspienia;
- end if;
- end case;
- end process work;
- licz_prob:process(reset, clk, kod)
- begin
- if (reset = '1') then
- proba <= "00";
- elsif (clk'event and clk = '1') then
- if (stan = PIN and kod /= kod_pop) then
- proba <= proba + "01";
- if proba = "11" then
- proba <= "01";
- end if;
- elsif (kod = kod_pop) then
- proba <= proba;
- end if;
- end if;
- end process licz_prob;
- wyplacona_kwota <= kwota when stan = wydruk_potwierdzenia else "0000";
- end bankomat_arch;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement