Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ############################## kod dla licznika sek####################################
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.std_logic_unsigned.all;
- entity licznik_sek is
- port (
- clk,START,US,min_rowne_zero : in std_logic;
- licz_sek_jed,licz_sek_dzi: out std_logic_vector (3 downto 0);
- wyzerowanie_sek : out std_logic);
- end licznik_sek;
- architecture licz_sek of licznik_sek is
- signal sek_jed : std_logic_vector (3 downto 0);
- signal sek_dzi : std_logic_vector (3 downto 0);
- begin
- process(clk)
- begin
- if rising_edge (clk) then
- --dekrementacja
- if START='1' then --w przypadku ustawienia 1-ki na przycisku "start" rozpoczynana jest dekrementacja
- if sek_jed/="0000" then --gdy jedności sekund nie są równe zero, dekrementuje o 1 jedności
- sek_jed<=(sek_jed-'1');
- else
- if sek_dzi/="0000" then --w innym wypadku sprawdza dodatkowo czy dziesiątki sekund różnią się od zera, jeśli tak to dekrementuje dziesiątki
- sek_jed<="1001";
- sek_dzi<=(sek_dzi-'1');
- else
- if min_rowne_zero = '0' then --jeśli poprzedni warunek nie jest spełniony oraz na wyświetlaczu minut jedności i dzisiątki są równe zero to:
- sek_dzi<="0101"; --na dzisiatkach sekund ustawiana jest "5" oraz "9" na jednościach.
- sek_jed<="1001";
- end if;
- end if;
- end if;
- end if;
- --inkrementacja
- if START='0' then --w przypadku nieaktywowanego przycisku "start" oraz obecności 1-ki na US realizowana jest inkrementacja licznika sekund
- if US = '1' then
- if sek_jed/="1001" then --jeśli na jednościach sekund jest liczba różna od "9" to inkrementowane są jedności
- sek_jed<=(sek_jed+'1');
- else
- if sek_dzi/="0101" then -- w przypadku gdy jedności = "9" oraz dzisiątki są różne od 5, następuje inkrementacja dziesiątek, a jedności są zerowane
- sek_dzi<=(sek_dzi + '1');
- sek_jed<="0000";
- else
- sek_dzi<="0000"; -- w wypadku pojawienia sie liczby 59 ("5"-sek_dzi, "9"-sek_jed), licznik sekund zostaje wyzerowany
- sek_jed<="0000";
- end if;
- end if;
- end if;
- end if;
- end if;
- --sprawdzanie wyzerowania
- if falling_edge (clk) then
- if sek_dzi="0000" and sek_jed="0000" then -- w przypadku występowania "0" na jednościach i dziesiątkach sekund, ustawiana jest 1-ka na "wyzerowanie_sek"
- wyzerowanie_sek<='1'; -- aby wiadomo było że licznik sekund jest obecnie wyzerowany
- else
- wyzerowanie_sek<='0';
- end if;
- end if;
- licz_sek_jed<= sek_jed; -- przepisanie stanu jedności oraz dzisiątek w celu wyprowadzenia ich na wyjście
- licz_sek_dzi<=sek_dzi;
- end process;
- end architecture;
- ###########################kod dla licznika minut################################################
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.std_logic_unsigned.all;
- entity licznik_min is
- port (
- clk,START,UM,sek_rowne_zero : in std_logic;
- licz_min_jed,licz_min_dzi: out std_logic_vector (3 downto 0);
- wyzerowanie_min : out std_logic);
- end licznik_min;
- architecture licz_min of licznik_min is
- signal min_jed : std_logic_vector (3 downto 0);
- signal min_dzi : std_logic_vector (3 downto 0);
- begin
- process(clk)
- begin
- if rising_edge (clk) then
- --dekrementacja
- if START='1' then --w przypadku ustawienia 1-ki na przycisku "start" rozpoczynana jest dekrementacja
- if sek_rowne_zero='1' then --gdy mamy informacje że licznik sekund jest wyzerowany to:
- if min_jed/="0000" then --dekrementowane są jedności minut pod warunkiem, że nie są równe 0
- min_jed<=(min_jed-'1');
- else
- if min_dzi/="0000" then -- w przeciwnym wypadku (jedności="0") sprawdzany jest stan dzisiątek, gdy nie są równe 0 następuje dekrementacja dziesiątek a na jednościach ustawiana jest "9"
- min_jed<="1001";
- min_dzi <= (min_dzi - '1');
- end if;
- end if;
- end if;
- end if;
- --inkrementacja (działa w taki sam sposób jak inkrementacja w liczniku sekund, różniąc się tylko, że w tym wypadku zamiast przycisku US interesuje nas przycisk UM)
- if START='0' then
- if UM='1' then
- if min_jed/="1001" then
- min_jed<=(min_jed+'1');
- else
- if min_dzi/="0101" then
- min_dzi<=(min_dzi+'1');
- min_jed<="0000";
- else
- min_dzi<="0000";
- min_jed<="0000";
- end if;
- end if;
- end if;
- end if;
- --sprawdzanie wyzerowania (identyczny sposób jak w liczniku sekund)
- if min_dzi="0000" and min_jed="0000" then
- wyzerowanie_min<='1';
- else
- wyzerowanie_min<='0';
- end if;
- end if;
- licz_min_jed<=min_jed;
- licz_min_dzi<=min_dzi;
- end process;
- end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement