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

📄 watch.vhd

📁 显示时分秒 vhdl kebianchongluojiqijian
💻 VHD
字号:
--*****************************************************************
--文件名: watch.vhd
--文件描述:本文件为电子设计而开发的多功能数字钟VHDL语言完整源代码
--该数字钟实现的功能有时间,秒表,闹钟,年月日的显示设置等
--开发小组:信科04-3班    吴喆    张力文   王腾腾
--时间:2007年7月
--*********************************************************************


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_UNSIGNED;

ENTITY watch IS
PORT(clk,scanclk,clr,clock,sclock,data,pause,m_add,h_add,mclock,hclock:IN STD_LOGIC;
	 music:OUT STD_LOGIC;
     row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
     led:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
	 leda:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END watch;

ARCHITECTURE Behavioral OF watch IS
SIGNAL clk_div2,clk_div1:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL clk_div3:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL clk0,clk1,nomusic,year:STD_LOGIC;
SIGNAL month:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL hh,hl,mh,ml,sh,sl:STD_LOGIC_VECTOR(3 DOWNTO 0);--时分秒
SIGNAL shh,shl,smh,sml,ss:STD_LOGIC_VECTOR(3 DOWNTO 0);--闹钟时分秒
SIGNAL ssh,ssl,fs,msh,msl:STD_LOGIC_VECTOR(3 DOWNTO 0);--秒表时分秒
SIGNAL nhh,nhl,nlh,nll,yh,yl,dh,dl:STD_LOGIC_VECTOR(3 DOWNTO 0);--年月日
SIGNAL dispcnt:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL numh:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL a,b,c,d:INTEGER range 0 to 9;


BEGIN
P1:PROCESS(clk)       ----产生脉冲信号
   BEGIN
       IF rising_edge(clk) THEN
               clk_div1<=clk_div1+'1';
			   IF ( clk_div1 = "1111101000")THEN
				  clk_div1 <= (others=>'0');
                  clk_div3<=clk_div3+'1';
			   END IF;
			   IF(  clk_div3 = "10100")  THEN
				  clk0 <= NOT clk0;				----产生1ms脉冲信号
				  clk_div3 <=  (others=>'0');
				  clk_div2<=clk_div2+'1';
			   END IF;
			   IF(  clk_div2 = "1111101000")   THEN
					  clk_div2 <= (others=>'0');
					  clk1 <= NOT clk1;			----产生1s脉冲信号
			   END IF;
       END IF;
END PROCESS P1;

P2:PROCESS(clk1,clr)    ---60秒计数器
   BEGIN
        IF(clr='1')AND(sclock = '0')AND(data='0') THEN
            sl<="0000";
            sh<="0000";
        ELSIF rising_edge(clk1)THEN
             IF sl="1001"THEN
				IF(sh="0101")THEN
             		sh<="0000";
            	ELSE 
               		sh<=sh+'1';
				END IF;
                sl<="0000";
             ELSE
                sl<=sl+'1';
             END IF;
		END IF;
END PROCESS P2;

P3:PROCESS(clk1,clr,sh,sl,m_add)   --60分计数器
BEGIN
IF (clr='1')AND(sclock = '0')AND(data='0')THEN
ml<="0000";
mh<="0000";
ELSIF rising_edge(clk1)THEN
IF(((sh="0101")AND(sl="1001"))OR(m_add='1'))THEN
	IF((mh="0101")AND(ml="1001"))THEN
		mh<="0000";ml<="0000";
	ELSIF ml="1001" THEN
		mh <= mh+'1';
		ml <= "0000"; 
	ELSE    
		ml<=ml+'1';
	END IF;
END IF;
END IF;
END PROCESS  P3;


P4:PROCESS(clk1,clr,mh,ml,sh,sl,h_add)    --24 时计数器
BEGIN
IF (clr='1')AND(sclock = '0')AND(data='0')THEN
hl<="0000";
hh<="0000";
ELSIF rising_edge(clk1)THEN
	IF(((sh="0101")AND(sl="1001")AND(mh="0101")AND(ml="1001"))OR(h_add='1'))THEN
		  IF((hh="0010")AND(hl="0011"))THEN
			 hh<="0000";hl<="0000";   
		  ELSIF(hl="1001")THEN
			hh <= hh +'1';
			hl <= "0000";
		  ELSE
			hl<=hl+'1';
		  END IF;
	END IF;
END IF;
END PROCESS P4;


P5:PROCESS(clk0,clr,sclock)    ---毫秒计数器
   BEGIN
        IF  (clr='1')AND(sclock='1')  THEN
            msl<="0000";
            msh<="0000";
			fs <="0000";
        ELSIF rising_edge(clk0) THEN
			IF sclock = '1' THEN
             IF (msl="1001")AND(pause='0') THEN
				IF(msh="1001")THEN
					if(fs="1001")THEN
						fs<="0000";
					ELSE	    
    				    fs<=fs+'1';
					END IF;   
					msh<="0000"; 	
				ELSE 
               		msh<=msh+'1';
				END IF;
                msl<="0000";
             ELSE
                msl<=msl+'1';
             END IF;
		  END IF;
		END IF;
END PROCESS P5;

P6:PROCESS(clk0,clr,msh,msl,fs,sclock)     --s 计数器
BEGIN
IF (clr='1')AND(sclock='1')THEN
ssl<="0000";
ssh<="0000";
ELSIF rising_edge(clk0)THEN
  IF (sclock = '1')AND(pause='0')THEN
	IF((fs="1001")AND(msh="1001")AND(msl="1001"))THEN
		  IF((ssh="0101")AND(ssl="1001"))THEN
			 ssh<="0000";ssl<="0000";   
		  ELSIF(ssl="1001")THEN
			ssh <= ssh +'1';
			ssl <= "0000";
		  ELSE
			ssl<=ssl+'1';
		  END IF;
	END IF;
END IF;
END IF;
END PROCESS P6;

P7:PROCESS(clock,clk1)     		---设置闹钟时间
BEGIN
IF rising_edge( clk1 ) THEN
   IF ( ( clock = '1')AND(mclock = '1')) THEN	
		IF( sml = "1001" ) THEN
			IF(smh="0101") THEN
				smh <="0000";
			ELSE
				smh <= smh+'1';
			END IF;
			sml <= "0000";
		ELSE
			sml <= sml + '1';--nomusic <= '1';
		END IF;
	END IF;
   IF (( clock = '1') AND (hclock = '1'))THEN 
		IF( (shh="0010")AND(shl ="0011") ) THEN
			shh <= "0000";shl <= "0000";
		ELSIF(shl="1001") THEN
				shh <= shh+'1';
				shl <= "0000";
		ELSE
			shl <= shl + '1';
		END IF;
	END IF;
END IF;
END PROCESS P7;


P8:PROCESS(clk1)		--闹钟音乐
BEGIN
IF rising_edge( clk1 ) THEN
	IF((shl = hl )AND(shh = hh)AND(sml = ml )AND(smh = mh)AND(nomusic = '0')) THEN
		music <= '1';
		ss <= sml + "0001";
		IF (clock = '1') THEN
			music <= '0';
			nomusic <= '1';
		END IF;
	END IF;
	IF(ml = ss) THEN
		 music <= '0';
		 nomusic <= '0';
	END IF;
 END IF;
END PROCESS P8;


P9:PROCESS(clk1,yh,yl,a,b,c,d) ---闰年,月份判断
VARIABLE q,w:INTEGER range 0 to 30 := 0 ;
VARIABLE count:INTEGER range 0 to 100 :=0;
BEGIN
	IF((yh="0000")AND(yl="0010"))THEN
		month<="00";
	ELSIF((yh="0000")AND(yl="0100"))OR((yh="0000")AND(yl="0110"))OR((yh="0000")AND(yl="1001"))OR((yh="0001")AND(yl="0001"))THEN
		month<="01";
	ELSE
		month<="10";
	END IF;

	IF (c=0)AND(d=0) THEN
		count := INTEGER(10*a+ 1*b);
		q:=INTEGER(count / 4 );
		w:=INTEGER(4*q);
		IF(count = w)  THEN
			year <= '0';
		ELSE
			year <= '1';
		END IF;
	ELSE
		count := INTEGER(10*c+ 1*d);
		q:=INTEGER(count / 4 );
		w:=INTEGER(4*q);
		IF(count = w)THEN
			year <= '0';
		ELSE
			year <= '1';
		END IF;
	END IF;
END PROCESS P9;



P10:PROCESS(clk1,clr,hh,hl,data,month,year) ---年月日
BEGIN
        IF(clr='1')AND(data ='1')  THEN
			yh<="0000";yl<="0001";
            dh<="0000";dl<="0001";
         	nhh<="0010";nhl<="0000";
			nlh<="0000";nll<="0000";
        ELSIF rising_edge(clk1) THEN
		    IF ((data='1')AND(pause='1')) THEN	
   			  IF (month="00") THEN
				 IF(year='0')THEN
					IF(dh="0010")AND(dl="1001")THEN
						dl<="0001";dh<="0000";
					ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
					ELSE
    				    dl<=dl+'1';
					END IF;
				 ELSE 
               		IF(dh="0010")AND(dl="1000")THEN
						dl<="0001";dh<="0000";
					ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
					ELSE
    				    dl<=dl+'1';
					END IF;
				 END IF;
             ELSIF(month="01")THEN
                IF(dh="0011")AND(dl="0000")THEN
					dh<="0000";dl<="0001";
				ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
				ELSE
    				    dl<=dl+'1';
				END IF;
			 ELSIF(month="10") THEN
				IF(dh="0011")AND(dl="0001")THEN
					dh<="0000";dl<="0001";
				ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
				ELSE
    				    dl<=dl+'1';
				END IF;
             END IF;
			END IF;

		    IF(data='1')AND(mclock='1')THEN
				IF(yh="0001")AND(yl="0010")THEN
					yh<="0000";yl<="0001";
				ELSIF(yl="1001")   THEN
					yl<="0000";yh<=yh+'1';
				ELSE 
					yl<=yl+'1';
				END IF;
		    END IF;	
	       IF(data='1')AND(hclock='1')THEN
				IF(nll="1001") THEN
					IF(nlh="1001")THEN
						IF(nhl="1001")THEN
							nhl<="0000";nhh<=nhh+'1';
						ELSE
							nlh<="0000";nhl<=nhl+'1';
						END IF;
					ELSE
						nll<="0000";nlh<=nlh+'1';
					END IF;
				ELSE
					nll<=nll+'1';
				END IF;
		    END IF;	

		   IF ((hh="0010")AND(hl="0011")AND(mh="0101")AND(ml="1001")AND(sh="0101")AND(sl="1001")) THEN	
   			  IF (month="00") THEN
				IF(year='0')THEN
					IF(dh="0010")AND(dl="1001")THEN
						dl<="0001";dh<="0000";
						yl<=yl+'1';
					ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
					ELSE
    				    dl<=dl+'1';
					END IF;
				 ELSE 
               		IF(dh="0010")AND(dl="1000")THEN
						dl<="0001";dh<="0000";
						yl<=yl+'1';
					ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
					ELSE
    				    dl<=dl+'1';
					END IF;
				 END IF;
             ELSIF(month="01")THEN
                IF(dh="0011")AND(dl="0000")THEN
					dh<="0000";dl<="0001";
					IF(yl="1001")THEN
						yl<="0000";yh<="0001";
					ELSE
						yl<=yl+'1';
					END IF;
				ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
				ELSE
    				    dl<=dl+'1';
				END IF;

			 ELSIF(month="10") THEN
				IF(dh="0011")AND(dl="0001")THEN
					dh<="0000";dl<="0001";
					IF(yh="0001")AND(yl="0010")THEN
						yl<="0001";yh<="0000";
						IF(nll="1001")THEN
							nll<="0000";
							IF(nlh="1001")THEN
								IF(nhl="1001")THEN
									nhl<="0000";nhh<=nhh+'1';
								ELSE
									nhl<=nhl+'1';
								END IF;
								nlh<="0000";
							ELSE
								nlh<=nlh+'1';
							END IF;
						ELSE
							nll<=nll+'1';
						END IF;		
					ELSE
						yl<=yl+'1';
					END IF;
				ELSIF(dl="1001")THEN
   						dl<="0000";dh<=dh+'1'; 
				ELSE
    				    dl<=dl+'1';
				END IF;
             END IF;
		  END IF;
		END IF;
END PROCESS P10;

P11:PROCESS(scanclk)     ---  动态扫描时钟
BEGIN
IF rising_edge(scanclk)THEN
IF dispcnt="111"THEN
dispcnt<="000";
ELSE
dispcnt<=dispcnt+'1';
END IF;
END IF;
END PROCESS P11;


P12:PROCESS(dispcnt,clock)     ---选择对应位BCD码
BEGIN
IF ( clock='1') THEN
	IF dispcnt="000"THEN
    row<="00100000";numh<=shh;
	ELSIF dispcnt="001"THEN
    row<="00010000";numh<=shl;
	ELSIF dispcnt="010"THEN
    row<="00001000";num<=smh;
	ELSIF dispcnt="011"THEN
    row<="00000100";num<=sml;
	ELSE
	    row<="00000000";num<="0000";
	END IF;
ELSIF (sclock = '1')THEN
	IF dispcnt="000"THEN
    row<="00100000";numh<=ssh;
	ELSIF dispcnt="001"THEN
    row<="00010000";numh<=ssl;
	--ELSIF dispcnt="010"THEN
    --row<="00001000";num<=fsh;
	ELSIF dispcnt="011"THEN
    row<="00000100";num<=fs;
	ELSIF dispcnt="100"THEN
    row<="00000010";num<=msh;
	ELSIF dispcnt="101"THEN
    row<="00000001";num<=msl;
	END IF;
ELSIF(data='1')THEN
	IF dispcnt="000"THEN
    row<="10000000";numh<=nhh;
	ELSIF dispcnt="001"THEN
    row<="01000000";numh<=nhl;
	ELSIF dispcnt="010"THEN
    row<="00100000";numh<=nlh;
	ELSIF dispcnt="011"THEN
    row<="00010000";numh<=nll;
	ELSIF dispcnt="100"THEN
    row<="00001000";num<=yh;
	ELSIF dispcnt="101"THEN
    row<="00000100";num<=yl;
	ELSIF dispcnt="110"THEN
    row<="00000010";num<=dh;
	ELSIF dispcnt="111"THEN
    row<="00000001";num<=dl;
	END IF;
ELSE	
	IF dispcnt="000"THEN
    row<="00100000";numh<=hh;
	ELSIF dispcnt="001"THEN
    row<="00010000";numh<=hl;
	ELSIF dispcnt="010"THEN
    row<="00001000";num<=mh;
	ELSIF dispcnt="011"THEN
    row<="00000100";num<=ml;
	ELSIF dispcnt="100"THEN
    row<="00000010";num<=sh;
	ELSIF dispcnt="101"THEN
    row<="00000001";num<=sl;
	END IF;
END IF;
END PROCESS P12;

WITH nhh SELECT				--年译码
a<=  1 WHEN"0001",  --1
	 2 WHEN"0010",  --2
	 3 WHEN"0011",  --3
	 4 WHEN"0100",  --4
	 5 WHEN"0101",  --5
	 6 WHEN"0110",  --6
	 7 WHEN"0111",  --7
	 8 WHEN"1000",  --8
	 9 WHEN"1001",  --9
	 0 WHEN OTHERS;  --0

WITH nhl SELECT				--年译码
b<=  1 WHEN"0001",  --1
	 2 WHEN"0010",  --2
	 3 WHEN"0011",  --3
	 4 WHEN"0100",  --4
	 5 WHEN"0101",  --5
	 6 WHEN"0110",  --6
	 7 WHEN"0111",  --7
	 8 WHEN"1000",  --8
	 9 WHEN"1001",  --9
	 0 WHEN OTHERS;  --0

WITH nlh SELECT				--年译码
c<=  1 WHEN"0001",  --1
	 2 WHEN"0010",  --2
	 3 WHEN"0011",  --3
	 4 WHEN"0100",  --4
	 5 WHEN"0101",  --5
	 6 WHEN"0110",  --6
	 7 WHEN"0111",  --7
	 8 WHEN"1000",  --8
	 9 WHEN"1001",  --9
	 0 WHEN OTHERS;  --0

WITH nll SELECT				--年译码
d<=  1 WHEN"0001",  --1
	 2 WHEN"0010",  --2
	 3 WHEN"0011",  --3
	 4 WHEN"0100",  --4
	 5 WHEN"0101",  --5
	 6 WHEN"0110",  --6
	 7 WHEN"0111",  --7
	 8 WHEN"1000",  --8
	 9 WHEN"1001",  --9
	 0 WHEN OTHERS;  --0


--dp,g,f,e,d,c,b,a
WITH num SELECT				--SEG3--SEG6段7段译码器
led<="00000110"WHEN"0001",  --1
	 "01011011"WHEN"0010",  --2
	 "01001111"WHEN"0011",  --3
	 "01100110"WHEN"0100",  --4
	 "01101101"WHEN"0101",  --5
	 "01111101"WHEN"0110",  --6
	 "00000111"WHEN"0111",  --7
	 "01111111"WHEN"1000",  --8
	 "01101111"WHEN"1001",  --9
	 "00111111"WHEN OTHERS;  --0

WITH numh SELECT				--SEG7--SEG10段7段译码器
leda<="00000110"WHEN"0001",  --1
	 "01011011"WHEN"0010",  --2
	 "01001111"WHEN"0011",  --3
	 "01100110"WHEN"0100",  --4
	 "01101101"WHEN"0101",  --5
	 "01111101"WHEN"0110",  --6
	 "00000111"WHEN"0111",  --7
	 "01111111"WHEN"1000",  --8
	 "01101111"WHEN"1001",  --9
	 "00111111"WHEN OTHERS;  --0


END behavioral;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -