end process P6; P7:process(clk) begin if (delay_5ms = 250000) then key_2<=key_in; else key_2<=1; end if;
end process P7; P8:process(clk) begin key_3<=key_2; key_flag<=(key_3 and (not key_2)); end process P8;
P9:process(clk) begin if(key_flag) then key_cnt<=key_cnt+1; else key_cnt<=0; end if; end process P9;
P10:PROCESS( key_cnt ) begin CASE key_cnt IS WHEN 0=>F<=100000; WHEN 1=>F<=200000; WHEN 2=>F<=300000; WHEN 3=>F<=400000; END CASE; end process P10; END behave;
6.仿真波形及分析
用012345来仿真。状态为:012345-123450-234501-345012-450123-501234-012345
i)仿真波形
ii)波形分析
由波形可见,随着大计数周期的增加,依次产生012345-123450-234501-345012-450123-501234-012345 ??,这样便实现了循环移位。当清零信号为0时,控制数码管是否点亮的信号全为1,实现了让数码管全部熄灭的目标。实验室实测时,加大count_FLAG值为100,观察到稳定持续的周期循环移位的数码显示,完成实验任务。
308040-080403。(按键控制还是有问题)
二、数字时钟
1.实验目的
(1)掌握VHDL语言的语法规范,掌握时序电路描述方法 (2)掌握多个数码管动态扫描显示的原理及设计方法
2.实验任务要求
要求学生设计一个时钟,并输出到数码管显示时,分,秒。
3设计思路及VHDL代码
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
-------------------------------------------------------------------- entity digital is
port( Clk : in std_logic; --时钟输入 Rst : in std_logic; --复位输入
Display : out std_logic_vector(6 downto 0); --七段码管显示输出 SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动 ); end digital;
-------------------------------------------------------------------- architecture behave of digital is
signal Disp_Temp : integer range 0 to 15;
signal Disp_Decode : std_logic_vector(6 downto 0); signal SEC1,SEC10 : integer range 0 to 9; signal MIN1,MIN10 : integer range 0 to 9; signal HOUR1,HOUR10 : integer range 0 to 9;
signal Clk1kHz : std_logic;--数码管扫描时钟 signal Clk1Hz : std_logic;--时钟计时时钟 signal led_count : std_logic_vector(2 downto 0); signal led_display : std_logic_vector(3 downto 0); signal spkcout : std_logic; begin
PROCESS(clk) --产生1hz信号
variable cnt : INTEGER RANGE 0 TO 49999999; --产生1Hz时钟的分频计数器 BEGIN
IF clk='1' AND clk'event THEN IF cnt=49999999 THEN cnt:=0;
ELSE
IF cnt<25000000 THEN clk1hz<='1'; ELSE clk1hz<='0'; END IF; cnt:=cnt+1; END IF; END IF; end process;
PROCESS(clk) --产生1khz信号
variable cnt1 : INTEGER RANGE 0 TO 49999; --产生1KHz时钟的分频计数器 BEGIN
IF clk='1' AND clk'event THEN IF cnt1=49999 THEN cnt1:=0; ELSE
IF cnt1<25000 THEN clk1khz<='1'; ELSE clk1khz<='0'; END IF;
cnt1:=cnt1+1; END IF; END IF; end process;
process(Clk1Hz,Rst) begin
if(Rst='0') then --系统复位 SEC1<=0; SEC10<=0; MIN1<=0; MIN10<=0; HOUR1<=0; HOUR10<=0;
elsif(Clk1Hz'event and Clk1Hz='1') then --正常运行
if(SEC1=9) then SEC1<=0;
if(SEC10=5) then SEC10<=0;
if(MIN1=9) then MIN1<=0;
if(MIN10=5) then MIN10<=0;
if(HOUR1=9) then HOUR1<=0;
HOUR10<=HOUR10+1;