闰年补偿功能的数字日历论文-毕业论文_第1页
闰年补偿功能的数字日历论文-毕业论文_第2页
闰年补偿功能的数字日历论文-毕业论文_第3页
闰年补偿功能的数字日历论文-毕业论文_第4页
闰年补偿功能的数字日历论文-毕业论文_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

等级:湖南工程学院等级:课程设计课程名称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、具备日历调整功能和节日提醒功能。要求采用分层次描述方式,且用图形输入和文本输入混合方式建立描述文件。二、设计要求:设计思路清晰,给出整体设计框图;用VHDL设计各单元电路,完成其功能仿真和编译并生成低层计数器;在QuartusⅡ中完成顶层设计并编译通过;在QuartusⅡ中完成设计下载并调试电路;写出设计报告;主要设计条件提供EDA设计环境和EDA软件QuartusⅡ;提供EDA实验箱和CPLD下载装置;说明书格式课程设计报告书封面;任务书;说明书目录;设计总体思路;单元电路设计;总电路设计;设计调试体会与总结;附录;参考文献。注意:每个人的课程设计报告说明书不得雷同!课程设计报告说明书要求用16开纸打印!进度安排第一周:星期一上午安排任务、讲课。星期一下午~星期五查资料、设计第二周:星期一~星期二设计输入和设计仿真〈四楼EDA室〉星期三低层编译和设计下载〈四楼EDA室〉星期四调试电路、写总结报告;星期五答辩参考文献《EDA技术实用教程》第四版 潘松主编《电子技术与EDA技术课程设计指导》郭照南主编 中南大学出版社《电子线路设计、实验、测试》谢自美主编华中理工出版社目录一、设计总体思路1.1设计内容……11.2设计要求……11.3设计思路……11.4设计框图……2二、单元电路设计及仿真2.1年计数器……22.2月计数器……42.3日计数器……62.4星期计数器…………………82.5提醒模块……92.6控制模块……102.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;ENTITYnianISPORT(clk,en :IN STD_LOGIC;cr:IN STD_LOGIC;co:outSTD_LOGIC;q1:OUT STD_LOGIC_VECTOR(3DOWNTO0);y10:OUT STD_LOGIC_VECTOR(3DOWNTO0)); ENDnian;ARCHITECTUREaOFnianISSIGNAL bcd1n :STD_LOGIC_VECTOR(3DOWNTO0);SIGNAL vcd10n :STD_LOGIC_VECTOR(3DOWNTO0);BEGINq1<=bcd1n;y10<=vcd10n;PROCESS(clk,cr)BEGIN IF(cr='0')THEN bcd1n<="0000";vcd10n<="0000";ELSIF(clk'EVENTANDclk='1')THENif(en='1') then IF(bcd1n=9andvcd10n=9)THENbcd1n<="0000";vcd10n<="0000";ELSIF(bcd1n=9)THENbcd1n<="0000";vcd10n<=vcd10n+1;ELSEbcd1n<=bcd1n+1; ENDIF;ENDIF;endif;ENDPROCESS;process(bcd1n,vcd10n)beginif((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;ENTITYyueISPORT(clk,run:INSTD_LOGIC;cr:IN STD_LOGIC;en:IN STD_LOGIC;a,b,co:outSTD_LOGIC;q1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);y10:OUTSTD_LOGIC_VECTOR(3DOWNTO0)); ENDyue;ARCHITECTUREaOFyueISSIGNAL bcd1n:STD_LOGIC_VECTOR(3DOWNTO0);SIGNAL vcd10n:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALvcd10nbcd1n:std_logic_vector(7downto0);BEGINq1<=bcd1n;y10<=vcd10n;PROCESS(clk,cr)BEGIN IF(cr='0')THEN bcd1n<="0001";vcd10n<="0000";ELSIF(clk'EVENTANDclk='1')THENif(en='1') then IF(bcd1n=2andvcd10n=1)THENbcd1n<="0001";vcd10n<="0000";ELSIF(bcd1n=9)THENbcd1n<="0000";vcd10n<=vcd10n+1;ELSEbcd1n<=bcd1n+1; ENDIF; ENDIF;endif;IF(bcd1n=2andvcd10n=1)THENco<='1';ELSEco<='0';ENDIF;vcd10nbcd1n<=vcd10n&bcd1n;casevcd10nbcd1niswhen"00000001"=>a<='0';b<='0';when"00000010"=>ifrun='1'thena<='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;ENTITYriISPORT(clk,s1,s2:INSTD_LOGIC;cr:IN STD_LOGIC;en:IN STD_LOGIC;co:outSTD_LOGIC;q1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);y10:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDri;ARCHITECTUREaOFriISSIGNALs1s2:STD_LOGIC_VECTOR(1DOWNTO0);SIGNAL bcd1n :STD_LOGIC_VECTOR(3DOWNTO0);SIGNAL vcd10n :STD_LOGIC_VECTOR(3DOWNTO0);BEGINq1<=bcd1n;y10<=vcd10n;PROCESS(clk,cr,s1,s2)BEGIN IF(cr='0')THEN bcd1n<="0001";vcd10n<="0000";ELSIF(clk'EVENTANDclk='1')THENIF(en='1') then IF(bcd1n=9)THENbcd1n<="0000";vcd10n<=vcd10n+1;ELSEbcd1n<=bcd1n+1; ENDIF; ENDIF;s1s2<=s1&s2;CASEs1s2ISWHEN"00"=>IFvcd10n=3ANDbcd1n=1THENbcd1n<="0001";vcd10n<="0000";co<='1';ELSEco<='0';ENDIF;WHEN"01"=>IFvcd10n=3ANDbcd1n=0THENbcd1n<="0001";vcd10n<="0000";co<='1';ELSEco<='0';ENDIF;WHEN"10"=>IFvcd10n=2ANDbcd1n=8THENbcd1n<="0001";vcd10n<="0000";co<='1';ELSEco<='0';ENDIF;WHEN"11"=>IFvcd10n=2ANDbcd1n=9THENbcd1n<="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;ENTITYxingqiISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDxingqi;ARCHITECTUREBEHAVOFxingqiISSIGNALCQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK,RST,EN)BEGINIF(RST='1')THENCQI<="0001";ELSIF(CLK'EVENTANDCLK='1')THENIF(EN='1')THENCQI<=CQI+1;IFCQI=6THENCQI<="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;entitytixingisport(cr:instd_logic;ri1,ri2,yue1,yue2:instd_logic_vector(3downto0);co:outstd_logic);endtixing;architectureaoftixingisbeginprocess(cr,ri1,ri2,yue1,yue2)beginIF(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;entitykongzhiisport(ri1,ri2,yue1,yue2:instd_logic_vector(3downto0);co:outstd_logic);endkongzhi;architectureaofkongzhiisbeginprocess(ri1,ri2,yue1,yue2)beginif(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_LEDISPORT(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_LEDISSIGNALCNT8:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALA:STD_LOGIC_VECTOR(3DOWNTO0);BEGINP1:PROCESS(CNT8)BEGINCASECNT8ISWHEN"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)BEGINIFCLK'EVENTANDCLK='1'THENCNT8<=CNT8+1;ENDIF;ENDPROCESSP2;P3:PROCESS(A)BEGINCASEAISWHEN"0000"=>SG<="0111111";WHEN"0001"=>SG<="0000110";WHEN"0010"=>SG<="1011011";WHEN"0011"=>SG<="1001111";WHEN"0100"=>SG<="1100110";WHEN"0101"=>SG<="1101101";WHEN"0110"=>SG<="1111101";WHEN"0111"=>SG<="0000111";WHEN"1000"=>SG<="1111111";WHEN"1001"=>SG<="1101111";WHEN"1010"=>SG<="1110111";WHEN"1011"=>SG<="1111100";WHEN"1100"=>SG<="0111001";WHEN"1101"=>SG<="1011110";WHEN"1110"=>SG<="1111001";WHEN"1111"=>SG<="1110001";WHENOTHERS=>NULL;ENDCASE;ENDPROCESSP3;END;三、总电路设计日历总体设计图四、设计调试总结与体会在拿到课题后,感觉这个容易,就是几个计数器,但是实际不简单,我太想当然了。端正态度,我一步一步出发,先做星期部分,因为这个在EDA机试时做过,所以比较顺手,只是当时没有做到跳到6后跳8这个功能;接着做天数部分,这里有些棘手,不能单独的做几个计数器,突然想到实验课的基于状态机的彩灯控制器设计与调试,利用四种不同状态分别计数大月,小月,二月不同的天数;然后是月份的模块,有了日子的模块基础,这一个模块就好做多了,这个模块不是一个简单的十二进制计数器,它需要有控制天数的输出端,所以用了case语句来实现;最后做了年模块设计,刚开始我只是简单的做了一个100进制的计数器,后来做总体

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论