EDA原理及应用
实验报告
题目:多功能数字秒表
专业:电子信息工程 班级: 姓名: 学号:
一、 设计题目: 多功能数字秒表 二、 设计目标: 1.精确到1/100秒
2.留个数码管显示范围0.01——59.59.99S 3.有复位端,使能端
4.当时间到达设置的时间时,蜂鸣器报警,按下按键可消除声音,但继续计时。
三、 设计原理:(含系统总的原理图)
由三个分频器模块,六个计数器模块,一个扫描数码管模块,和一个蜂鸣器
报警模块连接而成。
四、 设计内容:(含状态转换图、软件流程图、说明文字等,每单
独模块的图标和VHDL程序;最后为总体程序框图)
(1)分频器模块1
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF IS
PORT(CLK:IN STD_LOGIC;
--D:IN STD_LOGIC_VECTOR(3 DOWNTO 0); FOUT:OUT STD_LOGIC); END;
ARCHITECTURE one OF DVF IS SIGNAL FULL:STD_LOGIC; BEGIN
P_REG:PROCESS(CLK)
VARIABLE CNT8:INTEGER RANGE 48000000 DOWNTO 0; BEGIN
IF CLK'EVENT AND CLK='1' THEN IF CNT8=240000 THEN CNT8:=0; FULL<='1';
ELSE CNT8:=CNT8+1; FULL<='0'; END IF; END IF;
END PROCESS P_REG; P_DIV:PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC; BEGIN
IF FULL'EVENT AND FULL='1' THEN CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF; END IF;
END PROCESS P_DIV; END;
RTL状态图
说明:采用的是48M时钟输入,作为0.01S最低位的时钟信号。
分频器模块2
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF IS
PORT(CLK:IN STD_LOGIC;
--D:IN STD_LOGIC_VECTOR(3 DOWNTO 0); FOUT:OUT STD_LOGIC); END;
ARCHITECTURE one OF DVF IS SIGNAL FULL:STD_LOGIC; BEGIN
P_REG:PROCESS(CLK)
VARIABLE CNT8:INTEGER RANGE 48000000 DOWNTO 0; BEGIN
IF CLK'EVENT AND CLK='1' THEN IF CNT8=24000 THEN CNT8:=0; FULL<='1';
ELSE CNT8:=CNT8+1; FULL<='0'; END IF; END IF;
END PROCESS P_REG; P_DIV:PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC; BEGIN
IF FULL'EVENT AND FULL='1' THEN CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF; END IF;
END PROCESS P_DIV; END;
说明:改变了分频器的大小,这个频率很高,是给扫描数码管模块使用的。
(3)分频器模块3
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF3 IS
PORT(CLK,B:IN STD_LOGIC;
--D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
FOUT:OUT STD_LOGIC); END;
ARCHITECTURE one OF DVF3 IS SIGNAL FULL:STD_LOGIC; BEGIN
P_REG:PROCESS(B,CLK)
VARIABLE CNT8:INTEGER RANGE 40000000 DOWNTO 0; BEGIN
IF B='0' THEN
IF CLK'EVENT AND CLK='1' THEN IF CNT8=200000 THEN CNT8:=0; FULL<='1';
ELSE CNT8:=CNT8+1; FULL<='0'; END IF; END IF; END IF;
END PROCESS P_REG; P_DIV:PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC; BEGIN
IF B='0' THEN
IF FULL'EVENT AND FULL='1' THEN CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF; END IF;
ELSE FOUT<='1'; END IF;
END PROCESS P_DIV; END;
说明:控制蜂鸣器的声音
(2)计数器模块
10进制计数器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt4 IS
PORT(CLK:IN STD_LOGIC; RST:IN STD_LOGIC; EN:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUNT:OUT STD_LOGIC); END;
ARCHITECTURE bhv OF cnt4 IS
SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(CLK) BEGIN
IF RST='0' THEN Q1<=\"0000\";
ELSIF CLK'EVENT AND CLK='1' THEN IF EN='1' THEN
Q1<=Q1+1;IF Q1=\"1001\" THEN Q1<=\"0000\";COUNT<='1';ELSE COUNT<='0';END IF; END IF;END IF; END PROCESS; Q<=Q1; END bhv;
10进制计数器RTL状态图
10进制仿真波形图
说明:此计数器为10进制计数器且上一个的输出进位端为下一个计数器的时钟。此计数器用于01S,,0.01S,,1S以及1min位。
6进制计数器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt5 IS
PORT(CLK:IN STD_LOGIC; RST:IN STD_LOGIC; EN:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUNT:OUT STD_LOGIC); END;
ARCHITECTURE bhv OF cnt5 IS
SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(CLK) BEGIN
IF RST='0' THEN Q1<=\"0000\";
ELSIF CLK'EVENT AND CLK='1' THEN IF EN='1' THEN
Q1<=Q1+1;IF Q1=\"0101\" THEN Q1<=\"0000\";COUNT<='1';ELSE COUNT<='0';END IF; END IF;END IF; END PROCESS; Q<=Q1; END bhv;
6进制计数器RTL状态图
6进制仿真图
说明:“此计数器为6进制,用于十秒位和十分位;
(3)扫描数码管模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity scan_led is port( clk:in std_logic;
a1,a2,a3,a4,a5,a6,a7,a8:in std_logic_vector(3 downto 0); sg:out std_logic_vector(6 downto 0); bt:out std_logic_vector(7 downto 0)); end;
architecture one of scan_led is
signal cnt8 : std_logic_vector(2 downto 0); signal a :std_logic_vector(3 downto 0); begin
p1:process (cnt8) begin
case cnt8 is
when \"000\"=>bt<=NOT\"00000001\";a<=a1; when \"001\"=>bt<=NOT\"00000010\";a<=a2; when \"010\"=>bt<=NOT\"00000100\";a<=a3; when \"011\"=>bt<=NOT\"00001000\";a<=a4; when \"100\"=>bt<=NOT\"00010000\";a<=a5; when \"101\"=>bt<=NOT\"00100000\";a<=a6; when \"110\"=>bt<=NOT\"01000000\";a<=a7; when \"111\"=>bt<=NOT\"10000000\";a<=a8; when others=>null; end case; end process p1; p2:process(clk) begin
if clk'event and clk='1' then cnt8<=cnt8+1; end if;
end process p2; p3:process(a) begin case a is
when \"0000\"=>sg<=NOT\"0111111\";when \"0001\"=>sg<=NOT\"0000110\"; when \"0010\"=>sg<=NOT\"1011011\";when \"0011\"=>sg<=NOT\"1001111\"; when \"0100\"=>sg<=NOT\"1100110\";when \"0101\"=>sg<=NOT\"1101101\"; when \"0110\"=>sg<=NOT\"1111101\";when \"0111\"=>sg<=NOT\"0000111\"; when \"1000\"=>sg<=NOT\"1111111\";when \"1001\"=>sg<=NOT\"1101111\"; when \"1010\"=>sg<=NOT\"1110111\";when \"1011\"=>sg<=NOT\"1111100\"; when \"1100\"=>sg<=NOT\"0111001\";when \"1101\"=>sg<=NOT\"1011110\"; when \"1110\"=>sg<=NOT\"1111001\";when \"1111\"=>sg<=NOT\"1110001\"; when others=>null; end case;
end process p3; end;
扫描数码管RTL状态图
说明:采用共阳7段数码管。经过高频率的扫描给人以同时出现的错觉。虽然有8个输入但我只用了6个;
(4)蜂鸣器报警模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY FM IS
PORT(A,RST:IN STD_LOGIC;
B1,B2,B3,B4:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --D:IN STD_LOGIC_VECTOR(3 DOWNTO 0); FOUT:OUT STD_LOGIC); END;
ARCHITECTURE one OF FM IS
SIGNAL Q1,Q2:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL X:STD_LOGIC; SIGNAL F:STD_LOGIC; BEGIN
Q1<=B4&B3&B2&B1; Q2<=\"0000000100000000\";
PROCESS(Q1,Q2) BEGIN
IF A='0' THEN F<='1';
ELSIF Q1>Q2 THEN F<='0';else F<='1';END IF; END PROCESS; FOUT<=F; END;
RTL状态图
说明:将4个数码管的数值进行拼接得到Q1,与所设Q2进行比较得出F。从而是蜂鸣器报警。为消除开始的噪音,采用>进行比较。设置按键,当按下时,改变G,间接固定F来消除报警声。同时计数器的复位端,可以使G恢复成正常状态。所以可以改变Q2的值来定时。
(5)总体程序框图
复 位 按 键 使能 按 键 分频模块1 6进制计数器 10进制计数器 时钟信号 分频模块2 扫 描 数 码 管 模 块 选择器 控制按键 蜂鸣器
五.实验现象(需要有实验现象图片及文字说明)
秒表正常计时,当按下复位键时,计数器重新计时,当按下使能键时,计数器停止计时。蜂鸣器报警时,按下按键可消除声音。
因篇幅问题不能全部显示,请点此查看更多更全内容