fpga数字钟实训报告具有8点报时按键调时功能.docx
《fpga数字钟实训报告具有8点报时按键调时功能.docx》由会员分享,可在线阅读,更多相关《fpga数字钟实训报告具有8点报时按键调时功能.docx(20页珍藏版)》请在冰点文库上搜索。
fpga数字钟实训报告具有8点报时按键调时功能
桂林电子科技大学职业技术学院
FPGA应用实训报告
数字钟
学院(系):
电子信息工程系
专业:
电子信息工程技术
学号:
1212220217
学生姓名:
李建军
指导教师:
叶俊明
目录
摘要2
1绪论3
2课题背景4
2.1设计任务与要求4
2.2设计目的4
2.3总体设计方案4
3程序方案论证5
3.1分频方案论证5
3.1.1分频模块方案I5
3.1.2分频模块方案II5
3.2计时模块方案论证6
3.2.1计时模块方案I6
3.2.2计时模块方案II6
3.3方案总结7
4系统软件设计7
4.1程序流程图7
4.2计时模块8
4.3闹钟模块8
4.4显示模块8
5系统硬件设计9
5.1FPGA的介绍9
5.1.1FPGA概述9
5.1.2FPGA基本结构 9
5.2原理框图11
6调试12
6.1调时程序调试12
6.2闹钟程序调试12
总结13
致谢14
参考文献15
附录16
摘要
数字钟是由振荡器、分频器、计数器、译码器、数码显示器等几部分组成。
振荡电路:
主要用来产生时间标准信号,因为时钟的精度主要取决于时间标准信号的频率及稳定度,所以采用石英晶体振荡器。
分频器:
因为振荡器产生的标准信号频率很高,要是要得到“秒”信号,需一定级数的分频器进行分频。
计数器:
有了“秒”信号,则可以根据60秒为1分,24小时为1天的制,分别设定“时”、“分”、“秒”的计数器,分别为60进制,60进制,24进制计数器,并输出一分,一小时,一天的进位信号。
译码显示:
将“时”“分”“秒”显示出来。
将计数器输入状态,输入到译码器,产生驱动数码显示器信号,呈现出对应的进位数字字型。
由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路可以对分和时进行校时。
另外,计时过程要具有报时功能,当时间到达整点时开始响,蜂鸣器不停地响1分钟后不响。
关键词:
数字钟,振荡,计数,校正,报时
1绪论
数字钟是采用数字电路实现对时、分、秒,数字显示的计时装置,广泛用于个人家庭,车站,码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英振荡器的广泛应用,使得数字钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大地方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、校时自动打铃、时间程序自动控制、定是广播、自动启闭路灯、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用有着非常现实的意义。
伴随着集成电路技术的发展,电子设计自动化(EDA)技术逐渐成为数字电路设计的重要手段。
基于FPGA的EDA技术的发展和应用领域的扩大与深入,使得EDA技术在电子信息,通信,自动控制,计算机等领域的重要性日益突出。
本设计给出了一种基于FPGA的多功能数字钟方法,测试结果表明本设计实现了一个多功能的数字钟功能,具有时、分、秒计时显示功能,以24小时循环计时;具有校正小时和分钟的功能;以及清零,整点报时功能。
2课题背景
数字化的钟表给人们带来了极大的方便。
近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
利用EDA技术进行电子系统的设计具有以下几个特点:
采用自顶向下的设计方法;用软件的形式设计硬件;用软件的方式设计过程中可用相关软件进行仿真;系统可现场编程,在线升级;整个系统集成在一个芯片上,体积小,功耗低,可靠性高.因此,EDA技术是现代电子设计的发展趋势.
用硬件描述语言结合FPGA可编程器件可以极大地方便集成电路的设计,使其成为集成电路的发展趋势,也是每一个电子工程师必须掌握的技术,故基于FPGA(现场可编程门阵列)的设计型实验成为高校电类专业学生的必修且重要环节。
2.1设计任务与要求
(1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式)
(2)到点报时、闹钟时间固定为8:
00
(3)同时设置按键调时。
2.2设计目的
为了更好的运用掌握FPGA多功能数字钟编程知识,学会自我找到问题、分析问题并解决问题的方法,培养认真学习和工作的作风,锻炼自己的思考能力和团结合作能力。
充分发挥思维创造性,开发功能多样的扩展功能电路并锻炼自己的动手能力。
2.3总体设计方案
(1)方案一用数电制作一个数字钟,通过74L74芯片实现数码管计数功能
用与非门结合,用按键来设置实现闹钟和整点报时的功能。
(2)方案二用fpga来制作一个数字钟,通过编写程序来控制fpga芯片输
出输入来得到数字钟的功能,同时用fpga板来实现该功能。
(3)方案三用单片机来控制数字钟,通过编写程序来实现时钟计时功能,
通过单片机试验箱来实现该功能,最终达到相应的结果。
总结:
方案一用数电的方式做数字钟,用的芯片多同时之制作麻烦,不适合制做数字钟。
方案二制作比较便捷,只需要写程序,制作业是比较方便,也比较实现功能。
方案三用单片机虽然也是编写程序,可是和FPGA相比我个人觉得还是比单片机好做一点。
综合上述我选择FPGA来制作该程序
3程序方案论证
3.1分频方案论证
3.1.1分频模块方案I
定义变量并且设定一个上限值,每次加计数到该上限值时,输出该计数值的最高位
parameterDIV_SIZE=25;
always@(posedgeclock)
counter=counter+1;
assignclkdiv=counter[DIV_SIZE-1];
3.1.2分频模块方案II
定义一个变量,使得counter_1hz==20000000,使得输入1hz信号,让counter_1hz自加
always@(posedgeclk)
Beginif(counter_1hz==20000000)
begincounter_1hz=0;clk_1hz<=~clk_1hz;end
elsecounter_1hz=counter_1hz+1;
if(counter>=10000)
begincounter<=0;clk_1khz<=~clk_1khz;end
elsebegincounter<=counter+1;
End
3.2计时模块方案论证
3.2.1计时模块方案I
计时分每个信号的高低位进行判断及计时
if(sL==9)beginsL<=0;if(sH==5)beginsH<=0;if(mL==9)beginmL<=0;if(mH==5)beginmH<=0;if(hL==9)
beginhL<=0;hH<=hH+1;end
elseif(hL==3&&hH==2)
beginhL<=0;hH<=0;endelsehL<=hL+1;endelsemH<=mH+1;
end
elsemL<=mL+1;
end
elsesH<=sH+1;
end
elsesL<=sL+1;
end
3.2.2计时模块方案II
用信号来判断
if(b==1000)
begin
b=0;
second_l=second_l+1;
if(second_l==10)
beginsecond_l=0;second_h=second_h+1;end
if(second_h==6)
beginsecond_h=0;miniute_l=miniute_l+1;end
if(miniute_l==10)
beginminiute_l=0;miniute_h=miniute_h+1;end
if(miniute_h==6)
beginminiute_h=0;hour_l=hour_l+1;end
if(hour_l==10)beginhour_l=0;hour_h=hour_h+1;end
if((hour_l>=4&&hour_h==2)||(hour_h==3))
begin
hour_h=0;
hour_l=0;end
end
elseb=b+1;end
3.3方案总结
分频采用方案2来实现设计。
方案2在思路方面较为通俗易懂,且判断过程简短明了,在最终的显示时出现毛刺干扰现象,其他方案中不便于增加小时和分钟的调节信号,方案最终失败。
方案2比较判断复杂,在最终的数码管显示时可能不怎么稳定。
方案2我们上课时学的也是这个方案用起来也比较熟悉。
综合考虑,使用方案2。
4系统软件设计
软件部分有分频模块,按键防抖动,时钟主体,闹铃模块,动态扫描模块等来实现此方案。
程序流程图3-1
使用此方案首先进行分频得到一个信号,使得信号稳定。
进而促使时钟主体工作。
再通过按键防抖来控制调时和闹钟模块最后用动态扫描来实现软件的所有功能。
4.1程序流程图
图3-1
4.2计时模块
second_l,second_h;miniute_l,miniute_h;hour_l,hour_h;分别表示秒,分,小时的高位和低位L组成十六进制计数器。
以1hz作为一秒,自加计时,当秒加到60后自动向分进位,当分加到60后自动向时进位,当时到24小时候变为00。
4.3闹钟模块
always@(posedgeclk)
begin
if(hour_h==0&&hour_l==8&&miniute_h==0&&miniute_l==0)//8:
00报时,闹钟模块
beginif(counter_clock==8000)
begincounter_clock=0;alarm_clock=~alarm_clock;end
elsecounter_clock=counter_clock+1;end
闹钟模块从CLk中分出8000hz的频率,驱动蜂鸣器。
当时钟到8:
00时,蜂鸣器电平取反,产生报时。
4.4显示模块
//动态扫描模块
always@(posedgeclk_1khz)
begin
case(state)
s0:
beginseg_bit=4'b0111;
display_tab=miniute_l;
state=s1;led_test=1;end
s1:
beginseg_bit=4'b1011;
display_tab=miniute_h;
state=s2;led_test=1;end
s2:
beginseg_bit=4'b1101;
display_tab=hour_l;
state=s3;led_test=~clk_1hz;end
s3:
beginseg_bit=4'b1110;
display_tab=hour_h;
state=s0;led_test=1;end
default:
beginled_out=7'bz;state=0;end
endcase
end
动态显示扫描,将分的高低位和时的高低位依次显示在4位数码管上。
5系统硬件设计
5.1FPGA的介绍
5.1.1FPGA概述
FPGA是现场可编程门阵列(Field Programmable Gate Array)的简称,与之相应的CPLD是复杂可编程逻辑器件(ComplexProgrammable LogicDevice)的简称,两者的功能基本相同,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。
CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。
它如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。
通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。
使用CPLA/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
这些优点使得CPLA/FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言HDL的进步。
5.1.2FPGA基本结构
FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。
这3种可编程电路是:
可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。
可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
1.CLB是FPGA的主要组成部分。
它主要由逻辑函数发生器、触发器、数据选择器等电路组成。
CLB中3个逻辑函数发生器分别是G、F和H,相应的输出是G’ 、F’和H’。
G有4个输入变量G1、G2、G3和G4;F也有4个输入变量F1、F2、F3和F4。
这两个函数发生器是完全独立的,均可以实现4输入变量的任意组合逻辑函数。
逻辑函数发生器H有3个输入信号;前两个是函数发生器的输出G’和F’,而另一个输入信号是来自信号变换电路的输出H1。
这个函数发生器能实现3输入变量的各种组合函数。
这3个函数发生器结合起来,可实现多达9变量的逻辑函数。
CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。
这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。
CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。
F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。
另一方面,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。
2.输入/输出模块IOB。
IOB提供了器件引脚和内部逻辑阵列之间的连接。
它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。
每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。
当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。
缓冲器的输出分成两路:
一路可以直接送到MUX,另一路经延 时几纳秒(或者不延时)送到输入通路D触发器,再送到数据选择器。
通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。
当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:
一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。
IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通Vcc、地线或者不接通,用以改善输出波形和负载能力。
3.可编程互连资源IR。
可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。
5.2原理框图
FPGA的多功能数字钟的设计方案是设计一个具有计时、报时和显示这三部分的主要功能。
系统原理框图如图4-1所示。
其中计时功能是整个多功能数字钟的核心部分;报时——顾名思义,也就是在时钟到达整点时的鸣叫功能;显示起到了一个译码功能,使得程序在实验箱上下载时我们能清晰、明了的整个运行过程。
这三部分相结合,就基本完成了这样的一个多功能数字钟。
图4-1数字钟原理框图
原理框图功能如下:
①首先输入电源然后进入FPGA芯片,来实现最基本的数字钟计时电路,其计数输出送7段译码电路,由数码管显示。
②PPGA芯片工作使得基准频率分频器可分频出标准的1hz频率信号,用于秒计数的时钟信号;分频出频率信号用于校时、校分的快速递增信号;分频出频率信号用于对于按动校时、校分按键的消除抖动。
③然后用按键控制电路模块是一个校时、校分、秒清零的模式控制模块,频率信号用于键的消除抖动。
而模块的输出则是一个边沿整齐的输出信号。
④控制电路模块是一个校时、校分、秒清零的模式控制模块,64Hz频率信号用于键KEY1、KEY2、KEY3的消除抖动。
而模块的输出则是一个边沿整齐的输出信号。
⑥闹时电路模块也需要音频信号以及来自分计数器和时计数器的输出信号
6调试
6.1调时程序调试
原始程序下载时,数字钟能正常显示,初始化值7:
59分55秒,当到8:
00时,蜂鸣器不响没有报时。
按键模块没有进位设计,调时位按键程序异常显示。
后加入:
if((hour_l>=4&&hour_h==2)||(hour_l==10))beginhour_l=0;
hour_h=hour_h+1;//按键进位
if(hour_h==3)hour_h=0;
程序后按键调时能正常显示,也可以进位。
6.2闹钟程序调试
原始程序8:
00没有报时,可能是蜂鸣器频率不对,于是写了个蜂鸣器响的小程序,试着探索蜂鸣器的鸣响频率,最后发现当将CLK进行8000hz分频是,蜂鸣器能响,将此小程序放在:
if(hour_h==0&&hour_l==8&&miniute_h==0&&miniute_l==0)
条件中能实现8:
00报时功能。
具体程序如下:
always@(posedgeclk)
begin
if(hour_h==0&&hour_l==8&&miniute_h==0&&miniute_l==0)//8:
00报时,闹钟模块
beginif(counter_clock==8000)
begincounter_clock=0;alarm_clock=~alarm_clock;end
elsecounter_clock=counter_clock+1;end
end
总结
此次实训基本实现了多功能数字钟的功能,该程序能让数字钟整点报时,也能够实现按键调时,和8:
00报时的闹钟功能。
不足之处在于闹钟时间无法自由设定,缺少闹钟设置按键,也无法复位清零。
最后是设计作品时的设计逻辑和设计思想,在选择不同的系统方案时要综合考虑,选择最优方案。
各个模块的实现也要考虑综合情况而制定出最符合实际情况的实现方案,方案间要进行对比、实践,最终确定。
在这次的课程设计中我不仅学习到有关程序编写以及设计方面的逻辑思维,对系统功能的实现也有了较为深入的了解,对各模块的调试等也学习到不少东西,总之,从这次设计中学到很多东西,也巩固了我的理论学习。
致谢
首先要感谢叶俊明老师,老师知识渊博,治学认真而严谨,感谢您从本文研究开始一路指导至本论文的完成,从论文题目的选定到论文写作的指导,经由您悉心的点拨,再经思考后的领悟,常常让我有“山重水复疑无路,柳暗花明又一村”的豁然开朗!
由衷感谢您在论文上倾注的大量心血,您宽厚待人的学者风范令我无比感动。
感谢授课老师叶俊明老师课上对我们的教导,你们丰富的授课内容拓宽了我的视野,让我能更顺利的完成这篇文章;感谢我的同学们,你们不仅让我感受到友情的力量,也让我感觉到了生活的愉悦,通过课堂讨论学到的思维方式使我受益终生。
最后,我要向我的同学表示深深的谢意。
你们的理解、支持、鼓励和鞭策催我更加上进,我竭尽全力的努力,更希望的是能够让你们高兴和满意。
你们的情感永远都是我上进的不竭的动力源泉。
这些时光会慢慢的沉淀下来,但无论何时,我想到这段岁月,都如同是看到一枚珍藏已久的夹在书里发黄的书签,永远都是那么璀璨、那么绚烂。
参考文献
【1】夏宇闻.Verilog数字系统设计教程[第二版].北京航空航天大学出版社,【2】康华光等.电子技术基础(数字部分)[第五版]高等教育出版社,
【3】罗朝霞等.CPLD/FPGA设计及应用.北京人民邮电出版社,
【4】亿特科技编著.CPLD/FPGA应用系统设计与产品开发.北京人民邮电出版社。
【5】付文红.花汉兵着.EDA技术与实验.机械工业出版社
【6】崔建明.电工电子EDA仿真技术。
北京高等教育出版社
【7】侯伯亨.VerilogHDL硬件描述语言与数字逻辑电路设计.西安电子科技大学出版
附录
moduletest(clk,led_out,seg_bit,led_test,alarm_clock,
key,key_1,key_2,key_3,key_4);
inputclk;
inputkey,key_1,key_2,key_3,key_4;
regclk_1hz;
regclk_1khz;
outputregled_test;
outputreg[6:
0]led_out;
outputreg[3:
0]seg_bit;
outputregalarm_clock;
reg[31:
0]counter_clock;
reg[20:
0]counter;
reg[30:
0]counter_1hz;
reg[7:
0]display_tab;
reg[7:
0]second_l,second_h;
reg[7:
0]miniute_l,miniute_h;
reg[7:
0]hour_l,hour_h;
reg[1:
0]state;
parameters0=2'd0,s1=2'd1,s2=2'd2,s3=2'd3;//定时8:
00
integerj,b;
initialbeginstate=0;counter=0;counter_1hz=0;miniute_l=9;miniute_h=5;
second_h=5;
second_l=5;
hour_h=0;
hour_l=7;end//初始化寄存器,初始时间为7点59分55秒
//分频模块
always@(posedgeclk)
begin
if(counter_1hz==20000000)
begin
counter_1hz=0;
clk_1hz<=~clk_1hz;end
elsecounter_1hz=counter_1hz+1;
if(counter>=10000)
begin
counter<=0;clk_1khz<=~clk_1khz;end
else
begincounter<=counter+1;
end//时钟分频模块
case(display_tab)//数码管显示表
0:
led_out=7'b