fpga数字钟课程设计报告.docx
《fpga数字钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《fpga数字钟课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
![fpga数字钟课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-10/26/48115fb3-89c1-4660-89f1-42188db1c7df/48115fb3-89c1-4660-89f1-42188db1c7df1.gif)
fpga数字钟课程设计报告
fpga数字钟课程设计报告
课程设计报告
设计题目:
基于FPGA的数字钟设计
班级:
电子信息工程1301
学号:
20133638
姓名:
王一丁
指导教师:
李世平
设计时间:
2016年1月
关键词:
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