基于VHDL的动态扫描数字时钟

基于VHDL的动态扫描数字时钟

什么是动态扫描呢?打地鼠游戏,有六个洞口,已知地鼠会依次的出现,洞1、洞2、…,并且同一时刻不会同时出现两只地鼠。地鼠会从小长到大,当距离上一次被打超过n秒,他就会特别大以至于锤子不能把它打下去,那么游戏就失败了。现在有两种方案,1、用六个人六只锤子,每个人盯一个洞口。2、用一个人一个锤子,盯着六个洞口。你品吧,细细品。嗯嗯,我是这样理解动态扫描的。

现在有六位数码管,要求做一个时钟,能同时显示小时、分、秒。先上效果图在这里插入图片描述

![有点乱啊,凑合看吧。](https://img-blog.csdnimg.cn/20200501180836392.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E4MDk1ODY5Mjk=,size_16,color_FFFFFF,t_70#pic_center

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY eda1 IS
  PORT (      CLK:IN STD_LOGIC;
      C_OUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
L0,L1,L2,L3,L4,L5:OUT STD_LOGIC);    
END ENTITY;
ARCHITECTURE BHV OF eda1 IS
 SIGNAL Q:INTEGER RANGE 0 TO 50000000;
 SIGNAL SEL:STD_LOGIC_VECTOR(2 DOWNTO 0);
 SIGNAL CLK2:STD_LOGIC;
 SIGNAL S1:STD_LOGIC;
 SIGNAL S10:STD_LOGIC;
 SIGNAL m1:STD_LOGIC;
 SIGNAL m10:STD_LOGIC;
 SIGNAL h1:STD_LOGIC;
 SIGNAL h10:STD_LOGIC;
 SIGNAL SEC1:STD_LOGIC_VECTOR(3 DOWNTO 0);
 SIGNAL SEC10:STD_LOGIC_VECTOR(3 DOWNTO 0);
 SIGNAL MIN1: STD_LOGIC_VECTOR(3 DOWNTO 0);
 SIGNAL MIN10: STD_LOGIC_VECTOR(3 DOWNTO 0);
 SIGNAL HOUR1: STD_LOGIC_VECTOR(3 DOWNTO 0);
 SIGNAL HOUR10: STD_LOGIC_VECTOR(3 DOWNTO 0);
 BEGIN
PROCESS(CLK) 
         BEGIN
    IF CLK'EVENT AND CLK='1' THEN 
     IF Q=50000000 THEN CLK2<='1';Q<=0;
     ELSE CLK2<='0';Q<=Q+1; END IF;
     END IF;
END PROCESS; 
PROCESS(CLK2)  
       BEGIN 
    IF CLK2'EVENT AND CLK2='1' THEN
     IF SEC1<"1001" THEN SEC1<=SEC1+1;S1<='0';
     ELSE SEC1<="0000";S1<='1';
     END IF;
    END IF; 
END PROCESS; 
PROCESS(S1)
 BEGIN
  IF CLK2'EVENT AND CLK2='1' THEN
    IF S1='1' THEN 
    IF SEC10="0101" THEN 
    SEC10<="0000";S10<='1';
      ELSE SEC10<=SEC10+1;S10<='0';
      END IF;
   END IF;
  END IF;
 END PROCESS;
PROCESS(S10)
 BEGIN
  IF CLK2'EVENT AND CLK2='1' THEN
    IF S10='1' THEN 
    IF MIN1="1001" THEN 
    MIN1<="0000";
     M1<='1';
  ELSE MIN1<=MIN1+1;
     M1<='0';
      END IF;
   END IF;
  END IF;  
 END PROCESS; 
PROCESS(M1)
 BEGIN
  IF CLK2'EVENT AND CLK2='1' THEN
    IF M1='1' THEN 
    IF MIN10="0101" THEN 
    MIN10<="0000";M10<='1';
      ELSE MIN10<=MIN10+1;
    M10<='0';
      END IF;
   END IF;
  END IF;
 END PROCESS;
PROCESS(M10)
  BEGIN
  IF CLK2'EVENT AND CLK2='1' THEN
    IF M10='1' THEN 
    IF (HOUR1="1001")OR((HOUR1="0100")AND(HOUR10="0010"))  THEN 
    HOUR1<="0000";H1<='1';
      ELSE HOUR1<=HOUR1+1;
    H1<='0';
      END IF;
   END IF;
  END IF;
 END PROCESS;
PROCESS(CLK)
  BEGIN
  IF CLK2'EVENT AND CLK2='1' THEN
    IF SEL="110" THEN
    SEL<="000"; 
    ELSE SEL<=SEL+1;
      END IF;
   END IF;
END PROCESS;
PROCESS(SEL)
  BEGIN
   IF SEL= "000" THEN L0<='1';
      CASE SEC1 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN "0010" => C_OUT<="1011011";
    WHEN "0011" => C_OUT<="1001111";
    WHEN "0100" => C_OUT<="1100110";
    WHEN "0101" => C_OUT<="1101101";
    WHEN "0110" => C_OUT<="1111101";
    WHEN "0111" => C_OUT<="0000111";
    WHEN "1000" => C_OUT<="1111111";
    WHEN "1001" => C_OUT<="1101111";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
  END CASE;
   ELSIF SEL= "001" THEN L1<='1';
    CASE SEC10 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN "0010" => C_OUT<="1011011";
    WHEN "0011" => C_OUT<="1001111";
    WHEN "0100" => C_OUT<="1100110";
    WHEN "0101" => C_OUT<="1101101";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
  END CASE;
   ELSIF SEL= "010" THEN L2<='1';
    CASE MIN1 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN "0010" => C_OUT<="1011011";
    WHEN "0011" => C_OUT<="1001111";
    WHEN "0100" => C_OUT<="1100110";
    WHEN "0101" => C_OUT<="1101101";
    WHEN "0110" => C_OUT<="1111101";
    WHEN "0111" => C_OUT<="0000111";
    WHEN "1000" => C_OUT<="1111111";
    WHEN "1001" => C_OUT<="1101111";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
  END CASE;
 ELSIF SEL= "011" THEN L3<='1';
    CASE MIN10 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN "0010" => C_OUT<="1011011";
    WHEN "0011" => C_OUT<="1001111";
    WHEN "0100" => C_OUT<="1100110";
    WHEN "0101" => C_OUT<="1101101";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
      END CASE;
 ELSIF SEL= "100" THEN L4<='1';
     CASE HOUR1 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN "0010" => C_OUT<="1011011";
    WHEN "0011" => C_OUT<="1001111";
    WHEN "0100" => C_OUT<="1100110";
    WHEN "0101" => C_OUT<="1101101";
    WHEN "0110" => C_OUT<="1111101";
    WHEN "0111" => C_OUT<="0000111";
    WHEN "1000" => C_OUT<="1111111";
    WHEN "1001" => C_OUT<="1101111";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
  END CASE;
 ELSIF SEL= "101" THEN L5<='1';
      CASE HOUR10 IS
        WHEN "0000" => C_OUT<="0111111"; 
    WHEN "0001" => C_OUT<="0000110";
    WHEN OTHERS => C_OUT<="ZZZZZZZ";
      END CASE;
END IF;  
END PROCESS;
END ARCHITECTURE;  
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值