EDA数字时钟课程设计.docx
《EDA数字时钟课程设计.docx》由会员分享,可在线阅读,更多相关《EDA数字时钟课程设计.docx(10页珍藏版)》请在冰点文库上搜索。
EDA数字时钟课程设计
EDA课程设计报告书
课题名称
数字时钟
姓名
学号
院系
专业
指导教师
一、设计任务及要求:
1、使学生掌握EDA开发工具QuartusII5.0的常用工具的使用。
2、使学生掌握EDA设计流程及输入方法。
3、使学生掌握的硬件描述语言VHDL的基本应用。
4、使学生掌握原理图输入、波形图输入、VHDL文本输入等硬件设计方法。
5、使学生掌握硬件测试的方法,验证实际设计电路的。
6、使学生了解FPGA/CPLD工作原理及结构。
指导教师签名:
年月日
二、指导教师评语:
指导教师签名:
年月日
三、成绩
验收盖章
年月日
数字时钟
一.设计目的
综合本学期所学知识设计数字时钟,使用VHDL语言进行编程,掌握多位计数器相连的设计方法;掌握二十四进制,六十进制计数器的设计方法;掌握电子电路一般的设计方法,并了解电子产品的研制开发过程,基本掌握电子电路安装和调试的方法。
培养独立分析问题,解决问题的能力。
二.设计的主要内容及方法
1.用HDL语言编写时分秒计时器程序;
2.编写顶层文件,用来对元件进行例化,以及对端口进行映射;
3.编译、仿真并生成波形图;
4.生成元件;
三.设计原理
数字钟是一个将“时”“分”“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时;显示满刻度为23时59分59秒,另外具备校时功能和报时功能。
因此,一个基本的数字钟电路主要由“时”“分”“秒”计数器校时电路组成。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累加60秒发送一个“分脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计数器,可实现对一天24小时的累计。
钟计数采用层次化设计,将设计任务分成若干个模块。
规定每一模块的功能和各模块之间的接口。
a.second(秒)60进制BCD码计数;
b.minute(分)60进制BCD码计数;
c.hour(时)24进制BCD码计数;
d.clocktop顶层设计;
同时整个计数器有清零,调时,调分功能。
端口引脚名称
输入 clk,reset,setmin,sethour;
输出 second-daout,minute-daout,hour-daout;
四.设计过程
SECOND模块:
用来对秒进行计时,当记到计数器的低四位为1001时,若高三位不是101时,则秒计数器加7,目的是使计数值变为BCD码。
若高三位是101时,则有一进位。
当计数器的低四位不为1001时,计数器加1。
SECOND模块给MINUTE的时钟由SETMINUTE和它本身记到60的进位两部分组成。
SECOND模块源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysecondis
port(clk,reset,setmin:
instd_logic;--时钟信号、复位输入端
enmin:
outstd_logic;--分钟进位输出
daout:
outstd_logic_vector(6downto0)--秒输出端
);
endentitysecond;
architecturefunofsecondis
signalcount:
std_logic_vector(6downto0);
signalenmin_1,enmin_2:
std_logic;--信号变量定义
begin
daout<=count;
enmin_2<=(setminandclk);
enmin<=(enmin_1orenmin_2);
process(clk,reset,setmin)
begin
if(reset='1')thencount<="0000000";--对秒计时器清零
elsif(clk'eventandclk='1')then--当产生时钟上升沿是进行计数
if(count(3downto0)="1001")then
if(count<16#60#)then
if(count="1011001")then
enmin_1<='1';count<="0000000";--当秒计数至59秒产生分钟进位信号
else
count<=count+7;--秒计数器加7,使计数值变为BCD码
endif;
else
count<="0000000";--对计数值清零
endif;
elsif(count<16#60#)then
count<=count+1;--当计数值少于60时计数值加一
enmin_1<='0'after100ns;
else
count<="0000000";--计数值等于60时对计数值清零
endif;
endif;
endprocess;
endfun;
SECOND生成的元件如图4.1:
图4.1
MINUTE模块:
用来对分进行计时,当记到计数器的低四位为1001时,若高三位不是101时,则分计数器加7,目的是使计数值变为BCD码。
若高三位是101时,则有一进位。
当计数器的低四位不为1001时,计数器加1。
MINUTE模块的时钟由SETMIN和SECOND记到60的进位两部分组成。
MINUTE模块源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityminuteis
port(clk,reset,clk1,sethour:
instd_logic;--时钟信号、复位端口定义
enhour:
outstd_logic;--时计数信号进位端
daout:
outstd_logic_vector(6downto0)–分钟计数输出
);
endentityminute;
architecturefunofminuteis
signalcount:
std_logic_vector(6downto0);
signalenhour_1,enhour_2:
std_logic;--信号变量定义
begin
daout<=count;
enhour_2<=(sethourandclk1);
enhour<=(enhour_1orenhour_2);--
process(clk,reset,sethour)
begin
if(reset='1')thencount<="0000000";--对计数值复位
elsif(clk'eventandclk='1')then--当产生时钟上升沿是进行计数
if(count(3downto0)="1001")then
if(count<16#60#)then
if(count="1011001")then
enhour_1<='1';count<="0000000";--当计数值为59时产生小时进位信号,
--并清计数值
else
count<=count+7;--若高三位不是101,则分计数器加7,使计数值变为BC码
endif;
else
count<="0000000";
endif;
elsif(count<16#60#)then
count<=count+1;--当计数值小于60时计数值加一
enhour_1<='0'after100ns;--时钟中间信号延时100纳秒置零
else
count<="0000000";--当计数值等于60时对计数清零
endif;
endif;
endprocess;
endfun;
MINTUE生成元件如图4.2:
图4.2
HOUR模块:
用来对时进行计数,当记到计数器的低四位为1001时,若高三位小于010时,则时计数器加7,目的是使计数值变为BCD码。
当计数器的高三位小于010,低四位小于1001时,计数器加1;若当计数器记到0100100时,则有一进位。
HOUR模块的时钟由SETHOUR和MINUTE记到60的进位两部分组成。
HOUR模块源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityhouris
port(clk,reset:
instd_logic;--时钟信号、复位信号输入端
daout:
outstd_logic_vector(5downto0)--小时信号输出端
);
endentityhour;
architecturefunofhouris
signalcount:
std_logic_vector(5downto0);--信号变量定义
begin
daout<=count;
process(clk,reset)
begin
if(reset='1')then
count<="000000";--当复位信号为“1”时,对计数清零
elsif(clk'eventandclk='1')then--当产生时钟上升沿时进行计数操作
if(count(3downto0)="1001")then
if(count<16#23#)then
count<=count+7;--当记到计数器的低四位为1001时,若高三位小于010时,--则时计数器加7,使计数值变为BCD码。
else
count<="000000";--当计数等于24时对计数清零
endif;
elsif(count<16#23#)then
count<=count+1;--当计数值小于23时对计数值进行加一操作
else
count<="000000";--当计数值等于24时对计数值清零
endif;
endif;
endprocess;
endfun;
HOUR生成元件如图4.3:
图4.3
顶层CLOCK_TOP模块:
顶层模块的作用是将各个模块组合到一起,从而实现最终的功能。
其输入即为各个模块的输入,用来对元件进行例化,以及对端口进行映射。
HOUR模块源程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityclock_topis
port(clk,reset,setmin,sethour:
instd_logic;
second_daout,minute_daout:
outstd_logic_vector(6downto0);
hour_daout:
outstd_logic_vector(5downto0)
);
endclock_top;
architectureaofclock_topis
componentsecond--秒计数元件声明
port(clk,reset,setmin:
instd_logic;
daout:
outstd_logic_vector(6downto0);
enmin:
outstd_logic);
endcomponent;
componentminute--分计数元件声明
port(clk,reset,clk1,sethour:
instd_logic;
enhour:
outstd_logic;
daout:
outstd_logic_vector(6downto0));
endcomponent;
componenthour--小时计数元件声明
port(clk,reset:
instd_logic;
daout:
outstd_logic_vector(5downto0));
endcomponent;
signalenmin_re,enhour_re:
std_logic;
begin
u1:
secondportmap(reset=>reset,
clk=>clk,
setmin=>setmin,
enmin=>enmin_re,
daout=>second_daout);--秒端口关联
u2:
minuteportmap(clk=>enmin_re,
reset=>reset,
clk1=>clk,
sethour=>sethour,
enhour=>enhour_re,
daout=>minute_daout);--分端口关联
u3:
hourportmap(clk=>enhour_re,
reset=>reset,
daout=>hour_daout);--时计数端口关联
enda;
生成电路元件图如图4.4:
图4.4
五.仿真波形图
计时仿真波形图如图5.1
图5.1
输入:
CLK—时钟脉冲,RESET—复位信号,SETMIN—分加1信号,SETHOUR—秒加1信号
输出:
SECOND_DAOUT—秒输出,MINUTE_DAOUT—分输出,HOUR_DAOUT—时输出
时序仿真:
程序主要运用计数器完成,在时钟脉冲的作用下,完成时钟功能,由时序图可以看出每一个时钟脉冲上升沿秒加1,当接收到reset信号,即reset为高电平,所有计数为零,并重新计数,setmin和sethour可以完成调节时钟功能,都是高电平调节,每来一个脉冲,相应的时或分加1。
六.设计总结
通过两周的单片机课程设计使我对单片机这门课程有了更加深入的了解,知道它是一门需要不断地实践才能真正掌握的课程。
这次单片机课程设计不仅使我熟悉手机键盘的工作原理,工作过程和所需的相关器件,而且增加对单片机编程方法,编程步骤,相应的操作流程和软件操作等的熟悉度。
更重要的是使我在设计的过程中积累对数字电路简单系统的实际制作经验,培养独立设计电路系统的专业素养,也深刻认识到其他相关课程之间的联系对于我们电子信息工程专业的学生重要性。
只有认真扎实的学好相应的基础课程才能在以后的学习工作中解决更加复杂困难的问题。
参考文献
[1]彭伟,单片机C语言程序设计实训100例.北京航空航天大学出版社.2010.5.1.
[2]楼然苗,51系列单片机设计实例.北京航空航天出版社.2003.3:
100-115.
[3]唐俊翟,单片机原理与应用.冶金工业出版社.2003.9:
255-258.
[4]刘瑞新,单片机原理及应用教程.机械工业出版社,2003.7:
56-89.
[5]吴国经,单片机应用技术.中国电力出版社,2004.1:
89-103.