📄 watchgai.vhd
字号:
--**********************************************************
--功能描述:数字电子表设计,分别显示时,分,秒,驱动八位数码管
-- 显示出12.12.12。三个按键,分别对时,分,秒进行初始
-- 设定或过程时间修改。
--**********************************************************
--程序心得:在同一段程序中,每一个process()中的量如果变化,
-- 则执行一次本段process,process中的量如果想同,则
-- 各个process同时进行。在分频时,要注意每个周期都包
-- 波峰和波谷,所以要将分频的倍数/2,如将50MHZ的频率
-- 分成1HZ,则需分频50*1024*1024/2。另外,对同一个量
-- 的赋值或者改动需要在同一个process中完成,不能在多
-- process中对同一个量进行改动,判定,赋值,否则会
-- 引起对同一变量的多驱动错误。在程序调试过程中,在
-- 按键去抖,和按键程序的位置问题并没有得到很好的解
-- 决,今后,要详细的研究下这方面的问题。
--**********************************************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;--库文件调用
entity watchgai is
port(
an1:in std_logic;
an2:in std_logic;
an3:in std_logic;--按键信号
clk:in std_logic;--时钟信号
bee:out std_logic;
data:out std_logic_vector(7 downto 0);--数码管显示信号
segment:out std_logic_vector(7 downto 0)--数码管亮灭信号
);
end watchgai;
architecture jishu of watchgai is
signal cnt:std_logic_vector(25 downto 0);--分频倍数,一秒
signal cnt1:std_logic_vector(24 downto 0);--分频倍数,亮灭,每个数码管工作频率大于50HZ就好
signal clk_temp:std_logic;--1秒
signal clk_temp1:std_logic;
signal beef:std_logic;
signal miao:std_logic_vector(5 downto 0);--秒位
signal fen:std_logic_vector(5 downto 0);--分位
signal shi:std_logic_vector(5 downto 0);--时位
signal p1: std_logic_vector(7 downto 0):="11000000";
signal p2: std_logic_vector(7 downto 0):="11000000";
signal p3: std_logic_vector(7 downto 0):="11000000";
signal p4: std_logic_vector(7 downto 0):="11000000";
signal p5: std_logic_vector(7 downto 0):="11000000";
signal p6: std_logic_vector(7 downto 0):="11000000";--各位数码管信号
signal qq: std_logic_vector(7 downto 0);--亮灭信号
signal bwm: std_logic_vector(7 downto 0);--显示信号
signal count:std_logic_vector(3 downto 0);
signal ma,fa,sa:std_logic_vector(24 downto 0);
begin
fenpin:process(clk)
begin
if clk'event and clk='1' then
if cnt="1100100000000000000000000" then
clk_temp<=not clk_temp;
cnt<="00000000000000000000000000";
else
cnt<=cnt+1;
end if;------分频器1秒
end if;
end process fenpin;
process(clk)
begin
if clk'event and clk='1' then
if cnt1="10001000000000000" then
clk_temp1<=not clk_temp1;
cnt1<="0000000000000000000000000";
else
cnt1<=cnt1+1;
end if;------分频器
end if;
end process;
S:process(clk_tmp)--主程序,控制数码管的每一位信号产生
begin
if clk_temp'event and clk_temp='1' then
if miao="111011" then
miao<="000000";
fen<=fen+1;
if fen="111011" then
fen<="000000";
shi<=shi+1;
if shi="011000" then
shi<="000000";
end if;
end if;
else
miao<=miao+1;
end if;--时,分,秒换算
end if;
--if an1='0' then
-- ma<=ma+1;
-- if ma="110010000000000000000000" then
-- ma<="0000000000000000000000000";
-- if miao="111011" then
-- miao<="000000";
-- else miao<=miao+1;
-- end if;
-- end if;
--else ma<="0000000000000000000000000";
--end if;
--if an2='0' then
-- fa<=fa+1;
-- if fa="110010000000000000000000" then
-- fa<="0000000000000000000000000";
-- if fen="111011" then
-- fen<="000000";
-- else fen<=fen+1;
-- end if;
-- end if;
--else fa<="0000000000000000000000000";
--end if;
--if an3='0' then
-- sa<=sa+1;
-- if sa="110010000000000000000000" then
-- if shi="010111" then
-- shi<="000000";
-- else shi<=shi+1;
-- end if;
-- end if;
--else sa<="0000000000000000000000000";
--end if;
case miao is--秒显示
when "000000"=>
p1<="11000000";
p2<="11000000";
--00
when "000001"=>
p1<="11111001";
p2<="11000000";
--01
when "000010"=>
p1<="10100100";
p2<="11000000";
--02
when "000011"=>
p1<="10110000";
p2<="11000000";
--03
when "000100"=>
p1<="10011001";
p2<="11000000";
--04
when "000101"=>
p1<="10010010";
p2<="11000000";
--05
when "000110"=>
p1<="10000010";
p2<="11000000";
--06
when "000111"=>
p1<="11111000";
p2<="11000000";
--07
when "001000"=>
p1<="10000000";
p2<="11000000";
--08
when "001001"=>
p1<="10010000";
p2<="11000000";
--09
when "001010"=>
p1<="11000000";
p2<="11111001";
--10
when "001011"=>
p1<="11111001";
p2<="11111001";
--11
when "001100"=>
p1<="10100100";
p2<="11111001";
--12
when "001101"=>
p1<="10110000";
p2<="11111001";
--13
when "001110"=>
p1<="10011001";
p2<="11111001";
--14
when "001111"=>
p1<="10010010";
p2<="11111001";
--15
when "010000"=>
p1<="10000010";
p2<="11111001";
--16
when "010001"=>
p1<="11111000";
p2<="11111001";
--17
when "010010"=>
p1<="10000000";
p2<="11111001";
--18
when "010011"=>
p1<="10010000";
p2<="11111001";
--19
when "010100"=>
p1<="11000000";
p2<="10100100";
--20
when "010101"=>
p1<="11111001";
p2<="10100100";
--21
when "010110"=>
p1<="10100100";
p2<="10100100";
--22
when "010111"=>
p1<="10110000";
p2<="10100100";
--23
when "011000"=>
p1<="10011001";
p2<="10100100";
--24
when "011001"=>
p1<="10010010";
p2<="10100100";
--25
when "011010"=>
p1<="10000010";
p2<="10100100";
--26
when "011011"=>
p1<="11111000";
p2<="10100100";
--27
when "011100"=>
p1<="10000000";
p2<="10100100";
--28
when "011101"=>
p1<="10010000";
p2<="10100100";
--29
when "011110"=>
p1<="11000000";
p2<="10110000";
--30
when "011111"=>
p1<="11111001";
p2<="10110000";
--31
when "100000"=>
p1<="10100100";
p2<="10110000";
--32
when "100001"=>
p1<="10110000";
p2<="10110000";
--33
when "100010"=>
p1<="10011001";
p2<="10110000";
--34
when "100011"=>
p1<="10010010";
p2<="10110000";
--35
when "100100"=>
p1<="10000010";
p2<="10110000";
--36
when "100101"=>
p1<="11111000";
p2<="10110000";
--37
when "100110"=>
p1<="10000000";
p2<="10110000";
--38
when "100111"=>
p1<="10010000";
p2<="10110000";
--39
when "101000"=>
p1<="11000000";
p2<="10011001";
--40
when "101001"=>
p1<="11111001";
p2<="10011001";
--41
when "101010"=>
p1<="10100100";
p2<="10011001";
--42
when "101011"=>
p1<="10110000";
p2<="10011001";
--43
when "101100"=>
p1<="10011001";
p2<="10011001";
--44
when "101101"=>
p1<="10010010";
p2<="10011001";
--45
when "101110"=>
p1<="10000010";
p2<="10011001";
--46
when "101111"=>
p1<="11111000";
p2<="10011001";
--47
when "110000"=>
p1<="10000000";
p2<="10011001";
--48
when "110001"=>
p1<="10010000";
p2<="10011001";
--49
when "110010"=>
p1<="11000000";
p2<="10010010";
--50
when "110011"=>
p1<="11111001";
p2<="10010010";
--51
when "110100"=>
p1<="10100100";
p2<="10010010";
--52
when "110101"=>
p1<="10110000";
p2<="10010010";
--53
when "110110"=>
p1<="10011001";
p2<="10010010";
--54
when "110111"=>
p1<="10010010";
p2<="10010010";
--55
when "111000"=>
p1<="10000010";
p2<="10010010";
--56
when "111001"=>
p1<="11111000";
p2<="10010010";
--57
when "111010"=>
p1<="10000000";
p2<="10010010";
--58
when "111011"=>
p1<="10010000";
p2<="10010010";
--59
when others=>
p1<="11000000";
p2<="11000000";
end case;
case fen is--分显示
when "000000"=>
p3<="11000000";
p4<="11000000";
--00
when "000001"=>
p3<="11111001";
p4<="11000000";
--01
when "000010"=>
p3<="10100100";
p4<="11000000";
--02
when "000011"=>
p3<="10110000";
p4<="11000000";
--03
when "000100"=>
p3<="10011001";
p4<="11000000";
--04
when "000101"=>
p3<="10010010";
p4<="11000000";
--05
when "000110"=>
p3<="10000010";
p4<="11000000";
--06
when "000111"=>
p3<="11111000";
p4<="11000000";
--07
when "001000"=>
p3<="10000000";
p4<="11000000";
--08
when "001001"=>
p3<="10010000";
p4<="11000000";
--09
when "001010"=>
p3<="11000000";
p4<="11111001";
--10
when "001011"=>
p3<="11111001";
p4<="11111001";
--11
when "001100"=>
p3<="10100100";
p4<="11111001";
--12
when "001101"=>
p3<="10110000";
p4<="11111001";
--13
when "001110"=>
p3<="10011001";
p4<="11111001";
--14
when "001111"=>
p3<="10010010";
p4<="11111001";
--15
when "010000"=>
p3<="10000010";
p3<="11111001";
--16
when "010001"=>
p3<="11111000";
p4<="11111001";
--17
when "010010"=>
p3<="10000000";
p4<="11111001";
--18
when "010011"=>
p3<="10010000";
p4<="11111001";
--19
when "010100"=>
p3<="11000000";
p4<="10100100";
--20
when "010101"=>
p3<="11111001";
p4<="10100100";
--21
when "010110"=>
p3<="10100100";
p4<="10100100";
--22
when "010111"=>
p3<="10110000";
p4<="10100100";
--23
when "011000"=>
p3<="10011001";
p4<="10100100";
--24
when "011001"=>
p3<="10010010";
p4<="10100100";
--25
when "011010"=>
p3<="10000010";
p4<="10100100";
--26
when "011011"=>
p3<="11111000";
p4<="10100100";
--27
when "011100"=>
p3<="10000000";
p4<="10100100";
--28
when "011101"=>
p3<="10010000";
p4<="10100100";
--29
when "011110"=>
p3<="11000000";
p4<="10110000";
--30
when "011111"=>
p3<="11111001";
p4<="10110000";
--31
when "100000"=>
p3<="10100100";
p4<="10110000";
--32
when "100001"=>
p3<="10110000";
p4<="10110000";
--33
when "100010"=>
p3<="10011001";
p4<="10110000";
--34
when "100011"=>
p3<="10010010";
p4<="10110000";
--35
when "100100"=>
p3<="10000010";
p4<="10110000";
--36
when "100101"=>
p3<="11111000";
p4<="10110000";
--37
when "100110"=>
p3<="10000000";
p4<="10110000";
--38
when "100111"=>
p3<="10010000";
p4<="10110000";
--39
when "101000"=>
p3<="11000000";
p4<="10011001";
--40
when "101001"=>
p3<="11111001";
p4<="10011001";
--41
when "101010"=>
p3<="10100100";
p4<="10011001";
--42
when "101011"=>
p3<="10110000";
p4<="10011001";
--43
when "101100"=>
p3<="10011001";
p4<="10011001";
--44
when "101101"=>
p3<="10010010";
p4<="10011001";
--45
when "101110"=>
p3<="10000010";
p4<="10011001";
--46
when "101111"=>
p3<="11111000";
p4<="10011001";
--47
when "110000"=>
p3<="10000000";
p4<="10011001";
--48
when "110001"=>
p3<="10010000";
p4<="10011001";
--49
when "110010"=>
p3<="11000000";
p4<="10010010";
--50
when "110011"=>
p3<="11111001";
p4<="10010010";
--51
when "110100"=>
p3<="10100100";
p4<="10010010";
--52
when "110101"=>
p3<="10110000";
p4<="10010010";
--53
when "110110"=>
p3<="10011001";
p4<="10010010";
--54
when "110111"=>
p3<="10010010";
p4<="10010010";
--55
when "111000"=>
p3<="10000010";
p4<="10010010";
--56
when "111001"=>
p3<="11111000";
p4<="10010010";
--57
when "111010"=>
p3<="10000000";
p4<="10010010";
--58
when "111011"=>
p3<="10010000";
p4<="10010010";
--59
when others=>
p3<="11000000";
p4<="11000000";
end case;
case shi is--时显示
when "000000"=>
p5<="11000000";
p6<="11000000";
--00
when "000001"=>
p5<="11111001";
p6<="11000000";
--01
when "000010"=>
p5<="10100100";
p6<="11000000";
--02
when "000011"=>
p5<="10110000";
p6<="11000000";
--03
when "000100"=>
p5<="10011001";
p6<="11000000";
--04
when "000101"=>
p5<="10010010";
p6<="11000000";
--05
when "000110"=>
p5<="10000010";
p6<="11000000";
--06
when "000111"=>
p5<="11111000";
p6<="11000000";
--07
when "001000"=>
p5<="10000000";
p6<="11000000";
--08
when "001001"=>
p5<="10010000";
p6<="11000000";
--09
when "001010"=>
p5<="11000000";
p6<="11111001";
--10
when "001011"=>
p5<="11111001";
p6<="11111001";
--11
when "001100"=>
p5<="10100100";
p6<="11111001";
--12
when "001101"=>
p5<="10110000";
p6<="11111001";
--13
when "001110"=>
p5<="10011001";
p6<="11111001";
--14
when "001111"=>
p5<="10010010";
p6<="11111001";
--15
when "010000"=>
p5<="10000010";
p6<="11111001";
--16
when "010001"=>
p5<="11111000";
p6<="11111001";
--17
when "010010"=>
p5<="10000000";
p6<="11111001";
--18
when "010011"=>
p5<="10010000";
p6<="11111001";
--19
when "010100"=>
p5<="11000000";
p6<="10100100";
--20
when "010101"=>
p5<="11111001";
p6<="10100100";
--21
when "010110"=>
p5<="10100100";
p6<="10100100";
--22
when "010111"=>
p5<="10110000";
p6<="10100100";
--23
when others=>
p5<="11000000";
p6<="11000000";
end case;
end process;
process(clk_temp1)--用从右向左流水灯的方式控制每一个数码管的亮灭
begin
if clk_temp1'event and clk_temp1='1' then
if count="1000" then
count<="0000";
end if;
case count is
when "0000"=>qq<="11111110";
bwm<=p1;
when "0001"=>qq<="11111101";
bwm<=p2;
when "0010"=>qq<="11111011";
bwm<="01111111";
when "0011"=>qq<="11110111";
bwm<=p3;
when "0100"=>qq<="11101111";
bwm<=p4;
when "0101"=>qq<="11011111";
bwm<="01111111";
when "0110"=>qq<="10111111";
bwm<=p5;
when "0111"=>qq<="01111111";
bwm<=p6;
when others=>qq<="11111111";
bwm<=p1;
end case;
count<=count+1;
end if;
end process;
bee<=beef;
data<=bwm;
segment<=qq;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -