多功能数字钟实验报告.docx
- 文档编号:6960364
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:36
- 大小:617.44KB
多功能数字钟实验报告.docx
《多功能数字钟实验报告.docx》由会员分享,可在线阅读,更多相关《多功能数字钟实验报告.docx(36页珍藏版)》请在冰点文库上搜索。
多功能数字钟实验报告
数字电子技术实验课程
FPGA创新实验设计报告
设计名称多功能数字钟
姓名杜往泽李可
学号30901026763090101340
专业班级控制系0903班
光电系0904班
指导教师樊伟敏
日期2010年12月28日
浙江大学电工电子基础实验中心
多功能数字钟设计实验报告
设计背景:
数字钟是一种应用很广泛的电子产品。
相比于机械表,它无需机械传动,计时更精确,显示更便捷,而且无需经常调整,所以在很多公共场合都可以看到它的身影,同时,数字钟可以实现的功能很多,有利于今后扩展这款产品的功能,使其更具有市场竞争力,故决定设计一个多功能数字钟作为创新实验的内容。
摘要:
设计这款多功能数字钟是为了在掌握各类计数器以及它们的连接方法,深入理解FPGA技术的层次化设计方法和VHDL语言的设计思想的同时,能开发出一款有实际应用价值的产品。
这款数字钟是使用VHDL语言,在Quartus2平台下开发的。
具有显示时分秒,整点报时和手动拨时的功能,并且具有彩灯效果,美观大方,很好的方便和改善人们的生活,适合在生活中使用。
关键字:
数字钟,VHDL,Quartus2
(一)方案论证:
程序总体图:
(1)数字钟功能:
a)正确显示时、分、秒。
因为实验仪器限制,只有4个数码管,因此,本实验采用后两个数码管共同承担显示分和显示秒的任务,通过一个单独的状态开关控制;
b)设定时间。
在具体的实现时,仅仅采用两个逻辑开关,以下记为A,B。
i.A键有两个功能:
1.负责控制是否需要改变时间,若按下,则某一位闪烁4秒。
2.控制具体哪一位进行调整时间,在1的基础上,再次按下A键,则闪烁的位自动向左移动一位,表示对左边一位进行数值调整。
ii.B键实现加1调整时间。
在有数码管闪烁的前提下(即要调整时间),每次按下B键,闪烁的数码管的数值加1,并且可以重新再闪烁4秒。
iii.另外,为了增强人机关系,采用了当按下A时,某一位闪烁,然后进行对该位的数值调整,若在4秒内没有对A和B进行操作,则数字钟自动回到正常计时状态,若在4秒内按键按下A或B,则可以再闪烁4秒。
c)整点报时,当到达整点的时候,LED灯会同时亮灭表示到达整点,并且可以取消整点报时功能。
另外,通过亮灭的次数表示当前的时间,如上午9点,则LED灯将同时亮灭9次。
d)彩灯效果,在1秒内,LED灯交替间隔亮灭,增强数字钟的美观,并且可以取消该功能。
e)暂停功能,可以暂停计时功能。
(2)可行性分析:
a)本设计的最大亮点和难点在于4秒的时间长度的获得,经小组讨论、分析,想到以下解决方案:
当输入状态量发生改变时,改变输出量,使符合预期要求,同时在程序内部进行计数,当计数达到4秒时,再次改变输出量,最终可以获得,每改变一次,输出4秒的低电平;
b)LED灯闪烁的实现:
通过输入CP脉冲控制,在CLK的前半段时间,即CLK='1'的时候,令LED灯亮,而当CLK=’0’的时候,令LEN灯暗,从而达到在1秒内让LED亮灭的效果;
c)LED灯亮灭的次数通过将输入信号的小时数存储到一个tmp中,递减tmp,直至为0,则可以实现到点报时当前时间次数
d)暂停功能:
在设计正常计数功能的时候,将时分秒分别设计为60进制和24进制,在具体的模块内部,通过增加一位控制位,如低电平有效的时候,实现加1计时
e)按一次调时按键,选择位左移一格:
通过6进制加法器和3-8译码器实现该功能
(3)关键模块的方案比较与选择:
a)基本计数功能的实现:
i.做成多个模块,即一个24进制,两个60进制,共同实现正常计数功能
优点:
稳定性强,抗干扰能力好
缺点:
导线连接比较混乱
ii.做出一个模块,直接输出时分秒
优点:
做成一个模块后,使得在总体布线的时候,导线不会显得很凌乱
缺点:
结合程序具体展开(详见附录)
经仿真,该程序确实可以实现预期的功能,但是完整运行后,程序报出大量的warning,而且是关于loop的错误,即循环的警告,但是我的程序并没有使用循环。
小组讨论后忽视了这个问题,觉得既然仿真结果是正确的,而且将程序烧到实验电路板上的时候显示也是正确的,应该是没有问题的。
但是当加上了其他的模块后,片间关联出现明显的问题,调试了很久都没有发现具体的问题出处,在询问了樊老师之后,采取了用一片24进制和和两片60进制共同实现正常计数功能,并最终实验通过。
b)CP脉冲的选择:
最初方案中,CP脉冲都是直接假定从秒脉冲的分频器中获取,但是通过具体的实验后发现,采用秒脉冲难以在上升沿的时候捕获有效信息,即信息容易作为毛刺而略去,之后就选择采用50M高频脉冲,再结合老师给的消抖程序很好的实现了稳定输出一个周期有效信号的作用,但是在综合各个模块于一个总体的时候,发现读入数据总是很不稳定,在小组讨论与不断的尝试后,采用了将50M高频脉冲做多次分频,将分得的较低的频率的脉冲输出作为主要脉冲,最终解决了这个问题
c)输入输出端口个数的选择,我们小组在这个问题上讨论了很多次,一方认为为了体现程序的优良品质,应该减少输入输出,而增加程序的复杂性,而另一方认为,现阶段这个程序的关键不在于减少输入输出端口的个数,而在于各个模块的衔接是否自然。
如整点报时功能的实现,从理论上讲,只要输入小时数就可以获得当前是否恰好是整点的信息(当小时数发生变化,并且当前不是正在调整时间),但是这个在具体的编程的时候,困难却比较大,而另一方面,可以简单的将时分秒的信息都加载作为输入端,那么若当前的分秒都是59时,则下一个脉冲到来的时候就是到达整点。
(4)工作过程
a)正常计数
一共三个模块,分别实现小时计数,分计数,秒计数功能,
b)手动拨时:
右上角为主要的程序(该模块进行了180°转体),右端为输入,左端为输出,右端输出为第一个模块的6个输入,左端的输出结果输入到第一个模块的置数端。
控制该模块的是两个按键,为button【1】和button【0】,其中button【1】控制是否打开手动拨时功能并且选择需要调整的数位,button【0】负责加一操作。
上图左侧为一些辅助模块,有消抖程序,延时程序,增强延时效果的程序,移位程序,综合控制了手动拨时的打开或关闭以及第一个模块的是否置数功能。
c)整点报时和彩灯效果
经研讨,仅做成一个模块,因为当要关闭整点报时功能的时候,认为是为了一个比较安静的环境,则同时默认关闭彩灯效果。
输入为第一个模块输出的时分秒,输出到LED灯象征性的表示整点。
由KEY和EN共同控制是否开启该功能,即当EN=1,表示当前在调整时间,暂时关闭该功能,EN与第二个模块的控制位是同一个信号
d)显示模块:
共三个,第一个为判断是否闪烁的模块,第二个为六四转换模块,第三个为输出模块第一个模块由EN控制是否开启该功能,由ATO[2..0]控制需要闪烁的数据位置,SW[0]控制显示分还是显示秒。
(二)单元电路设计
1)软件设计平台:
QuartusⅡ
2)设计语言:
VHDL语言
3)开发工具具体信息如下图:
4)单元电路工作原理介绍及分析:
a)消抖电路
在借鉴了樊老师程序基础上进行了一定的改编而成
改编后的程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--输入一个信号,输出这个一个脉冲宽度的信号;
--本程序由樊老师的程序改编而成,是捕获一个下降沿,输出一个脉冲宽度的低电平
ENTITYXDIS
PORT(CLK:
INSTD_LOGIC;--高频脉冲信号
KEY_IN:
INSTD_LOGIC;--输入的需要捕获下降沿的信号
KEY_OUT:
OUTSTD_LOGIC);--输出信号
ENDXD;
ARCHITECTUREFWMOFXDIS
SIGNALTMPA,TMPB:
STD_LOGIC;--用于纪录信号的变化
SIGNALTMPO:
STD_LOGIC;
BEGIN
XDQ:
PROCESS(CLK,TMPA,TMPB)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
TMPA<=KEY_IN;TMPB<=TMPA;
ENDIF;
TMPO<=NOT(((NOTTMPA)ANDTMPB));
ENDPROCESSXDQ;
KEY_OUT<=TMPO;
ENDFWM;
程序仿真运行结果如下:
如图可得,在CP脉冲的上升沿到来的时候,如果此时输入信号为低电平,则马上输出一个脉冲宽度的低电平,并且不论之后输入信号持续多久为零,输出经过一个脉冲宽度后都恢复高电平,这有效的使输出信号稳定,防止抖动。
b)四秒低电平电路
本程序需结合消抖单元共同使用,在经过消抖电路后,该程序的输入必然为一个脉冲宽度的低电平,在进行对该输入的判断,当输入信号变为0,则标记量cout变为1,进行计数,每一个CO脉冲到来的时候加一,直至预定值M,从而达到延时的效果。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXD4SIS
PORT(CLK:
INSTD_LOGIC;
KEY:
INSTD_LOGIC;
KEY_OUT:
OUTSTD_LOGIC);
ENDXD4S;
ARCHITECTUREDWZOFXD4SIS
SIGNALTMP:
STD_LOGIC;
CONSTANTM:
INTEGER:
=20;
BEGIN
SEC:
PROCESS(CLK,KEY)
VARIABLEcout:
INTEGER:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN
IF(COUT/=0)THEN
cout:
=cout+1;
IFcout<=MTHENtmp<='0';
ELSIFCOUT>MTHENcout:
=0;TMP<='1';
ENDIF;
IF(KEY='0')THEN
TMP<='0';COUT:
=1;
ENDIF;
ELSIF(KEY='0')THEN
TMP<='0';COUT:
=1;
ELSETMP<='1';COUT:
=0;
ENDIF;
ENDIF;
ENDPROCESSSEC;
KEY_OUT<=TMP;
ENDDWZ;
经仿真后的波形如图:
这个程序仍然有美中不足的地方,即4秒低电平的输出有一个脉冲的滞后性,人为产生了延时效应,但是因为我们采用的是高频输入信号作为脉冲,时间的差距微乎其微,近似忽略不计,另外,设计这个四秒低电平的输出电路仅仅是为了给调整时间一个大概的时间范围,并不是用来作为精确定量的时间长度,所以这么做是可行的。
如上,在低电平的时候,如果再次有脉冲加入,可以重新计时,形成了可重触发的单稳电路。
设计理念的关键在于纪录变化,以此作为状态改变的前提。
c)综合延时
实现的效果为:
在调整时间的状态下,若不进行任何操作,则在4秒的时间过去后自动回到正常计数的状态,倘若4秒中有对时间进行调整,如加1操作或者选择另一位数据进行操作,则重新再次闪烁4秒,等待调整。
但是,若当前不处于调整时间状态,则加1操作位不论是否变化,输出都不变。
程序为:
ENTITYDELAYAGAINIS
PORT(CLK:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
UP:
INSTD_LOGIC;
KEY_OUT:
OUTSTD_LOGIC);
ENDENTITYDELAYAGAIN;
ARCHITECTUREDWZOFDELAYAGAINIS
SIGNALTMP:
STD_LOGIC;
begin
PROCESS(CLK,EN,UP)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
TMP<=EN;
IFUP='0'THEN
IF(EN='0'ORTMP=UP)THEN
TMP<=UP;
ELSETMP<=EN;
ENDIF;
ELSETMP<=EN;
ENDIF;
ENDIF;
ENDPROCESS;
设计理念是通过一个中间信号tmp纪录当前的状态,若当前的状态是处于调整时间,则触发该程序,使时间再次重新装配。
仿真结果如下:
符合实验要求。
d)整点报时和彩灯效果:
共两个控制位,共同控制是否打开整点报时程序和彩灯效果,这两个控制,分别是手动开关SW[8]和调整时间的控制信号,即,若当前正在调整时间,则不进行整点报时功能和彩灯效果。
输入程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--输出到LED灯,以当前整点示数为基准tmp,亮灭tmp次
--在正常状态,LED灯交替亮灭,显示彩灯效果
ENTITYMYRINGIS
PORT(CLK:
INSTD_LOGIC;--秒脉冲
key:
INSTD_LOGIC;--手动控制位,0则继续报时
en:
instd_logic;--外加判断是否是在调整时间,1表示可以报时和彩灯效果,0表示在进行其他操作,停止当前
S_LO,S_HI,M_LO,M_HI,h_LO,H_HI:
INSTD_LOGIC_VECTOR(3DOWNTO0);--输入当前时间
LED:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));--输出LED灯的亮灭状态
ENDENTITYMYRING;
ARCHITECTUREDWZOFMYRINGIS
SIGNALM:
STD_LOGIC_VECTOR(5DOWNTO0);--闹钟时间
SIGNALLED_TMP:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALTMP:
STD_LOGIC;
CONSTANTCO_0:
STD_LOGIC_VECTOR(9DOWNTO0):
="0000000000";
CONSTANTCO_1:
STD_LOGIC_VECTOR(9DOWNTO0):
="1111111111";
CONSTANTCO_2:
STD_LOGIC_VECTOR(9DOWNTO0):
="1010101010";
CONSTANTCO_3:
STD_LOGIC_VECTOR(9DOWNTO0):
="0101010101";
BEGIN
TIM:
PROCESS(CLK,H_HI,H_LO)
BEGIN
IFH_HI="0000"THENM<="00"&H_LO;
elsifh_hi="0001"THENM<=("00"&H_LO)+10;
ELSIFH_HI="0010"THENM<=("00"&H_LO)+20;
ELSEM<="000000";
endif;
endprocesstim;
SEC:
PROCESS(clk,key,EN,S_LO,S_HI,M_LO,M_HI,H_LO,H_HI)
VARIABLEcout:
INTEGER:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN
IF(COUT/=0)THEN
cout:
=cout+1;
IFcout<=MTHENtmp<='0';
ELSIFCOUT>MTHENcout:
=0;TMP<='1';
ENDIF;
IF(S_LO="1001"ANDS_HI="0101"ANDM_LO="1001"ANDM_HI="0101")THEN
TMP<='0';COUT:
=1;
ENDIF;
ELSIF(S_LO="1001"ANDS_HI="0101"ANDM_LO="1001"ANDM_HI="0101")THEN
TMP<='0';COUT:
=1;
ELSETMP<='1';COUT:
=0;
ENDIF;
ENDIF;
ENDPROCESSSEC;
RIN:
PROCESS(TMP,EN,CLK,KEY)
BEGIN
IF(EN='1'ANDKEY='0')THEN
IFTMP='0'THEN
IFCLK='1'THENLED_TMP<=CO_0;
ELSELED_TMP<=CO_1;
ENDIF;
ELSE
IFCLK='1'THENLED_TMP<=CO_2;
ELSELED_TMP<=CO_3;
ENDIF;
ENDIF;
ELSELED_TMP<=CO_0;
ENDIF;
ENDPROCESSRIN;
LED<=LED_TMP;
ENDDWZ;
经过仿真后,显示图形如下:
在第一条时间刻度线时,为上升沿脉冲,分秒显示恰为59,则根据程序,此时开始整点报时,效果为LED灯同时亮灭,若当前时间为12点,则同时亮灭12次后恢复为彩灯效果,而彩灯效果为LED灯交替间隔亮灭,也可从程序的仿真波形中看出。
e)手动拨时
通过两个控制开关,实现调整时间的功能
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
--当EN=0时,开始设置时间
--UP=0时候所选位加1
ENTITYSETTIMEIS
PORT(CLK:
INSTD_LOGIC;--采用高频脉冲
H_HI_IN,H_LO_IN,M_HI_IN,M_LO_IN,S_HI_IN,S_LO_IN:
INSTD_LOGIC_VECTOR(3DOWNTO0);--输入当前时间
EN:
INSTD_LOGIC;--当EN=0时,开始设置时间
UP:
INSTD_LOGIC;--UP=0时候所选位加1
ATO:
inSTD_LOGIC_VECTOR(2DOWNTO0);--数据选择位,控制对哪一位进行加1操作
H_HI,H_LO,M_HI,M_LO,S_HI,S_LO:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));--输出改变后的时间
ENDENTITYSETTIME;
ARCHITECTUREDWZOFSETTIMEIS
SIGNALH_HI_TMP,H_LO_TMP,M_HI_TMP,M_LO_TMP,S_LO_TMP,S_HI_TMP:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
BEGIN
T_TIME:
PROCESS(EN,H_HI_IN,H_LO_IN,M_HI_IN,M_LO_IN,ATO,CLK,S_HI_IN,S_LO_IN)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFUP='0'ANDEN='0'THEN
CASEATOIS
WHEN"000"=>S_LO_TMP<=S_LO_IN+1;
M_LO_TMP<=M_LO_IN;H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_HI_TMP<=S_HI_IN;
WHEN"001"=>S_HI_TMP<=S_HI_IN+1;
M_LO_TMP<=M_LO_IN;H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;
WHEN"010"=>M_LO_TMP<=M_LO_IN+1;
H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
WHEN"011"=>M_HI_TMP<=M_HI_IN+1;
M_LO_TMP<=M_LO_IN;H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
WHEN"100"=>H_LO_TMP<=H_LO_IN+1;
M_LO_TMP<=M_LO_IN;H_HI_TMP<=H_HI_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
WHEN"101"=>H_HI_TMP<=H_HI_IN+1;
M_LO_TMP<=M_LO_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
WHEN"110"=>M_LO_TMP<=M_LO_IN;
H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
WHEN"111"=>M_LO_TMP<=M_LO_IN;
H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
ENDCASE;
elseM_LO_TMP<=M_LO_IN;
H_HI_TMP<=H_HI_IN;H_LO_TMP<=H_LO_IN;M_HI_TMP<=M_HI_IN;S_LO_TMP<=S_LO_IN;S_HI_TMP<=S_HI_IN;
ENDIF;
ENDIF;
ENDPROCESST_TIME;
H_HI<=H_HI_TMP;
H_LO<=H_LO_TMP;
M_HI<=M_HI_TMP;
M_LO<=M_LO_TMP;
S_HI<=S_HI_TMP;
S_LO<=S_LO_TMP;
ENDDWZ;
该程序设置了较多的中间信号,在读程序上增加了难度,为此,我们在设计信号的代号的时候,为了便于理解和记忆,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 数字 实验 报告