数字逻辑电路(数电)课程设计_电子秒表_VHDL实现(含完整源代码!!)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学
UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA
数字逻辑设计
实验报告
实验题目:电子秒表
学生姓名:
指导老师:
一、实验内容
利用FPGA设计一个电子秒表,计时范围00.00 ~ 99.00秒,最多连续记录3个成绩,由两键控制。
二、实验要求
1、实现计时功能:
域值范围为00.00 ~ 99.00秒,分辨率0.01秒,在数码管上显示。
2、两键控制与三次记录:
1键实现“开始”、“记录”等功能,2键实现“显示”、“重置”等功能。
系统上电复位后,按下1键“开始”后,开始计时,记录的时间一直显示在数码管上;按下1键“记录第一次”,次按1键“记录第二次”,再按1键“记录第三次”,分别记录三次时间。
其后按下2键“显示第一次”,次按2键“显示第二次”,再按2键“显示第三次”,数码管上分别显示此前三次记录的时间;显示完成后,按2键“重置”,所有数据清零,此时再按1键“开始”重复上述计时功能。
三、设计思路
1、整体设计思路
先对按键进行去抖操作,以正确的得到按键信息。
同时将按键信息对应到状态机中,状态机中的状态有:理想状态、开始状态、3次记录、3次显示、以及其之间的7次等待状态。
因为需要用数码管显示,故显示的过程中需要对数码管进行片选和段选,因此要用到4输入的多路选择器。
在去抖、计时、显示的过程中,都需要用到分频,从而得到理想频率的时钟信号。
2、分频设计
该实验中有3个地方需要用到分频操作,即去抖分频(需得到200HZ时钟)、计时分频(需得到100HZ时钟)和显示分频(需得到25kHZ时钟)。
分频的具体实现很简单,需首先算出系统时钟(50MHZ)和所需始终的频率比T,并定义一个计数变量count,当系统时钟的上升沿每来到一次,count就加1,当count=T时就将其置回1。这样只要令count=1~T/2时clk=‘0’,count=T/2+1~T时clk=‘1’即可。
3、去抖设计
由于用按键为机械弹性开关,故当机械触点断开、闭合时,按键开关在闭合时不会马上稳定地接通,在断开时也不会马上断开,而是在闭合及断开的瞬
间发生一系列的抖动,时间一般为5ms~10ms,如下图所示:
故应考虑对按键时进行去抖操作。
这里去抖用到了一个状态机,具体如下:
其中,按键按下时为低电平,松开后为高电平。去抖用的频率为200HZ,当连续两次采样都为低电平时,认为按键稳定按下,在按键稳定按下后,采样到按键为高电平时,认为按键释放。
4、状态机设计
(1)状态转移:
当按下key1或者key2且检测到时间上升沿到来,状态机中将发生状态转移,且不论在什么状态,按下reset键时都将回到idle状态。
这里在记录状态和显示状态之间加入了一些“中间状态”,其目的是为了避免一次按键时间过长而导致认为其进行了多次按键的情况。
状态转移图如下所示:
其中,a表示第一个按键(开始、记录),b表示第二个按键(显示、复位),idle为理想状态也是初始状态,r1、r2、r3为三个记录状态,d1、d2、d3为三个显示状态,m1~m7为7个中间状态。
(2)计时与监视:
在“开始状态”之后,若没有按下reset键,都将一直进行计时,且记录的过程中数码管需要一直显示当前计时,于是数码管需要对当前时间进行不停得“监视”。
监视的过程中就涉及到计时,这里计时其实是用计数器来实现的,即每当分频后(这里分频为100mHZ,即0.01s)的时钟上升沿到来时,就使数码管最低位(即0.01位)加一,以此来实现计时。
5、数码管的显示:
由于数码管的四个数字采用同一组控制开关,即共阴极、共阳极,所以如果直接开启数码管显示则四个管子的显示将完全相同,原理图如下所示:
故这里用“扫描”的方式来控制数码管,当扫描速度很快时人眼将无法区分,故会认为四个数码管都在一直显示。这里的扫描的频率选取为25kHz,四个数码管的选取通过4输入多路选择器来实现。
四、程序设计
1、顶层:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE STD.TEXTIO.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.NUMERIC_STD.ALL;
entity main is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
key1 : in STD_LOGIC;
key2 : in STD_LOGIC;
led : out STD_LOGIC_VECTOR(0 to 6);
led_com : out STD_LOGIC_VECTOR(3 downto 0);
point : out STD_LOGIC);
end main;
architecture Behavioral of main is
COMPONENT debounce
PORT(
clk_deb : IN std_logic;
reset : IN std_logic;
keyi : IN std_logic;
keyo : OUT std_logic
);
END COMPONENT;
COMPONENT freq_div_debounce
PORT(
clk : IN std_logic;
clk_out : OUT std_logic
);
END COMPONENT;
COMPONENT freq_div_display
PORT(
clk : IN std_logic;
clk_out : OUT std_logic
);
END COMPONENT;
COMPONENT freq_div_time
PORT(
clk : IN std_logic;
clk_out : OUT std_logic
);
END COMPONENT;
COMPONENT mux
PORT(
clk_dis : IN std_logic;
num1 : IN std_logic_vector(3 downto 0);
num2 : IN std_logic_vector(3 downto 0);
num3 : IN std_logic_vector(3 downto 0);
num4 : IN std_logic_vector(3 downto 0);