数电课设实验报告.docx
《数电课设实验报告.docx》由会员分享,可在线阅读,更多相关《数电课设实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
数电课设实验报告
大连理工大学本科实验报告
题目:
数字钟
课程名称:
数字电路课程设计
学院(系):
电信学部
专业:
电气工程及其自动化
班级:
电气1603班
学生姓名:
肖也
学号:
201692279
完成日期:
2018.12.26
成绩:
2018年12月26日
数字电路实验室安全操作规范
在实验室指定的位置进行实验。
实验前,应检查要使用的实验设备是否在正确的位置,注意人身安全,防止使用过程中造成事故。
使用设备前,检查是否有漏电等危险情况。
如果设备不正常,要关闭电源,请指导教师更换。
禁止学生未经允许移动和更换以及检修设备。
实验室内的仪器设备要安全接地,注意仪器设备的通风和防尘,远离高温以及强辐射区域。
仪器设备要按照使用说明书操作,严禁用锐器和硬物损坏仪器设备、电源线和信号线等,严禁在实验室刻画和做标记等行为。
应正确选择和使用设备,严禁违章操作,避免人身事故和仪器损坏,造成损失的要赔偿。
一般情况下,禁止学生携带个人的电子元器件和设备进入实验室。
学生自制的电路必须经过指导教师批准才能接到实验设备上。
严禁学生携带实验室的设备和元器件等到实验室外。
借用设备时要请示教师,登记之后再带离,并在规定的时间内归还,归还时要检查是否正常。
实验过程中,禁止带电操作,检查电路时要关闭电源。
如果发现有异常发热,焦糊味和异常声响等,应首先关闭电源,并请指导教师解决。
如遇到地震、火灾等灾害要按照实验室安全预案进行处理。
实验结束后,要整理实验设备到正确的位置,带好个人物品,清扫卫生后,经过指导教师允许才能离开。
离开时,各个实验设备要关闭电源,计算机和投影仪要按照正确的方法关机,不得强行关闭。
电脑中不能存放与教学无关的资料,不能玩游戏和观看电影。
进入实验室时,不能携带食品和饮料。
离开时,要把垃圾带走。
签名:
日期:
题目:
数字钟
1设计要求
(1)能够显示当前时间,分别用6个数码管显示小时、分钟、秒钟的时间,秒针的计数频率为1Hz;
(2)具有手动校时、校分、校秒的功能,调整的形式为通过按键进行累加;
(3)在整点进行提示,通过六位流水灯来实现,具体方式为2秒1个轮回,偶数位和奇数位各亮1秒,循环闪烁直到整点过1分结束。
(4)具有闹钟功能,闹钟时间可以任意设定,只能调整时和分,秒数统一设置为0(设定的形式同样为通过按键累加),并且在设定的时间能够进行提示,提示由1位LED闪烁实现,闹钟到点后持续一分钟;
(5)具有闹铃音乐功能,由蜂鸣器接到开发板GPIO引脚输出实现,闹钟到点后自动循环播放事先编制好的特定乐谱的音乐,持续时间和闹钟到点提示灯一样为1分钟;
(6)设计模式选择计数器,有计时、校时(手动校时和闹钟定时)及整点报时三个模式,通过计数器来控制各个功能之间转换。
2设计分析及系统方案设计
4个输入:
27Mhz时钟,三个按键;
14个输出:
6个数码管显示输出,2个当前校时提示灯(分别提示当前为校正数字钟和设定闹铃时间),3个当前校时位提示灯(时、分、秒),1个闹钟到点提示灯,1个整点报时6位流水灯,1个蜂鸣器输出引脚;
通过对50MHZ的clk进行分频得到1Hz时钟信号作为基本信号,三个按键分别控制模式,调时位,累加。
时分秒key3key2key1
位位位模式校时校时
显显显提示位按键
示示示提示累加
图1系统框图
3系统以及模块硬件电路设计
硬件电路及其引脚说明如下:
图2按键部分电路
表1按键部分接口定义
图3数码管部分电路
表2数码管部分接口定义
图4LED部分电路
整点报时6位流水灯
闹钟到时提示灯
由下到上依次为时分秒当前校时位提示灯
LEDG[7]:
闹钟定时提示灯
LEDG[8]数字钟校时提示灯
表3实验中用到的LED接口定义
图5GPIO接口部分电路
表4实验中用到的GPIO引脚(蜂鸣器外设接口)定义
4系统的VerilogHDL设计
moduleclock(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_LED,set_sec_LED,set_min_LED,alarm_light,hourly_light,speaker);
inputclk,set_mod_key,set_xx_key,add;//输入为50MHZ开发板时钟和三个按键:
运行模式、调时位、累加
output[6:
0]hour1_show,hour2_show,min1_show,min2_show,sec1_show,sec2_show;//6个数码管显示输出
outputset_time_LED,set_clock_LED;//数字钟校时提示灯和闹钟定时提示灯
outputset_hour_LED,set_sec_LED,set_min_LED;//当前校时位提示灯(时、分、秒)
outputalarm_light;//闹钟到时提示灯
output[5:
0]hourly_light;//整点报时六位流水灯
outputspeaker;//扬声器GPIO引脚对应的音频输出端状态寄存器
reg[6:
0]hour1_show,hour2_show,min1_show,min2_show,sec1_show,sec2_show;
//时分秒显示数码管
reg[3:
0]hour1,hour2,min1,min2,sec1,sec2;//存储正常计时的当前时间
reg[3:
0]set_hour1,set_hour2,set_min1,set_min2,set_sec1,set_sec2;
//存储校时功能的目标校正时间
reg[3:
0]shour1,shour2,smin1,smin2,ssec1,ssec2;
//存储数码管应显示的对应十进制数的寄存器
reg[3:
0]ahour1,ahour2,amin1,amin2,asec1,asec2;//存储闹钟定时
regset_counter;
regclk_sec,clk_2s;//秒脉冲(1HZ的时钟脉冲)
reg[24:
0]counter1;
reg[24:
0]counter2;
regset_time,set_clock;//分别为校时和闹钟定时的启动开关
regset_hour,set_sec,set_min;//校时和闹钟定时设置时分秒的标志寄存器
regset_time_LED,set_clock_LED;//校时模式提示灯和闹钟定时模式提示灯
regset_hour_LED,set_sec_LED,set_min_LED;//当前校时、闹钟定时时分秒位提示灯
regalarm_light;
reg[5:
0]hourly_light;
regset_ok;//标志校时或者闹钟定时已完成
regclock_sys;//当前计时模式标志寄存器
regspeaker;
regclk_6mhz;//由50MHZ系统时钟八分频得到(实际为6.25MHZ),用于产生各种音阶频率的基准频率
regclk_8hz;//用于控制音长(节拍)的时钟频率,所有节拍均为1/4拍的整数倍
reg[14:
0]divider,origin;//divider为分频系数,origin为各个音调实现分频的加载预置数
regcarry;
reg[7:
0]counter;/*乐曲从开始处经过的1/4节拍(1/8秒)数计数器*/
reg[3:
0]high,med,low;/*高中低八度音阶*/
reg[2:
0]count8;//50MHZ八分频作为基频
reg[18:
0]count19;//6.25MHZ时钟分频到8HZ所需要的计数器
parameterdiv_para1=25000000;
parameternum_quarter_note=143;//闹钟音乐四分音符数目
/**************50MHz转化为1Hz**************/
always@(posedgeclk)
begin
counter1<=counter1+1’b1;
if(counter1>=div_para1)
begin
counter1<=0;
clk_sec=!
clk_sec;
end
end
always@(posedgeclk_sec)
begin
clk_2s=~clk_2s;
end
//为闹钟到点提示灯和整点报时流水灯设置的0.5HZ时钟信号,由数字钟秒脉冲二分频得到
/*模式1:
正常计时*/
always@(posedgeclk_sec)
begin
if(set_ok==1&&set_time==1)
begin
sec1<=set_sec1;
sec2<=set_sec2;
min1<=set_min1;
min2<=set_min2;
hour1<=set_hour1;
hour2<=set_hour2;
end
if(!
set_time)//24小时计时
if(sec2==4'h9)
begin
sec2<=4'h0;
if(sec1==4'h5)
begin
sec1<=4'h0;
if(min2==4'h9)
begin
min2<=4'h0;
if(min1==4'h5)
begin
min1<=4'h0;
if(hour2==4'h3&&hour1==4'h2)
begin
hour2<=4'h0;
hour1<=4'h0;
end
elseif(hour2==4'h9)
begin
hour2<=4'h0;
if(hour1==4'h5)
hour1<=4'h0;
else
hour1<=hour1+1'b1;
end
else
hour2<=hour2+1'b1;
end
else
min1<=min1+1'b1;
end
else
min2<=min2+1'b1;
end
else
sec1<=sec1+1'b1;
end
else
sec2<=sec2+1'b1;
end
/***************模式1计时、模式2校时、模式3闹钟定时时间显示*************/
always@(posedgeclk)
begin
if(set_time==1)
begin
ssec1<=set_sec1;
ssec2<=set_sec2;
smin1<=set_min1;
smin2<=set_min2;
shour1<=set_hour1;
shour2<=set_hour2;
end
elseif(set_clock==1)
begin
ssec1<=asec1;
ssec2<=asec2;
smin1<=amin1;
smin2<=amin2;
shour1<=ahour1;
shour2<=ahour2;
end
else
begin
ssec1<=sec1;
ssec2<=sec2;
smin1<=min1;
smin2<=min2;
shour1<=hour1;
shour2<=hour2;
end
case(shour1)
4'b0000:
hour1_show<=7'b1000000;
4'b0001:
hour1_show<=7'b1111001;
4'b0010:
hour1_show<=7'b0100100;
endcase
case(shour2)
4'b0000:
hour2_show<=7'b1000000;
4'b0001:
hour2_show<=7'b1111001;
4'b0010:
hour2_show<=7'b0100100;
4'b0011:
hour2_show<=7'b0110000;
4'b0100:
hour2_show<=7'b0011001;
4'b0101:
hour2_show<=7'b0010010;
4'b0110:
hour2_show<=7'b0000010;
4'b0111:
hour2_show<=7'b1111000;
4'b1000:
hour2_show<=7'b0000000;
4'b1001:
hour2_show<=7'b0010000;
endcase
case(smin1)
4'b0000:
min1_show<=7'b1000000;
4'b0001:
min1_show<=7'b1111001;
4'b0010:
min1_show<=7'b0100100;
4'b0011:
min1_show<=7'b0110000;
4'b0100:
min1_show<=7'b0011001;
4'b0101:
min1_show<=7'b0010010;
4'b0110:
min1_show<=7'b0000010;
endcase
case(smin2)
4'b0000:
min2_show<=7'b1000000;
4'b0001:
min2_show<=7'b1111001;
4'b0010:
min2_show<=7'b0100100;
4'b0011:
min2_show<=7'b0110000;
4'b0100:
min2_show<=7'b0011001;
4'b0101:
min2_show<=7'b0010010;
4'b0110:
min2_show<=7'b0000010;
4'b0111:
min2_show<=7'b1111000;
4'b1000:
min2_show<=7'b0000000;
4'b1001:
min2_show<=7'b0010000;
endcase
case(ssec1)
4'b0000:
sec1_show<=7'b1000000;
4'b0001:
sec1_show<=7'b1111001;
4'b0010:
sec1_show<=7'b0100100;
4'b0011:
sec1_show<=7'b0110000;
4'b0100:
sec1_show<=7'b0011001;
4'b0101:
sec1_show<=7'b0010010;
4'b0110:
sec1_show<=7'b0000010;
endcase
case(ssec2)
4'b0000:
sec2_show<=7'b1000000;
4'b0001:
sec2_show<=7'b1111001;
4'b0010:
sec2_show<=7'b0100100;
4'b0011:
sec2_show<=7'b0110000;
4'b0100:
sec2_show<=7'b0011001;
4'b0101:
sec2_show<=7'b0010010;
4'b0110:
sec2_show<=7'b0000010;
4'b0111:
sec2_show<=7'b1111000;
4'b1000:
sec2_show<=7'b0000000;
4'b1001:
sec2_show<=7'b0010000;
endcase
end
/***************整时提醒************/
always@(posedgeclk)
begin
if(clock_sys==1)
if(min1==5&&min2==9&&sec1==5&&(sec2==0||sec2==2||sec2==4||sec2==6||sec2==8))
hourly_light<=6'b010101;//59分50/52/54/56/58秒LEDR[0][2][4]亮
elseif(min1==0&&min2==0&&sec1==0&&sec2==0)
hourly_light<=6'b010101;//整点时同上
elseif(min1==5&&min2==9&&sec1==5&&(sec2==1||sec2==3||sec2==5||sec2==7
||sec2==9))
hourly_light<=6'b101010;//59分51/53/55/57/59秒LEDR[1][3][5]亮
else
hourly_light<=6'b000000;
end
/********************调时位置按键检测*************/
always@(posedgeset_xx_key)
begin
if(set_time==1||set_clock==1)
begin
if(set_hour==1)//调时完下一步调秒,调秒完下一步调分,调分完下一步调时,依次循环
begin
set_hour<=0;
set_min<=0;
set_sec<=1;
set_ok<=1;
set_hour_LED<=0;
set_min_LED<=0;
set_sec_LED<=1;
end
elseif(set_sec==1)
begin
set_hour<=0;
set_min<=1;
set_sec<=0;
set_ok<=1;
set_hour_LED<=0;
set_min_LED<=1;
set_sec_LED<=0;
end
elseif(set_min==1)
begin
set_hour<=1;
set_min<=0;
set_sec<=0;
set_ok<=1;
set_hour_LED<=1;
set_min_LED<=0;
set_sec_LED<=0;
end
else//如果调时位置按键的几个寄存器均为0,那么下一步默认按调秒处理,只用于刚上电启动第一次校时或闹钟定时的情况
begin
set_hour<=0;
set_min<=0;
set_sec<=1;
set_ok<=1;
set_hour_LED<=0;
set_min_LED<=0;
set_sec_LED<=1;
end
end
if(set_time==0&&set_clock==0)
begin
set_hour<=0;
set_min<=0;
set_sec<=0;
set_ok<=0;
set_hour_LED<=0;
set_sec_LED<=0;
set_min_LED<=0;
end
end
/*******************调时模式按键检测**************/
always@(posedgeset_mod_key)
//在计时、校时和闹钟定时三个模式之间依次循环切换,每次按下set_mod_key键及切换到下一模式并且相应的提示灯亮
begin
if(set_time==1)
begin
set_time<=0;
set_clock<=1;
clock_sys<=0;
set_time_LED<=0;
set_clock_LED<=1;
end
elseif(set_clock==1)
begin
set_time<=0;
set_clock<=0;
set_time_LED<=0;
set_clock_LED<=0;
clock_sys<=1;//clock_sys标志当前数字钟正处在正常计时模式
end
else
begin
set_time<=1;
set_clock<=0;
clock_sys<=0;
set_time_LED<=1;
set_clock_LED<=0;
end
end
/***************add检测*****************/
always@(posedgeadd)
begin
if(set_time==1)
begin
if(set_sec==1)
begin
if(set_sec2==9)
begin
if(set_sec1==5)
begin
set_sec1<=0;
set_sec2<=0;
end
else
begin
set_sec1<=set_sec1+1'b1;
set_sec2<=0;
end
end
else
begin
set_sec2<=set_sec2+1'b1;
end
end
elseif(set_min==1)
begin
if(set_min2==9)
begin
if(set_min1==5)
begin
set_min1<=0;
set_min2<=0;
end
else
begin
set_min1<=set_min1+1'b1;
set_min2<=0;
end
end
else
set_min2<=set_min2+1'b1;
end
elseif(set_hour==1)
begin
if(set_hour1!
=2)
begin
if(set_hour2==9)
begin
set_hour1<=set_