万年历实训报告.docx
《万年历实训报告.docx》由会员分享,可在线阅读,更多相关《万年历实训报告.docx(14页珍藏版)》请在冰豆网上搜索。
万年历实训报告
《EDA技术及其应用》
实
训
报
告
班级电信一班
姓名xx
学号xx
指导教师xx
2012年05月21日
xxxx学院
10级机械电子工程系
1.1前言...................................................................................4
1.2课题....................................................................................4
1.3实验的目的及意义............................................................4
1.4实验的内容及要求............................................................4
1.5实验的地点........................................................................4
1.6实验的器材........................................................................4
1.7实验设计思想....................................................................4
1.8各模块的设计程序和元件介绍........................................5
1.9感想……………………………………………………….
1.1前言
随着电子技术的不断发展与进步,电子系统的设计方法发生了很大的变化,基于EDA技术的设计方法正成为电子系统设计的主流,EDA技术已成为许多高职高专院校电类专业学生必须掌握的一门重要技术。
此次基于EDA技术的万年历实训,加强了同学们对EDA工具QuartusII的使用方法、VHDL语言知识、FPGA开发技术的深入理解,通过万年历的功能实现和功能测试,详细介绍QuartusII的完整设计流程,在此基础上,进一步介绍面向复杂模块的使用方法。
其中包括年、月、日、时、分、秒以及调整、控制等各个模块的功能实现和仿真测试,进一揭示VHDL语言在语句应用和电路功能描述上的特点及其特殊用法,使我们在很短的时间内快速掌握了EDA这门重要技术。
1.2实验的课题:
万年历
1.3实验的目的及意义:
(1)掌握EDA技术及FPGA技术的开发流程。
(2)掌握系统设计的方法和层次化设计的方法。
(3)掌握QuartusII软件的使用方法。
(4)掌握VHDL语言的程序设计、编写、编译和错误修改。
(5)掌握熟悉EDA实验箱的各个模块
(6)掌握EDA试验箱与pc机的连接、下载和引脚绑定的全过程和方法,实现功能仿真。
1.4实验的内容及要求:
(1)实现年、月、日、时、分、秒的显示并具有闰年判断计数的功能
(2)在试验箱上通过按键实现年月日和时分秒的显示切换。
(3)利用试验箱和pc机进行功能测试并实现万年历的显示功能。
1.5实验的地点:
xxx学院EDA实验室
1.6实验的器材:
硬件:
计算机、EDA试验箱软件:
QuartusII软件
1.7实验设计思想:
将万年历分为各个模块分项处理,每个小模块实现一个小的功能,最后在万年历的顶层文件中将各个模块整好在一起,实现万年历的整体功能。
这是万年历实验设计的整体思想。
1.8其中组成模块有:
秒计时模块cnt60、分计时模块cnt60、时计时模块cnt24、日计时模块tian、月计时模块yue、年计时模块nian、调整模块tz、控制模块mux21,然后在顶层文件中连接个各个模块组成万年历的完整连接图,之后再pc机上进行编译,完成引脚绑定再下载到实验箱上,根据程序内容及引脚绑定通过按键控制和led灯的显示最终完成测试。
各模块设计:
1、秒分时、年月日、调整控制模块设计程序
(1)秒计时模块cnt60(六十进制计数器)程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityCNT60is
port(clk:
instd_logic;
CQ1,CQ2:
outstd_logic_vector(3downto0);
COUT:
OUTstd_logic);
endentityCNT60;
architectureartofCNT60is
signals1,s2:
std_logic_vector(3downto0);
begin
process(clk)
begin
IFclk'eventANDclk='1'thenS1<=S1+1;
IFS1=9THENS1<="0000";S2<=S2+1;ENDIF;
IFs2=5ANDS1=9thens1<="0000";s2<="0000";COUT<='1';
elseCOUT<='0';endif;endif;
CQ1<=S1;CQ2<=S2;
endprocess;
ENDart;
将程序用QuartusII软件编译之后生成的cnt60模块元件如下图所示:
(此模块实现六十进制计数,用它实现分和秒功能)
(2)分计时模块cnt60:
(六十进制计数器)
分计时模块和秒计时秒快一样,同样是用六十进制计数器cnt60,程序和生成元件同上所述。
(3)时计时模块cnt24(二十四进制计数器)程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityCNT24is
port(clk:
instd_logic;
CQ1,CQ2:
outstd_logic_vector(3downto0);
COUT:
OUTstd_logic);
endentityCNT24;
architectureartofCNT24is
signals1,s2:
std_logic_vector(3downto0);
begin
process(clk)
begin
IFclk'eventANDclk='1'thenS1<=S1+1;
IFS1=9THENS1<="0000";S2<=S2+1;ENDIF;
ifs2=2ANDS1=3thens1<="0000";s2<="0000";COUT<='1';
elseCOUT<='1';endif;endif;
CQ1<=S1;CQ2<=S2;
endprocess;
ENDart;
将程序用QuartusII软件编译之后生成的cnt24模块元件如下图所示:
(此模块实现二十四进制计数,用它实现小时功能)
(4)天计时模块tian程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytianis
port(clk:
instd_logic;
ab:
instd_logic_vector(1downto0);
CQ1,CQ2:
outstd_logic_vector(3downto0);
COUT:
OUTstd_logic);
endentitytian;
architectureartoftianis
signals1,s2:
std_logic_vector(3downto0);
begin
process(clk)
begin
IFclk'eventANDclk='1'thenS1<=S1+1;
IFS1=9THENS1<="0000";S2<=S2+1;ENDIF;
Endif;
CASEABIS
when"00"=>IFS2=2ANDS1=8THEN
S1<="0000";S2<="0000";COUT<='1';
ELSECOUT<='0';ENDIF;
when"01"=>IFS2=2ANDS1=9THEN
S1<="0000";S2<="0000";COUT<='1';
ELSECOUT<='0';ENDIF;
when"10"=>IFS2=3ANDS1=0THEN
S1<="0000";S2<="0000";COUT<='1';
ELSECOUT<='0';ENDIF;
when"11"=>IFS2=3ANDS1=1THEN
S1<="0000";S2<="0000";COUT<='1';
ELSECOUT<='0';ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
CQ1<=S1;CQ2<=S2;
endprocess;
ENDart;
将程序用QuartusII软件编译之后生成的tian模块元件如下图所示:
(此模块实现的是天的计数功能,其中ab用来控制计数的进制,分为四种情况:
28天、29天、30天和31天,其具体信号由月模块判断输出)
(5)月计时模块yue程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityyueis
port(clk:
instd_logic;
ab:
outstd_logic_vector(1downto0);
r:
instd_logic;
CQ1,CQ2:
outstd_logic_vector(3downto0);
COUT:
OUTstd_logic);
endentityYUE;
architectureartofyueis
signals1,s2:
std_logic_vector(3downto0);
begin
process(clk)
begin
IFclk'eventANDclk='1'thenS1<=S1+1;
IFS1=9THENS1<="0000";S2<=S2+1;ENDIF;
IFs2=1ands1=2thens1<="0001";s2<="0000";COUT<='1';
ELSECOUT<='0';ENDIF;
ENDIF;
CASEs2&s1is
when"00000001"=>ab<="11";
when"00000010"=>ifr='0'then
ab<="00";elseab<="01";endif;
when"00000011"=>ab<="11";
when"00000100"=>ab<="10";
when"00000101"=>ab<="11";
when"00000110"=>ab<="10";
when"00000111"=>ab<="11";
when"00001000"=>ab<="11";
when"00001001"=>ab<="10";
when"00010000"=>ab<="11";
when"00010001"=>ab<="10";
when"00010010"=>ab<="11";
WHENOTHERS=>NULL;
ENDCASE;
CQ1<=S1;CQ2<=S2;
endprocess;
ENDart;
将程序用QuartusII软件编译之后生成的yue模块元件如下图所示:
(此模块实现的是月的计数功能,在其输入信号中,r用来判断是否为闰年,且在该模块中判断月份,为:
一、三、五、七、八、十、十二月份时,ab<="11",每月为31天;为:
四、六、九、十一月份时,ab<="10",每月为30天;二月份单独判断,当为闰年时,ab<="10",二月为28天,当为非闰年时,ab<="01",二月为29天。
)
(6)年计时模块nian程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitynianis
port(clk:
instd_logic;
CQ1,CQ2:
outstd_logic_vector(3downto0);
r:
bufferstd_logic);
endentitynian;
architectureartofnianis
signals1,s2,a:
std_logic_vector(3downto0);
begin
process(clk)
begin
IFclk'eventANDclk='1'thenS1<=S1+1;a<=a+1;
IFS1=9THENS1<="0000";S2<=S2+1;ENDIF;
IFs2=9ands1=9thens1<="0001";s2<="0000";ENDIF;
IFa=3thenr<='1';a<="0000";
elser<='0';endif;
ENDIF;
CQ1<=S1;CQ2<=S2;
endprocess;
ENDart;
将程序用QuartusII软件编译之后生成的nian模块元件如下图所示:
(此模块实现的是年的计数功能,并判断是否为闰年)
(7)调整模块tz程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtzIS
PORT(fi,si,ti,yi,ni,l2,l3,l4,l5,l6:
outSTD_LOGIC;
k2,k3:
inSTD_LOGIC;
yo,too,soo,fo,mo:
inSTD_LOGIC);
ENDtz;
architectureoneoftzis
signala:
std_logic_vector(3downto0);
begin
process(k3,k2)
begin
ifk2'eventandk2='1'thena<=a+1;
ifa=5thena<="0000";endif;
endif;
caseais
when"0000"=>fi<=mo;si<=fo;ti<=soo;yi<=too;ni<=yo;l2<='0';l3<='0';l4<='0';l5<='0';l6<='0';
when"0001"=>fi<=k3;si<='0';ti<='0';yi<='0';ni<='0';
l2<='1';l3<='0';l4<='0';l5<='0';l6<='0';
when"0010"=>fi<='0';si<=k3;ti<='0';yi<='0';ni<='0';
l2<='0';l3<='1';l4<='0';l5<='0';l6<='0';
when"0011"=>fi<='0';si<='0';ti<=k3;yi<='0';ni<='0';
l2<='0';l3<='0';l4<='1';l5<='0';l6<='0';
when"0100"=>fi<='0';si<='0';ti<='0';yi<=k3;ni<='0';
l2<='0';l3<='0';l4<='0';l5<='1';l6<='0';
when"0101"=>fi<='0';si<='0';ti<='0';yi<='0';ni<=k3;
l2<='0';l3<='0';l4<='0';l5<='0';l6<='1';
whenothers=>null;
endcase;
endprocess;
end;
将程序用QuartusII软件编译之后生成的tz模块元件如下图所示:
(此模块实现调整各模块(不包括秒)的调数,通过按键k2、k3调整年月日时分秒的切换,从而控制实验箱上年月日时分秒相对应的led灯的亮灭,l2、l3、l4、l5、l6用来指示是否处于调数状态)
(8)控制模块mux21:
(用来控制年月日和时分秒的切换)程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmux21IS
PORT(m1,m2,f1,f2,s1,s2:
inSTD_LOGIC_vector(3downto0);
t1,t2,n1,n2,y1,y2:
inSTD_LOGIC_vector(3downto0);
k1:
inSTD_LOGIC;
l1:
outstd_logic;
a1,a2,b1,b2,c1,c2:
outSTD_LOGIC_vector(3downto0));
ENDmux21;
architectureoneofmux21is
begin
process(k1)
begin
ifk1='0'thena1<=m1;a2<=m2;b1<=f1;b2<=f2;
c1<=s1;c2<=s2;l1<='1';
elsea1<=t1;a2<=t2;b1<=y1;b2<=y2;
c1<=n1;c2<=n2;l1<='0';
endif;
endprocess;
endone;
将程序用QuartusII软件编译之后生成的mux21模块元件如下图所示:
(此模块用来显示年月日和时分秒之间内容的切换)
2、万年历的顶层文件原理图:
(将以上各个模块在顶层文件中用线连接起来构成万年历的原理图,从而使它万年历的功能)
3、引脚绑定和下载:
编译通过之后,在pc机上完成各个引脚的绑定工作,绑定好之后再用数据线将pc机和实验箱上的USB接口连接起来,然后完成下载工作,即将程序下载到实验箱上,在实验箱上完成万年历功能的显示和实现。
4、调试
通过对应的按键和切换将数码管上的时间时分秒和日期年月日调整到当前时刻即可。
直到万年历功能在实验箱上正确显示和实现。
实验感想
通过这次试验………………..