zegar czasu rzeczywistego, ustawianie godzin i minut.

Dyskusje ogólne na temat "cyfrówki" czyli wszystko o TTL/CMOS, językach VHDL i VERILOG, bramkach, rejestrach, przerzutnikach... Dobre miejsce na pytania odnośnie uniwersalnych programatorów (np. Willem) a także podłączania własnych peryferiów do komputera PC.
ODPOWIEDZ
adiex1
-
Posty: 1
Rejestracja: 18 sty 2010, 21:26
Lokalizacja: Szczecin

zegar czasu rzeczywistego, ustawianie godzin i minut.

Post autor: adiex1 » 18 sty 2010, 23:12

Witam serdecznie,
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
Ostatnio zmieniony 19 sty 2010, 14:05 przez adiex1, łącznie zmieniany 1 raz.

ODPOWIEDZ