vhdl电子日历设计完整.docx
《vhdl电子日历设计完整.docx》由会员分享,可在线阅读,更多相关《vhdl电子日历设计完整.docx(34页珍藏版)》请在冰豆网上搜索。
![vhdl电子日历设计完整.docx](https://file1.bdocx.com/fileroot1/2022-10/28/1eebca8e-7557-49c8-9ba1-79b35c1d64b3/1eebca8e-7557-49c8-9ba1-79b35c1d64b31.gif)
vhdl电子日历设计完整
《EDA技术教程》
基于VHDL的万年历设计
(EDA实验报告)
学校:
郑州大学
院部:
物理工程学院
年级:
2010级
专业:
电子科学与技术
姓名:
张金灿
2013年01月20日
ONE:
本设计为实现一个多功能的万年历,具有年、月、日、时、分、秒计时并显示的功能,其满量程计时为一万年;具有校对功能,能够对初始的时间进行人为的设定。
设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计具有万年历功能的硬件电路,在QuartusII9.0软件设计环境下,采用自顶向下的设计思路,分别对各个基础模块进行创建,通过各个基础模块的组合和连接来构建上层原理图,完成基于VHDL万年历设计。
系统目标芯片采用EP2C35F484C8N,由CNT60模块、CNT24模块、DAY模块、MONTH模块、YEAR模块、TIAOSHI模块、CONTROL模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,将硬件编写程序下载到试验箱上,选择模式5进行功能验证。
本系统能够完成年、月、日和时、分、秒的分别显示,由按键输入进行万年历的校时功能。
TWO:
万年历的设计思路与多功能时钟的设计思路相似。
多功能时钟的各功能模块及相互之间的连接如下图1所示
图1
THREE:
年、月、日和时、分、秒的显示格式如图2所示。
年、月、日同时显示,时、分、秒同时显示,通过显示模式切换来分别显示。
年/(时)月/分日/秒
图2万年历显示格式
FOUR:
按照模块化的设计思想,要实现万年历的基础功能,必定要包含年、月、日和时、分、秒的功能模块,其中秒和分可以用六十进制计数器来实现,时用二十四进制计数器实现,月用十二进制计数器来实现,年的低两位和高两位都是一百进制计数器,比较特殊的是天的计数器,因为它有四种情况,大月三十一天,小月三十天,平年二月二十八天,闰年二月有二十九天,所以年和月的模块对天的计数都有影响,需要从年和月的输出端引出控制信号来控制天的计数。
同时每个计数器都有显示输出端和进位输出端,同时低级别(如秒)的进位输出要给较高级别(如分)的时钟输入端,以此类推,采用串行工作方式进行连接。
从而完成了基础的计时和显示的功能。
再按照由基础功能到增强功能的设计思路,要实现校时功能,要在之前电路的基础之上增加一个校时控制模块,增加两个按键来实现控制,按键1来选择校对哪一个模块,按键2选择校对到何值——检测到按键2的一个上升沿,对应的计数器加1。
除此之外还需要有显示模式的切换的功能,需要增加一个模式切换的控制模块,通过增加一个按键3来实现控制,是显示年月日还是时分秒。
实验原理图
万年历时分秒部分的原理图如下图所示,年月日部分与之同理,通过控制可以进行切换。
译码驱动
译码驱动
译码驱动
译码驱动
译码驱动
译码驱动
时十位
计数
时个位
计数
分十位
计数
分个位
计数
秒十位
计数
秒个位
计数
校时控制电路
校分控制电路
分频器电路
分频器电路
晶体振荡器电路
1HZ
图3万年历实验原理图
FIVE:
K1键是选择万年历工作的模式,K2键提供上升沿(时钟功能)来使各计数模块加一,从而实现校时的功能。
LED灯起指示作用。
共有五种选择模式(A,B,C,D,E,F):
A:
正常计时--K1不按
B:
调整分--K1按下一次
C:
调整时--K1按下两次
D:
调整日--K1按下三次
E:
调整月--K1按下四次
F:
调整年--K1按下五次
CLK是外部1Hz输入时钟,作为秒的时钟输入,驱动整个万年历工作运行。
K3键是显示模式的选择,显示时分秒时,LED指示灯亮,显示年月日时,LED指示灯灭。
SIX:
VHDL语言描写和原理图部分
1.秒与分模块为六十进制的计数器
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT60IS
PORT(CLK:
INSTD_LOGIC;
Q1,Q2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT60;
ARCHITECTUREONEOFCNT60IS
SIGNALQ11,Q22:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
Q11<=Q11+1;
IFQ11=9THENQ11<=(OTHERS=>'0');
Q22<=Q22+1;
ENDIF;
IFQ22=5ANDQ11=9THEN
Q22<="0000";Q11<="0000";COUT<='1';
ELSECOUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
Q1<=Q11;Q2<=Q22;
END;
仿真结果:
图660进制计数器仿真图
原理图:
2.小时模块
时模块为24进制计数器。
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT24IS
PORT(CLK:
INSTD_LOGIC;
Q1,Q2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT24;
ARCHITECTUREONEOFCNT24IS
SIGNALQ11,Q22:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
Q11<=Q11+1;
IFQ11=9THENQ11<=(OTHERS=>'0');
Q22<=Q22+1;
ENDIF;
IFQ22=2ANDQ11=3THEN
Q22<="0000";Q11<="0000";COUT<='1';
ELSECOUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
Q1<=Q11;Q2<=Q22;
END;
仿真结果:
图724进制计数器仿真图
原理图:
3.日模块
日模块有四种情况,大月为31进制计数器,小月为30进制计数器,平年二月为28进制计数器,闰年二月为29进制计数器,需要有一个二位判断输入信号来进行进制数的选择。
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDAYIS
PORT(PANDUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);--两位判断输入信号
CLK:
INSTD_LOGIC;
CQ1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CQ2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREONEOFDAYIS
SIGNALCQ3,CQ4:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALPAN:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
PROCESS(CLK,PANDUAN)
BEGIN
IFCLK'EVENTANDCLK='1'THEN--上升沿
CQ3<=CQ3+1;
IFCQ3=9THENCQ3<=(OTHERS=>'0');
CQ4<=CQ4+1;
ENDIF;
PAN<=PANDUAN;
CASEPANIS
WHEN"00"=>IFCQ3="0001"ANDCQ4="0011"--判断信号为00时为31进
THENCQ3<="0001";CQ4<="0000";COUT<='1';--制计数器
ELSECOUT<='0';ENDIF;
WHEN"01"=>IFCQ3="0000"ANDCQ4="0011"--判断信号为01时为30进
THENCQ3<="0001";CQ4<="0000";COUT<='1';--制计数器
ELSECOUT<='0';ENDIF;
WHEN"10"=>IFCQ3="1000"ANDCQ4="0010"--判断信号为10时为28进
THENCQ3<="0001";CQ4<="0000";COUT<='1';--制计数器
ELSECOUT<='0';ENDIF;
WHEN"11"=>IFCQ3="1001"ANDCQ4="0010"--判断信号为11时为29进
THENCQ3<="0001";CQ4<="0000";COUT<='1';--制计数器
ELSECOUT<='0';ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
CQ1<=CQ3;
CQ2<=CQ4;
ENDPROCESS;
END;
仿真结果:
图8判断信号为00时天模块仿真图
图9判断信号为01时天模块仿真图
图10判断信号为10时天模块仿真图
图11判断信号为11时天模块仿真图
原理图:
4.月模块
月模块为12进制计数器,同时其需要为天提供判断信号输出,其与天的判断输入信号相一致。
由于二月的判断信号输出要受到平年和闰年的影响,平年时判断信号是10,闰年时判断信号为11,所以它要有接收来之年模块的判断平年闰年的输出信号(run=0时表平年,run=1时表闰年)。
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYMONTHIS
port(clk:
INSTD_LOGIC;
run:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
pan:
OUTSTD_LOGIC_VECTOR(1DOWNTO0);
cq1,cq2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbehavOFMONTHIS
signalcq3,cq4:
STD_LOGIC_VECTOR(3DOWNTO0);
signalcq5:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IFclk'EVENTandclk='1'THEN
cq3<=cq3+1;
IFcq3=9THENcq4<=cq4+1;cq3<="0000";ENDIF;
IFcq3