电子时钟实验报告.docx
《电子时钟实验报告.docx》由会员分享,可在线阅读,更多相关《电子时钟实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
电子时钟实验报告
目录
前言
一、题目………………………………………………………
二、实验目的…………………………………………………
三、任务要求…………………………………………………
四、实验步骤…………………………………………………
五、统设计方案………………………………………………
六、模块VHDL源程序设计………………………………..
七、引脚锁定与下载验证……………………………………
八、问题分析…………………………………………………
附录:
设计人员……………………………………………
前言
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
电子时钟的设计过程就是一个充分利用EDA软件的过程,利用VHDL语言对硬件进行描述,充分利用软件的逻辑综合与仿真的功能完成对电子时钟的设计,然后将程序写入实验箱,实现其电子时钟的各种功能。
一、题目
设计多功能数字时钟
二、实验目的
通过Max+plus2软件和实验箱实现电子时钟功能,熟练掌握用Max+plus2实现电子时钟的操作步骤并解决在运行过程中的问题。
三、任务要求
1.时、分、秒计数功能,且以24小时循环计时。
2.计时结果要用6个数码管分别显示时、分、秒的十位和个位。
3.具有清零的功能。
4.调整数码显示器,使其符合设计要求。
5.参照程序,改善显示效果。
四、实验步骤
1.打开Max+plus2软件
2.打开file-open,在open对话框的TextEditorfiles选择后缀为*.vhd文件格式
3.选择files为VOTE7.vhd的文件,单击ok,出现源程序文本
4.单击file-project-setprojectto…,单击Assign-Device选择驱动,在弹出的Device窗口下选择Device为EPF1OK1OLC84-4,单击ok
5.单击Assign-pin/location/chip…进行引脚锁定。
例如,输入从men0到men6,对应的inputpin为28-30、35-38,在Nodename中输入pass,对应输出pin为Vote7,outputpin为23,在Nodename中输入stopchipname为vote7,outputpin为65,单击ok
6.单击菜单下的compiler选项,在出现的窗口下单击start完成综合,单击确定,关闭窗口
7.单击菜单下的programmer选项,若未出现Hardwaresetup窗口,则打开options菜单下的Hardwaresetup选项,在弹出的窗口下,选择Hardwaretype为Byteblaster(MV)选项,单击ok,然后再单击configure,完成进程
8.使用仪器测试电子时钟功能,调整时钟脉冲,降低计时频率。
五、设计方案
根据系统设计要求,系统设计采用自顶向下的设计方法,由10进制计数器(count10),6进制计数器(count6),24进制计数器(count24),8位数码扫描显示电路(scan_led)模块组成。
点子时钟的小时部分是24进制,时与分之间各位和十位分别是6进制和十进制,此处则需要以上模块完成。
动态扫描控制模块,在SEL模块输出控制下轮流点亮8数码管来显示相对应的数据。
六、模块VHDL源程序设计
1.顶层设计文件(,设计的电子时钟可以显示时,分,秒,还可以进行时间的设置和调节。
顶层文件VHDL源程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityclock_top1is
Port(clk:
instd_logic;--1Hz
clk1:
instd_logic;--512Hz
reset:
instd_logic;--复位信号
dins:
instd_logic_vector(6downto0);--秒钟预设
dinm:
instd_logic_vector(6downto0);--分钟预设
dinh:
instd_logic_vector(5downto0);--时钟预设
sg:
outstd_logic_vector(6downto0);--段控制信号输出
bt:
outstd_logic_vector(7downto0));--weima--位控制信号输出
endclock_top1;
architectureBehavioralofclock_top1is
componentcount10is--十进制计数器
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(3downto0);
c:
outstd_logic);
endcomponent;
componentcount6is--6进制计数器
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(2downto0);
dout:
outstd_logic_vector(2downto0);
c:
outstd_logic);
endcomponent;
componentcount24is--24进制计数器
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(5downto0);
dout:
outstd_logic_vector(5downto0));
endcomponent;
componentscan_ledis--动态扫描控制模块
Port(clk:
instd_logic;
count:
instd_logic_vector(19downto0);
sg:
outstd_logic_vector(6downto0);
bt:
outstd_logic_vector(7downto0));
endcomponent;
signaln:
std_logic_vector(24downto0);
signalm:
std_logic;
signalc1,c2,c3,c4:
std_logic;
signaldoutsl,doutml:
std_logic_vector(3downto0);
signaldoutsh,doutmh:
std_logic_vector(2downto0);
signaldouth:
std_logic_vector(5downto0);
signalrdoutsh,rdoutmh:
std_logic_vector(3downto0);
signalrdouth:
std_logic_vector(7downto0);
signalcounter:
std_logic_vector(19downto0);
Begin
Process(clk,reset)
Begin
Ifreset='0'thenn<=(others=>'0');
Elsif(clk'eventandclk='1')then
n<=n+1;
Endif;
Endprocess;
m<=n(24);
rdoutsh<='0'&doutsh;--将秒钟高位数据变为4位,在进行译码
rdoutmh<='0'&doutmh;--将分钟高位数据变为4位,在进行译码
rdouth<="00"&douth;--将时钟高位数据变为4位,在进行译码
u1:
count10portmap(clk=>clk,reset=>reset,din=>dins(3downto0),dout=>counter(3downnto0),c=>c1);
u2:
count6portmap(clk=>c1,reset=>reset,din=>dins(6downto4),dout=>counter(6downnto4),c=>c2);
u3:
count10portmap(clk=>c2,reset=>reset,din=>dinm(3downto0),dout=>counter(10downnto7),c=>c3);
u4:
count6portmap(clk=>c3,reset=>reset,din=>dinm(6downto4),dout=>counter(13downnto11),c=>c4);
u5:
count24portmap(clk=>c4,reset=>reset,din=>dinh(5downto0),dout=>counter(19downto14));
u6:
scan_ledportmap(clk=>clk1,count=>counter,sg=>sg,bt=>bt);
endBehavioral;
顶层文件RTL视图
右接下图
右接下图
顶层文件仿真波形图
2.十进制计数器VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycount10is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(3downto0);
c:
outstd_logic);
endcount10;
architectureBehavioralofcount10is
signalcount:
std_logic_vector(3downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
c<='0';
elsifrising_edge(clk)then
ifcount="1001"then
count<="0000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endprocess;
endBehavioral;
功能:
十进制可预置计数器模块。
时钟由时、分、秒组成,分、秒都为60进制。
由于需要使用LED显示时间,所以采用的计数器应该是十进制的,从而方便译码模块的通用。
而60进制计数器可以由十进制计数器和6进制计数器组成。
该程序正好表示了秒和分的个位。
仿真波形图
模块图
3.六进制计数器VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycount6is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(2downto0);
dout:
outstd_logic_vector(2downto0);
c:
outstd_logic);
endcount6;
architectureBehavioralofcount6is
signalcount:
std_logic_vector(2downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
c<='0';
elsifrising_edge(clk)then
ifcount="101"then
count<="000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endprocess;
endBehavioral;
功能:
六进制可预置计数器模块。
要组成一个可预置六十进制的计数器,还需要一个六进制计数器,使用十进制的进位作为六进制的计数器的时钟可以组成一个六十进制的计数器.
仿真波形图
模块图
4.二十四进制计数器VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycount24is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(5downto0);
dout:
outstd_logic_vector(5downto0));
endcount24;
architectureBehavioralofcount24is
signalcount:
std_logic_vector(5downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
elsifrising_edge(clk)then
ifcount(3downto0)="1001"then
count(3downto0)<="0000";
count(5downto4)<=count(5downto4)+1;
else
count(3downto0)<=count(3downto0)+1;
endif;
ifcount="100011"then
count<="000000";
endif;
endif;
endprocess;
endBehavioral;
功能:
二十四进制可预置计数器模块,时钟的小时是二十四进制的,所以必须设计一个二十四进制的可预置计数器.显然,二十四进制计数器不可以使用六进制计数器和四进制计数器组成,因为这样的二十四进制计数器将给译码带来麻烦.
仿真波形图
模块图
5.八位数码扫描显示电路VHDL源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSCAN_LEDIS
PORT(CLK:
INSTD_LOGIC;
count:
inSTD_LOGIC_VECTOR(19DOWNTO0);
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--段控制信号输出
BT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));--位控制信号输出
END;
ARCHITECTUREoneOFSCAN_LEDIS
SIGNALCNT8:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALA:
INTEGERRANGE0TO15;
BEGIN
P1:
process(CNT8)
BEGIN
CASECNT8IS
WHEN"000"=>BT<="00000001";A<=conv_integer(count(19downto18));--小时十位
WHEN"001"=>BT<="00000010";A<=conv_integer(count(17downto14));--小时个位
WHEN"010"=>BT<="00000100";A<=10;--连接符
WHEN"011"=>BT<="00001000";A<=conv_integer(count(13downto11));--分十位
WHEN"100"=>BT<="00010000";A<=conv_integer(count(10downto7));--分个位
WHEN"101"=>BT<="00100000";A<=10;--连接符
WHEN"110"=>BT<="01000000";A<=conv_integer(count(6downto4));--秒十位
WHEN"111"=>BT<="10000000";A<=conv_integer(count(3downto0));--秒个位
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSp1;
p2:
PROCESS(clk)
BEGIN
IFclk'eventANDCLK='1'THENCNT8<=CNT8+1;
ENDIF;
ENDPROCESSP2;
P3:
process(A)--译码电路
BEGIN
CASEAIS
WHEN0=>SG<="0111111";WHEN1=>SG<="0000110";
WHEN2=>SG<="1011011";WHEN3=>SG<="1001111";
WHEN4=>SG<="1100110";WHEN5=>SG<="1101101";
WHEN6=>SG<="1111101";WHEN7=>SG<="0000111";
WHEN8=>SG<="1111111";WHEN9=>SG<="1101111";
WHEN10=>SG<="1000000";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
END;
功能:
实验原理:
下图所示的是8位数码扫描显示电路,其中每个数码管的8个段:
h、g、f、e、d、c、b、a(h是小数点)都分别连在一起,8个数码管分别由8个选通信号k1、k2、…k8来选择。
被选通的数码管显示数据,其余关闭。
如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。
根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、…k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
仿真波形图
模块图
七、引脚锁定与下载验证
实验所用的设备如下:
引脚锁定:
时钟信号clock由cp11Hz控制,时钟信号clock1由cp2256Hz控制.复位reset信号由K1键控制,小时的初始信号值由K2~K7控制,分钟的初始信号值由K8~K14控制,秒的初始信号值dins0,dins1分别由K15,K16控制,dins2~dins6由L3~L6控制.输出由动态数码显示管显示.显示结果如下:
八、问题分析
在运行程序时,发现秒、分、小时的显示位不同,那么需要参照程序调整个个显示位,调试是一个复杂的过程,在调试的过程中要注意程序的结构化,完整化和顺序性,不仅要做到在短时间内调整程序,还要保证调试的简单性和简洁操作性。
通过调试,那么我们成功实现了电子时钟的计时功能,保证了实验的成功,这里也要感谢老师的指导!