EDA课程设计数字时钟.docx
《EDA课程设计数字时钟.docx》由会员分享,可在线阅读,更多相关《EDA课程设计数字时钟.docx(15页珍藏版)》请在冰豆网上搜索。
![EDA课程设计数字时钟.docx](https://file1.bdocx.com/fileroot1/2023-1/31/94600023-7474-48de-be65-bbfbf22a7223/94600023-7474-48de-be65-bbfbf22a72231.gif)
EDA课程设计数字时钟
泰山学院
2011级电子信息科学与技术本科班
EDA课程设计·数字时钟
姓名:
胡乃宽
学号:
2011080032
学院:
物电学院
班级:
2011级电本
任课老师:
王春玲
设计时间:
2013-11-21
摘要:
以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言(VHDL)为主要表达方式,以QⅡ开发软件和EDA试验箱为设计工具,阐述了数字时钟的工作原理和软件实现方法。
并通过对所设计的数字时钟进行了时序仿真,使我们小组成员掌握综合性电路的设计、仿真、下载、调试方法,并能写出简单的EDA实验程序。
作为学习电子的本科生,我们必须不断接受先进的电子知识,这就要求我们努力学好EDA这门课程,并熟练掌握相关软件及硬件的操作。
除此之外,我们在课下还要不断练习,争取掌握一定的EDA编程方法,并且利用现有的条件不断实践。
这样一来,我们可以学好EDA这门课程。
此次课程设计不是我们EDA课程的结束,而是一个继续学习EDA相关课程的开始。
关键词:
QⅡ开发软件;数字时钟;EDA
Abstract:
Fieldprogrammablelogicdevice(FPGA)designsupport,hardwaredescriptionlanguage(VHDL)asthemainexpressiontoQⅡchamberforthedevelopmentofsoftwareandEDAdesigntools,digitalclockdescribestheworkingprincipleandsoftwareimplementation.
Ase-learningundergraduate,wemustcontinuetoacceptadvancedelectronicknowledge,whichrequiresustostrivetolearnEDAthiscourse,proficiencyinrelevantsoftwareandhardwareoperations.Inaddition,wealsocontinuetopracticeinclass,fightmastercertainEDAprogrammingmethods,andtheuseoftheexistingconditionsofcontinuouspractice.Inthisway,wecanlearnEDAthiscourse.
ThecoursedesignisnottheendofourEDAprograms,butacontinuingstudybeganEDArelatedcourses.
Keywords:
QⅡsoftwaredevelopment;digitalclock;EDA
一课程设计任务及要求
1.1实验目的
(1)掌握VHDL语言的简单运用
(2)掌握VHDL编程设计方法及会简单编程
(3)掌握QII的简单操作并会使用EDA实验箱
(4)掌握一个基本EDA课程设计的操作
(5)掌握综合性电路的设计、仿真、下载、调试方法
(6)学会使用试验箱
1.2功能设计
(1)有时、分、秒计数显示功能,小时为24进制,分钟和秒为60进制以24小时循环计时
(2)部分显示功能
(3)具有整点报时功能
1.3实验仪器
(1)PC机1台
(2)QII软件1套
二设计思想
1.1功能设计概述
(1)时、分、秒计时器
时、分、秒计时器分别有三个程序驱动,其中时计时器为一个24进制计数器,分、秒计时器均为60进制计数器。
当秒计时器接受到一个秒脉冲时,秒计数器开始从1计数到60,每当秒计数器数到00时,就会产生一个脉冲输出送至分计时器,此时分计数器数值在原有基础上加1;每当分计数器数到00时,就会产生一个脉冲输出送至时计时器,此时时计数器数值在原有基础上加1。
即当数字钟运行到23点59分59秒时,当秒计时器在接受一个秒脉冲,数字钟将自动恢复到00点00分00秒。
(2)部分显示功能
显示功能用一个子程序驱动,在这里我们只做了时间显示功能。
我们用的WHEN,CASE语句对两个LED灯管进行赋值(WHEN,ELSE无法实现)。
1.2可实现的原理图
(1)简单的数字时钟原理图
图一简单的数字时钟原理图
(2)具有显示功能的数字时钟原理图
图二具有显示功能的数字时钟原理图
(3)具有报警功能和显示功能的数字时钟原理图
_
图三具有报警功能和显示功能的数字时钟原理图
三实验步骤概述
1.打开QⅡ,单击“File”菜单,选择File→NewProjectWizard;分别输入项目的工作路径、项目名和实体名,单击Finish。
2.单击“File”菜单,选择New,弹出小对话框,双击“VHDLFile",即选中了文本编辑方式。
在出现的“Vhdl1.vhd”文本编辑窗中键入VHDL程序,输入完毕后,选择File→SaveAs,即出现“SaveAs”对话框。
选择自己建立好的存放本文件的目录,然后在文件名框中键入文件名,按“Save”按钮。
3.建立工程项目,在保存VHDL文件时会弹出是否建立项目的小窗口,点击“Yes”确定。
即出现建立工程项目的导航窗口,点击“Next”,最后在出现的屏幕中分别键入新项目的工作路径、项目名和实体名。
注意,原理图输入设计方法中,存盘的原理图文件名可以是任意的,但VHDL程序文本存盘的文件名必须与文件的实体名一致,输入后,单击“Finish”按钮。
4.单击工具条上的编译符号开始编译
5.开始进行时序仿真。
建立波形文件:
选择File→New,在New窗中选中“OtherFile”标签。
在出现的屏幕中选择“VectorWaveformFile”项出现一新的屏幕。
在出现的新屏幕中,双击“Name”下方的空白处,弹出“InsertNodorBus”对话框,单击该对话框的“NodeFinder……”。
在屏幕中的Filter中选择Pins,单击“List”。
而后,单击“>>”,所有输入/输出都被拷贝到右边的一侧,这些正是我们希望的各个引脚,也可以只选其中的的一部分,根据实际情况决定。
然后单击屏幕右上脚的“OK”。
在出现的小屏幕上单击“OK”。
6.设定仿真时间宽度。
选择Edit→Endtime…选项,在Endtime选择窗中选择适当的仿真时间域,以便有足够长的观察时间。
7.波形文件存盘。
选择File→Saveas选项,直接存盘即可。
8.运行仿真器。
在菜单中选择项,直到出现,仿真结束。
四实验步骤
1.1单元模块设计
(1)秒计数模块
试验程序(根据参考程序修改而成)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsecondIS
PORT(clk1,reset1:
STD_LOGIC;
enmin:
OUTSTD_LOGIC;
daout1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYsecond;
ARCHITECTUREfunOFsecondIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGINdaout1<=count;
PROCESS(clk1,reset1)
BEGIN
IF(reset1='0')THENcount<="0000000";
ELSIF(clk1'eventandclk1='1')then
IF(count<16#3C#)then
IF(count="0111011")then
enmin<='1';
count<="0000000";
ELSE
count<=count+1;
enmin<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDfun;
仿真结果:
图四秒计数模块仿真结果
(2)分计数模块
试验程序(根据参考程序修改而成)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYminuteIS
PORT(clk2,reset2:
INSTD_LOGIC;
enhour:
OUTSTD_LOGIC;
daout2:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYminute;
ARCHITECTUREfunOFminuteIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN--enmin_2由clk调制后的手动调时脉冲信号串
daout2<=count;
PROCESS(clk2,reset2)
BEGIN
IF(reset2='0')THEN--若reset为0,则异步清零
count<="0000000";
ELSIF(clk2'eventandclk2='1')THEN--否则,若clk上升沿到
IF(count<16#3C#)THEN--又若count小于16#60#,即60
IF(count="0111011")THEN--又若已到59D
enhour<='1';--则置进位为1
count<="0000000";--count复0
ELSE
count<=count+1;--若count未到59D,则加7,即作"加6校正"
enhour<='0';
ENDIF;--使前面的16#60#的个位转变为8421BCD的容量
ENDIF;--ENDIF(reset='0')
ENDIF;
ENDprocess;
ENDfun;
仿真结果:
图五分计数模块仿真结果
(3)时计数模块
试验程序(根据参考程序修改而成)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYhourIS
PORT(clk3,reset3:
INSTD_LOGIC;
daout3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYhour;
ARCHITECTUREfunOFhourIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
daout3<=count;
PROCESS(clk3,reset3)
BEGIN
IF(reset3='0')THEN--若reset为0,则异步清零
count<="0000000";
ELSIF(clk3'eventandclk3='1')THEN--否则,若clk上升沿到
IF(count<16#18#)THEN--又若count小于16#60#,即24
IF(count="0010111")THEN--又若已到23
count<="0000000";--count复0
ELSE
count<=count+1;
ENDIF;--使前面的16#60#的个位转变为8421BCD的容量
ENDIF;
ENDIF;
ENDprocess;
ENDfun;
仿真结果:
图六时计数模块仿真结果
(4)显示模块程序
试验程序(根据参考程序修改而成)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxianshiis
port(hour1:
instd_logic_vector(6downto0);
led1:
outstd_logic_vector(6downto0);
led2:
outstd_logic_vector(6downto0));
endxianshi;
architectureartofxianshiis
signalaaa:
std_logic_vector(6downto0);
begin
aaa<=hour1;
process(aaa)
begin
caseaaais
when"0000000"=>led2<="1111110";led1<="1111110";
when"0000001"=>led2<="1111110";led1<="0110000";
when"0000010"=>led2<="1111110";led1<="1101101";
when"0000011"=>led2<="1111110";led1<="1111001";
when"0000100"=>led2<="1111110";led1<="0110011";
when"0000101"=>led2<="1111110";led1<="1011011";
when"0000110"=>led2<="1111110";led1<="1011111";
when"0000111"=>led2<="1111110";led1<="1110000";
when"0001000"=>led2<="1111110";led1<="1111011";
when"0001001"=>led2<="1111110";led1<="1110111";
when"0001010"=>led2<="0110000";led1<="1111110";
when"0001011"=>led2<="0110000";led1<="0110000";
when"0001100"=>led2<="0110000";led1<="1101101";
when"0001101"=>led2<="0110000";led1<="1111001";
when"0001110"=>led2<="0110000";led1<="0110011";
when"0001111"=>led2<="0110000";led1<="1011011";
when"0010000"=>led2<="0110000";led1<="1011111";
when"0010001"=>led2<="0110000";led1<="1110000";
when"0010010"=>led2<="0110000";led1<="1111011";
when"0010011"=>led2<="0110000";led1<="1110111";
when"0010100"=>led2<="1101101";led1<="1111110";
when"0010101"=>led2<="1101101";led1<="0110000";
when"0010110"=>led2<="1101101";led1<="1101101";
when"0010111"=>led2<="1101101";led1<="1111001";
whenothers=>null;
endcase;
endprocess;
endart;
仿真结果:
图七显示模块仿真结果
(5)报时模块
试验程序(根据参考程序修改而成)
libraryieee;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYshizhong1IS
PORT(in1,in2,in3:
inSTD_LOGIC_vector(6downto0);
clk4:
instd_logic;
alert:
outstd_logic;
out1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYshizhong1;
architecturefunOFshizhong1IS
begin
process(in1,in2,in3)
begin
IF(clk4'eventandclk4='1')then
out1<=in3;
if(in1="0000000"andin2="0000000")then
alert<='1';
elsealert<='0';
endif;
endif;
endprocess;
endfun;
仿真波形
图八报时模块仿真结果
1.2顶层模块设计
(1)简单的数字时钟
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYshizhongIS
PORT(clk,reset:
STD_LOGIC;
out1,out2,out3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYshizhong;
ARCHITECTUREfunOFshizhongIS
--SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
componentsecond
port(clk1,reset1:
instd_logic;
enmin:
outstd_logic;
daout1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
componentminute
port(clk2,reset2:
instd_logic;
enhour:
outstd_logic;
daout2:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
componenthour
port(clk3,reset3:
instd_logic;
daout3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
signala,b:
std_logic;
begin
u1:
secondportmap(clk1=>clk,reset1=>reset,daout1=>out1,enmin=>a);
u2:
minuteportmap(clk2=>a,reset2=>reset,daout2=>out2,enhour=>b);
u3:
hourportmap(clk3=>b,reset3=>reset,daout3=>out3);
endARCHITECTUREfun;
仿真波形:
图九顶层仿真结果一
(2)带有显示功能的数字时钟
试验程序(根据参考程序修改而成)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYshizhongIS
PORT(clk,reset:
STD_LOGIC;
out1,out2,out3,out4:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYshizhong;
ARCHITECTUREfunOFshizhongIS
--SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
componentsecond
port(clk1,reset1:
instd_logic;
enmin:
outstd_logic;
daout1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
componentminute
port(clk2,reset2:
instd_logic;
enhour:
outstd_logic;
daout2:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
componenthour
port(clk3,reset3:
instd_logic;
daout3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
componentxianshi
port(hour1:
inSTD_LOGIC_VECTOR(6DOWNTO0);
led2,led1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
endcomponent;
signala,b:
std_logic;
signalc:
std_logic_VECTOR(6downto0);
begin
u1:
secondportmap(clk1=>clk,reset1=>reset,daout1=>out1,enmin=>a);
u2:
minuteportmap(clk2=>a,reset2=>reset,daout2=>out2,enhour=>b);
u3:
hourportmap(clk3=>b,reset3=>reset,daout3=>c);
u4:
xianshiportmap(hour1=>c,led1=>out3,led2=>out4);
endARCHITECTUREfun;
仿真结果
图十仿真结果二
(3)具有报警功能和显示功能的数字时
试验程序(根据参考程序修改而成)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYshizhongIS
PORT(clk,reset:
inSTD_LOGIC;
out2:
outstd_logic;
out3,out4:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYshizhong;
ARCHITECTUREfunOFshizhongIS
--SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
componentsecond
port(clk1