У меня есть этот дизайн, который в основном представляет собой многофункциональный каландр со следующими функциями:
- отображает дату в этом [формате год/месяц/день: часы: минуты: секунды]
- Секундомер.
- Тревога .
- Опция повтора, когда будильник активен, и вы можете изменить период повтора или отключить будильник.
- события, которые будут сохранены в выбранную дату и время, и когда это произойдет, будет включена тревога.
это то, что я сделал для расчета часов [часы: минуты: секунды]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Clock is
port (clk : in std_logic;
seconds : out integer ;
minutes : out integer;
hours : out integer
);
end Clock;
architecture Behavioral of Clock is
signal sec,min : integer range 0 to 60 := 0 ;
signal hour : integer range 0 to 24 := 0 ;
begin
seconds <= sec;
minutes <= min;
hours <= hour;
process (clk)
begin
if (clk'event and clk='1') then
sec <=sec+1 ;
if (sec=60) then
min <= min+1 ;
sec <= 0 ;
if (min=60) then
hour <= hour +1;
min<=0;
if ( hour = 24) then
hour <= 0;
end if;
end if ;
end if;
end if;
end process ;
end Behavioral;
и этот код, чтобы сделать остальную информацию о дате [Год/месяц/день]...
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity calender is
port (
clk : in std_logic;
LYear : in std_logic;
O_DAYS_IN_MONTH : out unsigned(4 downto 0)
);
end entity calender;
architecture Behavioral of calender is
signal hours :integer;
signal Mday,day : integer range 1 to 31:=1;
signal month: integer range 1 to 12:=1;
signal year : integer range 2010 to 2030 :=2010;
begin
u0 : entity work.Clock port map ( clk => clk , hours => hours );
process ( clk,hours )
begin
if (clk'event and clk='1') then
if ( hours = 23 ) then
day <= day +1 ;
if ( day = Mday ) then
day <= 1;
month <= month +1 ;
if ( month = 13 ) then
month <= 1 ;
year <= year +1;
if ( year = 2030 ) then
year <= 2010;
end if;
end if;
end if;
end if;
end if;
end process;
process ( month , LYear)
begin
if ( month = 9 or month = 4 or month = 6 or month = 11) then
Mday <= 30;
elsif ( month = 2 and LYear = '0') then
Mday <= 28 ;
elsif ( month = 2 and LYear = '1') then
Mday <= 29;
else
Mday <= 31;
end if;
end process;
O_DAYS_IN_MONTH <= to_unsigned( Mday ,O_DAYS_IN_MONTH'length) ;
end architecture Behavioral;
Я также самостоятельно закодировал секундомер, который выходит на 7-сегментном спартанском 3, который выглядит следующим образом ...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity stop_watch is
port(
clr: in std_logic;
strt: in std_logic;
clk : in std_logic;
anode : out std_logic_vector (3 downto 0);
seg : out std_logic_vector (7 downto 0)
);
end stop_watch ;
architecture Behavioral of stop_watch is
signal dig1,dig2,dig3,dig4:std_logic_vector (7 downto 0);
signal clk10hz,clk1khz:std_logic;
begin
process (clr,strt,clk10hz)
variable d1,d2,d4:integer range 0 to 10;
variable d3:integer range 0 to 6;
begin
if(clr='1')then
d1:=0;
d2:=0;
d3:=0;
d4:=0;
elsif(clk10hz'event and clk10hz='1') then
if(strt='0')then
d1:=d1;
d2:=d2;
d3:=d3;
d4:=d4;
else
d1:= d1+1;
if(d1=10)then
d1:=0;
d2:=d2+1;
end if;
if(d2=10)then
d3:=d3+1;
d2:=0;
end if;
if(d3=6)then
d4:=d4+1;
d3:=0;
end if;
if(d4=10)then
d4:=0;
end if;
end if;
end if;
case d1 is
when 0 => dig1 <="10000001";
when 1 => dig1 <="11001111";
when 2 => dig1 <="10010010";
when 3 => dig1 <="10000110";
when 4 => dig1 <="11001100";
when 5 => dig1 <="10100100";
when 6 => dig1 <="10100000";
when 7 => dig1 <="10001111";
when 8 => dig1 <="10000000";
when 9 => dig1 <="10001100";
when 10 => dig1 <="10000001";
end case;
case d2 is
when 0 => dig2 <="00000001";
when 1 => dig2 <="01001111";
when 2 => dig2 <="00010010";
when 3 => dig2 <="00000110";
when 4 => dig2 <="01001100";
when 5 => dig2 <="00100100";
when 6 => dig2 <="00100000";
when 7 => dig2 <="00001111";
when 8 => dig2 <="00000000";
when 9 => dig2 <="00001100";
when 10 => dig2 <="00000001";
end case;
case d3 is
when 0 => dig3 <="10000001";
when 1 => dig3 <="11001111";
when 2 => dig3 <="10010010";
when 3 => dig3 <="10000110";
when 4 => dig3 <="11001100";
when 5 => dig3 <="10100100";
when 6 => dig3 <="10100000";
end case;
case d4 is
when 0 => dig4 <="00000001";
when 1 => dig4 <="01001111";
when 2 => dig4 <="00010010";
when 3 => dig4 <="00000110";
when 4 => dig4 <="01001100";
when 5 => dig4 <="00100100";
when 6 => dig4 <="00100000";
when 7 => dig4 <="00001111";
when 8 => dig4 <="00000000";
when 9 => dig4 <="00001100";
when 10 => dig4 <="00000001";
end case;
end process;
process (clk)
Variable Count: integer range 0 to 5000000 :=0;
begin
if (Clk'event and Clk ='1') then
count := count+1;
if ( count < 2500000 ) then
clk10Hz <= '0';
elsif (count = 2500000) then
clk10Hz <= '1';
elsif (count = 5000000) then
clk10Hz <= '0' ; count := 0;
end if;
end if;
end process ;
process (clk1Khz)
variable cnt : integer range 0 to 3:= 0;
begin
if (clk1Khz'event and clk1Khz='1') then
case cnt is
when 0 => anode <="1110";
seg<= dig1;
cnt:=cnt+1;
when 1 => anode <="1101";
seg<= dig2;
cnt:=cnt+1;
when 2 => anode <="1011";
seg<= dig3;
cnt:=cnt+1;
when 3 => anode <="0111";
seg <= dig4;
cnt:=0;
end case;
end if;
end process;
process (clk)
Variable Count: integer range 0 to 50000 :=0;
begin
if (Clk'event and Clk ='1') then
count := count+1;
if ( count < 25000 ) then
clk1Khz <= '0';
elsif (count = 25000) then
clk1Khz <= '1';
elsif (count = 50000) then
clk1Khz <= '0' ; count := 0;
end if;
end if;
end process ;
end Behavioral;
Теперь моя проблема..
Я должен вывести всю эту информацию на ЖК-дисплей в спартанском 3-AN, с которым у меня совершенно нет опыта, я знаю, что мой код еще не закончен, и мне все еще нужно делать некоторые деления часов, как я сделал в код секундомера, и я знаю, что деление часов будет изменено при взаимодействии с ЖК-дисплеем, поэтому я не стал писать его в своем коде, напишите сейчас. Если кто-нибудь может дать мне какую-либо информацию о том, как обращаться с ЖК-дисплеем, как отображать символы, как переходить от символа к другому, чтобы я мог изменить его, когда событие происходит с клавиатуры.
Вы можете сказать, что у меня нет опыта работы с этим ЖК-дисплеем в Spartan 3AN, я пытался увидеть руководство пользователя для платы, предоставленной xilinx, и я понял некоторые вещи из нее, но до сих пор не знаю, как ее использовать. Если есть какое-либо руководство, которое может помочь, этого будет более чем достаточно для меня.