数字跑表实验报告(电子科技大学)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字跑表设计报告
学院:物理电子学院
学号:2014040206029
姓名:刘明哲
班级:电子六班
一 系统总体设计
设计要求
设计一个数字秒表,有6个输出显示,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,系统主要由显示译码器、分频器、十进制计数器和六进制计数器组成。整个秒表还需有一个启动/停止信号和一个复位信号,以便秒表能随意停止及启动。
要求:
(1) 秒表计时范围为:1小时;
(2) 秒表精度为0.01秒;
(3) 具有开始计时、停止计时控制功能,且开始计时、停止计时为一个复用按键;
(4) 在正常计时显示过程中,能够在存储按键作用下存储某一计时时间;存储的时间组数为确定值或1至任意值;
(5) 在读取按键作用下存储的时间能够回放显示;回放显示时,秒表计时可停止或在后台正常进行;回放显示可手动或自动依次显示;
(6) 具有复位功能;
(7) 用六位数码管显示时间读数。
系统工作原理
数字跑表通过系统将48MHz时钟进行分频得到100Hz的秒表时钟,之后通过对时钟信号进行计数得到具体的跑表显示数值,跑表数值作为显示单元电路的输入,显示单元控制数码管动态扫描显示计数
因此,系统主要划分为:分频器,计数器,显示控制,开始\停在使能控制,清零控制,存储读取功能,按键消抖。
原理图如下:
二 单元电路设计
1. 分频器
设计思路:输入信号48MHz,将其48000分频可得1KHz信号,再将
1KHz信号10分频可得100Hz信号。1KHz用于显示LED扫描,100Hz用于计数器时钟。
源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity pp is
PORT(CLKIN:IN STD_LOGIC;
CLKOUT1K:OUT STD_LOGIC;
CLKOUT100:OUT STD_LOGIC);
end ENTITY pp;
architecture Behavioral of pp is
SIGNAL CNTER0:INTEGER RANGE 0 TO 23999 :=0;
SIGNAL CNTER1:INTEGER RANGE 0 TO 4 :=0;
SIGNAL CLKOUT1K_TMP,CLKOUT100_TMP: STD_LOGIC:='0'; begin
PROCESS(CLKIN) IS
BEGIN
IF CLKIN'EVENT AND CLKIN ='1' THEN
IF CNTER0=23999 THEN
CNTER0 <=0;
CLKOUT1K_TMP <= NOT CLKOUT1K_TMP;
ELSE
CNTER0 <= CNTER0 + 1 ;
END IF;
END IF;
END PROCESS;
CLKOUT1K <= CLKOUT1K_TMP;
PROCESS(CLKOUT1K_TMP) IS
BEGIN
IF CLKOUT1K_TMP'EVENT AND CLKOUT1K_TMP='1' THEN IF CNTER1 =4 THEN
CNTER1 <=0;
CLKOUT100_TMP <= NOT CLKOUT100_TMP;
ELSE CNTER1 <= CNTER1 + 1;
END IF;
END IF;
END PROCESS;
CLKOUT100<=CLKOUT100_TMP;
end Behavioral;
2. 计数器以及清零装置
实验需要用到2个六进制计数器和4个十进制计数器,并且将六个计数器级联
十进制计数器的源程序:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity COUNTER is
PORT(RST,CLK:IN STD_LOGIC;
CARRY_IN:IN STD_LOGIC;
CARRY_OUT:OUT STD_LOGIC;
COUNT_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
end COUNTER;
architecture Behavioral of COUNTER is
SIGNAL COUNT:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"; begin
PROCESS(RST,CLK)
BEGIN
IF RST='1' THEN
COUNT<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CARRY_IN='1' THEN
IF COUNT< "1001" THEN
COUNT <= COUNT + 1;
ELSE
COUNT<="0000";
END IF;
ELSE NULL;