资源描述
-------------------------------------
-- Title:多功能数字秒表 --
-- Author:Pan hongtao --
-- Data: 2006-10-1 --
-------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entity stopwatch is
port( Clk : in std_logic; --时钟输入
reset : in std_logic; --复位输入
start,over : in std_logic; --秒表控制输入
ledag : out std_logic_vector(6 downto 0); --七段码管显示输出
SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动
);
end stopwatch;
--------------------------------------------------------------------
architecture behave of stopwatch is
signal Disp_Temp : integer range 0 to 15;
signal Disp_Decode : std_logic_vector(6 downto 0);
signal mSEC1,mSEC10 : integer range 0 to 9;
signal SEC1,SEC10 : integer range 0 to 9;
signal MIN1,MIN10 : integer range 0 to 9;
signal HOUR1,HOUR10 : integer range 0 to 9;
signal Clk1kHz : std_logic;
signal Clk100Hz : std_logic;
signal Start_Flag : std_logic;
signal Music_Count : std_logic_vector(2 downto 0);
begin
PROCESS(clk) --generate 100hz clock signal
variable cnt : INTEGER RANGE 0 TO 499999;--产生100Hz时钟的分频计数器
BEGIN
IF clk='1' AND clk'event THEN
IF cnt=499999 THEN cnt:=0;
ELSE
IF cnt<250000 THEN clk100hz<='1';
ELSE clk100hz<='0';
END IF;
cnt:=cnt+1;
END IF;
END IF;
END PROCESS;
PROCESS(clk) --generate 1khz clock signal
variable cnt1 : INTEGER RANGE 0 TO 49999;--产生1kHz时钟的分频计数器
BEGIN
IF clk='1' AND clk'event THEN
IF cnt1=49999 THEN cnt1:=0;
ELSE
IF cnt1<25000 THEN clk1khz<='1';
ELSE clk1khz<='0';
END IF;
cnt1:=cnt1+1;
END IF;
END IF;
END PROCESS;
process(Clk100Hz)
begin
if(reset='0') then --系统复位
mSEC1<=0;
mSEC10<=0;
SEC1<=0;
SEC10<=0;
MIN1<=0;
MIN10<=0;
HOUR1<=0;
HOUR10<=0;
Start_Flag<='0';
elsif(start='0' and Start_Flag='0') then
Start_Flag<='1';
elsif(over='0' and Start_Flag='1') then
Start_Flag<='0';
elsif(Clk100Hz'event and Clk100Hz='1') then --正常运行
if(Start_Flag='1') then
if(mSEC1=9) then
mSEC1<=0;
if(mSEC10=9) then
mSEC10<=0;
if(SEC1=9) then
SEC1<=0;
if(SEC10=5) then
SEC10<=0;
if(MIN1=9) then
MIN1<=0;
if(MIN10=5) then
MIN10<=0;
if(HOUR1=9) then
HOUR1<=0;
if(HOUR10=9) then
HOUR10<=0;
else
HOUR10<=HOUR10+1;
end if;
else
HOUR1<=HOUR1+1;
end if;
else
MIN10<=MIN10+1;
end if;
else
MIN1<=MIN1+1;
end if;
else
SEC10<=SEC10+1;
end if;
else
SEC1<=SEC1+1;
end if;
else
mSEC10<=mSEC10+1;
end if;
else
mSEC1<=mSEC1+1;
end if;
end if;
end if;
end process;
process(SEL)
begin
if(HOUR1=0) then
case (SEL+1) is
when "111"=>Disp_Temp<=MIN10;
when "110"=>Disp_Temp<=MIN1;
when "101"=>Disp_Temp<=10;
when "100"=>Disp_Temp<=SEC10;
when "011"=>Disp_Temp<=SEC1;
when "010"=>Disp_Temp<=10;
when "001"=>Disp_Temp<=mSEC10;
when "000"=>Disp_Temp<=mSEC1;
end case;
else
case (SEL+1) is
when "111"=>Disp_Temp<=HOUR10;
when "110"=>Disp_Temp<=HOUR1;
when "101"=>Disp_Temp<=10;
when "100"=>Disp_Temp<=MIN10;
when "011"=>Disp_Temp<=MIN1;
when "010"=>Disp_Temp<=10;
when "001"=>Disp_Temp<=SEC10;
when "000"=>Disp_Temp<=SEC1;
end case;
end if;
end process;
process(Clk1khz)
begin
if(Clk1khz'event and Clk1khz='1') then --扫描累加
SEL<=SEL+1;
ledag<=Disp_Decode;
end if;
end process;
process(Disp_Temp) --显示转换
begin
case Disp_Temp is
when 0=>Disp_Decode<="0111111"; --0
when 1=>Disp_Decode<="0000110"; --1
when 2=>Disp_Decode<="1011011"; --2
when 3=>Disp_Decode<="1001111"; --3
when 4=>Disp_Decode<="1100110"; --4
when 5=>Disp_Decode<="1101101"; --5
when 6=>Disp_Decode<="1111101"; --6
when 7=>Disp_Decode<="0000111"; --7
when 8=>Disp_Decode<="1111111"; --8
when 9=>Disp_Decode<="1101111"; --9
when 10=>Disp_Decode<="1000000"; ---
when others=>Disp_Decode<="0000000"; --全灭
end case;
end process;
end behave;
展开阅读全文