⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchgai.vhd

📁 利用FPGA的V4开发板制作的电子表
💻 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 + -