您的当前位置:首页正文

EDA秒表设计

2021-10-01 来源:意榕旅游网


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 扫 描 数 码 管 模 块 选择器 控制按键 蜂鸣器

五.实验现象(需要有实验现象图片及文字说明)

秒表正常计时,当按下复位键时,计数器重新计时,当按下使能键时,计数器停止计时。蜂鸣器报警时,按下按键可消除声音。

因篇幅问题不能全部显示,请点此查看更多更全内容