一、设计任务:
(一)主体功能
用HDL设计一个多功能数字钟,包含以下主要功能:
1.计时及校时,时间可以24小时制或12小时制显示
2.日历:显示年月日星期,及设定设定功能
3.跑表:启动/停止/保持显示/清除
4.闹钟:设定闹钟时间,整点提示
(二)输入输出界面
输入:时钟输入,三个按键
输出:8位7段码,2个LED,一个蜂鸣器
三个按键从左到右为:Key3、key2、Key1,功能在不同模式下定义不同:
Key3:模式键ModeKey,
Key2:日历显示/设置选择键SetSelKey/启动与停止键StartPause,
Key1:闹钟时间显示/设置键SetKey/显示保持键HoldReset
8位7段码从左到右编号为8-1
━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━ ━
┃ ┃
━
┃ ┃
━
8 7 6 5 4 3 2 1
两个LED分别指示闹钟与整点提示的开关状态。
(三)仿真实验条件要求
试验板为EDA Pro2K实验开发系统,仿真芯片用Altera FLEX10K系列的EPF10K10LC84-4。
由于实验板有限,大部分仿真在计算机上用maxplus或其它软件完成。当认为运行比较理想时,要按照后文的管脚定义,分配好管脚,编译成可下载的文件,到实验室申请做下载试验。要求能够实现主体功能,实验结果存在的问题,要在报告中分板其原因。
二、详细功能及状态描述:
总体分四种模式,由Key3(ModeKey)切换
(一)时间显示模式:
初始状态为24小时制显示当前时间:小时(8-7)/分(6-5)/秒(4-3),2-1位不显。设置为12小时制时,第1位数码管显示上午/下午,上午显示A(AM),下午显示b(如果自己控制七段码也可以令其显示P)
按Key2显示当前日历:年(8-7)/月(6-5) /日(4-3) /星期(1),第2位不显。释放Key2还原显示;
按Key1显示闹钟所定时间:24小时制下显示:小时(8-7)/分(6-5),4-1位不显。12小时制下第1位数码管显示A/B。
按Key3(ModeKey)进入下一模式:跑表模式
(二)跑表模式
状态机如下图所示:
显示:小时(9-7)分钟(6-5)/秒(4-3)/百分秒(2-1)
按Key3(ModeKey)进入下一模式:校时/校日历
(三)校时模式
按Key2进行调节对像选择
小时 Key2
--->
分 Key2
--->
秒
清0 Key2
--->
24/12小时切换 Key2
--->
年 Key2
--->
月 Key2
--->
日 Key2
--->
星期 Key2
--┐
<-┘
按Key1一下,所调对像加1(或秒清0),长按Key1一秒钟以上,进入快调模式,所调对像每秒跳变8-10次。设置某一部分时,要断开相关的进位链,如:正在调分时,应忽略秒的进位脉冲,并且满60的进位也不能影响到后面的小时。
按Key3(ModeKey)进入下一模式:闹钟设定模式
(四)闹钟设定模式
按Key2进行调节对像选择
Key2 Key2 Key2 Key2
调小时---->调分---->闹钟开关----->整点提示开关----->调小时
调节方式同上。
按Key3(ModeKey)回到时间显示模式。
三、参考模块设计:
1.按键接口模块
功能:1)消除按键的抖动,输出平稳的电平
2)跟据不同模块的需要输出不同宽度的电平。
如:输入到跑表的按键电平宽度应与状态机所用时钟的宽度相同。在设定时间和闹钟时,长按Key3需要输出快速调节脉冲。
2.分频模块:由输入的时钟得到需要的各种基准频率,详细讨论见设计提示。
3.模式切换模块:通过按键切换当前模式及设置选择。
输入:ModeKey,SetSelKey
输出:当前显示模式Mode,设置对像选择SetSel
注意一点的是:当Mode变化时,SetSel应自动清0。
4.计时/校时模块
根据Mode、SetSel的不同,对各时间部分进行计数及设置
输入:1Hz脉冲,Mode,SetSel,设置脉冲等
输出:秒、分、小时、日、月、年和星期,并且小时需要24/12小时制两种输出
5.设定闹钟模块:
输入:Mode,SetSel,设置脉冲、当前时间等
输出:所定时间,小时也需要24/12小时制两种输出
6.秒表模块:
输入:Mode,StartPauseKey,HoldResetKey
输出:当前计时,Holding状态所保持的时间
7.闹钟控制及波形产生模块
到了设定时间,输出闹铃波形至蜂鸣器
闹铃:1秒四个节拍:嘀-嘀-----(-表示无声,长度1/8秒)声音频率:1kHz左右
整点提示音:四低一高,低音500Hz左右,高音1kHz左右,59分钟最后十秒声音为:—低—低—低—低—高,(—表示无声,长度1秒)
8.显示控制模块
控制不同模式下显示不同的内容,以及调节时闪烁显示。
四、设计提示
1.关于输入时钟
试验板上可以输入4路时钟,并有多钟频率可以选择(详见后文实验板资源),问题:输入几路时钟?各多少赫兹?如何分频得到所需频率?
提示:选择时钟源的原则是:输入的时钟源尽量少,内部分频器也要尽量少。先查看一下需要哪些时钟。
计时的基准时钟:1Hz
跑表的基准时钟:100Hz
数字闪烁显示:2Hz
闹铃/整点提示音:节拍控制4Hz/1Hz,及声音频率1kHz/500Hz左右
快速调节:每秒8-10次
七段码扫描显示:>=200Hz(每位数字至少25Hz,8位扫描至少要200Hz的扫描频率)
参考一:输入两路时钟源:8Hz和4096Hz
8Hz经分频得到:4Hz,2Hz,1Hz
4096Hz经分频得到音频与数码管的扫描脉冲:1024Hz,512Hz
4096Hz经41分频得到:100Hz(误差小于0.1%)
参考二:输入一路时钟源,由4096Hz分频得到全部所需时钟。
2.关于星期
星期的设定可以有自动和手动两种方案,自动是指根据当前年、月、日自动确定星期几;手动方案是需要自己设定好星期,然后星期与日历同步走。手动设计相对简单一些,自动则需要利用Altera芯片提供的EAB来实现ROM型的查找表。
3.关于24/12小时制
设计中时间与闹钟定时都需要小时在两钟模式下显示,设计不好就会增加很多资源的开销。有三种设计方案:
1)两套计数器分别计24/12小时制的时间。
2)只计数24制小时,用组合逻辑来转换24->12
3)用查找表来转换。注意的是两个地方都要转换,如何同享同一个查找表?
24/12小时对照表
24: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 13 17 18 19 20 21 22 23
12: 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11
AM PM
4.关于跑表的状态机设计
所需输出的变量Runing,Holding与状态有关,与输入无关,但需要控制的清0、刷新保持显示的值不仅与状态有关,与输入也有关。但是可以设计三个状态下状态变量S的值分别为:00/01/11(格雷码),则Runing对应S的低位,Holding对应S的高位,这样需要改变的只有清0与刷新保持值的信号,可以当作Merly状态机来设计。
5.关于按键除抖动及固定宽度脉冲输出
按键除抖动的原理是:当检测到一个高电平时,延时一段时间(如10ms)再检测,如果仍是高电平就表明按键确实按下了。释放按键也是同样的检测方法。
固定宽度脉冲生成的原理是:在去除抖动的基础上,判断两个经过不同延时的按键信号,如果前一时钟检测到的是低电平,这一时钟检测到高电平,说明按键按下,输出一个时钟周期宽度的高电平。
6.关于试验板的资源与仿真模式
本实验中需要利用到的有时钟源、按键、数码管、LED和蜂鸣器。实验板上可以选择不同的模式来选择不同的输入输出方式,本实验可选择模式三、七、八。后两种控制显示效果的能力强一些,做起来也相对复杂。
先介绍一下几种模式下的引脚定义,比较优缺点,并给出相关设计提示。
三种模式下时钟源、LED、蜂命器的定义完全相同:
资源名称 引脚名称 引脚号 功能
时钟 CLK0 3 1/4/16/64/1024/4096/16384/65536/12M/24M/48M
CLK1 5 1/2/8
CLK2 6 1024/4096/32768
CLK3 7 12M/24M/48M
LED D8/D7/D6/D5 81/80/79/78 红/黄/绿/绿
D4/D3/D2/D1 73/72/71/70 绿/绿/黄/红
蜂鸣器 SPK 83
按键输入在三种模式下管脚号相同,但输入的电平模式不同
资源名称 引脚名称 引脚号 模式三 模式七 模式八
按键 K8/K7/K6/K5 19/18/17/16 琴键电平 乒乓电平 乒乓电平
K4/K3/K2/K1 11/10/9/8 琴键电平 乒乓电平 2ms脉冲
琴键电平是指按下时输出高电平,释放恢复低电平
乒乓电平是指按一次变成高电平,再按一次变成低电平,如此反复
数码管的输出在三钟模式下完全不同:
模式三: 每个数码管有4个引脚作为8421码输入,经内部译码,显示0-F十六进制数;
模式七:8个数码管并联成动态扫描显示器,共12个引脚,其中4个作为公用的显示数值输入端,8个为输出的选择端。也就是说,每一时刻8个选择端只有一个高电平,其余为低电平,输入的数值显示在高电平对应的数码管上。
模式八:也是动态扫描显示,不同的有16个引脚,除8个为输出的选择端外,另八个对应七段码的每一段及小数点。
几种模式相比较,模式三输出最简单,但不能控制数码管的亮与灭。模式七的显示比较实用一些,可以控制亮与灭,但不能点亮数码管的点号,缺少各时间部分的分隔号。模式八功能最强,除了可以点亮点号作为分隔符外,还可以显示非标准的字符,比如可以显示P来指示下午。
虽然模式七、八能控制数码管的亮与灭,但不足之处是按键都没有符合需要的琴键电平,使用起来不太方便。只能选择乒乓电平,每次需要按两次来完成实际需要的一次按键。
各种模式参考设计如下:
模式三:如果想控制某个数码管灭或闪烁,输出F与正常显示的数字相区别。(输出Z是无效的,默认输出是0)
模式七/八:需要三组8位的状态码来控制分别控制扫描输出、亮与灭、闪烁。
扫描码:ScanCode,由8位循环移位计数器还控制,扫描时钟频率>200Hz。
使能位:LEDEnable,为1的位对应用数码管才亮。
闪烁位:Blink,为0的位闪动
三组状态码与闪烁用的2Hz脉冲组合起来控制相应数码管的显示。
三种模式下的数码管管脚定义:
模式三:
数码管号 位 管脚号
数码管8 B3/B2/B1/B0 69/67/66/65
数码管7 B3/B2/B1/B0 64/62/61/60
数码管6 B3/B2/B1/B0 59/58/54/53
数码管5 B3/B2/B1/B0 52/51/50/49
数码管4 B3/B2/B1/B0 48/47/39/38
数码管3 B3/B2/B1/B0 37/36/35/30
数码管2 B3/B2/B1/B0 29/28/27/25
数码管1 B3/B2/B1/B0 24/23/22/21
模式七/八
管脚名称 管脚号
动态数码选择 8/7/6/5/4/3/2/1 59/58/54/53/52/51/50/49 模式七/八
显示数据 B3/B2/B1/B0 64/62/61/60 模式七
a/b/c/d/e/f/g/p 60/61/62/64/65/66/67/69 模式八
(注:以上各表的排列顺序与实验板上从左至右的循序一致)
MAX7219,数字显示用
单片机,任意一款51的就可以了
获取时钟就用DS12CR887,
键盘用4*4普通的16位键盘,也可以用8279。
其他的自己设计吧。