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

📄 tclk.vhd

📁 ALARM=1时蜂鸣器叫。 --第50秒时开始叫
💻 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 + -