秒表显示

秒表自动计数,按键实现暂停,继续计数,归零~~~

代码如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY stopwatch IS
PORT (en,rst,clk:IN STD_LOGIC; --按键与时钟
duan:OUT STD_LOGIC_VECTOR(0 TO 3); --数码管段选
cout:OUT STD_LOGIC_VECTOR(0 TO 7)); --数码管位选
END stopwatch;
ARCHITECTURE behave OF stopwatch IS
SHARED VARIABLE flag: INTEGER RANGE 0 TO 1;
SIGNAL clk_100h:STD_LOGIC;--100Hz 分频程序
SIGNAL cnt4:INTEGER RANGE 0 TO 3; --四数码管位选
SIGNAL led1,led2,led3,led4:STD_LOGIC_VECTOR(3 DOWNTO 0);--四位二进制数
SIGNAL dout:STD_LOGIC_VECTOR(3 DOWNTO 0); --数码管位选输出
SIGNAL s:STD_LOGIC_VECTOR(7 DOWNTO 0); --八段数码管
SIGNAL data:STD_LOGIC_VECTOR(3 DOWNTO 0);--数码管位地址相对应的输出段码信号
BEGIN
p1:PROCESS(clk_100h) IS
VARIABLE count1:INTEGER RANGE 0 TO 500000;
BEGIN
IF(clk'EVENT AND clk='1') THEN
count1:=count1+1;
IF(count1=250000) THEN
clk_100h<='1';
ELSIF(count1=500000) THEN
clk_100h<='0';
count1:=0;
END IF;
END IF;
END PROCESS;
--数码管地址扫描
p2:PROCESS(clk_100h) IS
BEGIN
IF (clk_100h'EVENT AND clk_100h='1') THEN
IF cnt4=3 THEN
cnt4<=0;
ELSE
cnt4<=cnt4+1;
END IF;
END IF;
END PROCESS;
p3:PROCESS(cnt4) IS
BEGIN
CASE cnt4 IS
WHEN 0=>dout<="1110";
WHEN 1=>dout<="1101";
WHEN 2=>dout<="1011";
WHEN 3=>dout<="0111";
WHEN OTHERS=>dout<=NULL;
END CASE;
END PROCESS;
p4:PROCESS(dout) IS
BEGIN
CASE dout IS----------数码管位地址相对应的输出段码信号
WHEN "1110"=>data<=led1;
WHEN"1101"=>data<=led2;
WHEN "1011"=>data<=led3;
WHEN "0111"=>data<=led4;
WHEN OTHERS=>data<=NULL;
END CASE;
END PROCESS;
--段显示地址-
p5:PROCESS(clk_100h) IS
BEGIN
IF (rst='0') THEN
led4<="0000";
led3<="0000";
led2<="0000";
led1<="0000";
ELSIF (clk_100h'EVENT AND clk_100h='1') THEN
IF (en='1' ) THEN
CASE led1 IS
WHEN"1001"=>led1<="0000";
CASE led2 IS
WHEN"1001"=>led2<="0000";
CASE led3 IS
WHEN"1001"=>led3<="0000";
CASE led4 IS
WHEN"1001"=>led4<="0000";
led3<="0000";
led2<="0000";
led1<="0000";
WHEN OTHERS=>led4<=led4+1;
END CASE;
WHEN OTHERS=>led3<=led3+1;
END CASE;
WHEN OTHERS=>led2<=led2+1;
END CASE;
WHEN OTHERS=>led1<=led1+1;
END CASE;
END IF;
END IF;
END PROCESS;
--7 段译码--
p6:PROCESS(data)IS
BEGIN
CASE data IS
WHEN"0000"=>s<="00000011";
WHEN"0001"=>s<="10011111";
WHEN"0010"=>s<="00100101";
WHEN"0011"=>s<="00001101";
WHEN"0100"=>s<="10011001";
WHEN"0101"=>s<="01001001";
WHEN"0110"=>s<="01000001";
WHEN"0111"=>s<="00011111";
WHEN"1000"=>s<="00000001";
WHEN"1001"=>s<="00001001";
WHEN OTHERS=>s<=NULL;
END CASE;
duan<=dout;
cout<=s;
END PROCESS;
END ARCHITECTURE behave;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值