基于VHDL的万年历设计EDA实验报告.docx
- 文档编号:28492205
- 上传时间:2023-07-15
- 格式:DOCX
- 页数:37
- 大小:974.69KB
基于VHDL的万年历设计EDA实验报告.docx
《基于VHDL的万年历设计EDA实验报告.docx》由会员分享,可在线阅读,更多相关《基于VHDL的万年历设计EDA实验报告.docx(37页珍藏版)》请在冰豆网上搜索。
基于VHDL的万年历设计EDA实验报告
《EDA技术实用教程》
基于VHDL的万年历设计
(EDA实验报告)
学校:
苏州大学
院部:
电子信息学院
年级:
2020级
专业:
通信工程
******
2021年12月28日
前言
本设计为实现一个多功能的万年历,具有年、月、日、时、分、秒计时并显示的功能,顾名思义,其满量程计时为一万年;具有校对功能,能够对初始的时刻进行人为的设定。
本设计采纳EDA技术,以硬件描述语言VHDL为系统逻辑描述手腕设计具有万年历功能的硬件电路,在QuartusII软件设计环境下,采纳自顶向下的设计思路,别离对各个基础模块进行创建,通过各个基础模块的组合和连接来构建上层原理图,完成基于VHDL万年历设计。
系统目标芯片采纳EP1K30TC144-3,由时钟模块、操纵模块、计时模块、数据译码模块、显示模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,将硬件编写程序下载到实验箱上,选择模式3进行功能验证。
本系统能够完成年、月、日和时、分、秒的别离显示,由按键输入进行万年历的校时功能。
1实验概述4
EDA技术4
QuartusII的利用4
模块化设计4
分析、解决问题4
2实验内容与要求5
实验内容5
实验说明5
实验要求6
3实验原理7
设计思想7
设计原理图8
工作工程9
4实验结果10
程序与仿真10
4.1.1秒和分模块10
4.1.2小时模块11
4.1.3日(天)模块12
4.1.4月份模块15
4.1.5年模块17
4.1.6校时模块19
4.1.7显示模式切换模块21
顶层设计与仿真23
下载与验证25
4.电路结构选择25
4.3.2端口配置26
4.3.3实际电路验证29
5实验小结30
参考文献31
1、实验概述
EDA技术
EDA(ElectronicDesignAutomation),即电子设计自动化,是指利用运算机完成电子系统的设计。
它的要紧特点及核心是“自顶向下”的设计方式,这种设计方式第一从系统设计入手,在顶层进行功能方框图的划分和结构设计。
在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。
然后用综合优化工具生成具体门电路的网表。
由于设计的要紧仿真和调试进程是在高层次上完成的,这不仅有利于初期发觉结构设计上的错误,幸免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
QuartusII的利用
通过实验,熟悉并把握QuartusII软件的利用,熟悉该软件工具的环境。
除学习利用VHDL语言编写程序实现硬件电路之外,还要熟练的利用原理图输入的方式进行硬件设计,具体是对每一个模块形成一个功能元件,通过元件的连接来实现系统的功能,而不是通过VHDL语言的元件例化程序来完成,不仅提高了效率,而且思想原理也加倍的清楚。
模块化设计
把握年、月、日、时、分、秒和操纵部份的各功能模块程序设计的原理,进而明白得万年历的设计原理,学习并明白得模块化设计的方式与思想。
用VHDL语言编写各模块程序,进一步了解和把握各个程序语言,明白编程中的注意事项,提高编程的熟练程度。
分析、解决问题
通过本实验设计,理论联系实际,巩固所学理论知识,而且提高自己通过所学理论分析、解决实际问题的能力。
进一步加深对VHDL设计的了解与熟悉,体会EDA的庞大作用,了解进行硬件系统设计的整个流程,对生活工作中的电气设备有了更深一层次的了解,对电气工程专业有了更多爱好。
二、实验内容与要求
实验内容
设计具有如下功能的万年历:
1)能进行正常的年、月、日和时、分、秒的日期和时刻计时功能,按键KEY1用来进行模式切换,当KEY1=1时,显示年、月、日;当KEY1=0时,显示时、分、秒。
2)能利用实验系统上的按键实现年、月、日和时、分、秒的校对功能。
3)用层次化设计方式设计该电路,编写各个功能模块的程序。
4)仿真报时功能,通过观看有关波形确认电路设计是不是正确。
5)完成电路设计后,用实验系统下载验证设计的正确性。
实验说明
万年历的设计思路与多功能时钟的设计思路相似。
多功能时钟的各功能模块及彼此之间的连接如以下图1所示
图1多功能时钟系统原理框图
年、月、日和时、分、秒的显示格式如图2所示。
年、月、日同时显示,时、分、秒同时显示,通过显示模式切换来别离显示。
年/时月/分日/秒
图2万年历显示格式
实验报告要求
1)分析系统的工作原理。
2)画出顶层原理图,写出顶层文件源程序。
3)写出各功能模块的源程序。
4)仿真各功能模块,画出仿真波形。
5)书写实验报告应结构合理,层次分明。
3、实验原理
设计思想
依照模块化的设计思想,要实现万年历的基础功能,必然要包括年、月、日和时、分、秒的功能模块,其中秒和分能够用六十进制计数器来实现,时用二十四进制计数器实现,月用十二进制计数器来实现,年的低两位和高两位都是一百进制计数器,比较特殊的是天的计数器,因为它有四种情形,大月三十一天,小月三十天,平年二月二十八天,闰年二月有二十九天,因此年和月的模块对天的计数都有阻碍,需要从年和月的输出端引出操纵信号来操纵天的计数。
同时每一个计数器都有显示输出端和进位输出端,同时低级别(如秒)的进位输出要给较高级别(如分)的时钟输入端,以此类推,采纳串行工作方式进行连接。
从而完成了基础的计时和显示的功能。
再依照由基础功能到增强功能的设计思路,要实现校时功能,要在之前电路的基础之上增加一个校时操纵模块,增加两个按键来实现操纵,按键1来选择校对哪个模块,按键2选择校对到何值——检测到按键2的一个上升沿,对应的计数器加1。
除此之外还需要有显示模式的切换的功能,需要增加一个模式切换的操纵模块,通过增加一个按键3来实现操纵,是显示年月日仍是时分秒。
实验原理图
万年历时分秒部份的原理图如以下图所示,年月日部份与之同理,通过操纵能够进行切换。
图3万年历实验原理图
图4万年历实验结构框图
图5万年历实验结构局部图
原理图说明:
如图4、5所示,K1键是选择万年历工作的模式,K2键提供上升沿(时钟功能)来使各计数模块加一,从而实现校时的功能。
LED灯起指示作用。
模式0:
正常计时显示--K1不按,LED1到LED5都不亮
模式1:
调整分增加--K1按下一次,LED1亮其余四个不亮
模式2:
调整时增加--K1按下两次,LED2亮其余四个不亮
模式3:
调整日增加--K1按下三次,LED3亮其余四个不亮
模式4:
调整月增加--K1按下四次,LED4亮其余四个不亮
模式5:
调全年增加--K1按下五次,LED5亮其余四个不亮
CLK是外部1Hz输入时钟,作为秒的时钟输入,驱动整个万年历工作运行。
K3键是显示模式的选择,显示时分秒时,LEDSHUCHUMOSHI指示灯亮,显示年月日时,LEDSHUCHUMOSHI指示灯灭。
工作进程
当1Hz时钟信号从CLK输入端输入时,K1,K2,K3都没有按下时,系统从零(闰年)开始处于正常的计时模式,显示时分秒部份,LEDSHUCHUMOSHI指示灯亮。
低位计满归零而且向高位进1,若是月份是二月,那么天计满29就向月进1。
若是按下按键3,LEDSHUCHUMOSHI指示灯不亮,显示年月日部份。
若是现在按一下按键1,那么万年历停止计时,工作于模式1,再通过按键2对分进行校时,通过一样的方式能够对时、日、月、年进行校时。
当校时完毕,需要万年历从头计时工作时,通过按下键1使LED1到LED5都不亮时,系统工作与正常计时模式。
4、实验结果
程序与仿真
4.秒与分模块
秒与分模块为六十进制的计数器
源程序:
LIBRARYIEEE;
USECNT60IS
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进制计数器仿真图
如上图所示当Q一、Q2计满60时,Q一、Q2都归零同时有一个进位输出脉冲,完成了六十进制计数器的功能,设计正确。
4.小时模块
时模块为24进制计数器。
源程序:
LIBRARYIEEE;
USECNT24IS
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进制计数器仿真图
如上图所示当Q一、Q2计满24时,Q一、Q2都归零同时有一个进位输出脉冲,完成了六十进制计数器的功能,设计正确。
4.1.3日(天)模块
日模块有四种情形,大月为31进制计数器,小月为30进制计数器,平年二月为28进制计数器,闰年二月为29进制计数器,需要有一个二位判定输入信号来进行进制数的选择。
源程序:
LIBRARYIEEE;
USEDAYIS
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时天模块仿真图
如图8、9、10、11所示,仿真结果与设计要求一致,日模块的设计正确
4.月模块
月模块为12进制计数器,同时其需要为天提供判定信号输出,其与天的判定输入信号相一致。
由于二月的判定信号输出要受到平年和闰年的阻碍,平年时判定信号是10,闰年时判定信号为11,因此它要有接收来之年模块的判定平年闰年的输出信号(run=0时表平年,run=1时表闰年)。
源程序:
LIBRARYIEEE;
USEMONTHIS
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=2andcq4=1THENcq3<="0001";cq4<="0000";cout<='1';ELSEcout<='0';
ENDIF;ENDIF;--十二进制计数器
cq5<=cq4&cq3;--逻辑位相连接
CASEcq5IS
WHEN"00000001"=>pan<="00";--一月
WHEN"00000010"=>ifrun='1'thenpan<="11";elsepan<="10";endif;--—二月
WHEN"00000011"=>pan<="00";--三月
WHEN"00000100"=>pan<="01";--四月
WHEN"00000101"=>pan<="00";--五月
WHEN"00000110"=>pan<="01";--六月
WHEN"00000111"=>pan<="00";--七月
WHEN"00001000"=>pan<="00";--八月
WHEN"00001001"=>pan<="01";--七月
WHEN"00001010"=>pan<="00";--十月
WHEN"00001011"=>pan<="01";--十一月
WHEN"00001100"=>pan<="00";--十二月
WHENothers=>NULL;
ENDCASE;
cq1<=cq3;
cq2<=cq4;
ENDPROCESS;
END;
仿真结果:
图12平年(run=0)时月模块仿真图
图13闰年(run=1)时月模块仿真图
如图12、13所示月模块为12进制计数器,而且一、3、五、7、八、10、12月(大月)判定信号为00,4、六、9平年(run=0)2月的判定输出信号为、11月(小月)判定信号为01,平年(run=0)2月的判定输出信号为10,闰年(run=1)2月的判定输出信号为11,与天模块的判定输入信号相一致,符合设计要求,模块的设计正确。
4.年模块
年的高两位和低两位都为一百进制计数器,功能大体相同,不同的是低两位模块有闰年判定输出信号,要传送给月份模块,计满四次就产生一个闰年输出信号,因为闰年数值是4的整倍数。
源程序:
LIBRARYIEEE;
USEYEARIS
PORT(CLK:
INSTD_LOGIC;
Y1,Y2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
RUN,COUT:
OUTSTD_LOGIC);
ENDYEAR;
ARCHITECTUREONEOFYEARIS
SIGNALQ1,Q2,Q3:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THENQ1<=Q1+1;
IFQ1=9THENQ1<=(OTHERS=>'0');
Q2<=Q2+1;
ENDIF;
IFQ2=9ANDQ1=9THEN
Q2<="0000";Q1<="0000";COUT<='1';
ELSECOUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THENQ3<=Q3+1;
IFQ3=3THENQ3<=(OTHERS=>'0');
RUN<='1';
ELSERUN<='0';
ENDIF;
ENDIF;
Y1<=Q1;Y2<=Q2;
ENDPROCESS;
END;
仿真结果:
图14低两位年模块仿真图
如图14所示,低两位年模块为100进制计数器当T二、T1表示的数为4的整数倍时,判定闰年输出信号就为高电平,与月模块的判定闰年输入信号相一致。
符合设计的要求,设计正确。
4.校时模块
如原理图的说明部份所述,校时模块进行工作模式的选择,输入端设有操纵按键K1,K2。
K1进行模式的选择,K2的功能犹如手动时钟脉冲,进行调时设置。
源程序:
LIBRARYIEEE;
USEJIAODUIIS
PORT(K1,K2:
INSTD_LOGIC;
MI,FI,SI,TI,YI:
INSTD_LOGIC;
FO,SO,TL,YO,NO:
OUTSTD_LOGIC;
L1,L2,L3,L4,L5:
OUTSTD_LOGIC);
END;
ARCHITECTUREBEHAVOFJIAODUIIS
SIGNALA:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(K1,K2)
BEGIN
IFK1'EVENTANDK1='1'THEN
A<=A+1;
IFA=5THEN
A<="0000";
ENDIF;
ENDIF;
CASEAIS
WHEN"0000"=>FO<=MI;SO<=FI;TL<=SI;YO<=TI;NO<=YI;--模式0正常及时
L1<='0';L2<='0';L3<='0';L4<='0';L5<='0';
WHEN"0001"=>FO<=K2;SO<='0';TL<='0';YO<='0';NO<='0';--选通分模块,调分
L1<='1';L2<='0';L3<='0';L4<='0';L5<='0';
WHEN"0010"=>FO<='0';SO<=K2;TL<='0';YO<='0';NO<='0';--选通时模块,调时
L1<='0';L2<='1';L3<='0';L4<='0';L5<='0';
WHEN"0011"=>FO<='0';SO<='0';TL<=K2;YO<='0';NO<='0';--选通日模块,调日
L1<='0';L2<='0';L3<='1';L4<='0';L5<='0';
WHEN"0100"=>FO<='0';SO<='0';TL<='0';YO<=K2;NO<='0';--选通月模块,调月
L1<='0';L2<='0';L3<='0';L4<='1';L5<='0';
WHEN"0101"=>FO<='0';SO<='0';TL<='0';YO<='0';NO<=K2;--选通年模块,调年
L1<='0';L2<='0';L3<='0';L4<='0';L5<='1';
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
仿真结果:
图15校时模块仿真图
图16校时模块仿真图
如图15、16,按键K1,K2能够完成万年历工作模式的选择与调时校对的功能,知足系统的设计要求,设计正确。
4.1.7显示模式切换模块
显示模式切换模块完成显示年月日和显示时分秒的彼此切换,设置一个按键K3对其进行操纵,通过检测按键的上升沿,对显示模式进行连番切换。
源程序:
LIBRARYIEEE;
USECONTROLIS
PORT(SL,SH,FL,FH,HL,HH,DL,DH,ML,MH,YL,YH,Y1L,Y1H:
INSTD_LOGIC_VECTOR(3DOWNTO0);
K1:
INSTD_LOGIC;
led:
OUTSTD_LOGIC;
Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCONTROL;
ARCHITECTUREONEOFCONTROLIS
SIGNALW:
STD_LOGIC_VECTO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 万年历 设计 EDA 实验 报告