闰年补偿功能的数字日历论文学位论文.docx

上传人:b****6 文档编号:7974863 上传时间:2023-01-27 格式:DOCX 页数:20 大小:163.23KB
下载 相关 举报
闰年补偿功能的数字日历论文学位论文.docx_第1页
第1页 / 共20页
闰年补偿功能的数字日历论文学位论文.docx_第2页
第2页 / 共20页
闰年补偿功能的数字日历论文学位论文.docx_第3页
第3页 / 共20页
闰年补偿功能的数字日历论文学位论文.docx_第4页
第4页 / 共20页
闰年补偿功能的数字日历论文学位论文.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

闰年补偿功能的数字日历论文学位论文.docx

《闰年补偿功能的数字日历论文学位论文.docx》由会员分享,可在线阅读,更多相关《闰年补偿功能的数字日历论文学位论文.docx(20页珍藏版)》请在冰豆网上搜索。

闰年补偿功能的数字日历论文学位论文.docx

闰年补偿功能的数字日历论文学位论文

等级:

湖南工程学院

课程设计

课程名称EDA技术

课题名称基于FPGA的具有闰年补偿功能的

数字日历

专业

班级

学号

姓名

指导教师郭照南

2014年12月8日

D题

(注:

完成人员:

01班的24号、30号和34号;02班的28号和29号)

湖南工程学院

课程设计任务书

 

课程名称EDA技术

课题基于FPGA的具有闰年补偿功能的数字日历

专业班级电子科学与技术

学生姓名蒋玉

学号201201180134

指导老师郭照南

审批

任务书下达日期2014年12月8日星期一

设计完成日期2014年12月19日星期五

设计内容与设计要求

一.设计内容:

用FPGA为核心器件,用VHDL为设计手段设计制作一个具有大小月份自动调节和闰年补偿功能的数字日历,具体设计要求如下:

1、用7个数码管从左到右分别显示年(后两位)、月、日和星期;星期与日之间隔开一位。

2、年计数从00到99循环;月、日的计数显示均从1开始,并具备大小月份自动调节和闰年补偿功能,即日期的计数实现大月31天,小月30天,二月28天或29天(闰年)的自动调整(注意:

7、8月均为大月)。

3、对星期的计数显示从1到6再到日(日用8代替);注意星期应和实际日历相吻合。

4、具备日历调整功能和节日提醒功能。

要求采用分层次描述方式,且用图形输入和文本输入混合方式建立描述文件。

二、设计要求:

1、设计思路清晰,给出整体设计框图;

2、用VHDL设计各单元电路,完成其功能仿真和编译并生成低层计数器;

3、在QuartusⅡ中完成顶层设计并编译通过;

4、在QuartusⅡ中完成设计下载并调试电路;

5、写出设计报告;

主要设计条件

1、提供EDA设计环境和EDA软件QuartusⅡ;

2、提供EDA实验箱和CPLD下载装置;

说明书格式

1、课程设计报告书封面;

2、任务书;

3、说明书目录;

4、设计总体思路;

5、单元电路设计;

6、总电路设计;

7、设计调试体会与总结;

8、附录;

9、参考文献。

注意:

每个人的课程设计报告说明书不得雷同!

课程设计报告说明书要求用16开纸打印!

进度安排

第一周:

星期一上午安排任务、讲课。

星期一下午~星期五查资料、设计

第二周:

星期一~星期二设计输入和设计仿真〈四楼EDA室〉

星期三低层编译和设计下载〈四楼EDA室〉

星期四调试电路、写总结报告;

星期五答辩

参考文献

《EDA技术实用教程》第四版潘松主编

《电子技术与EDA技术课程设计指导》郭照南主编中南大学出版社

《电子线路设计、实验、测试》谢自美主编 华中理工出版社

目录

一、设计总体思路

1.1设计内容……………………………………1

1.2设计要求……………………………………1

1.3设计思路……………………………………1

1.4设计框图……………………………………2

二、单元电路设计及仿真

2.1年计数器……………………………………2

2.2月计数器……………………………………4

2.3日计数器……………………………………6

2.4星期计数器…………………………………8

2.5提醒模块……………………………………9

2.6控制模块……………………………………10

2.7显示模块……………………………………11

三、总电路设计………………………………..13

四、设计调试总结与体会……………………..13

五、附录………………………………………..15

六、参考文献…………………………………..15

附:

课程设计评分表

一、设计总体思路

1.1设计内容

用FPGA为核心器件,用VHDL为设计手段设计制作一个具有大小月份自动调节和闰年补偿功能的数字日历,具体设计要求如下:

1、用7个数码管从左到右分别显示年(后两位)、月、日和星期;星期与日之间隔开一位。

2、年计数从00到99循环;月、日的计数显示均从1开始,并具备大小月份自动调节和闰年补偿功能,即日期的计数实现大月31天,小月30天,二月28天或29天(闰年)的自动调整(注意:

7、8月均为大月)。

3、对星期的计数显示从1到6再到日(日用8代替);注意星期应和实际日历相吻合。

4、具备日历调整功能和节日提醒功能。

要求采用分层次描述方式,且用图形输入和文本输入混合方式建立描述文件。

1.2设计要求

1、设计思路清晰,给出整体设计框图;

用VHDL设计各单元电路,完成其功能仿真和编译并生成低层计数器;

2、在QuartusⅡ中完成顶层设计并编译通过;

3、在QuartusⅡ中完成设计下载并调试电路;

4、写出设计报告;

1.3设计思路

用FPGA为核心器件,用VHDL为设计手段设计制作一个具有大小月份自动调节和闰年补偿功能的数字日历,日历有年、月、日、星期以及特殊节日提醒的功能,根据要求,用了一个一百进制的计数器来进行年的计数,中间有一个辅助进程,闰年时让进位端输出为一;设计了一个十二进制的计数器进行月的控制,其中用了case语句,来完成该年是不是闰年以及该月是大月或者小月的控制;利用一个七进制计数器来进行星期的计时;现在就完成了我们所需要的几个计数器。

设计了一个控制模块来控制是否进入下一年;然后设计了一个特殊节日提醒提醒功能,输出端接了一个LED灯,灯亮时表示提醒;最后设计动态扫描显示部分。

将这些计数器的组合,我们可以完成具有闰年补偿功能的万年历的设计,同时可以通过控制键对年、月、日进行调整。

1.4设计框图

二、单元电路设计及仿真

2.1年计数器的设计

对于年100进制的加法计数器的设计,有个位、十位的输出,用显示模块来显示,以及一个进位端,来驱动月模块二月的选择,其输入有清零端,使能端和时钟脉冲,当清零端为低电平0时此计数器被清零,而重新开始计数,当使能端为低电平时该计数器不工作处于暂停状态。

其程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYnianIS

PORT

(clk,en:

INSTD_LOGIC;cr:

INSTD_LOGIC;

co:

outSTD_LOGIC;

q1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

y10:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDnian;

ARCHITECTUREaOFnianIS

SIGNALbcd1n:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALvcd10n:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

q1<=bcd1n;y10<=vcd10n;

PROCESS(clk,cr)

BEGIN

IF(cr='0')THEN

bcd1n<="0000";vcd10n<="0000";

ELSIF(clk'EVENTANDclk='1')THEN

if(en='1')then

IF(bcd1n=9andvcd10n=9)THEN

bcd1n<="0000";vcd10n<="0000";

ELSIF(bcd1n=9)THEN

bcd1n<="0000";vcd10n<=vcd10n+1;ELSE

bcd1n<=bcd1n+1;ENDIF;ENDIF;endif;

ENDPROCESS;

process(bcd1n,vcd10n)

begin

if((bcd1n=0andvcd10n=0)or(bcd1n=4andvcd10n=0)or(bcd1n=8andvcd10n=0)or(bcd1n=2andvcd10n=1)or(bcd1n=6andvcd10n=1)or(bcd1n=0andvcd10n=2)or(bcd1n=4andvcd10n=2)or(bcd1n=8andvcd10n=2)or(bcd1n=2andvcd10n=3)or(bcd1n=6andvcd10n=3)or(bcd1n=0andvcd10n=4)or(bcd1n=4andvcd10n=4)or(bcd1n=8andvcd10n=4)or(bcd1n=2andvcd10n=5)or(bcd1n=6andvcd10n=5)or(bcd1n=0andvcd10n=6)or(bcd1n=4andvcd10n=6)or(bcd1n=8andvcd10n=6)or(bcd1n=2andvcd10n=7)or(bcd1n=6andvcd10n=7)or(bcd1n=0andvcd10n=8)or(bcd1n=4andvcd10n=8)or(bcd1n=8andvcd10n=8)or(bcd1n=2andvcd10n=9)or(bcd1n=6andvcd10n=9))thenco<='1';elseco<='0';

endif;

endprocess;enda;

其仿真波形如下:

2.2月计数器

对于月十二进制的加法计数器的设计,有个位、十位的输出用显示模块来显示,a,b的输出,来控制日计数器是31或30或28或29天。

其输入有清零端,使能端,run控制端和时钟脉冲,当清零端为低电平0时此计数器被清零,当使能端为低电平时该计数器不工作处于暂停状态。

run为1并且计数器记为2时,ab就输出11,run为0并且计数器记为2时,ab就输出10,来控制日计数器二月的输出。

其程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYyueIS

PORT(clk,run:

INSTD_LOGIC;

cr:

INSTD_LOGIC;

en:

INSTD_LOGIC;

a,b,co:

outSTD_LOGIC;

q1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

y10:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDyue;

ARCHITECTUREaOFyueIS

SIGNALbcd1n:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALvcd10n:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALvcd10nbcd1n:

std_logic_vector(7downto0);

BEGIN

q1<=bcd1n;

y10<=vcd10n;

PROCESS(clk,cr)

BEGIN

IF(cr='0')THEN

bcd1n<="0001";vcd10n<="0000";

ELSIF(clk'EVENTANDclk='1')THEN

if(en='1')then

IF(bcd1n=2andvcd10n=1)THEN

bcd1n<="0001";vcd10n<="0000";

ELSIF(bcd1n=9)THEN

bcd1n<="0000";vcd10n<=vcd10n+1;

ELSE

bcd1n<=bcd1n+1;

ENDIF;

ENDIF;

endif;

IF(bcd1n=2andvcd10n=1)THENco<='1';

ELSEco<='0';

ENDIF;

vcd10nbcd1n<=vcd10n&bcd1n;

casevcd10nbcd1nis

when"00000001"=>a<='0';b<='0';

when"00000010"=>ifrun='1'then

a<='1';b<='1';elsea<='1';b<='0';

endif;

when"00000011"=>a<='0';b<='0';

when"00000100"=>a<='0';b<='1';

when"00000101"=>a<='0';b<='0';

when"00000110"=>a<='0';b<='1';

when"00000111"=>a<='0';b<='0';

when"00001000"=>a<='0';b<='0';

when"00001001"=>a<='0';b<='1';

when"00010000"=>a<='0';b<='0';

when"00010001"=>a<='0';b<='1';

when"00010010"=>a<='0';b<='0';

whenothers=>null;

ENDCASE;

ENDPROCESS;

enda;

 

仿真波形如下:

2.3日计数器

对于日计数器的设计,有个位、十位的输出用显示模块来显示,有一个进位端,来驱动月计算器,给月计数器时钟脉冲。

其输入有清零端,使能端,s1,s2控制端和时钟脉冲,当清零端为低电平0时此计数器被清零,当使能端为低电平时该计数器不工作处于暂停状态。

用了一个case语句,s1s2分别输出为00、01、10、11时,日计数器就分别计数31、30、28、29天。

程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYriIS

PORT(clk,s1,s2:

INSTD_LOGIC;

cr:

INSTD_LOGIC;

en:

INSTD_LOGIC;

co:

outSTD_LOGIC;

q1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

y10:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDri;

ARCHITECTUREaOFriIS

SIGNALs1s2:

STD_LOGIC_VECTOR(1DOWNTO0);

SIGNALbcd1n:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALvcd10n:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

q1<=bcd1n;

y10<=vcd10n;

PROCESS(clk,cr,s1,s2)

BEGIN

IF(cr='0')THEN

bcd1n<="0001";vcd10n<="0000";

ELSIF(clk'EVENTANDclk='1')THEN

IF(en='1')then

IF(bcd1n=9)THEN

bcd1n<="0000";vcd10n<=vcd10n+1;

ELSE

bcd1n<=bcd1n+1;

ENDIF;

ENDIF;

s1s2<=s1&s2;

CASEs1s2IS

WHEN"00"=>IFvcd10n=3ANDbcd1n=1THEN

bcd1n<="0001";vcd10n<="0000";co<='1';

ELSEco<='0';ENDIF;

WHEN"01"=>IFvcd10n=3ANDbcd1n=0THEN

bcd1n<="0001";vcd10n<="0000";co<='1';

ELSEco<='0';ENDIF;

WHEN"10"=>IFvcd10n=2ANDbcd1n=8THEN

bcd1n<="0001";vcd10n<="0000";co<='1';

ELSEco<='0';ENDIF;

WHEN"11"=>IFvcd10n=2ANDbcd1n=9THEN

bcd1n<="0001";vcd10n<="0000";co<='1';

ELSEco<='0';ENDIF;

ENDcase;

ENDIF;

ENDPROCESS;ENDa;

仿真波形如下:

 

2.4星期计数器

对于星期七进制计数器的设计,有一个输出端,用显示模块来显示。

其输入有清零端,使能端和时钟脉冲,当清零端为高电平1时此计数器被清零,当使能端为低电平时该计数器不工作处于暂停状态。

其中设计了当输出为6后让输出为8然后回到1重新计数。

其程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYxingqiIS

PORT(CLK,RST,EN:

INSTD_LOGIC;

CQ:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDxingqi;

ARCHITECTUREBEHAVOFxingqiIS

SIGNALCQI:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PROCESS(CLK,RST,EN)

BEGIN

IF(RST='1')THEN

CQI<="0001";ELSIF(CLK'EVENTANDCLK='1')THEN

IF(EN='1')THEN

CQI<=CQI+1;IFCQI=6THEN

CQI<="1000";ELSIFCQI>7THENCQI<="0001";ENDIF;ENDIF;ENDIF;

ENDPROCESS;

CQ<=CQI;ENDBEHAV;

仿真波形如下:

2.5提醒模块

设计这个模块是要用来特别节日提醒的,其输入端有一个异步置1端,其它四个输入端,当输入0501时,输出端会为0,此时输出端接一个LED灯,那么灯就会闪一下,表示节日提醒。

其程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytixingis

port(cr:

instd_logic;

ri1,ri2,yue1,yue2:

instd_logic_vector(3downto0);

co:

outstd_logic);

endtixing;

architectureaoftixingis

begin

process(cr,ri1,ri2,yue1,yue2)

begin

IF(cr='0')THEN

co<='1';

endif;

if

((yue2=0andyue1=1andri2=0andri1=1)or

(yue2=0andyue1=5andri2=0andri1=1)or

(yue2=0andyue1=6andri2=0andri1=1)or

(yue2=0andyue1=8andri2=0andri1=1)or

(yue2=1andyue1=0andri2=0andri1=1))

thenco<='0';

endif;

endprocess;

enda;

仿真波形如下:

2.6控制模块

设计控制这一部分是当月和日计数器分别输出12、31时,输出端输出为1,给年计数器一个时钟脉冲。

其程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitykongzhiis

port(

ri1,ri2,yue1,yue2:

instd_logic_vector(3downto0);

co:

outstd_logic);

endkongzhi;

architectureaofkongzhiis

begin

process(ri1,ri2,yue1,yue2)

begin

if(yue2=1andyue1=2andri2=3andri1=1)

thenco<='1';

elseco<='0';

endif;

endprocess;

enda;

仿真波形如下:

2.7显示模块

用来显示年、月、日、星期的。

程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSCAN_LEDIS

PORT(CLK:

INSTD_LOGIC;

d0,d1,d2,d3,d4,d5,d6,d7:

inSTD_LOGIC_VECTOR(3DOWNTO0);

SG:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

BT:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

END;

ARCHITECTUREoneOFSCAN_LEDIS

SIGNALCNT8:

STD_LOGIC_VECTOR(2DOWNTO0);

SIGNALA:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

P1:

PROCESS(CNT8)

BEGIN

CASECNT8IS

WHEN"000"=>BT<="00000001";A<=d0;

WHEN"001"=>BT<="00000010";A<=d1;

WHEN"010"=>BT<="00000100";A<=d2;

WHEN"011"=>BT<="00001000";A<=d3;

WHEN"100"=>BT<="00010000";A<=d4;

WHEN"101"=>BT<="00100000";A<=d5;

WHEN"110"=>BT<="01000000";A<=d6;

WHEN"111"=>BT<="10000000";A<=d7;

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESSP1;

P2:

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'

THENCNT8<=CNT8+1;

ENDIF;

ENDP

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

当前位置:首页 > 解决方案 > 学习计划

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

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