EDA课程设计.docx
《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
EDA课程设计
课程设计说明书
课程:
EDA技术基础
题目:
数字钟的设计
闹钟与整点报时模块
学生姓名:
王玲
学号201265110204
班级:
1203班
专业:
电子信息与科学
指导教师:
贺慧勇
2014年12月20日
长沙理工大学课程设计任务书
物理与电子科学学院电子信息与科学专业1203班姓名王玲
课程名称EDA技术基础
题目数字钟的设计
同组设计者:
(1)24小时计时显示(时分秒);
(2)具有时间设置功能(时,分);
(3)具有整点提示功能;
(4)实现闹钟功能(定时,闹响);
发挥部分:
(1)实现年月日星期功能,可与时分秒交替显示
(2)按我校现行作息时间表输出打铃信号
工作计划
(1)时间
本课程设计安排2周时间:
2014.12.22~2015.1.2
(2)进度安排
第1周周一周二:
查阅资料,拿出整体设计方案,划分模块;
第1周周三至周五:
各模块的设计、调试、验证。
第2周周三前完成项目整体调试和测试。
第2周周三周四文档写作整理
第2周周五:
答辩讨论
指导教师:
贺慧勇唐立军文勇军
钟海丽周晓萍唐俊龙
2014年11月7日
教研室意见:
同意。
教研室主任文勇军
2014年11月11日
长沙理工大学课程设计成绩评定表
学生姓名:
王玲学号:
201265110204专业班级:
电子信息与科学1203
课程设计题目:
电子钟的设计(闹钟与整点报时模块)
评分项目
要求
分值
得分
学习态度
学习态度认真,遵守纪律。
10
设计方案
调研充分,方案设计合理。
20
工作量
完成了任务书规定的工作量。
实际设计、调试效果好。
40
设计报告
完全符合撰写规范要求,结构严谨,逻辑性强,层次清晰,表述准确,文字流畅。
20
答辩
准备充分,概念清楚,能准确流利地回答各种问题。
10
总分
备注:
成绩:
指导教师:
年月日
1数字钟设计闹钟模块基本任务要求4
2设计思想4
3简述闹钟模块的输入与输出5
4分进程描述6
5仿真结果与分析7
6简述数字钟的设计总成果10
7总结11
参考文献13
代码附件13
基本任务要求:
运用QuartusⅡ13.1软件平台,用VHDL语言描述并设计的闹钟模块满足可调闹钟时间,当时钟时间到达闹钟时间后会响闹铃,(由于实验室权限问题会以FPGA开发板上12个LED灯交替发光来表现);整点报时过程表现为整点的前十秒内响铃,(以FPGA开发板上一个LED灯交替发光来实现)。
设计思想:
闹钟模块要以分频模块、计数器模块和译码显示模块为基础,将闹钟模块分为三个进程,一个进程用来实现调闹钟,一个进程来实现闹响闹钟(即实现LED灯交替发光),另一个进程来是实现整点报时。
(上面截图为数字钟整体编译后的RTL电路的闹钟模块)
简述闹钟模块图的输入与输出:
上图中的输入粗黑实线为计数器模块输出的小时、分钟的高低位和秒钟的高位(都用四位的二进制表示);输出的粗黑实线为定的闹钟时间(包括小时和分钟),将送到译码显示模块显示闹钟时间,闹钟时间与时钟都在FPGA上的数码管显示,用二选一实现交替显示。
clk和clk1都是经过分频器分出的不同频率的信号分别用于整点报时的闪灯脉冲与闹钟调时、闹响的闪灯脉冲。
AlarmEn和alarmADJ分别为控制闹钟闹响和控制闹钟调时的输入脉冲;ADJ1和ADJ2就分别为控制闹钟调小时与分钟的的输入脉冲(可与校时钟的开关共用)。
sound13为整点报时的LED灯的输入信号,其余的为闹钟闹响时的LED灯的输入信号。
分进程描述:
1.调闹钟进程:
先列出调闹钟进程的部分VHDL语言描述:
if(alarmADJ='0')then
ifclk1'eventandclk1='1'then
ifADJ1='0'then
if(hour_unitcount<9)then
hour_unitcount:
=hour_unitcount+1;
elsehour_unitcount:
="0000";
hour_decadecount:
=hour_decadecount+1;
endif;
if(hour_decadecount=2andhour_unitcount=4)then
hour_decadecount:
="0000";hour_unitcount:
="0000";
endif;
ENDIF;
分析:
alarmADJ为低电平且ADJ1也为低电平时,随着clk1的脉冲信号来计数,小时为24进制数,可从上面的语句中看出计数的周期为24;根据调闹钟小时的部分代码可类似的分析出调闹钟分钟的基本逻辑。
2.整点报时进程:
process(clk,mh,ml,sh)
variablecount1:
std_logic_vector(3downto0);
begin
if(ml="1001"andmh="0101"andsh="0101")then
ifclk'eventandclk='1'then
if(count1<1)thencount1:
=count1+1;sound13<='1';
elsesound13<='0';count1:
="0000";
endif;
endif;
elsesound13<='0';count1:
="0000";
endif;
endprocess;
分析:
定义count1为变量来计clk脉冲的上升沿个数,sound13为LED的输入信号,mh、ml和sh分别是分钟的高位、分钟的低位和秒钟的高位,当时间的分钟与秒钟到达59:
50时开始以每秒闪一次LED灯来表现整点报时,整点报时闪灯10s。
3.闹钟响铃进程:
先列出调闹钟进程的部分VHDL语言描述:
if(AlarmEn='0')then
if(hourl=hour2andhourh=hour1andml=min2andmh=min1)then
ifclk1'eventandclk1='1'then
if(count<1)thencount:
=count+1;
sound1<='1';sound3<='1';sound5<='1';sound7<='1';sound9<='1';sound11<='1;sound2<='0';sound4<='0';sound6<='0';sound8<='0';sound10<='0';sound12<='0';
else
sound1<='0';sound3<='0';sound5<='0';sound7<='0';sound9<='0';sound11<='0';
sound2<='1';sound4<='1';sound6<='1';sound8<='1';sound10<='1';sound12<='1';
count:
="0000";
endif;
endif;
分析:
可参照整点报时进程来分析,相比整点报时进程,LED闪灯的个数增加了,且clk1的脉冲频率大于clk(即表现为LED的闪灯频率比整点报时的闪灯频率快);闹响的时间为一分钟,接到FPGA开发板上后可手动关掉闹钟。
仿真结果与分析:
(以下仿真均为波形功能仿真)
1.调闹钟进程的波形仿真结果截图
分析:
(1)仿真环境设置:
仿真设置的结束时间为
;输入的clk和clk1脉冲的周期分别为10ns和5ns;alarmADJ为低电平输入;ADJ1和ADJ2为高低电平交替输入;其他的输入可以不考虑。
(2)仿真内容:
当alarmADJ为低电平时,调节ADJ1和ADJ2分别可以对ADJhourh、ADJhourl和ADJmh、ADJml进行调节,从上图中可看出当ADJ1为低电平时,ADJhourh和ADJhourl会自动随clk1脉冲来调节到相应的小时,当ADJ2为低电平时,ADJmh和ADJml会自动随clk1脉冲来调节到相应的分钟。
从仿真结果看出最后调出的闹钟时间为00:
48。
经过整个数字钟的仿真可以知道ADJ1和ADJ2没有相关(即调节小时与调节分钟的按键互不受影响)。
小时的24进制可从上图中看出,分钟的60进制已经经过了仿真测试。
2.整点报时进程的波形仿真结果截图
分析:
(1)仿真环境设置:
仿真设置的结束时间为
;在上一个进程仿真环境中加入了小时高低位、分钟高低位和秒钟高位,即输入了几个不同的时间。
(2)仿真内容:
从仿真结果中看出当输入的分钟与秒钟时间到达59:
50时,sound13将随着clk的脉冲信号产生高低电平交替输出(在FPDA开发板上表现为LED闪灯)。
3.闹钟响铃进程的波形仿真结果截图
分析:
(1)仿真环境设置:
仿真设置的结束时间为
;在整点报时进程的仿真环境设置中加入00:
48的输入时间,为了验证当时钟时间到达闹钟时间后的sound(1~12)的输出变化。
(3)仿真内容:
从仿真结果可看出当调好闹钟时间为00:
48后,当时钟时间走到00:
48时,sound(1~12)将随着clk1的脉冲信号产生高低电平交替输出(在FPDA开发板上表现为LED闪灯)。
也可看出sound(1~12)中的基数与偶数灯是交替闪烁的。
4.结合其他模块后,在FPGA开发板上的仿真分析如下:
开关SW17上拉后数码管显示时钟时间,下拉后显示闹钟时间;当SW17下拉显示闹钟时间后,通过按键KEY2和KEY1分别调闹钟的小时和分钟,按键按下时会自动计数,当达到预想的数值后松开按键,这时就已经订好闹钟了;开关SW16下拉后为闹钟开启模式,SW16上拉后为闹钟关闭模式,即当时钟时间到达闹钟时间后,有12个LED灯交替闪烁,会连续闪烁一分钟,中途可通过开关自动关闭闹钟(即停止闪烁)。
简述数字钟的设计总成果:
整个数字钟设计分为五个模块,分别为分频模块、校时模块、计数器模块、译码器显示模块和闹钟与整点报时模块;拓展并完成了按学校作息时间打铃(打铃用LED闪灯来表现)。
电路板固定的晶振信号为50MHz,通过分频模块以分频分出分别为
倍频、
倍频和
倍频的三个信号;
倍频的信号输入给秒计时器和整点报时进程,
倍频的信号输入给校时模块和调闹钟进程,
倍频输入给打铃模块,分频模块为数字钟的基础模块。
通过较时模块与计数器模块后的时钟信号分别为小时的高低位、分钟的高低位和秒钟的高低位(都是有四位的二进制数表示),秒的低位直接由译码器显示模块输出到数码管显示;小时的高低位、分钟的高低位和秒钟的高位还要接到闹钟与整点报时模块,然后再通过译码器显示模块输出到数码管显示,时钟显示与闹钟显示通过二选一来实现。
拓展的打铃模块也需要小时的高低位、分钟的高低位和秒钟的高位的输入,来实现到达打铃时间后LED灯会闪烁10s。
(其中闹钟与整点报时模块【调闹钟进程与整点报时进程】和打铃模块用到的LED灯均没有联系)。
总结:
开始课程设计的第一天老师就把全部的课题大概的讲解了一遍,听过一遍后觉得所有的题目都无从下手,毕竟之前有过几次上机实验都是自己按照书上的模板敲代码;当分组及分任务分完后,我们一组5个人拿到数字钟设计的任务书,一开始确实没头绪,便在网上和图书馆去找与数字钟相关的资料;用了差不多一天半的时间确认每个人的任务模块;遇到的第一个问题就是分频,也就和老师最近一次综合作业的问题相似,最后决定先弄清根源问题;在网上找了些资源与代码运行了一遍,并通过波形仿真来加深对VHDL语句的理解,也及时向学长请教并通过了编译,最后就开始入手数字钟模块的设计。
虽说每个人是设计不同的模块,但必须先整体了解数字钟的功能再进行个人的设计,前后模块的联系也要及时与组员交流。
闹钟与整点报时模块可以说是在基本的数字钟完成后的基础上实现的。
在FPGA开发板没有发下来之前还没有完全确认每个模块的大概输入与输出,在FPGA开发板发下来后,首先就单独的测试了译码器显示模块,用四个按键来表示二进制的输入,确保0到9的数字在一个数码管上显示出来,因为是第一次接触到FPGA开发板,所以在开发板连接到计算机并输出显示遇到了些难题,最后都在老师与学长的帮助下通过了调试并仿真成功。
有了之前译码器显示模块的电路板仿真成功,接下来就准备用电路板仿真测试秒钟的输出,其中包括分频模块、秒计数模块和译码器显示模块,建立了新的工程,其顶层文件调用了分频模块、秒计数模块和两个译码器显示模块,在调试整个工程中遇到些问题,主要是顶层文件的格式不太熟悉,然后参考了全加器的VHDL语言描述解决了难题,秒钟显示在两个数码管上并自动计时,经过一分钟的等待可看出为60进制,单独显示秒钟也运行成功了。
然后就直接在秒钟的工程中加入了分校时模块和分计数模块,成功的仿真出了分钟与秒钟的输出,再一步步加入校时模块、时计数模块和闹钟与整点报时模块。
最后出来了大致的数字钟设计的成果,当时控制闹钟的按键有4个,控制时钟复位及校时的按键有3个,进一步优化成4个按键控制整个数字钟,将调闹钟的按键与时钟校时的按键共用就完成了优化。
最后再加入了打铃模块,最后也对着标准时钟测试了误差,没有发现大的问题。
通过这次EDA的课程设计学到了团队工作的重要性,也明白分模块运行成功后对整体工程的重要性,有没有基础好像都没那么重要,重要的是对待课设的态度与和成员交流的热心并虚心接受同组成员及老师的建议。
参考文献:
代码附件:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityalarmis
port(clk,clk1:
instd_logic;
alarmADJ:
instd_logic;
AlarmEn:
instd_logic;
ADJ1,ADJ2:
instd_logic;
hourl:
instd_logic_vector(3downto0);
hourh:
instd_logic_vector(3downto0);
ml:
instd_logic_vector(3downto0);
mh,sh:
instd_logic_vector(3downto0);
ADJhourl:
outstd_logic_vector(3downto0);
ADJhourh:
outstd_logic_vector(3downto0);
ADJml:
outstd_logic_vector(3downto0);
ADJmh:
outstd_logic_vector(3downto0);
sound1,sound3,sound5,sound7,sound9,sound11:
outstd_logic;
sound2,sound4,sound6,sound8,sound10,sound12:
outstd_logic;
sound13:
outstd_logic);
end;
architecturebhvofalarmis
signalhour1,hour2,min1,min2:
std_logic_vector(3downto0);
begin
process(alarmADJ,ADJ1,ADJ2,clk1)
variablehour_decadecount,hour_unitcount,min_decadecount,min_unitcount:
std_logic_vector(3downto0);
begin
if(alarmADJ='0')then
ifclk1'eventandclk1='1'then
ifADJ1='0'then
if(hour_unitcount<9)then
hour_unitcount:
=hour_unitcount+1;
elsehour_unitcount:
="0000";
hour_decadecount:
=hour_decadecount+1;
endif;
if(hour_decadecount=2andhour_unitcount=4)then
hour_decadecount:
="0000";hour_unitcount:
="0000";
endif;
ENDIF;
ifADJ2='0'then
if(min_unitcount<9)then
min_unitcount:
=min_unitcount+1;
else
min_decadecount:
=min_decadecount+1;
min_unitcount:
="0000";
endif;
if(min_decadecount=6andmin_unitcount=0)then
min_decadecount:
="0000";
min_unitcount:
="0000";
endif;
endif;
endif;
endif;
hour1<=hour_decadecount;
hour2<=hour_unitcount;
min1<=min_decadecount;
min2<=min_unitcount;
endprocess;
process(AlarmEn,clk,hourl,hourh,ml,mh,hour1,hour2,min1,min2)
variablecount:
std_logic_vector(3downto0);
begin
if(AlarmEn='0')then
if(hourl=hour2andhourh=hour1andml=min2andmh=min1)then
ifclk1'eventandclk1='1'then
if(count<1)thencount:
=count+1;
sound1<='1';sound3<='1';sound5<='1';sound7<='1';sound9<='1';sound11<='1';
sound2<='0';sound4<='0';sound6<='0';sound8<='0';sound10<='0';sound12<='0';
elsesound1<='0';sound3<='0';sound5<='0';sound7<='0';sound9<='0';sound11<='0';
sound2<='1';sound4<='1';sound6<='1';sound8<='1';sound10<='1';sound12<='1';
count:
="0000";
endif;
endif;
elsesound1<='0';sound3<='0';sound5<='0';sound7<='0';sound9<='0';sound11<='0';
sound2<='0';sound4<='0';sound6<='0';sound8<='0';sound10<='0';sound12<='0';
count:
="0000";
endif;
elsesound1<='0';sound3<='0';sound5<='0';sound7<='0';sound9<='0';sound11<='0';
sound2<='0';sound4<='0';sound6<='0';sound8<='0';sound10<='0';sound12<='0';
count:
="0000";
endif;
ADJhourh<=hour1;
ADJhourl<=hour2;
ADJmh<=min1;
ADJml<=min2;
endprocess;
process(clk,mh,ml,sh)
variablecount1:
std_logic_vector(3downto0);
begin
if(ml="1001"andmh="0101"andsh="0101")then
ifclk'eventandclk='1'then
if(count1<1)thencount1:
=count1+1;sound13<='1';
elsesound13<='0';count1:
="0000";
endif;
endif;
elsesound13<='0';count1:
="0000";
endif;
endprocess;
end;