第一篇:多功能数字钟课程设计报告
课题名称 姓名 学号 院、系、部 专业 指导教师
电子技术课程设计报告书
2016年6月12日
一、设计任务及要求:
用中小规模集成芯片设计并制作多功能数字钟,具体要求如下:
1、准确及时,以数字形式显示时(00~23)、分(00~59)、秒(00~59)的时间。
2、具有校时功能。指导教师签名:
2016
二、指导教师评语:
指导教师签名:
2016
三、成绩
指导教师签名:
2016年6月年6月年6月日
日
日
多功能数字钟课程设计报告 设计目的
一、设计原理与技术方法:
包括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明; 软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。
1、电路工作原理分析与原理图
数字钟实际上是一个对标准频率(1Hz)进行计数的计数电路。由于标准的1Hz 时间信号必须做到准确稳定,所以通常使用输出频率稳定的石英晶体振荡器电路构成数字钟的振源。又由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路。因此一个具有计时、校时、报时、显示等基本功能的数字钟主要由振荡器、分频器、计数器、译码器、显示器、校时电路、报时电路等七部分组成。石英晶体振荡器产生的信号经过分频器得到秒脉冲后,秒脉冲送入计数器计数,计数结果通过“时”、“分”、“秒”译码器译码,并通过显示器显示时间。由以上分析可得到原理框图如下图
图1 实验原理框图
2、元器件选择与参数计算
(1)晶体振荡电路:产生秒脉冲既可以采用555脉冲发生电路也可以采用晶振脉冲发生电路。若由集成电路定时器555与RC组成的多谐振荡器作为时间标准信号源,可使555与RC组成多谐振荡器,产生频率 f=1kHz的方波信号,再通过分频则可得到秒脉冲信号。晶体振荡器电路则可以给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。相比二者的稳定性,晶振电路比555电路能够产生更加稳定的脉冲,数字电路中的时钟是由振荡器产生的,振荡器是数字钟的核心。振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,所以最后决定采用晶振脉冲发生电路。石英晶体振荡器的特点是振荡频率准确、电路结构简单、频率易调整,它是电子钟的核心,用它产生标准频率信号,再由分频器分成秒时间脉冲。
所以秒脉冲晶体振荡选用32768Hz的晶振,该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。从有关手册中,可查得C1、C2均为20pF。当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为20MΩ。
(2)分频器电路:分频器电路将32768Hz的高频方波信号经32768(152)次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。该电路可通过CD4060与双D触发器74LS74共同实现。
(3)时间计数器电路:时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器。计数器可以使用十进制的74LS160。
(4)译码驱动电路:译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。译码器可以使用CD4511。
(5)校时电路:可以通过基本的门器件、电阻与开关实现。由设计的电路图可选择与非门74LS00。(6)整点报时电路:一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒.其作用方式是发出连续的或有节奏的音频声波。
3、电路调试方法与结果说明(1)电路调试方法 ①数码管的调试:可以用万用表的负极接数码管的3或8脚,正极依次接数码管剩余的管脚所接电阻的另一端,并将万用表调至测发光二极管档位,从而测试数码管的显示是否正确。②“时”“分”“秒”电路的调试:将“时”“分”“秒”电路连接完成后,可以用函数信号发生器产生的1Hz方波信号分别作为“时”、“分”、“秒”的个位74LS160的计数脉冲,从而测试“时”是否为24进制,“分”和“秒”是否为60进制。③校时电路的调试:先将电路外接用函数信号发生器产生的2Hz方波信号,再分别通过校时、校分电路开关的断开、闭合以及开关闭合后电路的工作情况判断电路的校时、校分功能是否正确。
④秒脉冲产生电路的调试:将电路产生的秒时间脉冲接入示波器,观察并计算电路是否产生1Hz方波信号。(2)结果说明
①数码管的调试:当正极依次接1、2、4、5、7、9、10管脚时,数码管依次是G、F、A、B、C、D、E亮。②“时”“分”“秒”电路的调试:“时”为24进制(从“00”到“23”),“分”和“秒”都为60进制(从“00”到“59”)。
③校时电路的调试:开关断开时电路处于正常工作状态,开关闭合时电路处于校时、校分状态。
④秒脉冲产生电路的调试:电路产生1Hz方波信号。
4、软件设计说明书与流程图(1)秒脉冲产生电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。晶体XTAL的频率选为32768HZ。该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。从有关手册中,可查得C1、C2均为20pF。当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为22MΩ。较高的反馈电阻有利于提高振荡频率的稳定性。通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。
本实验中采用CD4060来构成分频电路。管脚图见图2。CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。CD4060计数为14级2进制计数器,可以将32768Hz的信号分频为2Hz,再经过74LS74即可获得1Hz的方波信号。原理电路图如图3所示,图4为仿真电路图。
图2 D4060管脚图
图3 CD4060秒脉冲振荡发生器
图 4 产生1Hz时间脉冲的电路图
(2)时间计数器电路 ①“秒”“分”电路
根据题目要求,“秒”和“分”都是60进制的,而且是从“00”到“59”,可以使用十进制的74LS160来实现这个功能。首先将两片74LS160通过串行进位方式接成百进制计数器,即分别将“秒”和“分”个位的进位输出信号经非门作为“秒”和“分”十位的计数输入脉冲。当计数器从全0状态开始计数,计入59个脉冲时,经与非门译码产生低电平信号立刻将两片74LS160同时置零,于是便得到了60进制的计数器。74160的逻辑功能示意图、引脚图及功能表如下所示。
图5 a)74160逻辑功能示意图
b)74160引脚图
图6 74160逻辑功能表 ②“时”电路 根据题目要求,“时”是24进制的,而且是从“00”到“23”,可以使用十进制的74LS160来实现这个功能。首先将两片74LS160通过串行进位方式接成百进制计数器,当计数器从全0状态开始计数,计入23个脉冲时,经与非门译码产生低电平信号立刻将两片74LS160同时置零,于是便得到了24进制的计数器。(3)译码驱动电路
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路。由于CD4511是输出高电平有效,所以选用七段共阴极LED数码管。若将“秒”、“分”、“时”计数器的每位输出分别接到相应七段译码器的输入端,便可进行不同数字的显示。“秒”用数码管显示如图7所示。
图7 “秒”的译码及驱动显示电路图(4)校时电路
数字种启动后,每当数字钟显示与实际时间不符合,需要根据标准时间进行校时。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。校“秒”时,采用等待校时。校“分”、“时”的原理比较简单,采用加速校时。对校时电路的要求是 : 1.在小时校正时不影响分和秒的正常计数。2.在分校正时不影响秒和小时的正常计数。当开关断开时,因为校正信号和0相与的输出为0,而开关的另一端接高电平,正常输入信号可以顺利通过与或门,故校时电路处于正常计时状态;当开关闭合时,情况正好与上述相反,这时校时电路处于校时状态。与非门可选74LS00,非门则可用与非门2个输入端并接来代替从而节省芯片。校时电路图见图8。
校时电路图(5)整点报时电路
一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒。其作用方式是发出连续的或有节奏的音频声波。当时间在59分50秒到59分59秒期间时,分十位、分个位和秒十位均保持不变,分别为5、9和5,因此可将分计数器十位的QC和QA、个位的QD和QA及秒计数器十位的QC 和QA相与。电路在整点前6秒钟内开始整点报时,即当时间在59分54秒到59分59秒期间时,报时电路产生报时控制信号,控制小喇叭产生低音;当时间为00分00秒时,报时电路产生报时控制信号,控制小喇叭产生高音。
5、软件调试方法与运行结果说明(1)软件调试方法
由于仿真时晶振不能正常工作,所以通过外接1KHz方波信号来调试电路。“时”“分”“秒”电路的调试:“时”为24进制(从“00”到“23”),“分”和“秒”都为60进制(从“00”到“59”)。校时电路的调试:可以通过校时、校分电路的开关来校对时间,并判断电路的“时”“分”“秒”的进制是否正确。开关断开时电路处于正常工作状态,开关闭合时电路处于校时、校分状态。(2)运行结果说明
数码管的各部分可以正确显示,电路的“时”为24进制(从“00”到“23”),“分”和“秒”都为60进制(从“00”到“59”)。开关断开时电路处于正常工作状态,开关闭合时电路处于校时、校分状态,通过控制开关及输入信号可以达到校时功能。
三、设计体会与建议 1.设计体会
我觉得此次的数字钟设计实验,电路原理相对来比较简单,但电路图比较复杂,所用芯片比较多,相应的连线也多,这就给焊接电路增加了较大的难度。不过通过此次实验,使我更进一步地熟悉了芯片的结构,掌握了实验中所用各芯片的工作原理和其具体的使用方法,同时还接触到了一些新认识的芯片,增长了见识。这次课程设计是一次难得的锻炼机会,让我们能够充分运用所学过的理论知识和自己动手实际操作的能力,另外还让我们学习查找资料的方法,以及自己设计电路、焊接电路、分析解决电路存在的问题的能力。这对于我来说是很好的提高,填补了平日理论学习后实践方面的空白。参考文献
[1] 阎石.数字电子技术基础[M].北京:高等教育出版社,2001年
[2] 杨素行.模拟电子技术基础简明教程[M].北京:高等教育出版社,2005年 [3]康华光.电子技术基础[M].北京:高等教育出版社,1999年 [4]彭华林等编.数字电子技术[M].长沙:湖南大学出版社,2004年 [5]金唯香等编.电子测试技术[M].长沙:湖南大学出版社,2004年
第二篇:多功能数字钟课程设计
多功能数字钟
朱安烟
(安阳师范学院 物电学院, 河南 安阳 455002)
摘要:时钟相比具有更高的准确性和直观性
因此得到了更加广泛的使用。数字钟从原理上讲是一种典型的数字电路,其中
本设计采用六位LED
24小时计时方式根据数码管动态显示原理来进行显示。用晶振产生振荡脉加以分频得到所需的钟表秒脉冲,利用纯数字电路,实现数字电子时钟功能,时间重置功能。此次数字钟的理图设计,PCB图的制作主要是基于altium designer软件,利用proteus7.7软件进行仿真,最终本设计实现24小时的时钟计时、时间重置功能。
关键词:LED数码管
时序电路
逻辑电路
时钟
校时引言
仅向。方案论证:
2.1方案一
由于是数字钟的设计,可以用单片机AT89C51来实现计数功能,相对于纯数字电路来讲它具有功耗低、体积小、使用方便等优点。但在大二下半学期初期,对单片机方面的内容知识还不够完善,加上用单片机为核心来做数字钟还需做编程,对自身来说又是一难点。不过此法可以待以后,学习知识完善后再考虑。
2.2 方案二
继而考虑到用原先学过的纯数字电路来做,以74Ls160来做为计数的芯片,用六片分别实现 数字钟的小时、分、秒、的计数,并用晶振加以分频产生数字钟所需的秒脉冲。
从以上两种方案,很容易看出,采用方案二,用此法做即可以复习回顾早期学习的数电模电知识,又避免了单片机知识不足的问题,故用此法。结果与讨论
3.1.1数字钟主要计数芯片为74ls160其引脚图如下:
这种同步可预置十进计数器是由四个D型触发器和若干个门电路构成,内部有超前进位,具有计数、置数、禁止、直接(异步)清零等功能。对所有触发器同时加上时钟,使得当计数使能输入和内部门发出指令时输出变化彼此协调一致而实现同步工作。这种工作方式消除了非同步(脉冲时钟)计数器中常有的输出计数尖峰。缓冲时钟输入将在时钟输入上升沿触发四个触发器。这种计数器是可全编程的,即输出可预置到任何电平。当预置是同步时,在置数输入上将建立一低电平,禁止计数,并在下一个时钟之后不管使能输入是何电平,输出都与建立数据一致。清除是异步的(直接清零),不管时钟输入、置数输入、使能输入为何电平,清除输入端的低电平把所有四个触发器的输出直接置为低电平。超前进位电路无须另加门,即可级联出n位同步应用的计数器。它是借助于两个计数使能输入和一个动态进位输出来实现的。两个计数使能输入(ENP和ENT)计数时必须是高电平,且输入ENT必须正反馈,以便使能动态进位输出。因而被使能的动态进位输出将产生一个高电平输出脉冲,其宽度近似等于QA输出高电平。此高电平溢出进位脉冲可用来使能其后的各个串联级。使能ENP和ENT输入的跳变不受时钟输入的影响。电路有全独立的时钟电路。改变工作模式的控制输入(使能ENP、ENT或清零)纵使发生变化,直到时钟发生为止,都没有什么影响。计数器的功能(不管使能、不使能、置数或计数)完全由稳态建立时间和保持时间所要求的条件来决定。
管脚说明: CLR:清零复位端
当输入为低电平时有效
CLK:时钟信号接收端
A~D:读入
QA~QD:输出
ENT、ENP置一时芯片正常工作
LOAD:置数端
RCO:信号输出端
GND:接地
Vcc:接高
工作方式:
3.1.2 7段LED数码管
3.1.3 32.768KHZ晶振
32.768KHZ是一个标准的频率,晶振频率的应用主要有以下几个方面的参数:尺寸、负载电容、频率偏差、应用范围。按尺寸外形来分主要分为插件和贴片的;插件的主要有2*
6、3*
8、49s 等,贴片的就有很多种了,跟据各公司的设计可的型号有很多,例如:日本KDS晶振就有49SMD、DST310S、SM—14J、DST520、DST410S等。
3.1.4 CD4060分频器
CD4060由一振荡器和14级二进制串行计数器位组成,振荡器的结构可以是RC或晶振电路,CR为高电平时,计数器清零且振荡器使用无效。所有的计数器位均为主从触发器。在CP1(和CP0)的下降沿计数器以二进制进行计数。在时钟脉冲线上使用斯密特触发器对时钟上升和下降时间无限制 引脚功能:
/CP1:时钟输入端
/CP0:时钟输出端
/CP0:反相时钟输出端
Q4~Q10,Q12~Q14:计数器输出端
/Q14:第14级计数器反相输出端
VDD:电源正
VSS:电源负
CR:清零端 3.1.5 74ls48
功能介绍:
74LS48除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya~Yg)端外,7448还引入了灯测试输入端(LT)和动态灭零输入端(RBI),以及既有输入功能又有输出功能的消隐输入/动态灭零输出(BI/RBO)端。
由7448真值表可获知7448所具有的逻辑功能:
(1)7段译码功能(LT=1,RBI=1)
在灯测试输入端(LT)和动态灭零输入端(RBI)都接无效电平时,输入DCBA经7448译码,输出高电平有效的7段字符显示器的驱动信号,显示相应字符。除DCBA = 0000外,RBI也可以接低电平,见表1中1~16行。
(2)消隐功能(BI=0)
此时BI/RBO端作为输入端,该端输入低电平信号时,表1倒数第3行,无论LT 和RBI输入什么电平信号,不管输入DCBA为什么状态,输出全为“0”,7段显示器熄灭。该功能主要用于多显示器的动态显示。
(3)灯测试功能(LT = 0)
此时BI/RBO端作为输出端,端输入低电平信号时,表1最后一行,与 及DCBA输入无关,输出全为“1”,显示器7个字段都点亮。该功能用于7段显示器测试,判别是否有损坏的字段。
(4)动态灭零功能(LT=1,RBI=1)
此时BI/RBO端也作为输出端,LT 端输入高电平信号,RBI 端输入低电平信号,若此时DCBA = 0000,表1倒数第2行,输出全为“0”,显示器熄灭,不显示这个零。DCBA≠0,则对显示无影响。该功能主要用于多个7段显示器同时显示时熄灭高位的零。
3.2 原理设计
整体电路设计方案:
3.2.1 振荡电路设计
振荡电路由振荡器产生的脉冲,振荡器是数字钟的核心。振荡器的稳定度及频率的精度决定了数字钟的精确程度,次处有555定时器和晶振两种产生秒脉冲的方法:555振荡器做振荡源一般用于精确度要求不高的场合,由门电路组成的多谐振荡器的振荡周期不仅与时间常数RC有关,而且还取决于门电路的阈值电压VTH,由于VTH容易受到温度、电源电压及干扰的影响,因此频率稳定性较差,只能用于对频率稳定性要求不高的场合。考虑到振荡频率的精确度与稳定性固采用晶振做为振荡源来实现振荡电路,得时钟脉冲更稳定,时间走的更准37.268KHz晶振 通过cd4060分频器进行十四分频得到0.5s的脉冲信号,再进行一个SN74LS74进行二分频得到所需的秒脉冲信号:
3.2.2 校时电路设计
根据电路设计所知需要在分处和小时处需要校时,分别在分和时个位向十位进位处各加一开关,另一端接地并且在与地之间接100pf电容为防止按键抖动。
电路设计如下:
当开关处于自然位置时分十位clk端所接为高电平,当开关按下时则引入一低电平实其clk端有一个下降沿脉冲接入,使其产生了校时功能。
3.2.3显示电路设计
显示电路是用74ls48驱动七段共阴数码管来作为时钟显示器。
电路设计如下:
3.2.4 计时电路设计
数字钟的秒和分位都是从0到60循环计数的,所以可以用用异步清零法设计60进制计数器作为秒和分的计数器。用异步置数法设计小时所用的24进制计数器。秒、分位设计电路如下:
3.3 程序调试过程
在板子焊接好以后通上5V电源发现六Led灯只有三个能完整亮出来,其余的都不亮或是亮的不全,而且秒位不走,校时按键不管用。问题很多。
开始调试:
1、首先调试的是秒位为何不走,先测晶振石否起振,测量后发现晶振正常起振,然后从74ls160的clk端用示波器测试一下没有脉冲信号输入,则找74ls74的输出口也无脉冲,以次往前推,最后测量出从74ls74输入端有正确的脉冲输入,输出端却无脉冲输出。观察后没有连接错误,故用万用表测vcc.end端都有正确的电平接入,再测量两点间是否有漏焊现象,最后测出一处漏焊点使D端与Q端没有接通。重新焊接后秒位正常计时。
2、秒位正常计时,但向秒的十位进位时总是显示从8到19,查阅资料可知,在第一个160芯片到第二个160芯片中缺一个非门,充当延时作用,使个位计数到9再来一个脉冲下计数时再向前进位。加上非门进位正常了。
3、秒位向分位进位正常,但校时按键不能用,且分位向十分位不能进位,通过观察焊接对比原理图与pcb图后发现,开关接地的一端弄反了,应是开关与接电容端相侧对着的端接地。这个错误导致开关不能用,亦使分的十位端的74ls160芯片clk段一直接了地,故不能使其正常进位。修改过后则可以正常进位,且两开关都能用了。
4、显示小时位的第一个数码管一直不亮,通过测量发现led数码管没有烧坏,能正常工作,通过对比PCB图观察没有焊接错误,用万用表测量则发现驱动次led的74ls48管没有正常接地,连接跳线处有一虚焊,重新焊接后恢复正常。
5、但分向小时不能进位,由示波器观察发现74ls160芯片clk端无脉冲输入,但十分位有脉冲输出,且导线也导通了,就观察原理图发现原理图一处错误,分向时进位时是分满60向前进一个脉冲,故分的TC端不用再接到时的CLK端了。找到错误后用镊子将板上的铜线划段,则正常进位了。
6、小时进位正常但显示的不是24进制,显示的是44进制,则推测可能是跳线连接错误,将显示小时的十位 74ls160芯片接B端连接成接C端了,故使其显示44进制,通过观察、对比pcb图,最后发现果然如此。修改过后小时为正常24进制了。
7、最后一个数码管有三段老是不亮,观察连接没有错误,测量焊接也正常,最后用万用表测量发现芯片没有问题,那三段不亮的数码管烧了。
8、调试好后在后来的观察中发现从秒向分进位时有时一下进两位,自己找不出来原因。问过老师后,老师说是由于防抖电容所致。尝试着将电容先划断试了一下就没有那种情况了。但此时校时开关由于抖动缘故,按一下有时跳3、4个位,校时不稳定了。结论
此数字钟相对于机械钟来说有低功耗,高精度,数字化显示和不易损坏等特点。符合人们日常家居及办公对钟表的要求,可以作为家居、办公等用表。
参考文献
[1] 佘新平数学电子技术基础 华中科技大学出版社 2009年
[2] 许树玲 丁电宽 王晋 电子技术及实验 内蒙古大学出版社2005年
[3] 佘新平数字电路设计·仿真·测试 华中大学出版社 2010年
附图: 电路原理图:
第三篇:多功能数字钟课程设计报告(最终版)
电子时钟课程设计
电子时钟课程
设计报告
班级:文通 0741 姓名:***
学号:2007905121**
共
页
第页
电子时钟课程设计 多功能数字钟课程设计报告
一、课程设计题目: 多功能数字钟
二、实验目的:
☆ 了解多功能数字电子钟的工作原理。☆ 学习数字系统设计中自顶向下的设计方法。☆ 加深利用EDA技术实现数字系统的理解。
三、课程设计任务和基本要求: ☆ 设计任务
采用中规模集成电路设计一台可以显示时、分、秒的数字钟。☆ 基本要求
1、能够正确的连线及下载。
2、能够完成以秒为最小及时单位的时钟设计。
3、设计完成后的时钟能够正常调整时、分、秒。
三、课程设计题目分析: ☆ 设计要点
●设计一个精确的秒脉冲信号产生电路 ●设计60进制、24进制计数器 ●设计译码显示电路 ●设计整点报时电路 ☆ 工作原理
数字电子钟由信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用555构成的振荡器加分频器来实现。将标准秒脉冲信号送入“秒计数器”,该计数器采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计数器,可以实现一天24h的累计。译码显示电路将“时、分、秒”计数器的输出状态经七段显示译码器译码,通过六位LED显示器显示出来。整点报时电路是根据计时系统的输出状态产生一个脉冲信号,然后去触发音频发生器实现报时。校时电路是来对“时、分、秒”显示数字进行校对调整。其数字电子钟系统框图如下:
四、课程设计的电路设计部分:
共
页
第页
电子时钟课程设计
☆
秒、分、时计时器电路设计
秒、分计数器为60进制计数器,小时计数器为24进制计数器。实现这两种模数的计数器采用中规模集成计数器74LS90构成。
●
60进制计数器
由74162构成的60进制计数器,将一片74162设计成10进制加法计数器,另一片设置6进制加法计数器。两片74LS90按反馈清零法串接而成。秒计数器的十位和个位,输出脉冲除用作自身清零外,同时还作为分计数器的输入脉冲CP1。下图电路即可作为秒计数器,也可作为分计数器。
进 制 计 数 器
●
24进制计数器
由74162构成的二十进制计数器,将一片74162设计成4进制加法计数器,另一片设置2进制加法计数器。既个位计数状态为Qd Qc Qb Qa = 0100十位计数状态为Qd Qc Qb Qa = 0010时,要求计数器归零。通过把个位Qc、十位Qb相与后的信号送到个位、十位计数器的清零端,使计数器清零,从而构成24进制计数器。电路图如下:
共
页
第页
电子时钟课程设计 进 制 计 数 器
☆
译码显示电路
译码电路的功能是将秒、分、时计数器的输出代码进行翻译,变成相应的数字。用与驱动LED七段数码管的译码器常用的有7448。7448是BCD-7段译码器/驱动器,输出低电平有效,专用于驱动LED七段共阴极显示数码管。若将秒、分、时计数器的每位输出分别送到相应七段译吗管的输入端,便可以进行不同数字的显示。在译码管输出与数码管之间串联电阻R作为限流电阻。
译码显示电路 共
页
第页
电子时钟课程设计
☆
整点报时电路
仿广播电台整点报时电路设计,每当数字钟计时快到整点时发出响声,四低一高并且以最后一声高音结束的时刻为整点时刻。
整点报时电路
☆计时功能模块:
它是由两个60进制计数器和一个24进制计数器连接成的。构成了时钟正常的计时功能。当到达59秒钟的时候,当再来一个CP脉冲的时候,将自动进位,使分针上加一。分针也是一样。当时针到达23点59分59秒的时候,当再次来一个CP脉冲时候,又转化为0点0分0秒。
计时与整点报时模块 共
页
第页
电子时钟课程设计
☆数据选择器模块:
数据选择器
共
页
第页
电子时钟课程设计
☆总电路图
五、课程设计心得体会: 这次数字钟的设计与制作,我做的很辛苦。对于以前的数字电子技术软件操作淡忘了,所以开始的时候需要对系统软件进一步熟悉,通过自己慢慢深入学习,让我对于操作软件有了大概的思路。在实际操作中,了解了设计电路的程序,同时也让我了解了关于数字钟的原理与设计理念。看着复杂的程序被我设计完成,倍感欣慰。当设计电路完成还要实际接线。我在做这项工作的时候,犯了这样一个错误,连线时找不到相应的标示符号,其实老师已将标示的符号写在黑板上了,我却在疑惑。这其实也考验了实验者的细心与动手能力,遇到自己不懂的除了先发动大脑细胞想想之外,询问老师同学的却也受益匪浅,通过讨论,综合几个人的见解,能发现更多的知识。
共
页
第页
电子时钟课程设计
通过这次学习,让我的视野从课本之外延伸。多看书是好的。可是要想学好一门课光看书是不行的,还要在课外进行多多的实际操作。对于以前遗忘的知识,要抽时间复习,这样才会有更深刻的体会。
共
页第页
第四篇:EDA课程设计——多功能数字钟
哈尔滨工业大学(威海)电子学课程设计报告
带有整点报时的数字钟设计与制作
姓名: 蒋栋栋 班级: 0802503 学号: 080250331 指导教师:
井岩
目录
一、课程设计的性质、目的和任务„„„„„„„„„„„„3
二、课程设计基本要求„„„„„„„„„„„„„„„„„3
三、设计课题要求„„„„„„„„„„„„„„„„„„„3
四、课程设计所需要仪器„„„„„„„„„„„„„„„„4
五、设计步骤„„„„„„„„„„„„„„„„„„„„„4
1、整体设计框图„„„„„„„„„„„„„„„„„„„4
2、各个模块的设计与仿真„„„„„„„„„„„„„„„4
2.1分频模块„„„„„„„„„„„„„„„„„„„„„„„4
2.2计数器模块„„„„„„„„„„„„„„„„„„„„„„6
2.3控制模块„„„„„„„„„„„„„„„„„„„„„„10
2.4数码管分配„„„„„„„„„„„„„„„„„„„„„13
2.5显示模块„„„„„„„„„„„„„„„„„„„„„„14
2.6报时模块„„„„„„„„„„„„„„„„„„„„„„16
六、调试中遇到的问题及解决的方法„„„„„„„„„„„18
七、心得体会„„„„„„„„„„„„„„„„„„„„„18
一、课程设计的性质、目的和任务
创新精神和实践能力二者之中,实践能力是基础和根本。这是由于创新基于实践、源于实践,实践出真知,实践检验真理。实践活动是创新的源泉,也是人才成长的必由之路。
通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养学生的创新精神。
二、课程设计基本要求
掌握现代大规模集成数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。
三、设计课题要求
(1)构造一个24小时制的数字钟。要求能显示时、分、秒。(2)要求时、分、秒能各自独立的进行调整。
(3)能利用喇叭作整点报时。从59分50秒时开始报时,每隔一秒报时一秒,到达00分00秒时,整点报时。整点报时声的频率应与其它的报时声频有明显区别。
#设计提示(仅供参考):(1)对频率输入的考虑
数字钟内所需的时钟频率有:基准时钟应为周期一秒的标准信号。报时频率可选用1KHz和2KHz左右(两种频率相差八度音,即频率相差一倍)。另外,为防止按键反跳、抖动,微动开关输入应采用寄存器输入形式,其时钟应为几十赫兹。
(2)计时部分计数器设计的考虑 分、秒计数器均为模60计数器。
小时计数为模24计数器,同理可建一个24进制计数器的模块。(3)校时设计的考虑
数字钟校准有3个控制键:时校准、分校准和秒校准。
微动开关不工作,计数器正常工作。按下微动开关后,计数器以8Hz频率连续计数(若只按一下,则计数器增加一位),可调用元件库中的逻辑门建一个控制按键的模块,即建立开关去抖动电路(见书70页)。
(4)报时设计的考虑
可以将高频时钟分频得到约2KHz和1KHz的音频,作为数字钟的报时频率。当电子钟显示XX:59:50时,数字钟开始报时“DO“,持续一秒,而且每隔一秒报一下,直至显示XX:00:00时报“DI”,持续一秒后停止。最后输出至喇叭。应调用元件库中的逻辑门建一个控制报时的模块。
(5)建一个七段译码的模块
因在系统可编程器件实验箱上的数码管没有经过译码,故要用AHDL语言写一个七段译码的模块,且应考虑数码管为共阳极。数码管上的点(D2、D4、D6)应置Vcc。
四、课程设计所需要仪器
1、计算机一台
2、quartusⅡ软件
3、FPGA开发板
五、设计步骤
1、模块介绍
(1)分频模块:产生1Hz、1KHz、2KHz频率(2)计数器模块:生成60进制、24进制计数器(3)控制模块:按键控制、按键消抖
(4)显示模块:7段数码管显示器,分别显示小时、分钟、秒(5)报时模块:进行整点报时
2、各个模块的设计与仿真
2.1分频模块
CLK晶振频率50MHZ,分成2KHZ,1KHZ,1HZ的信号。基准1HZ信号作为时钟计时的秒计数时钟信号;分频的1KHZ,2KHZ信号用于报时电路的不同声讯。
程序代码:
library ieee;use ieee.std_logic_1164.all;entity fre is port(clk ,sel: in std_logic;clk1hz,clk1khz,clk2khz:out std_logic);end fre;architecture beh of fre is signal data1khz,data2khz,data1hz : std_logic := '0';begin clk1hz <= data1hz;clk1khz <= data1khz;clk2khz <= data2khz;clk1khz_pro : process(clk)--产生1khz信号 variable cnt : integer range 0 to 24999;begin if clk'event and clk='1' then if cnt = 24999 then cnt := 0;data1khz <= not data1khz;else cnt := cnt + 1;end if;end if;end process clk1khz_pro;clk2khz_pro : process(clk)--variable cnt : integer range 0 to 12499;begin if clk'event and clk='1' then if cnt = 12499 then cnt := 0;data2khz <= not data2khz;else cnt := cnt + 1;end if;end if;end process clk2khz_pro;clk1hz_pro : process(data1khz)--variable cnt : integer range 0 to 499;begin if data1khz'event and data1khz='1' then if sel='0' then cnt:=0;else if cnt = 499 then cnt := 0;data1hz <= not data1hz;else cnt := cnt + 1;end if;end if;end if;end process clk1hz_pro;end beh;
输入模块电路图:
产生2khz信号 产生1hz 信号 5 freclkclk1hzclk2khzinst selclk1khz2.2计数器模块
由秒计数器,分计数器,时计数器组成了最基本的数字钟计时电路,两个六十进制计数器与二十四进制计数器组合构成。
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;
entity shuzizhong is port(clk_change : in std_logic;s_en,m_en,h_en:in std_logic;sel:in std_logic;secout,minout,hourout :out std_logic;sl,sh,ml,mh,hl,hh:out std_logic_vector(3 downto 0);a:out std_logic_vector(15downto 0));end shuzizhong;architecture behav of shuzizhong is
signal low_rega,high_rega,low_regb,high_regb,low_regc,high_regc :std_logic_vector(3 downto 0):=“0000”;signal sout,mout,hout :std_logic :='0';begin--秒的60进制进制 counter_sec_l : process(clk_change,s_en)begin
sl<=low_rega;sh<=high_rega;ml<=low_regb;mh<=high_regb;hl<=low_regc;hh<=high_regc;6 if clk_change'event and clk_change='1' then if s_en='1' then if low_rega=“1001” then low_rega <= “0000”;else low_rega <= low_rega+'1';end if;end if;end if;end process counter_sec_l;counter_sec_h : process(clk_change,s_en,low_rega)begin if clk_change'event and clk_change='1' then if s_en='1' then if low_rega=“1001” then if high_rega =“0101”then high_rega <= “0000”;else high_rega <= high_rega+'1';end if;end if;end if;end if;end process counter_sec_h;sout <= '1' when low_rega=“1001” and high_rega=“0101” else '0';
----分钟的60进制设置 counter_min_l : process(clk_change,m_en)begin if clk_change'event and clk_change='1' then if m_en='1' then if sout='1'or sel='0' then if low_regb=“1001” then low_regb <= “0000”;else low_regb <= low_regb+'1';end if;end if;end if;end if;end process counter_min_l;counter_min_h : process(clk_change,m_en,low_regb)begin if clk_change'event and clk_change='1' then 7 if sout='1'or sel='0' then if m_en='1' then if low_regb=“1001” then
if high_regb =“0101”then
high_regb <= “0000”;else high_regb <= high_regb+'1';end if;end if;end if;end if;end if;end process counter_min_h;mout <= '1' when low_regb=“1001” and high_regb=“0101”and sout='1' else '0';--小时的24进制设置 counter_hour_l : process(clk_change,h_en)begin if clk_change'event and clk_change='1' then if h_en='1' then if mout='1'or sel='0' then if low_regc=“1001”or hout='1' then low_regc <= “0000”;else low_regc <= low_regc+'1';end if;end if;end if;end if;end process counter_hour_l;counter_hour_h : process(clk_change,h_en,hout)begin if clk_change'event and clk_change='1' then if mout='1'or sel='0' then if h_en='1' then if hout='1' then high_regc<=“0000”;else if low_regc=“1001” then high_regc <= high_regc+'1';end if;end if;end if;8 end if;end if;end process counter_hour_h;hout <= '1' when low_regc=“0011” and high_regc=“0010” else '0';secout<=sout;minout<=mout;hourout<=hout;a<=high_regb&low_regb&high_rega&low_rega;end behav;
输入模块电路图:
shuzizhongclk_changes_enm_enh_enselsecoutminouthouroutsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]a[15..0]inst
2.3控制模块
分五个状态0状态正常计时,按下按键进入下一状态开始调时模式1,按下按键进入调秒模式2,按下按键进入调分模式3,按下按键进入调小时模式4.按下按键恢复正常计时模式。
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_press is port(set ,mode: in std_logic;clk1khz,clk1hz: in std_logic;secout,minout: in std_logic;clk_change,clk2hz_en:out std_logic;sel,s_ce,m_ce,h_ce:out std_logic;s_en,m_en,h_en:out std_logic);end key_press;architecture beh of key_press is 9 signal key1,key2:std_logic;signal sce_reg, mce_reg ,hce_reg:std_logic;signal ssl,ssen,mmen,hhen:std_logic;signal con : integer range 0 to 4 :=0;--按键按下(延时)begin
key_press2 : process(set,clk1khz)variable cnt :integer range 0 to 999;begin if set='0' then if clk1khz'event and clk1khz='1'then if cnt=50 and set='0' then cnt :=cnt+1;key2 <= '1';else cnt:=cnt+1;key2 <= '0';end if;end if;else cnt:=0;key2<='0';end if;end process key_press2;key_press1 : process(mode,clk1khz)variable cnt :integer range 0 to 999;begin if mode='0' then if clk1khz'event and clk1khz='1'then if cnt=50 and mode='0' then cnt :=cnt+1;key1 <= '1';else cnt:=cnt+1;key1 <= '0';end if;end if;else cnt:=0;key1<='0';end if;end process key_press1;count : process(key1,key2)begin if key1'event and key1='1' then if con=4 then con<=0;else con<=con+1;end if;end if;10 end process count;con_pro : process(con)begin case con is when 0 => ssl<='1';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='0';when 1 => ssl<='0';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='1';when 2 => ssl<='0';sce_reg <= '1';ssen <='1';mce_reg <= '0';mmen <='0';hce_reg <= '0';hhen <='0';clk2hz_en <='1';when 3 => ssl<='0';sce_reg <= '0';ssen <='0';mce_reg <= '1';mmen <='1';hce_reg <= '0';hhen <='0';clk2hz_en <='1';when 4 => ssl<='0';sce_reg <= '0';ssen <='0';mce_reg <= '0';mmen <='0';hce_reg <= '1';hhen <='1';clk2hz_en <='1';when others => ssl<='0';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='0';end case;end process con_pro;sel_pro : process(ssl)begin case ssl is when '0'=> s_ce<=sce_reg;m_ce<=mce_reg;h_ce<=hce_reg;clk_change<=key2;when '1'=> s_ce<=ssen;11 m_ce<=mmen;h_ce<=hhen;clk_change<=clk1hz;when others=> s_ce<=ssen;m_ce<=secout;h_ce<=minout;clk_change<=clk1hz;end case;end process sel_pro;sel<=ssl;s_en<=ssen;m_en<=mmen;h_en<=hhen;end beh;
输入模块电路图: key_presssetclk_changemodeclk2hz_enclk1khzselclk1hzs_cesecoutm_ceminouth_ces_enm_enh_eninst
2.4数码管分配
程序代码:
library ieee;use ieee.std_logic_1164.all;entity display is port(datain : in std_logic_vector(3 downto 0);dataout : out std_logic_vector(7 downto 0));end display;architecture duan of display is begin process(datain)begin case datain is 12 when “0000” => dataout <=“11000000”;--dp,g,f,e,d,c,b,a when “0001” => dataout <=“11111001”;when “0010” => dataout <=“10100100”;when “0011” => dataout <=“10110000”;when “0100” => dataout <=“10011001”;when “0101” => dataout <=“10010010”;when “0110” => dataout <=“10000010”;when “0111” => dataout <=“11111000”;when “1000” => dataout <=“10000000”;when “1001” => dataout <=“10010000”;when “1010” => dataout <=“10111111”;when “1011” => dataout <=“10000011”;when “1100” => dataout <=“10100111”;when “1101” => dataout <=“10100001”;when “1110” => dataout <=“10000110”;when “1111” => dataout <=“10001110”;when others => null;end case;end process;end;
输入模块电路图:
displaydatain[3..0]dataout[7..0]inst
2.5显示模块
使用七段数码管显示小时、分钟与秒
程序代码:
library ieee;use ieee.std_logic_1164.all;entity scan is port(clk1khz : in std_logic;sl,sh,ml,mh,hl,hh : in std_logic_vector(3 downto 0);clk2hz_en : in std_logic;s_ce,m_ce,h_ce : in std_logic;en_out : out std_logic_vector(7 downto 0);13 dataout : out std_logic_vector(3 downto 0));end scan;architecture beh of scan is signal cnt : integer range 0 to 7;signal en : std_logic_vector(7 downto 0);signal clk2hz : std_logic;signal h_ce_reg,m_ce_reg,s_ce_reg : std_logic;begin h_ce_reg <= not h_ce;m_ce_reg <= not m_ce;s_ce_reg <= not s_ce;cnt_pro : process(clk1khz)begin if clk1khz'event and clk1khz='1' then if cnt = 7 then cnt <= 0;else cnt <= cnt + 1;end if;end if;end process cnt_pro;clk2hz_pro :process(clk1khz)variable c : integer range 0 to 499 := 0;begin if clk1khz'event and clk1khz='1' then if clk2hz_en ='1' then if c =499 then c := 0;clk2hz <= not clk2hz;else c := c + 1;end if;else clk2hz <= '0';end if;end if;end process clk2hz_pro;scan_pro : process(cnt,sl,sh,ml,mh,hl,hh)begin case cnt is when 0 => dataout <= sl;en <= “11111110”;when 1 => dataout <= sh;en <= “11111101”;when 2 => dataout <= ml;en <= “11110111”;when 3 => dataout <= mh;en <= “11101111”;when 4 => dataout <= hl;en <= “10111111”;14 when 5 => dataout <= hh;en <= “01111111”;when 6 => dataout <= “1010”;en <= “11111011”;when 7 => dataout <= “1010”;en <= “11011111”;when others => null;end case;end process scan_pro;
en_out <= en or((clk2hz & clk2hz)or(h_ce_reg & h_ce_reg))& clk2hz &((clk2hz & clk2hz)or(m_ce_reg & m_ce_reg))& clk2hz &((clk2hz & clk2hz)or(s_ce_reg & s_ce_reg));end beh;
输入模块电路图:
scanclk1khzen_out[7..0]sl[3..0]dataout[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]clk2hz_ens_cem_ceh_ceinst
2.6报时模块
利用蜂鸣器进行整点报时
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;--整点报时 entity baoshi is port(clk1khz,clk2khz : in std_logic;a:in std_logic_vector(15 downto 0);sel:in std_logic;bell:out std_logic);end baoshi;architecture zhong of baoshi is signal c1,ring:std_logic;begin ring_bell :process(clk1khz,clk2khz)15 begin case a is when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk2khz;when “***0” => c1<=clk2khz;when others => c1<='0';end case;end process ring_bell;
bs: process(c1)begin if sel='1' then if c1='1' then ring<='0';else ring<='1';end if;end if;end process bs;bell<=ring;
end zhong;
输入模块电路图:
baoshiclk1khzbellclk2khza[15..0]selinst
整体模块电路图
displayshuzizhongs_enm_enh_enselclk_changes_enm_enh_enselsecoutminouthouroutsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]setmodefreclkINPUTVCCINPUTVCCdata[3..0]datain[3..0]secoutminoutinst1scanclk1khzclk1khzsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]a[15..0]dataout[7..0]OUTPUTdataout[7..0]en_out[7..0]dataout[3..0]OUTPUTen_out[7..0]data[3..0]key_presssetclk1khzmodeclk1khzclk1hzsecoutminoutclk_changeclk2hz_ensels_cem_ceh_ces_enm_enh_eninst6s_enm_enh_enselinst7a[15..0]INPUTVCChh[3..0]clk2hz_ens_cem_ceh_ceinst4baoshiclk1khzclk2khza[15..0]selclk1khzbellclk2khza[15..0]sel++selclkclk1hzselclk1khzclk2khzinst2clk1khzclk2khzsecoutminoutOUTPUTbellinst
六、调试中遇到的问题及解决的方法:
1、编程时,经常导致语法错误,如:“;”没有写上,变量类型没有预先标明,前后变量名字由于缺少一个或多一个字母而导致出错。解决办法:对照错误,认真检查程序,看哪个地方的标点,变量没有写上或标明。
2、进行编译或波形仿真时,经常得到的不是预想中的结果。
解决办法:将需要编译或进行仿真的实体文件置顶,经检错无误后,进行波形仿真,在仿真之前需要合理设置仿真结束时间和信号周期。
3、在控制时间的显示的时候,由于变量太多多发现不能完全的控制住变量,导致显示的时候出现了乱码,数码管显示不正常 解决办法:减少变量,仔细推敲,合理命名。
七、心得体会
一个多星期的课程设计让我受益匪浅,也让我真正明白理论与实践相结合的重要性。通过具体实践才能让自己清楚哪些知识已经掌握,哪些知识仍需巩固加强。与此同时,我也对EDA以及VHDL语言有了进一步了解,对于其结构、语法、功能等认识不少。当然,我目前所做的还仅仅只是一些基本操作,要想真正将其融会贯通还需要今后更多的学习与实践。虽然只是一个小设计,我却也从中学到了不少设计流程和一些相关问题。设计是一个十分严谨的过程,容不得随意和马虎。要想快速而高效地完成一项设计,必须先有一个清晰明了的设计思路,设想好一个整体框架,然后在此基础上,逐渐将各个部分功能进行完善。在设计的过程中,也曾遇到不少困难,但正所谓坚持就是胜利,要想取得成功,必须要有努力付出,这样所取得的结果才更有意义。
第五篇:FPGA课程设计多功能数字钟讲解
多功能数字钟
开课学期:2014—2015 学年第二学期 课程名称: FPGA课程设计
学 院: 信息科学与工程学院
专 业: 集成电路设计与集成系统
班 级: 学 号: 姓 名:
任课教师:
2015 年 7 月 21 日
说 明
一、论文书写要求与说明
1.严格按照模板进行书写。自己可以自行修改标题的题目 2.关于字体:
a)题目:三号黑体加粗。
b)正文:小四号宋体,行距为1.25倍。
3.严禁抄袭和雷同,一经发现,成绩即判定为不及格!!
二、设计提交说明
1.设计需要提交“电子稿”和“打印稿”;
2.“打印稿”包括封面、说明(即本页内容)、设计内容三部分;订书机左边装订。
3.“电子稿”上交:文件名为 “FPGA课程设计报告-班级-学号-姓名.doc”,所有报告发送给班长,由班长统一打包后统一发送到付小倩老师。
4.“打印稿”由班长收齐后交到:12教305办公室; 5.上交截止日期:2015年7月31日17:00之前。
第一章
绪论....................................................................................................................3 关键词:FPGA,数字钟....................................................................................................3 第二章 FPGA的相关介绍...............................................................................................4 2.1 FPGA概述........................................................................................................4 2.2 FPGA特点...........................................................................................................4 2.3 FPGA设计注意...................................................................................................5 第三章 Quartus II与Verilog HDL相关介绍..................................................................7 3.1 Quartus II..............................................................................................................7 3.2 Verilog HDL......................................................................................................7 第四章 设计方案..............................................................................................................8 4.1数字钟的工作原理..............................................................................................8 4.2 按键消抖.............................................................................................................8 4.3时钟复位..............................................................................................................8 4.4时钟校时..............................................................................................................8 4.5数码管显示模块。..............................................................................................8 第五章 方案实现与验证..................................................................................................9 5.1产生秒脉冲..........................................................................................................9 5.2秒个位进位..........................................................................................................9 5.3按键消抖..............................................................................................................9 5.4复位按键设置....................................................................................................10 5.5 数码管显示。...................................................................................................10 5.6 RTL结构总图....................................................................................................11 第六章 实验总结............................................................................................................14 第七章 Verilog HDL源代码附录..................................................................................15
第一章
绪论
现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic, EDA)技术。
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面广,抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器;而FPGA是特殊的ASIC芯片,与其它的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所对应的功能。因此,按键信息输入是与软件结构密切相关的过程。根据键盘结构的不同,采用不同的编码方法,但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。[1] 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此研究数字钟以及扩大其应用有着非常现实的意义。
关键词:FPGA,数字钟
第二章 FPGA的相关介绍
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.1 FPGA概述
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。
2.2 FPGA特点
FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。
2.3 FPGA设计注意
不管你是一名逻辑设计师、硬件工程师或系统工程师,甚或拥有所有这些头衔,只要你在任何一种高速和多协议的复杂系统中使用了FPGA,你就很可能需要努力解决好器件配置、电源管理、IP集成、信号完整性和其他的一些关键设计问题。不过,你不必独自面对这些挑战,因为在当前业内领先的FPGA公司里工作的应用工程师每天都会面对这些问题,而且他们已经提出了一些将令你的设计工作变得更轻松的设计指导原则和解决方案。
本次实验所采用的FPGA器件是Altera Cyclone V 5CSEMA5F31C6N
FPGA实物图
FPGA数码管介绍,每节数码管低电平点亮高电平熄灭。LED序号如下图所示:
根据上图所示的顺序,可以得出显示的数组代码。
4'd0: HEX0=7'b1000000;4'd1: HEX0=7'b1111001;4'd2: HEX0=7'b0100100;4'd3: HEX0=7'b0110000;4'd4: HEX0=7'b0011001;4'd5: HEX0=7'b0010010;4'd6: HEX0=7'b0000010;4'd7: HEX0=7'b1111000;4'd8: HEX0=7'b0000000;4'd9: HEX0=7'b0010000;
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9 default: HEX0=7'b1111111;//不符合条件的显示零
第三章 Quartus II与Verilog HDL相关介绍
3.1 Quartus II Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
Quartus II 软件拥有友好的界面,使用便捷,功能强大,当中可编程逻辑设计环境采用完成集成化,是先进的EDA工具软件。该软件具备诸多特点(例如:开放性,与结构无联系,多平台设计,完全集成化,设计库丰富、工具模块化等),支持原理图、VHDL、VerilogHDL以及AHDL等多种设计输入形式。Quartus II能够在多系统上使用,为用户的设计方式提供了完善的图形界面。具有运行速度快,界面统一,功能集中,学用简单等特点。
图形或HDL编辑Analysis & Synthesis(分析与综合)Filter(适配器)Assembler(编程文件汇编)编辑器Timing Analyzer(时序分析器)设计输入综合或编译适配器件下载仿真
3.2 Verilog HDL
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
第四章 设计方案
4.1数字钟的工作原理
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻0”规律计数。计数满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分。控制信号由三个独立按键输入。输入信号选择FPGA器件上的50MHZ时钟信号。
4.2 按键消抖
因为按键的物理结构并非理想式开关,在按键按下后会在一个很短的时间内出现电平抖动的情况,因此需要对按键进行消抖处理。这里的按键消抖与单片机中的按键消抖问题有所不同,不能采用延时的方法进行按键消抖,这里我选用对时钟脉冲计数的方式来判断按键是否按下。采用50MHZ时钟信号,实测160ms的消抖时长较为合适,即8000000个时钟上升沿。
4.3时钟复位
按下复位按键后,所有位清零。
4.4时钟校时
时钟计时过程中,可对时钟进行校时。本次设计不考虑对秒位进行校时,分钟的个位和小时的个位加到10时会自动进位,因此只对分钟的个位和小时的个位设置可以加1的校时按钮,即可实现校时功能。整体比较容易实现。
4.5数码管显示模块。
选择需要显示的时钟位数作为敏感词,用上述给出的显示代码对时钟的每一位分别进行显示处理。
第五章 方案实现与验证
5.1产生秒脉冲
always@(posedge clk)。。。
如代码展现,当计数器count记到50000000个时钟上升沿的时候,向秒个位进1.count=count+1;
begin
end count=0;count_s0=count_s0+1;
//秒个位计数
if(count==32'd50000000)
//产生一个一秒的脉冲,//敏感词为50MHZ时钟上升沿
5.2秒个位进位
当秒的个位计数到10的时候,向秒的十位进位。
if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
5.3按键消抖
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)
begin count0=0;count_m0=count_m0+1;end
对时钟秒冲进行计数,计数达到8000000时,判断此时的电平是否为0,若还是为0,则判断按键按下,执行分钟个位加1操作。
5.4复位按键设置
begin
if(!reset)
begin
count=0;
count_s0=0;count_s1=0;
count_m0=0;count_m1=0;
count_h0=0;count_h1=0;
end else
复位按键按下后所有位置零。
5.5 数码管显示。
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
//按键按下为逻辑0
//复位置零
//秒个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
5.6 RTL结构总图
显示部分如下图:
判断主体如下图:
部分引脚图展现
最终实验现象:
第六章 实验总结
其实本次的多功能数字钟设计其实应该还有很多其他的方法,比如用到外部中断功能进行时钟的校时,采用按键输入加数码管闪烁的方式进行校时位的选择,但限于时间较短,这部分知识空白,所以本次设计实有所缺陷。
经历了本次FPGA的设计,有很多感受,首先就是看了一点数字钟设计方面的资料,遇到很多不理解的地方,于是就需要再和同学进行研究讨论,在讨论的过程中,能听到其他人的思路,感觉特别有意思,同样的功能,实现的方法有许许多多,努力把自己的想法实现,或是选择一种你喜欢的设计借鉴一下,两者都是很好的选择。
通过这次设计实验,着实培养了我们独立思考、解决问题的能力,从最一开始的一筹莫展,没有一点思路,感觉像平底拔楼一样,从两手空空到产生一个控制电路,从无到有,这是创造的力量。同时,和其他同学讨论的过程也很重要,要说的还有就是最后实验成功的喜悦是无可替代的,就好像你亲手种的果树长出了果实,养的鸡下了鸡蛋,是一种创造的喜悦,整个心就像是一个大箱子里面放着一块糖,隐隐约约总能感觉到一丝甜蜜。
数码管显示的数字钟是常见的技术,这次基于FPGA的多功能数字钟设计具有很高的工程价值和现实意义。让我们将知识服务于生活,将知识用于实践,锻炼了我们发现问题解决问题的能力。
这次FPGA的多功能数字钟设计,加深了我们对FPGA设计的理解,培养了我们的逻辑思维和动手操作能力,使我们将知识与技能链接起来,使我们每个人的都在不断进步,提高了专业技能,提高了动手实践的综合能力。
第七章 Verilog HDL源代码附录
module clock(reset,inrst_m0,inrst_h0,clk,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);input clk,reset,inrst_m0,inrst_h0;output reg [6:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;reg [31:0] count=0,count0=0,count1=0;reg [3:0] count_s0=0,count_s1=0,count_m0=0,count_m1=0, count_h0=0,count_h1=0;
//实际宽度为25 always@(posedge clk)begin
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)//按键消抖
begin count0=0;count_m0=count_m0+1;end if(!inrst_h0)count1=count1+1;if(count1==32'd8000000 &&!inrst_h0)
begin count1=0;count_h0=count_h0+1;end
//按键按下为逻辑0
//复位置零 if(!reset)begin count=0;count_s0=0;count_s1=0;count_m0=0;count_m1=0;count_h0=0;count_h1=0;end count=count+1;begin else
if(count==32'd50000000)
//产生一个一秒的脉冲,end count=0;count_s0=count_s0+1;
//秒个位计数
else if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//产生秒十位进位
else if(count_s1==4'd6)
begin
end
//分个位计数 count_s1=0;count_m0=count_m0+1;else if(count_m0==4'd10)
begin
end
//分十位计数 count_m0=0;count_m1=count_m1+1;else if(count_m1==4'd6)
begin
end
//时个位计数 count_m1=0;count_h0=count_h0+1;else if(count_h0==4'd10)
begin
end
//满24判断 count_h0=0;count_h1=count_h1+1;else if(count_h0==4 && count_h1==2)
begin
count_h0=0;
count_h1=0;end
end
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
always@(count_s1)
begin
case(count_s1)
4'd0: HEX1=7'b1000000;
4'd1: HEX1=7'b1111001;
4'd2: HEX1=7'b0100100;
4'd3: HEX1=7'b0110000;
4'd4: HEX1=7'b0011001;
4'd5: HEX1=7'b0010010;
default: HEX1=7'b1111111;endcase
//秒个位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//秒十位显示
//0 低电平点亮高电平熄灭//1 //2 //3 //4 //5
//不符合条件的显示零
end
always@(count_m0)
begin
case(count_m0)
4'd0: HEX2=7'b1000000;
4'd1: HEX2=7'b1111001;
4'd2: HEX2=7'b0100100;
4'd3: HEX2=7'b0110000;
4'd4: HEX2=7'b0011001;
4'd5: HEX2=7'b0010010;
4'd6: HEX2=7'b0000010;
4'd7: HEX2=7'b1111000;
4'd8: HEX2=7'b0000000;
4'd9: HEX2=7'b0010000;
default: HEX2=7'b1111111;
endcase end always@(count_m1)
begin
case(count_m1)
4'd0: HEX3=7'b1000000;
4'd1: HEX3=7'b1111001;
4'd2: HEX3=7'b0100100;
4'd3: HEX3=7'b0110000;
4'd4: HEX3=7'b0011001;
4'd5: HEX3=7'b0010010;
default: HEX3=7'b1111111;
endcase end always@(count_h0)
begin
case(count_h0)
4'd0: HEX4=7'b1000000;4'd1: HEX4=7'b1111001;
//分个位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//分十位显示
//0 低电平点亮高电平熄灭 //1 //2 //3 //4 //5
//不符合条件的显示零
//时个位显示
//0 低电平点亮高电平熄灭 //1
4'd2: HEX4=7'b0100100;
4'd3: HEX4=7'b0110000;
4'd4: HEX4=7'b0011001;
4'd5: HEX4=7'b0010010;
4'd6: HEX4=7'b0000010;
4'd7: HEX4=7'b1111000;
4'd8: HEX4=7'b0000000;
4'd9: HEX4=7'b0010000;
default: HEX4=7'b1111111;endcase End
always@(count_h1)
begin
case(count_h1)
4'd0: HEX5=7'b1000000;
4'd1: HEX5=7'b1111001;
4'd2: HEX5=7'b0100100;
default: HEX5=7'b1111111;
endcase end
endmodule
//2 //3 //4 //5 //6 //7 //8 //9
//不符合条件的显示零
//时十位显示
//0 低电平点亮高电平熄灭//1 //2
//不符合条件的显示零