Posiadam zegar , poprawnie napisany i sprawdzony w vhdl. Kod dla spartana.
Materiał dydaktyczny DIO1
Zegar działa i liczy , po 23: 59 sie zeruje 00:00.
Czy ktoś bardziej doświadczony wie może jak zrobić żeby działało ustawianie minut i godzin.
Czy mógłby ktoś wstawić element kodu który pozwala na ustawianie minut i godzin.
I oczywiście powiedział pomiędzy gdzie ten kod trzeba wstawić żeby to działało.
Obecny kod to jest liczący poprawnie zegar. Ale brak ustawiania minut i godzin.
Wiem że musi być eliminacja drgań.Czy mógłby ktoś wstawić kod chociaż dla ustawienia pierwszego wyświetlacza.
Dzięki za pomoc.
KOD ZEGARA bez ustawiania minut i godzin.
Kod: Zaznacz cały
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clo1 is
Port ( clk : in std_logic; --zegar
anody : out std_logic_vector(0 to 3);
led : out std_logic_vector(6 downto 0)); --ledy dla 7-seg wyswietlaczy
end clo1;
architecture Behavioral of clo1 is
signal sek:std_logic_vector( 5 downto 0);
signal minuty_l : std_logic_vector (3 downto 0);
signal minuty_h : std_logic_vector (3 downto 0);
signal godziny_l :std_logic_vector (3 downto 0);
signal godziny_h : std_logic_vector (3 downto 0);
signal nr_znaku: std_logic_vector (1 downto 0);
signal bcd: std_logic_vector (3 downto 0);
signal div1: std_logic_vector (26 downto 0);
signal div2: std_logic_vector (16 downto 0);
begin
process (clk)
begin
--dzialanie
--podzielenie 50MHz na 1Hz
if rising_edge(clk) then
div1 <= div1 + 1;
if div1 =1000000 then
div1 <= (others => '0');
sek <= sek +1;
if (sek = "111011") then
sek <= "000000";
minuty_l <= minuty_l + 1;
if (minuty_l="1001") then
minuty_l <= "0000";
minuty_h <= minuty_h + 1;
if (minuty_h = "0101") then
minuty_h <= "0000";
godziny_l <= godziny_l + 1;
if (godziny_l="1001") then
godziny_l <= "0000";
godziny_h <= godziny_h + 1;
end if;
end if;
end if;
end if;
if (godziny_h ="0010" and godziny_l ="0011") then
godziny_l <= "0000";
godziny_h <= "0000";
end if;
end if;
end if;
end process;
-- WYSWIETLANIE
--mux wyswietlanej cyfry
with nr_znaku select
bcd <= godziny_h when "00",
godziny_l when "01",
minuty_h when "10",
minuty_l when "11",
"1111" when others;
--licznik wyswietlanej cyfry
licz_adr: process (clk)
begin
--podzielenie 50MHz na 1kHz
if rising_edge(clk) then
div2 <= div2 + 1;
if div2 =50000 then
div2 <= (others => '0');
nr_znaku <= nr_znaku + 1;
end if;
end if;
end process;
--dekoder znaku dla anod
with nr_znaku select
anody <= "1000" when "00",
"0100" when "01",
"0010" when "10",
"0001" when "11",
"0000" when others;
-- dekoder dla katod
with bcd select
led <= "0000001" when "0000",
"1001111" when "0001",
"0010010" when "0010",
"0000110" when "0011",
"1001100" when "0100",
"0100100" when "0101",
"0100000" when "0110",
"0001111" when "0111",
"0000000" when "1000",
"0000100" when "1001",
"1111111" when others;
end Behavioral;
Proszę pamiętać o znacznikach [code] oraz [/code] przy prezentacji kodu. marcing