fpga数字钟课程设计报告.docx

上传人:b****8 文档编号:9529117 上传时间:2023-02-05 格式:DOCX 页数:19 大小:221.72KB
下载 相关 举报
fpga数字钟课程设计报告.docx_第1页
第1页 / 共19页
fpga数字钟课程设计报告.docx_第2页
第2页 / 共19页
fpga数字钟课程设计报告.docx_第3页
第3页 / 共19页
fpga数字钟课程设计报告.docx_第4页
第4页 / 共19页
fpga数字钟课程设计报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

fpga数字钟课程设计报告.docx

《fpga数字钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《fpga数字钟课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。

fpga数字钟课程设计报告.docx

fpga数字钟课程设计报告

课程设计报告

设计题目:

基于FPGA的数字钟设计

 

班级:

电子信息工程1301

学号:

20133638

姓名:

王一丁

指导教师:

李世平

设计时间:

2016年1月

 

摘要

EDA(ElectronicDesignAutomation)电子设计自动化,是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成软件方式设计得电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。

本次课程设计利用QuartusII为设计软件,VHDL为硬件描述语言,结合所学知识设计一个多功能时钟,具有显示年、月、日、时、分、秒显示,计时,整点报时,设定时间等功能。

利用硬件描述语言VHDL对设计系统的各个子模块进行逻辑描述,采用模块化的思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑综合优化、逻辑仿真、最终完成本次课程设计的任务。

 

关键词:

EDAVHDL语言数字钟

 

摘要

1课程设计目的

2课程设计内容及要求

2.1设计任务

2.2设计要求

3VHDL程序设计

3.1方案论证

3.2系统结构框图

3.3设计思路与方法

3.3.1状态控制模块

3.3.2时分秒模块

3.3.3年月日模块

3.3.4显示模块

3.3.5脉冲产生模块

3.3.6扬声器与闹钟模块

3.4RTL整体电路

4系统仿真与分析

5课程设计总结,包括.收获、体会和建议

6参考文献

1课程设计目的

(1)通过设计数字钟熟练掌握EDA软件(QUARTUSII)的使用方法,熟练进行设计、编译,为以后实际工程问题打下设计基础。

(2)熟悉VHDL硬件描述语言,提升分析、寻找和排除电子设计中常见故障的能力。

(3)通过课程设计,锻炼书写有理论根据的、实事求是的、文理通顺的课程设计报告。

2课程设计内容及要求

2.1设计任务

(1)6个数字显示器显示时分秒,setpin按键产生一个脉冲,显示切换为年月日。

(2)第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒,第八个脉冲到来后预置结束正常从左显示时分秒。

(3)up为高时,upclk有脉冲到达时,预置位加一,否则减一。

2.2设计要求

(1)在基本功能的基础上,闹钟在整点进行报时,产生一定时长的高电平。

(2)实现闹钟功能,可对闹钟时间进行预置,当达到预置时间时进行报时。

3VHDL程序设计

3.1方案论证

该数字钟可以实现:

计时功能、整点报时、闹钟和预置时间功能,因此时钟系统可分为5个模块:

功能选择模块、时分秒计数模块、年月日计数模块、显示模块、扬声器模块、脉冲产生模块。

(1)功能选择模块是有状态机构成的,功能为依次进行、设置时间、设置闹钟时间。

调整工作状态:

数字钟的初始状态显示时分秒,在setpin按键产生一个脉冲,显示切换为年月日。

设置时间:

第二个脉冲可预置年份,第三个脉冲可以预置月份,依次第四、五、六、七个脉冲到来时分别可以预置时期、时、分、秒。

第八个脉冲到来后,预置结束恢复初始状态,正常显示时分秒。

设置闹钟时间:

闹钟在setpin1按键产生第一个脉冲时设定闹钟的时,第二个脉冲设定分,第三个脉冲设定秒,第四个脉冲恢复显示时分秒。

(2)时分秒计数模块包括正常计时、闹钟、整点报时三个功能。

正常计时功能通过软件编写,60进制的秒计数器,60进制的分计数器,24进制的时计数器。

时分秒的计数器具有清0、置数、进位和计数功能。

其中reset为清0信号,当reset为0时,时分秒的计数器清0。

当set产生第四个脉冲后,连续产生的set信号使分秒计数器依次进行置数。

以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。

当set产生第八个脉冲时,数字钟恢复时分秒的显示。

闹钟功能是在正常计数功能上拓展,分为闹钟时间预置和闹钟响应两个部分。

闹钟时间预置功能:

当set1连续产生脉冲时,依次对闹钟的时分秒位进行预置。

以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。

当set1产生第四个脉冲时,数字钟恢复时分秒的显示。

与此同时在程序中增添变量时计时功能可以持续运行。

闹钟响应功能:

通过预置后,储存的变量与计时器模块的时、分、秒进行比对,当时、分、秒相同时,模块产生一个一段时间的高电平,传输给闹钟响应模块。

整点报时功能:

当计数器中的分位等于59,秒位等于59时,模块产生一段高电平,输出给扬声器模块进行报时。

(3)年月日计数模块分为年月日计数功能,年月日预置数功能。

年月日计数功能:

以时位的进位脉冲为计时脉冲,闰年二月份为29天,普通年二月份为28天。

一月、三月、五月、七月、八月、十月、十二月为31天,四月、六月、九月、十一月为30天。

年月日预置数功能:

当set产生第一个脉冲后,依次进行年月日数器置数。

以upclk为时钟,通过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,否则减一。

(4)显示模块:

以时分秒,年月日模块的输出、状态标志为输入信号,通过状态控制模块产生的状态标志对显示模块进行控制,显示计时、预置时的不同状态。

(5)扬声器模块:

输入信号为分位、秒位和状态信号,当计时时钟到达整点是输出高电平,其他时刻输出低电平。

(6)脉冲产生模块:

对输入的信号进行1000分频,产生周期为一秒的时钟信号,用于数字钟的时钟输入。

3.2系统结构框图

3.3设计思路与方法

3.3.1状态控制模块

状态控制模块实现对各个功能模块的整体设计,包括对时间与日期的显示与调整,闹钟的显示与调整等控制操作。

状态机的输入为setpin,setpin1,upclk。

状态机的状态有11种状态。

闹钟设置时位;

闹钟设置分位;

闹钟设置秒位;

时钟显示时分秒;

时钟显示年月日;

钟设置年;

时钟设置月;

时钟设置日;

时钟设置时;

时钟设置分;

设置秒

在产生如上状态的同时产生Tlock,flag状态标志,此标志用来进行时钟设置、闹钟设置与显示控制。

RTL电路图

实现代码如下:

process(upclk)

begin

if(upclk='1'andupclk'LAST_VALUE='0')then

state<=next_state;--实现状态变换

endif;

endprocess;

process(state,setpin,setpin1)

begin

next_state<=state;

case(state)is

whens0=>

Tlock<="0000";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s1;endif;

whens1=>

Tlock<="0001";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s2;endif;

whens2=>

Tlock<="0010";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s3;endif;

whens3=>

Tlock<="0011";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s4;endif;

whens4=>

Tlock<="0100";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s5;endif;

whens5=>

Tlock<="0101";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s6;endif;

whens6=>

Tlock<="0110";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s7;endif;

whens7=>

Tlock<="0111";

flag<='1';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s0;endif;

wheng0=>

Tlock<="1000";

flag<='0';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g1;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s0;endif;

wheng1=>

Tlock<="1001";

flag<='0';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=g2;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s0;endif;

wheng2=>

Tlock<="1010";

flag<='0';

if(setpin1='1'andsetpin1'LAST_VALUE='0')thennext_state<=s0;endif;

if(setpin='1'andsetpin'LAST_VALUE='0')thennext_state<=s0;endif;

whenothers=>

next_state<=s0;

endcase;

endprocess;

3.3.2时分秒模块

时分秒模块的输入为ce(使能端),clk0(系统输入时钟),clk1(upclk时钟),flag(标志位),lock(状态位),up(预置位增减控制),ov(进位位),op(闹钟与扬声器响应)。

时分秒模块的RTL电路图

时钟选择方式:

在初始状态和显示年月日的状态下,时分秒模块的时钟输入为系统时钟输入(clk0),在其他状态下,时分秒模块的时钟输入为(upclk时钟)用来进行置位。

实现代码入下:

process(lock,clk0,clk1)

begin

if(lock="0000"orlock="0001")then

clk<=clk0;--正常计数时选择clk0

elseclk<=clk1;--预置的时候clk1

endif;

endprocess;

时钟计时功能,在显示年月日,时分秒的状态时,时钟正常计数。

当数字钟处于置数状态时,年、月、日、时、分、秒时钟停止计时,各个位显示预置数。

在闹钟的预置功能实现的同时,通过增添变量,在设置闹钟的同时保证时钟的正常计数,在闹钟预置结束后,恢复到初始的时钟显示。

3.2.3年月日模块

年月日模块分为日期增加和日期减小两个部分,日期增加:

在显示时分秒,显示年月日和设置完秒位的状态下,如果是二月,通过函数判断是否为闰年,其他月份对大小月进行判断,大月为31天,小月为30天,代码如下:

if(clk'eventandclk='1')then

if(ce='1')then

if(lock="0000")or(lock="0001")or(lock="0100"andup='1')then

if(mon0="0010"andmon1="0000")then

Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);

elsif((mon0="0001"andmon0="0000")or(mon0="0011")or(mon0="0101")

or(mon0="0111")or(mon0="1000")or(mon0="0000"andmon1="0001")or(mon0="0010"andmon1="0001"))then

oddmonth_add_day(Td0,Td1,date0,date1);

elseevenmonth_add_day(Td0,Td1,date0,date1);

endif;

endif;

日期减少同理,代码如下:

if(lock="0100"andup='0')then

if(mon0="0010"andmon1="0000")then

Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);

elsif((mon0="0001"andmon1="0000")or(mon0="0011")or(mon0="0101")

or(mon0="0111")or(mon0="1000")or(mon0="0000"andmon1="0001")

or(mon0="0010"andmon1="0001"))then

oddmonth_sub_day(Td0,Td1,date0,date1);

elseevenmonth_sub_day(Td0,Td1,date0,date1);

ENDIF;

endif;

endif;

endif;

当以日位的进位为输入,当存在输入脉冲时,通过函数对月份进行加减,代码如下:

begin

if(clk'eventandclk='1')then

if(ce='1')then

if(lock="0000")or(lock="0001")or(lock="0011"andup='1')then

add_month(Tm0,Tm1,mon0,mon1);

endif;

if(lock="0011"andup='0')then

sub_month(Tm0,Tm1,mon0,mon1);

endif;

if(lock="0000")or(lock="0001")then

if(mon0="0010"andmon1="0001")then

sub_year(Ty0,Ty1,year0,year1);

endif;

endif;

if(lock="0010"andup='1')then

add_year(Ty0,Ty1,year0,year1);

endif;

if(lock="0010"andup='0')then

sub_year(Ty0,Ty1,year0,year1);

endif;

endif;

endif;

3.2.4显示模块

显示模块的输入为年、月、日、时、分、秒、lock(状态标志),通过if语句,状态机一共提供11钟状态。

在不同状态下,给显示模块的年月日时分秒不同的输入,从而得到要求的显示。

显示电路的RTL电路

代码如下:

process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1)

begin

if(lock="0000")then

a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1;

endif;

if(lock="0001")then

a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1;

endif;

if(lock="0101")or(lock="1000")then

a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=hour0;c1<=hour1;

endif;

if(lock="0110")or(lock="1001")then

a0<="1111";a1<="1111";b0<=min0;b1<=min1;c0<="1111";c1<="1111";

endif;

if(lock="0111")or(lock="1010")then

a0<=sec0;a1<=sec1;b0<="1111";b1<="1111";c0<="1111";c1<="1111";

endif;

if(lock="0010")then

a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=year0;c1<=year1;

endif;

if(lock="0011")then

a0<="1111";a1<="1111";b0<=mon0;b1<=mon1;c0<="1111";c1<="1111";

endif;

if(lock="0100")then

a0<=date0;a1<=date1;b0<="1111";b1<="1111";c0<="1111";c1<="1111";

endif;

endprocess;

endled_disp_arc;

3.2.5脉冲发生模块(分频电路)

脉冲发生电路将提供的1000hz频率分频成1hz(供系统时钟)。

f1000为1000hz输入,second_wave为分频输出。

分频器的RTL电路

代码如下:

process(f1000,cnt)

begin

if(f1000'eventandf1000='1')then

if(cnt="00000011")then

cnt<="000000000";second_wave<=notsecond_wave;

elsecnt<=cnt+'1';

endif;

endif;

endprocess;

endsecond_wave_arc;

3.2.6扬声器模块

模块的输入为clk(系统时钟),op(响应信号),vcc(闹钟使能端),ala(高电平输出)。

当vcc为高时,且当op有响应信号输入(高),闹钟产生一定时长的高电平。

闹钟的RTL电路

代码如下:

signaltemp1:

std_logic_vector(3downto0);

begin

process(op,vcc,clk)

begin

ifclk'eventandclk='1'then

if(vcc='1')then

if(temp1="1111")then

ala<=notala;

else

temp1<=temp1+'1';

ala<='1';

endif;

endif;

endif;

endprocess;

endalarm_arc;

3.3整体RTL电路

4系统仿真与分析

4.1对基本要求的仿真

初态设置:

setpin1=0;up=0;setpin置连续8个脉冲,f1000为频率为1000hz的方波。

分析:

在setpin第一次脉冲到来时,显示年月日,因为数字钟是初始状态所以年月日均为0。

Setpin。

第二次脉冲到来时对时进行预置数,因为up=0,所以设置时位,时位在不断地减小,在后面各位预置的过程中,每一位的预置过程都是减小。

第三次脉冲来到是对分位进行预置,第四次脉冲到来时对秒位进行预置。

第四次脉冲到来时对年进行预置,第五次脉冲到来时对月进行预置,第六次脉冲到来时对日进行预置。

第七次脉冲到来时,数字钟显示时分秒,从仿真结果可以看出来,此时时钟是从预置的时间开始计时的,第八次脉冲到来时,此时时钟显示的是年月日,此时显示的年月日为预置的年月日。

从上述分析可以看出,经过仿真的程序基本达到数字钟的基本要求,系统可靠。

4.2对闹钟状态转换的仿真

初始设置:

初态设置:

setpin1设计一个脉冲;up=0;setpin置连续2个脉冲,f1000为频率为1000hz的方波。

当第一个setpin脉冲到来时,显示年月日,第二个setpin脉冲来临时时钟对年进行预置,此后setpin1的第一个脉冲到来,时钟的状态转为对闹钟时间的设置,达到实验要求。

4.3对闹钟功能的仿真

初始设置:

初态设置:

setpin1设计三个脉冲;up=0;f1000为频率为1000hz的方波。

数字钟的原状态显示时分秒,由于未进行初始化,所以时分秒从0开始计时,当setpin1第一个脉冲到来时,数字钟对闹钟的时刻的时位进行预置,当setpin1第二个脉冲到来时,数字钟对闹钟的时刻的分位进行预置,当setpin1第三个脉冲到来时,数字钟对闹钟的时刻的秒位进行预置,当第四个脉冲到来是恢复显示时分秒,此时的时分秒已经计数到51秒,符合预期,在设置闹钟的同时,时钟依旧计数,达到要求。

同时从初始时刻,闹钟的扬声器产生一定时长高电平可以看出整点报时功能良好,达到设计要求。

5课程设计总结(收获、体会和建议)

本次VHDL设计的数字钟定义了三种类型的端口,分别是in、out、buffer。

In和out端口使用简单,buffer端口具有回读功能,因为buffer类型的端口不能连接

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1