📄 tclk.vhd
字号:
--alarm=1时蜂鸣器叫。--第50秒时开始叫,连续叫10秒,前9秒为低音,最后1秒为高音。--高音为500HZ,低音为250HZ。--按住MS3(ML3灯灭)时自动加,按调分键MS2(ML2灯灭)分自动加。--6个共阴LED数码管分别显示时/分/秒,6个LED数码管动态扫描显示。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY TCLK ISPORT( ADDR :IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK :IN STD_LOGIC;--分频CLK1为1HZ,CLK2为1KHZ MS1,MS2,MS3:IN STD_LOGIC;--MS1,MS2为调时调分键,MS3为使能键 LEDW :OUT STD_LOGIC_VECTOR(2 DOWNTO 0); LEDD :OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--显示输出 ALARM :OUT STD_LOGIC --蜂鸣器 );END TCLK;ARCHITECTURE HAV OF TCLK ISSIGNAL H1,M1,S1:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL KNUM:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL COUNT:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL CLK1,CLK2:STD_LOGIC;BEGINPROCESS(CLK)-- 10000分频器,10MHZ->1000HZ VARIABLE TEMP2:INTEGER RANGE 0 TO 10000; VARIABLE CL2:STD_LOGIC; BEGIN IF RISING_EDGE(CLK) THEN IF TEMP2=9999 THEN TEMP2:=0;CL2:='1'; ELSE TEMP2:=TEMP2+1; CL2:='0'; END IF; END IF; CLK2<=CL2;END PROCESS;PROCESS(CLK2)-- 1000分频器,1000HZ->1HZ VARIABLE TEMP1:INTEGER RANGE 0 TO 1000; VARIABLE CL1:STD_LOGIC; BEGIN IF RISING_EDGE(CLK1) THEN IF TEMP1=999 THEN TEMP1:=0;CL1:='1'; ELSE TEMP1:=TEMP1+1; CL1:='0'; END IF; END IF; CLK1<=CL1; END PROCESS;PROCESS(CLK1)BEGINIF(CLK1'EVENT AND CLK1='1')THEN IF(MS3='1')THEN IF(H1="00100011"AND M1="01011001"AND S1="01011001")THEN--23:59:59时变为00:00:00 H1<="00000000";M1<="00000000";S1<="00000000"; ELSIF(H1<="00001001"AND M1="01011001"AND S1="01011001")THEN --9:59:59时小时加7变为10:00:00 H1<=H1+7;M1<="00000000";S1<="00000000"; ELSIF(M1="01011001"AND S1="01011001")THEN --*:59:59时小时加1,分秒变0 H1<=H1+1;M1<="00000000";S1<="00000000"; ELSIF(M1="00001001"AND S1="01011001")THEN--*9:59时分加7变为*:10:00 M1<=M1+7;S1<="00000000"; ELSIF(S1="01011001")THEN --59秒时分加1,秒为0 M1<=M1+1;S1<="00000000"; ELSIF(S1(3 DOWNTO 0)="1001")THEN --秒加1 S1<=S1+7; ELSE S1<=S1+1; END IF; ELSIF(MS1='0')THEN --当MS3=0,MS1=0时调时 IF(H1="00100011")THEN H1<="00000000"; ELSIF(M1(3 DOWNTO 0)="1001")THEN H1<=H1+7; ELSE H1<=H1+1; END IF; ELSIF(MS2='0')THEN --当MS3=0,MS2=0时调分 IF(M1="01011001")THEN M1<="00000000"; ELSIF(M1(3 DOWNTO 0)="1001")THEN M1<=M1+7; ELSE M1<=M1+1; END IF; END IF; END IF;END PROCESS;PROCESS(CLK2) --6进制加1计数器,代码为3位二进制 BEGIN IF CLK2'EVENT AND CLK2='1'THEN IF COUNT<=5 THEN COUNT<=COUNT+1; ELSE COUNT<="000"; END IF; END IF;END PROCESS;LEDW<=COUNT; --LEDW经74LS138译码后产生动态扫描位选码KNUM<=S1(3 DOWNTO 0)WHEN COUNT=0 ELSE S1(7 DOWNTO 4)WHEN COUNT=1 ELSE M1(3 DOWNTO 0)WHEN COUNT=2 ELSE M1(7 DOWNTO 4)WHEN COUNT=3 ELSE H1(3 DOWNTO 0)WHEN COUNT=4 ELSE H1(7 DOWNTO 4);LEDD<="00111111"WHEN KNUM=0 ELSE --产生共阴极数码管的段码 "00000110"WHEN KNUM=1 ELSE "01011011"WHEN KNUM=2 ELSE "01001111"WHEN KNUM=3 ELSE "01100110"WHEN KNUM=4 ELSE "01101101"WHEN KNUM=5 ELSE "01111101"WHEN KNUM=6 ELSE "00000111"WHEN KNUM=7 ELSE "01111111"WHEN KNUM=8 ELSE "01101111"WHEN KNUM=9 ELSE "01110111"WHEN KNUM=10 ELSE "01111100"WHEN KNUM=11 ELSE "00111001"WHEN KNUM=12 ELSE "01011110"WHEN KNUM=13 ELSE "01111001"WHEN KNUM=14 ELSE "01110001"WHEN KNUM=15 ELSE "00000000"; ALARM<=COUNT(1)WHEN M1="01011001"AND S1(7 DOWNTO 4)="0101"ELSE--整点报时 COUNT(0)WHEN M1="00000000"AND S1="00000000"ELSE '0'; END HAV;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -