数字秒表设计大作业.docx
- 文档编号:8951178
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:22
- 大小:326.60KB
数字秒表设计大作业.docx
《数字秒表设计大作业.docx》由会员分享,可在线阅读,更多相关《数字秒表设计大作业.docx(22页珍藏版)》请在冰豆网上搜索。
数字秒表设计大作业
河南机电高等专科学校
《职业技能培训》结课大作业
数字秒表设计
姓名:
专业班级:
学号:
任课教师:
时间:
成绩:
数字秒表设计
医电08级1班任课老师:
摘要:
本设计介绍了用于体育比赛的数字秒表的VHDL设计,并基于FPGA在MAXPLUS2软件下,采用ALTAR公司FLEX10K系列的EPF10K10LC84-4芯片进行了计算机仿真
关键词:
FPGA;数字秒表;VHDL
目录
1.概述2
2.设计要求3
3.总体构思3
4.各单元电路的设计和实现4
5.功能仿真及其结果6
6.编译下载及调试10
7.总结与展望20
1.概述
超高速硬件描述语言VHDL是数字系统进行抽象的行为与功能描述道具体的内部线路结构描述,利用EDA工具可以在电子设计的各个阶段各个层系进行计算机模拟验证,保证设计过程中的正确性,可大大降低设计成本,缩短设计周期。
本文介绍的数字秒表设计,。
利用基于VHDL的EDA设计工具,采用大规模可编程逻辑器件FPGA,通过设计芯片来实现系统功能。
应用VHDL语言设计数字系统,很多设计工作可以在计算机上完成,从而缩短了系统的开发时间,提高了工作效率。
本文介绍一种以FPGA为核心,以VHDL为开发工具的数字秒表,并给出源程序和仿真结果。
2.设计要求
2.1实验任务及要求
设计用于体育比赛用的数字秒表,要求:
1、及时精度大雨1/1000秒,计数器能显示1/1000秒时间,提供给计时器内部定时的始终频率为12MHz;计数器的最长计时时间为1小时,为此需要一个7位的显示器,显示的最长时间为59分59.999秒。
2、设计有复位和起/停开关。
(1)、复位开关用来使计时器清零,并做好计时准备。
(2)、起/停开关的使用方法与传统的机械式计数器相同,即按一下起/停开关,启动计时器开始计时,再按一下起/停开关计时终止。
(3)、复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程理科终止,并对计时器清零。
3、采用层次设计方法设计符合上述功能要求的数字秒表。
4、对电路进行功能仿真,通过波形确认电路设计是否正确。
5、完成电路传布设计后,通过实验箱下载验证设计的正确性。
3.总体构思
3.1系统总体框图
数字秒表主要有分频器、计数模块、功能控制模块、势能控制模块和显示输出模块组成。
系统框图如图3-1所示。
图表3-1
本次的设计仿真选用以EP1C6Q240芯片为核心的FPGA开发板,该开发板提供了较完善的外围周边电路和信号接口,并提供了一块4位7段数码管的扩展板,为本次设计提供了硬件条件。
在设计中,功能控制模块根据控制选择不同的功能状态的时间输出,通过势能控制模块和显示输出模块驱动7段数码管显示相应的时间。
4.各单元电路的设计和实现
4.1数字秒表的电路逻辑图
图表4-1
4.2时序波形图如下:
图表4-2
4.3顶层程序框图如下:
图表4-3
5.功能仿真及其结果
5.1分频模块
开发板提供的系统时钟为50MHz,通过分频模块3次分频,将系统的时钟信号分为100Hz和1000Hz分别提供给计数模块和势能控制模块作为时钟控制信号。
该模块部分VHDL源程序如下:
5.2计数模块
计数模块中,时钟信号是100Hz作为秒表的百分秒输入,百分秒为100进制计数器,其进位输出作为秒的计数时钟,秒为60进制计数器。
控制信号输入端的begin-stop和reset信号控制计数器的开始、停止和至零。
该模块部分VHDL源程序如下,方针结果如图5-1所示:
图表5-1
5.3势能控制模块
本次设计选用的开发板数码管扩展板的数码显示采用的是4个数码管动态扫描输出,一般只要每个扫描频率超过人的眼睛视觉暂留频率24Hz以上就可以达到点亮单个显示而不闪烁,扫描频率采用1kHz信号。
通过势能控制,每个数码管的显示频率为250Hz,满足显示要求。
该模块部分VHDL源程序如下:
5.4显示控制模块
本次设计选用的开发板在4位数码管输入方面只提供1个数据接口,用来动态显示4位数据,在数据输入信号方面要做到和势能控制信号同频率输出,才能保证数码显示不会出错或显示移位。
该模块部分VHDL源程序如下:
同时通过控制信号示系统处在不同的功能状态:
系统时间运行状态,系统时间至零状态,时钟正常显示状态。
利用功能转换信号实现3个功能状态之间的转换,并产生相应的控制信号去控制显示输出模块不同状态的正确显示。
其部分源程序如下:
各部分模块完成后,用QuartusⅡ对程序编译、仿真、得到的仿真波形如图5-2所示。
图表5-2
本系统采用的FPGA芯片为Altera公司的EP1C6Q240,用VHDL和QuartusⅡ软件工具开发,设计输入完成后,进行整体的编译和逻辑仿真,然后进行转换、延时仿真生成配置文件,最后下载至FPGA器件,完成结果功能配置,实现其硬件功能。
6.编译下载及调试
6.1各功能模块VHDL程序十分之一秒
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINSECONDbis
port(clk,clrm,stop:
instd_logic;
secm0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endMINSECONDb;
architectureSECofMINSECONDbis
begin
process(clk,clrm)
variablecnt0:
std_logic_vector(3downto0);
begin
ifclrm='1'then
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifstop='0'then
ifcnt0="1001"then
co<='1';
cnt0:
="0000";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
co<='0';
endif;
elsecnt0:
=cnt0;
endif;
endif;
secm0<=cnt0;
endprocess;
endSEC;
秒
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitySECONDis
port(clk,clr:
instd_logic;
sec1,sec0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endSECOND;
architectureSECofSECONDis
begin
process(clk,clr)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
co<='0';
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
else
cnt1:
="0000";
co<='0';
endif;
endif;
endif;
sec1<=cnt1;
sec0<=cnt0;
endprocess;
endSEC;
分
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINUTEis
port(clk,en,clr:
instd_logic;
min1,min0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endMINUTE;
architectureMINofMINUTEis
begin
process(clk)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifen='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
co<='0';
else
cnt1:
="0000";
endif;
endif;
endif;
endif;
min1<=cnt1;
min0<=cnt0;
endprocess;
endMIN;
闹钟
libraryieee;
useieee.std_logic_1164.all;
entitynzis
port(clk:
instd_logic;
time:
instd_logic_vector(23downto0);
h1,h0,m1,m0,s1,s0:
instd_logic_vector(3downto0);
qlk:
outstd_logic);
endnz;
architecturesss_arcofnzis
begin
process(clk)
begin
ifclk'eventandclk='1'then
if(h1=time(23downto20)andh0=time(19downto16)andm1=time(15downto12)and
m0=time(11downto8)ands1=time(7downto4)ands0=time(3downto0))then
qlk<='1';
else
qlk<='0';
endif;
endif;
endprocess;
endsss_arc;
顶层程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytime2is
port(clk,clr,stop,en,led:
instd_logic;
time:
instd_logic_vector(23downto0);
qlk:
outstd_logic;
hou1,hou0,m1,m0,s1,s0,sm0:
outstd_logic_vector(3downto0));
endtime2;
architecturebavoftime2is
componentMINSECONDb
port(clk,clrm,stop:
instd_logic;
secm0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endcomponent;
componentSECOND
port(clk,clr:
instd_logic;
sec1,sec0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endcomponent;
componentMINUTE
port(clk,en,clr:
instd_logic;
min1,min0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endcomponent;
componentHOUR
port(clk,en,clr,led:
instd_logic;
h1,h0:
outstd_logic_vector(3downto0));
endcomponent;
componentnz
port(clk:
instd_logic;
time:
instd_logic_vector(23downto0);
h1,h0,m1,m0,s1,s0:
instd_logic_vector(3downto0);
qlk:
outstd_logic);endcomponent;
signalc:
std_logic;
signalc1:
std_logic;
signalc2:
std_logic;
signala1,a0,b1,b0,d1,d0,dm0:
std_logic_vector(3downto0);
begin
hou1<=a1;hou0<=a0;m1<=b1;m0<=b0;s1<=d1;s0<=d0;sm0<=dm0;
u1:
MINSECONDb
portmap(clk=>clk,clrm=>clr,stop=>stop,secm0=>dm0,co=>c);
u2:
SECOND
portmap(clk=>c,clr=>clr,sec1=>d1,sec0=>d0,co=>c1);
u3:
MINUTE
portmap(clk=>c1,clr=>clr,min1=>b1,min0=>b0,en=>en,co=>c2);
u4:
HOUR
portmap(clk=>c2,clr=>clr,h1=>a1,h0=>a0,en=>en,led=>led);
u5:
nz
portmap(clk=>clk,h1=>a1,h0=>a0,m1=>b1,m0=>b0,s1=>d1,s0=>d0,qlk=>qlk,
time=>time);
endbav;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINSECONDbis
port(clk,clrm,stop:
instd_logic;
secm0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endMINSECONDb;
architectureSECofMINSECONDbis
begin
process(clk,clrm)
variablecnt0:
std_logic_vector(3downto0);
begin
ifclrm='1'then
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifstop='0'then
ifcnt0="1001"then
co<='1';
cnt0:
="0000";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
co<='0';
endif;
elsecnt0:
=cnt0;
endif;
endif;
secm0<=cnt0;
endprocess;
endSEC;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitySECONDis
port(clk,clr:
instd_logic;
sec1,sec0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endSECOND;
architectureSECofSECONDis
begin
process(clk,clr)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
co<='0';
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
else
cnt1:
="0000";
co<='0';
endif;
endif;
endif;
sec1<=cnt1;
sec0<=cnt0;
endprocess;
endSEC;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINUTEis
port(clk,en,clr:
instd_logic;
min1,min0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endMINUTE;
architectureMINofMINUTEis
begin
process(clk)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifen='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
co<='0';
else
cnt1:
="0000";
endif;
endif;
endif;
endif;
min1<=cnt1;
min0<=cnt0;
endprocess;
endMIN;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityHOURis
port(clk,en,clr,led:
instd_logic;
h1,h0:
outstd_logic_vector(3downto0));
endHOUR;
architecturehour_arcofHOURis
begin
process(clk)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifen='1'then
ifled='1'then
ifcnt1="0010"andcnt0="0011"then
cnt1:
="0000";
cnt0:
="0000";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
elsifcnt0="1001"then
cnt1:
=cnt1+1;
cnt0:
="0000";
endif;
else
ifcnt1="0001"andcnt0="0001"then
cnt1:
="0000";
cnt0:
="0000";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
elsifcnt0="1001"then
cnt1:
=cnt1+1;
cnt0:
="0000";
endif;
endif;
endif;
endif;
h1<=cnt1;
h0<=cnt0;
endprocess;
endhour_arc;
libraryieee;
useieee.std_logic_1164.all;
entitynzis
port(clk:
instd_logic;
time:
instd_logic_vector(23downto0);
h1,h0,m1,m0,s1,s0:
instd_logic_vector(3downto0);
qlk:
outstd_logic);
endnz;
architecturesss_arcofnzis
begin
process(clk)
begin
ifclk'eventandclk='1'then
if(h1=time(23downto20)andh0=time(19downto16)andm1=time(15downto12)and
m0=time(11downto8)ands1=time(7downto4)ands0=time(3downto0))then
qlk<='1';
else
qlk<='0';
endif;
endif;
endprocess;
endsss_arc;
7.总结与展望
本系统设计用了现在EDA设计手段,基于FPGA采用VHDL语言编程实现数字秒表的设计,运用层次化设计方法,完成个电路模块的链接。
本数字秒表可用于体育比赛,计时精度大于高,显示时间长的特点
当今社会是数字化的社会,是数字集成电路广泛应用的社会。
数字集成电路本身在不断更新换代,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商独立承担。
系统设计师更愿意自己设计专业集成电路(ASIC)芯片,而且希望设计周期尽可能短,最好在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用中,因而出现了现场可编辑器件(FPLD)。
现场可编程门陈列(FPGA)即属其中应用最广泛的一种。
参考文献
[1]杨忠志等编.电子技术课程设计.北京:
机械工业
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 秒表 设计 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)