1、大连理工大学本科实验报告题目:数字钟课程名称: 数字电路课程设计 学院(系): 电信学部 专 业: 电气工程及其自动化 班 级: 电气 1603 班 学生姓名: 肖也 学 号: 201692279 完成日期: 2018.12.26 成 绩: 2018 年 12 月 26 日数字电路实验室安全操作规范在实验室指定的位置进行实验。实验前,应检查要使用的实验设备是否在正确的位置,注意人身安全,防止使用过程中造成事故。使用设备前,检查是否有漏电等危险情况。如果设备不正常,要关闭电源,请指导教师更换。禁止学生未经允许移动和更换以及检修设备。实验室内的仪器设备要安全接地,注意仪器设备的通风和防尘,远离高温
2、以及强辐射区域。仪器设备要按照使用说明书操作,严禁用锐器和硬物损坏仪器设备、电源线和信号线等,严禁在实验室刻画和做标记等行为。应正确选择和使用设备,严禁违章操作,避免人身事故和仪器损坏,造成损失的要赔偿。一般情况下,禁止学生携带个人的电子元器件和设备进入实验室。学生自制的电路必须经过指导教师批准才能接到实验设备上。严禁学生携带实验室的设备和元器件等到实验室外。借用设备时要请示教师,登记之后再带离,并在规定的时间内归还,归还时要检查是否正常。实验过程中,禁止带电操作,检查电路时要关闭电源。如果发现有异常发热,焦糊味和异常声响等,应首先关闭电源,并请指导教师解决。如遇到地震、火灾等灾害要按照实验室
3、安全预案进行处理。实验结束后,要整理实验设备到正确的位置,带好个人物品,清扫卫生后,经过指导教师允许才能离开。离开时,各个实验设备要关闭电源,计算机和投影仪要按照正确的方法关机,不得强行关闭。电脑中不能存放与教学无关的资料,不能玩游戏和观看电影。进入实验室时,不能携带食品和饮料。离开时,要把垃圾带走。签名:日期:题目:数字钟1 设计要求(1) 能够显示当前时间,分别用 6 个数码管显示小时、分钟、秒钟的时间,秒针的计数频率为 1Hz;(2) 具有手动校时、校分、校秒的功能,调整的形式为通过按键进行累加;(3) 在整点进行提示,通过六位流水灯来实现,具体方式为 2 秒 1 个轮回,偶数位和奇数位
4、各亮 1 秒,循环闪烁直到整点过 1 分结束。(4) 具有闹钟功能,闹钟时间可以任意设定,只能调整时和分,秒数统一设置为 0(设定的形式同样为通过按键累加) ,并且在设定的时间能够进行提示,提示由 1 位LED 闪烁实现,闹钟到点后持续一分钟;(5) 具有闹铃音乐功能,由蜂鸣器接到开发板 GPIO 引脚输出实现,闹钟到点后自动循环播放事先编制好的特定乐谱的音乐,持续时间和闹钟到点提示灯一样为 1 分钟;(6) 设计模式选择计数器,有计时、校时(手动校时和闹钟定时)及整点报时三个模式,通过计数器来控制各个功能之间转换。2 设计分析及系统方案设计4 个输入:27Mhz 时钟,三个按键;14 个输出
5、:6 个数码管显示输出,2 个当前校时提示灯(分别提示当前为校正数字钟和设定闹铃时间) ,3 个当前校时位提示灯(时、分、秒) ,1 个闹钟到点提示灯,1 个整点报时 6 位流水灯,1 个蜂鸣器输出引脚;通过对 50MHZ 的 clk 进行分频得到 1Hz 时钟信号作为基本信号,三个按键分别控制模式,调时位,累加。时 分 秒 key3 key2 key1位 位 位 模式 校时 校时显 显 显 提示 位 按键示 示 示 提示 累加图 1 系统框图3 系统以及模块硬件电路设计硬件电路及其引脚说明如下:图 2 按键部分电路表 1 按键部分接口定义图 3 数码管部分电路表 2 数码管部分接口定义图 4
6、 LED 部分电路整点报时 6 位流水灯闹钟到时提示灯由下到上依次为时分秒当前校时位提示灯LEDG7: 闹钟定时提示灯LEDG8 数字钟校时提示灯表 3 实验中用到的 LED 接口定义图 5 GPIO 接口部分电路表 4 实验中用到的 GPIO 引脚(蜂鸣器外设接口)定义4 系统的 Verilog HDL 设计module clock (clk,add,set_mod_key,set_xx_key,hour1_show,hour2_show,min1_show,min2_show, sec1_show,sec2_show,set_time_LED,set_clock_LED,set_hour_
7、LED,set_sec_LED,set_min_LED,alarm_light,hourly_light,speaker); input clk,set_mod_key,set_xx_key,add;/输入为 50MHZ 开发板时钟和三个按键:运行模式、调时位、累加output6:0 hour1_show,hour2_show,min1_show,min2_show,sec1_show,sec2_show;/6个数码管显示输出output set_time_LED,set_clock_LED; /数字钟校时提示灯和闹钟定时提示灯output set_hour_LED,set_sec_LED,s
8、et_min_LED; /当前校时位提示灯(时、分、秒)output alarm_light; /闹钟到时提示灯output5:0 hourly_light; /整点报时六位流水灯output speaker; /扬声器 GPIO 引脚对应的音频输出端状态寄存器reg6:0 hour1_show,hour2_show,min1_show,min2_show,sec1_show,sec2_show;/时分秒显示数码管reg3:0 hour1,hour2,min1,min2,sec1,sec2;/存储正常计时的当前时间reg3:0 set_hour1,set_hour2,set_min1,set_
9、min2,set_sec1,set_sec2;/存储校时功能的目标校正时间reg3:0 shour1,shour2,smin1,smin2,ssec1,ssec2;/存储数码管应显示的对应十进制数的寄存器reg3:0 ahour1,ahour2,amin1,amin2,asec1,asec2;/存储闹钟定时reg set_counter;reg clk_sec,clk_2s;/秒脉冲(1HZ 的时钟脉冲)reg24:0 counter1;reg24:0 counter2;reg set_time,set_clock;/分别为校时和闹钟定时的启动开关reg set_hour,set_sec,se
10、t_min;/校时和闹钟定时设置时分秒的标志寄存器reg set_time_LED,set_clock_LED;/校时模式提示灯和闹钟定时模式提示灯reg set_hour_LED,set_sec_LED,set_min_LED;/当前校时、闹钟定时时分秒位提示灯reg alarm_light;reg5:0 hourly_light;reg set_ok;/标志校时或者闹钟定时已完成reg clock_sys;/当前计时模式标志寄存器reg speaker;reg clk_6mhz;/由 50MHZ 系统时钟八分频得到(实际为 6.25MHZ),用于产生各种音阶频率的基准频率reg clk_8
11、hz;/用于控制音长 (节拍)的时钟频率,所有节拍均为 1/4 拍的整数倍reg14:0 divider,origin;/divider 为分频系数,origin 为各个音调实现分频的加载预置数reg carry;reg7:0 counter;/*乐曲从开始处经过的 1/4 节拍(1/8 秒)数计数器*/reg3:0 high,med,low;/*高中低八度音阶*/reg2:0 count8;/50MHZ 八分频作为基频reg18:0 count19;/6.25MHZ 时钟分频到 8HZ 所需要的计数器parameter div_para1=25000000;parameter num_qua
12、rter_note=143;/闹钟音乐四分音符数目/*50MHz 转化为 1Hz*/always(posedge clk)begincounter1=div_para1)begincounter1=0;clk_sec=!clk_sec;endendalways(posedge clk_sec)beginclk_2s=clk_2s;end/为闹钟到点提示灯和整点报时流水灯设置的 0.5HZ 时钟信号,由数字钟秒脉冲二分频得到/*模式 1:正常计时*/always(posedge clk_sec)beginif(set_ok=1sec2=set_sec2;min1=set_min1;min2=se
13、t_min2;hour1=set_hour1;hour2=set_hour2;endif(!set_time)/24 小时计时if (sec2=4h9)beginsec2=4h0; if (sec1=4h5)beginsec1=4h0;if (min2=4h9)beginmin2=4h0;if (min1=4h5)beginmin1=4h0;if (hour2=4h3hour1=4h0; endelse if (hour2=4h9)beginhour2=4h0;if (hour1=4h5)hour1=4h0;elsehour1=hour1+1b1;endelsehour2=hour2+1b1;
14、end elsemin1=min1+1b1;endelsemin2=min2+1b1;endelsesec1=sec1+1b1; endelsesec2=sec2+1b1;end/*模式 1 计时、模式 2 校时、模式 3 闹钟定时时间显示*/ always(posedge clk)beginif(set_time=1)beginssec1=set_sec1;ssec2=set_sec2;smin1=set_min1;smin2=set_min2;shour1=set_hour1;shour2=set_hour2;endelse if(set_clock=1)beginssec1=asec1;
15、ssec2=asec2;smin1=amin1;smin2=amin2;shour1=ahour1;shour2=ahour2;endelsebeginssec1=sec1;ssec2=sec2;smin1=min1;smin2=min2;shour1=hour1;shour2=hour2;endcase(shour1)4b0000 : hour1_show=7b1000000;4b0001 : hour1_show=7b1111001;4b0010 : hour1_show=7b0100100;endcasecase(shour2)4b0000 : hour2_show=7b1000000;
16、4b0001 : hour2_show=7b1111001;4b0010 : hour2_show=7b0100100;4b0011 : hour2_show=7b0110000;4b0100 : hour2_show=7b0011001;4b0101 : hour2_show=7b0010010;4b0110 : hour2_show=7b0000010;4b0111 : hour2_show=7b1111000;4b1000 : hour2_show=7b0000000;4b1001 : hour2_show=7b0010000;endcasecase(smin1)4b0000 : min
17、1_show=7b1000000;4b0001 : min1_show=7b1111001;4b0010 : min1_show=7b0100100;4b0011 : min1_show=7b0110000;4b0100 : min1_show=7b0011001;4b0101 : min1_show=7b0010010;4b0110 : min1_show=7b0000010;endcasecase(smin2)4b0000 : min2_show=7b1000000;4b0001 : min2_show=7b1111001;4b0010 : min2_show=7b0100100;4b00
18、11 : min2_show=7b0110000;4b0100 : min2_show=7b0011001;4b0101 : min2_show=7b0010010;4b0110 : min2_show=7b0000010;4b0111 : min2_show=7b1111000;4b1000 : min2_show=7b0000000;4b1001 : min2_show=7b0010000;endcasecase(ssec1)4b0000 : sec1_show=7b1000000;4b0001 : sec1_show=7b1111001;4b0010 : sec1_show=7b0100
19、100;4b0011 : sec1_show=7b0110000;4b0100 : sec1_show=7b0011001;4b0101 : sec1_show=7b0010010;4b0110 : sec1_show=7b0000010;endcasecase(ssec2)4b0000 : sec2_show=7b1000000;4b0001 : sec2_show=7b1111001;4b0010 : sec2_show=7b0100100;4b0011 : sec2_show=7b0110000;4b0100 : sec2_show=7b0011001;4b0101 : sec2_sho
20、w=7b0010010;4b0110 : sec2_show=7b0000010;4b0111 : sec2_show=7b1111000;4b1000 : sec2_show=7b0000000;4b1001 : sec2_show=7b0010000;endcaseend/*整时提醒*/always(posedge clk) beginif(clock_sys=1)if(min1=5 /59 分 50/52/54/56/58 秒 LEDR024亮else if(min1=0 /整点时同上else if(min1=5 /59 分 51/53/55/57/59 秒 LEDR135亮elseho
21、urly_light=6b000000;end/*调时位置按键检测 */ always(posedge set_xx_key)beginif(set_time=1|set_clock=1)beginif(set_hour=1)/调时完下一步调秒,调秒完下一步调分,调分完下一步调时,依次循环beginset_hour=0;set_min=0;set_sec=1;set_ok=1;set_hour_LED=0;set_min_LED=0;set_sec_LED=1;endelse if(set_sec=1)beginset_hour=0;set_min=1;set_sec=0;set_ok=1;s
22、et_hour_LED=0;set_min_LED=1;set_sec_LED=0;endelse if(set_min=1)beginset_hour=1;set_min=0;set_sec=0;set_ok=1;set_hour_LED=1;set_min_LED=0;set_sec_LED=0;endelse/如果调时位置按键的几个寄存器均为 0,那么下一步默认按调秒处理,只用于刚上电启动第一次校时或闹钟定时的情况beginset_hour=0;set_min=0;set_sec=1;set_ok=1;set_hour_LED=0;set_min_LED=0;set_sec_LED=1;
23、endendif(set_time=0set_min=0;set_sec=0;set_ok=0;set_hour_LED=0;set_sec_LED=0;set_min_LED=0;endend/*调时模式按键检测 */ always(posedge set_mod_key)/在计时、校时和闹钟定时三个模式之间依次循环切换,每次按下 set_mod_key 键及切换到下一模式并且相应的提示灯亮beginif(set_time=1)beginset_time=0;set_clock=1;clock_sys=0;set_time_LED=0;set_clock_LED=1;endelse if(s
24、et_clock=1)beginset_time=0;set_clock=0;set_time_LED=0;set_clock_LED=0;clock_sys=1;/clock_sys 标志当前数字钟正处在正常计时模式endelsebeginset_time=1;set_clock=0;clock_sys=0;set_time_LED=1;set_clock_LED=0;endend/*add 检测*/always(posedge add)beginif(set_time=1)beginif(set_sec=1)beginif(set_sec2=9)beginif(set_sec1=5)beg
25、inset_sec1=0;set_sec2=0;endelsebeginset_sec1=set_sec1+1b1;set_sec2=0;endendelsebeginset_sec2=set_sec2+1b1;endendelse if(set_min=1)beginif(set_min2=9)beginif(set_min1=5)beginset_min1=0;set_min2=0;endelsebeginset_min1=set_min1+1b1;set_min2=0;endendelseset_min2=set_min2+1b1;endelse if(set_hour=1)begini
26、f(set_hour1!=2)beginif(set_hour2=9)beginset_hour1=set_hour1+1b1;set_hour2=0;endelseset_hour2=set_hour2+1b1;endelsebeginif(set_hour2=3)beginset_hour1=0;set_hour2=0;endelse if(set_hour23)set_hour2=set_hour2+1b1;endendendelse if(set_clock=1)beginif(set_sec=1)beginasec2=0;asec1=0;endelse if(set_min=1)be
27、ginif(amin2=9)beginif(amin1=5)beginamin1=0;amin2=0;endelsebeginamin1=amin1+1b1;amin2=0;endendelseamin2=amin2+1b1;endelse if(set_hour=1)beginif(ahour1!=2)beginif(ahour2=9)beginahour1=ahour1+1b1;ahour2=0;endelseahour2=ahour2+1b1;endelsebeginif(ahour2=3)beginahour1=0;ahour2=0;endelse if(ahour23)ahour2=
28、ahour2+1b1;endendendend/*闹钟到点提示灯 */always(posedge clk)beginif(clock_sys=1)if(clk_2s=1elsealarm_light=0;end/*闹钟音乐 */always(posedge clk)/从 50MHZ 分频得到 6.25MHZ 时钟begin if(count8=7)begin count8=0;clk_6mhz=1;endelse begin count8=count8+1b1;clk_6mhz=0;endendalways(posedge clk_6mhz)/从 6.25MHZ 分频得到 8HZ 时钟beg
29、inif(count19=390625)begin clk_8hz=clk_8hz;count19=0;endelse count19=count19+1b1;endalways(posedge clk_6mhz)/通过置数,改变分频比beginif(divider=32767)/215-1begin carry=1;divider=origin;endelsebegin divider=divider+1b1;carry=0;endendalways(posedge carry)/2 分频得到方波信号,得到每个四分音符 1/8 秒内的特定频率的声音振动begin speaker=speake
30、r;endalways(posedge clk_8hz)begincase(high,med,low)/根据不同的音符,预置分频比h001: origin=8876; h002:origin=11487;h003: origin=13805; h004:origin=14869;h005: origin=16823; h006:origin=18562;h007: origin=20113; h010:origin=20824;h020: origin=22125; h030:origin=23287;h040: origin=23832; h050:origin=24795;h060: or
31、igin=25665; h070:origin=26440;h100: origin=26795; h200:origin=27446;h300: origin=28030; h400:origin=28293;h500: origin=28781; h600:origin=29216;h700: origin=29603; h000:origin=32767;/休止符endcaseendalways(posedge clk_8hz)/闹钟到时,循环播放一分钟闹铃音乐if(clock_sys=1)beginif(ahour1=hour1elsecounter=counter+1b1;case(
32、counter)/乐曲片段乐谱0:high,med,low=h000; 1:high,med,low=h0002:high,med,low=h000; 3:high,med,low=h000;4:high,med,low=h000; 5:high,med,low=h000;6:high,med,low=h000; 7:high,med,low=h000;8:high,med,low=h000; 9:high,med,low=h000; 10:high,med,low=h010; 11:high,med,low=h010;12:high,med,low=h010; 13:high,med,low
33、=h010;14:high,med,low=h020; 15:high,med,low=h020;16:high,med,low=h030; 17:high,med,low=h030;18:high,med,low=h030; 19:high,med,low=h030;20:high,med,low=h020; 21:high,med,low=h020;22:high,med,low=h030; 23:high,med,low=h030;24:high,med,low=h000; 25:high,med,low=h000;26:high,med,low=h030; 27:high,med,lo
34、w=h030;28:high,med,low=h020; 29:high,med,low=h020; 30:high,med,low=h010; 31:high,med,low=h010;32:high,med,low=h050; 33:high,med,low=h050;34:high,med,low=h050; 35:high,med,low=h050;36:high,med,low=h030; 37:high,med,low=h030;38:high,med,low=h050; 39:high,med,low=h050;40:high,med,low=h000; 41:high,med,
35、low=h000;42:high,med,low=h050; 43:high,med,low=h050;44:high,med,low=h060; 45:high,med,low=h060;46:high,med,low=h070; 47:high,med,low=h070;48:high,med,low=h100; 49:high,med,low=h100;50:high,med,low=h100; 51:high,med,low=h100;52:high,med,low=h100; 53:high,med,low=h100;54:high,med,low=h100; 55:high,med
36、,low=h100;56:high,med,low=h100; 57:high,med,low=h100;58:high,med,low=h070; 59:high,med,low=h070;60:high,med,low=h060; 61:high,med,low=h060;62:high,med,low=h070; 63:high,med,low=h070;64:high,med,low=h060; 65:high,med,low=h060;66:high,med,low=h030; 67:high,med,low=h030;68:high,med,low=h030; 69:high,me
37、d,low=h030;70:high,med,low=h050; 71:high,med,low=h050;72:high,med,low=h050; 73:high,med,low=h050;74:high,med,low=h050; 75:high,med,low=h050;76:high,med,low=h050; 77:high,med,low=h050;78:high,med,low=h060; 79:high,med,low=h060;80:high,med,low=h100; 81:high,med,low=h100;82:high,med,low=h050; 83:high,m
38、ed,low=h050;84:high,med,low=h050; 85:high,med,low=h050;86:high,med,low=h060; 87:high,med,low=h060;88:high,med,low=h000; 89:high,med,low=h000;90:high,med,low=h060; 91:high,med,low=h060;92:high,med,low=h050; 93:high,med,low=h050;94:high,med,low=h040; 95:high,med,low=h040;96:high,med,low=h050; 97:high,
39、med,low=h050;98:high,med,low=h030; 99:high,med,low=h030;100:high,med,low=h030; 101:high,med,low=h030;102:high,med,low=h020; 103:high,med,low=h020;104:high,med,low=h010; 105:high,med,low=h010;106:high,med,low=h010; 107:high,med,low=h010;108:high,med,low=h010; 109:high,med,low=h010;110:high,med,low=h0
40、60; 111:high,med,low=h010;112:high,med,low=h030; 113:high,med,low=h030;114:high,med,low=h020; 115:high,med,low=h020;116:high,med,low=h020; 117:high,med,low=h020;118:high,med,low=h010; 119:high,med,low=h010;120:high,med,low=h020; 121:high,med,low=h020;122:high,med,low=h050; 123:high,med,low=h050;124:
41、high,med,low=h050; 125:high,med,low=h050;126:high,med,low=h001; 127:high,med,low=h001;128:high,med,low=h020; 129:high,med,low=h020;130:high,med,low=h020; 131:high,med,low=h020;132:high,med,low=h020; 133:high,med,low=h020;134:high,med,low=h020; 135:high,med,low=h020;136:high,med,low=h020; 137:high,me
42、d,low=h020;138:high,med,low=h020; 139:high,med,low=h020;140:high,med,low=h000; 141:high,med,low=h000;142:high,med,low=h000; 143:high,med,low=h000;endcaseendelsehigh,med,low=h000;endendmodule5 结论以及结果说明系统在 DE2 开发板上能够正常运行,时间显示、计时、校时、闹钟定时和闹铃音乐都能正常工作,整点报时 LED 流水灯的花型也可以正常显示。基本实现了数字钟的功能。6 闹铃音乐部分设计说明乐曲演奏的基本
43、原理:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能连续演奏所需的两个基本数据。只要控制输出到蜂鸣器(扬声器)的激励信号的频率高低和持续时间,就可以使蜂鸣器(扬声器)发出连续的乐曲声。频率高低决定音调高低,简谱中每个音名都有特定的频率。所有不同频率的信号从同一个基准频率分频得到(此次课设从系统时钟 50MHZ 八分频的 6.25MHZ 方波再次分频得来) 。由于音阶频率多为非整数而分频系数又不能为小数,必须将计算得到的分频数四舍五入取整。基准频率必须适当大一些,以减小分频比取整的相对误差,同时避免分频数过大系统高频工作带来的不可靠因素。此次课设采用了加载预置数法实现分频,各个
44、不同音阶频率分频系数不同,用同一个整数减去分频系数,得到一组各音阶的加载预置数。对于乐曲中的休止符,只需分频系数设为 0,相应地加载的初始值设为该整数即可。该方法比反馈置零法更节省资源。音长控制需以乐曲中最短的音符作为节拍基准(例如四分音符) ,对于节拍较长的音符,只需在记谱时将该音名连续记录多次( )即可。2经过计算,得到不同音调的分频比和预置数如下表音名 分频比 预置数低音 1 23891 8876低音 2 21280 11487低音 3 18962 13805低音 4 17898 14869低音 5 15944 16823低音 6 14205 18562低音 7 12654 20113中
45、音 1 11943 20824中音 2 10642 22125中音 3 9480 23287中音 4 8935 23832中音 5 7972 24795中音 6 7102 25665中音 7 6327 26440高音 1 5972 26795高音 2 5321 27446高音 3 4737 28030高音 4 4474 28293高音 5 3986 28781高音 6 3551 29216高音 7 3164 29603休止符 0 32767(以 6.25MHZ 作为基频分频 ,15 位寄存器存储分频数,预置数=32767-分频比)7 心得体会及收获在本次实验过程中,自己独立完成了数字钟的设计,
46、大部分功能可以正常实现。本次实验不仅锻炼了自己的独立思考能力,而且还锻炼了自己的动手能力。加深了对数字电路以及 Verilog HGL 语言的理解及应用。1. 此次实验碰到最主要的阻碍是,最初 24 小时秒计时最基础的功能经常出现一些匪夷所思的 bug,例如秒向分进位时只有到下一分钟秒数为 1 时分钟数才进 1(eg. 00:24:5900:24:0000:25:01) 。向老师请教后,理解到 Verilog HDL 与 C 语言最大的区别是不是严格的面向过程的语言,而是各个逻辑块的组合,代码执行不具有明显的时序性,因此在书写条件语句时必须非此即彼,保证各个分支逻辑的独立性,而且条件分支的先后也隐含了判断条件的优先级。在将时分秒计时三个模块 always 语句合并到一起,并将进位处衔接好后,顺利完成了计时模块。2. 此实验音乐闹铃功