哈尔滨工业大学实验报告
综合实验
顺序延时关断三盏灯开关
一、实验原理
设计一个开关装置,该开关装置在第一次按下按钮 K 时,三盏灯 x、y、z
同时点亮;当再次按下按钮 K 时 x 灯立即熄灭;y 灯 5s 后熄灭,在 y 灯熄灭
8s 后 z 灯熄灭。
根据题意该数字系统的原理图如下:
x
Y
Z
状态机
K
Td5
Td8
T5
T8
五 进 制 计 数
器
译 码 显
示
八进制计数器
译码显示
二、实验环境
本次试验采用 CycloneⅡ EP2c70f896c6 芯片,系统时钟为 50MHz。实验环境
为:
1、PC 机一台。
2、Altera 的 Quartus 软件一套。
3、主芯片为 Altera 公司的 DE2-70 的 EDA 开发板一套。
三、实验要求
1、使用 VHDL 语言输入底层模块,使用图形输入顶层模块。
2、用数码管显示倒计时秒数。
该实验分为四个模块子实验,分别为:分频器实验、有限状态机实验、计
数器实验和数码管译码显示实验。本次试验由个人独立完成:
哈尔滨工业大学实验报告
(1) 完成 50M 分频程序,将 50MHz 的时钟分频成 1Hz 时钟;
(2) 完成有限状态机模块,实现 x,y,z 三灯的亮灭控制;
(3) 完成 5 进制和 8 进制计数器及其显示译码器控制数码管;
(4) 完成数码管 5 进制和 8 进制减法的显示;
(5) 对四个模块进行整合,在 DE2-70 开发板上调试实现按键控制和数
码管显示的功能。
整合的顶层文件采用图形输入的方法,实验板的晶振为 50MHz,分频后 1s
时钟的占空比为 1:1。
四、实验步骤
1、 分频器模块
在该模块实验中,系统输入时钟为 50MHz,自主设计基于 VHDL 语言的程
序,实现 50M 分频,输出 1Hz 秒脉冲信号。
port(
clk_in,reset : in
std_logic;
clk_1Hz : out std_logic
);
实验程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTity fenpin is
end fenpin;
architecture behave of fenpin is
signal cnt : integer range 0 to 49999999; -- 定义:临时计数值
begin
cnt <= 0;
elsif (clk_in'event and clk_in='1') then
else
process (clk_in,reset)
begin
if (reset = '0') then
if cnt= 49999999 then -- 计数至 50M
cnt<=0;
cnt<=cnt+1;
end if;
哈尔滨工业大学实验报告
if cnt>24999999 then --占空比为 50%
clk_1Hz<='1';
else
clk_1Hz<='0';
end if;
end if; -- endif reset
end process;
end behave;
2、 计数器模块与数码管显示模块
在该模块实验中,基于 VHDL 硬件设计语言,系统输入为上一模块输出的
1Hz 秒脉冲,作为系统时钟控制进程运行,设计实现 5 进制和 8 进制计数器,
以及计数器的减法显示。
计数器由计数启动控制,计数结束后结束标志为高,作为下一模块的控制
信号。
计数器减法显示采用译码器控制数码管的方法,本实验中数码管采用共阳
极连接,阳极驱动,低电平导通,数码管示意图如下图所示(hex:7 downto 0):
哈尔滨工业大学实验报告
实验程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY counter is
port(
clk_1Hz : in std_logic;
reset : in std_logic;
t8 : in std_logic; --控制启动倒计时
td8 : out std_logic; --td8 为‘1’时,倒计时结束标志
Q : out std_logic_vector(2 downto 0);
LED7 : out std_logic_vector(6 downto 0)
);
end counter;
architecture behave of counter is
signal Q1: std_logic_vector(2 downto 0);
begin
--倒计时进程
process(clk_1Hz,t8,reset)
begin
if reset='0' then
Q1<="111";
elsif clk_1Hz'event and clk_1Hz='1' and t8='1'then
Q1<=Q1-1;
end if;
if Q1="000" then
Q1<="111";
td8<='1';
ELSE
td8<='0';
哈尔滨工业大学实验报告
end if; -- end if reset;
Q<=Q1;
end process;
--数码管显示进程
process(Q1)
begin
case Q1(2 downto 0) is
when "111" => LED7 <= "1111000";-- 7
when "110" => LED7 <= "1111101";-- 6
when "101" => LED7 <= "0010010";-- 5
when "100" => LED7 <= "0011001";-- 4
when "011" => LED7 <= "0110000";-- 3
when "010" => LED7 <= "0100100";-- 2
when "001" => LED7 <= "1111001";-- 1
when "000" => LED7 <= "1000000";-- 0
end case;
end process;
end behave;
哈尔滨工业大学实验报告
3、 状态机模块
在该实验模块中,基于 VHDL 有限实现 x,y,z 三灯的亮灭控制。设计一
个开关装置,该开关装置在第一次按下按钮 K 时,三盏灯 x、y、z 同时点亮;
当再次按下按钮 K 时 x 灯立即熄灭;y 灯 5s 后熄灭,在 y 灯熄灭 8s 后 z 灯熄
灭。
该有限状态机模块共有四种状态,分别为三盏灯全亮、两盏灯亮、一盏灯
亮和三盏灯都不亮四种状态。状态转换通过时钟以及按键下降沿,计数器结束
标志控制。
程序设计如下:
哈尔滨工业大学实验报告
port(
reset : in std_logic; --复位
td5,td8 : in std_logic; --计时器输出状态
x,y,z : out std_logic; --三盏灯
t5,t8 : buffer std_logic --计时器启动控制
);
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY moore is
K : in std_logic; --控制按钮
end moore;
architecture behave of moore is
type state_type is (s1,s2,s3,s4);
signal state: state_type;
begin
-- process1:State_transition:
PROCESS (K,reset,td5,td8)
begin
if reset = '0' then
state <= s1;
end if;
case state is
when s1=> --x=y=z='0';
when s2=> --x=y=z='1';
when s3=> --x='0'; y=z='1';
if K='0' then
t5<='0'; t8<='0';
--if K'event and K='0' then
else state<=s2;
state <= s3;
end if;
t5<='0'; t8<='0';
--if K'event and K='0' then
state <= s2;
end if;
else state<=s1;
if K='0' then
哈尔滨工业大学实验报告
t5<='1'; t8<='0';
--if td5'event and td5='1' then
if td5='1' then
state <= s4;
else state<=s3;
end if;
t5<='0'; t8<='1';
--if td8'event and td8='1' then
if td8='1' then
state <= s1;
else state<=s4;
end if;
end process;
when s4=> --x=y='0'; z='1';
end case;
--end if; -- end if reset;
--output process:
process(state)
begin
when s2=> x<='1';y<='1';z<='1';
end process;
end behave;
模块 RTL 图及仿真波形图:
when s3=> x<='0';y<='1';z<='1';
when s4=> x<='0';y<='0';z<='1';
end case;
case state is
when s1=> x<='0';y<='0';z<='0';