秒表计时器.docx
《秒表计时器.docx》由会员分享,可在线阅读,更多相关《秒表计时器.docx(18页珍藏版)》请在冰点文库上搜索。
![秒表计时器.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/402274a8-20cb-4bc2-a93b-33158eb4b38a/402274a8-20cb-4bc2-a93b-33158eb4b38a1.gif)
秒表计时器
课程设计说明书
设计题目:
秒表计时器
院(系):
机电工程系
专业年级:
07机制本2班
学号:
0715118201
姓名:
樊印文
指导老师:
刘江海
课程设计任务书
机电工程系机制专业07级本科二班
姓名:
樊印文学号:
0715118201
题目:
秒表计时器
课程设计内容与要求:
1.课程设计的目的
(1)掌握EDA技术及CPLD/FPGA的开发流程
(2)能够应用VHDL语言和EDA软件进行电子系统的设计
(3)掌握自上而下的设计思想
(4)掌握秒表计时器的设计原理
(5)掌握系统设计的分析方法
2.课程设计的任务及要求
(1)用VHDL语言设计一个多功能的秒表计时器,包含以下主要功能:
精确计时,暂停,复位,整点报时等
(2)能把设计文件进行仿真并下载到实验箱正确实现功能
目录
1.绪论
2.说明
3.Protel99绘图过程
4.主要芯片
5.所有程序
6.心得体会
7.附件
8.参考文献
9.鸣谢
绪论
本文采用VHDL语言,运用自上而下的设计思想,将系统功能逐层分割的层次设计方法,使用MUX+PLUS2集成开发环境进行编辑,逻辑综合自动化把VHDL描述转电路,然后进行波形仿真,最后通过编程电缆将所设计的内容下载到CPLD器件中,最终实行了电子钟的设计。
相比传统的电路系统的设计方法,EDA技术采用硬件描述语言电路系统,包括电路的结构,行为方式,逻辑功能等。
VHDL具有多层次描述系统硬件功能的能力,支持自上而下和基于库的设计特点。
设计者不必了解硬件结构。
从系统设计入手,在顶层记性系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后在用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD期间中去,从而实现可编程的ASIC的设计。
本文运用现代电子设计工具,采用VHDL语言在CPLD器件上实现秒表计时器的设计,能够进行百分之一秒,秒,分,时的计数,而且通过十进制数码显示,具有体积小,可靠性高,功耗低的特点。
秒表计时器的设计基于强大的EDA功能,通过一台计算机,一套EDA软件和一片或者几片大规模可编程芯片(CPLD/FPGA),完成了秒表计时器的设计。
说明
一、设计实验说明及要求:
1、秒表主要由:
分频器、扫描显示译码器、一百进制计数器、六十进制计数器(或十进制计数器与6进制计数器)、十二进制计数器(或二十四进制计数器)电路组成。
在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,数字秒表需有清零控制端,以及启动控制端、保持保持,以便数字时钟能随意停止及启动。
2、数字秒表显示由时(24进制任选)、分(60进制)、秒(60进制)、百分之一秒(一百进制)组成,利用扫描显示译码电路在八个数码管显示。
3、能够完成清零、启动、保持(可以使用键盘或拨码开关置数)功能。
4、时、分、秒、百分之一秒显示准确。
二、秒表组成及功能:
1、分频率器:
用来产生100HZ计时脉冲;
来源:
(–我的EDA课程设计-----数字秒表1_THE_secret_新浪博客2、二十四进制计数器:
对时进行计数
3、六十进制计数器:
对分和秒进行计数;
4、六进制计数器:
分别对秒十位和分十位进行计数;
5、十进制计数器:
分别对秒个位和分个位进行计数;
6、扫描显示译码器:
完成对7字段数码管显示的控制;
三、系统硬件要求:
1、时钟信号为10MHz;
2、FPGA芯片型号为EP2C5Q208C8
3、8个7段扫描共阳级数码显示管;
4、按键开关(清零、启动、保持);
四、硬件实现
将时序仿真正确的文件下载到实验箱中的EP2C5Q208C8中,通过合适的管脚分配,将相应的管脚连接起来,验证设计是否完成设计要求
Protel99SE绘图过程
(1)设置原理图设计环境,设计环境对画原理图人影响很大,在画原理图之前,应该把设计环境设置好,工作环境是使用DESIGN/OPTIONS和TOOL/PREFERENCE菜单进行的,画原理图环境的设置主要包括图纸大小,捕捉栅格,电气栅格,模板设置等。
(2)放置元件。
将电气和电子元件放置到图纸上,一情况下元件的原理图符号在元件库中都可以找到,只需要将元件从元件库中取出,放置在图上,但由于本次设计中有一些新元件,故还要自己画元件。
(3)画元件图。
1、首先选择菜单FILE/NEW,然后在出现的窗口选择SCHEMATICLIBRARYDOCUMENT图标建立一个元件库,该库的缺省名为SCHLIBL.LIB;在设计管理器窗口中双击该元件库,这就进入了画元件图窗口,在元件管理器窗口,可以看到已经给元件取了个缺省名COMPONENT_。
2、进入编辑窗口后使用pageup键将窗口放大,放大到能清楚地看到可视栅格。
3、然后使用绘图工具箱中的工具依次绘出所需使用的元件。
4、当需要对所画元件放置管脚时,单击工具箱上的放管脚工具,就会看见鼠标变成十字还带着一个管脚,将鼠标移动到放置管脚的地方,单击鼠标将管脚一个接一个放置,注意用空格键调整管脚方向。
其中管脚的系列号是Protel99SE软件自动加上去的,若管脚名称或管脚的序号需要按顺序排列,则在放置第一个管脚之前,按Tab键然后在管脚Name和Number属性中输入排列序号的第一个数值或字母加数字,例如,若管脚序列号按数字增加的顺序排列,则输入第一个数字:
若管脚名按D0、D1、D2……排列,则输入D0。
(4)若需要将所画元件图放在原理图中,则需要将左上侧的Place单击则会自动跳转至原理图中,但选取适当的位置后,则单击右键即可确认。
(5)原理图布线,元件一旦放置在原理图上,就需要用导线将元件连接起来,连接时一定要符合电气规则。
(6)编辑与调整,编辑元件的属性,这些属性包括元件名,参数,封装图等,然后将元件与导线的位置进行细微的调整。
(7)检查原理图在编辑元件的属性的基础上使用Protel99SE的电气规则检查功能,检查原理图的连线是否合理与正确,给出检查报告,若有错误,就需要根据错误情况进行改正。
(8)在原理图右下角输入原理图名称,然后打印输出原理图。
主要芯片
一.555芯片
二.EP2C5Q208C8
CycloneIIEP2C5Q208C8是Altera公司生产的一款具有较高性价比的FPGA芯片,它采用Stratix架构,使用90nm工艺生产,具有4608个LE,26个M4K单元,2个PLL以及13个乘法器,另外,其I/O管脚可以直接与系统中使用的其它芯片相连而不需要进行电平转换。
该款FPGA的内部资源以及管脚数量能够完全满足本案的设计需求。
故选用该款FPGA作为主控逻辑芯片。
FPGA的内部功能模块可以划分为UART收发、AD9951控制、包络信号DDS、脉冲信号控制、变频控制信号输出这五个主要部分,另外,还包括各个模块间的协调以及时钟信号产生等部分。
这些控制逻辑都通过Verilog硬件描述语言来实现。
所有程序
一.顶层设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclockIS
PORT(
clk:
INSTD_LOGIC;
enable:
INSTD_LOGIC;
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDclock;
ARCHITECTURErt1OFclockIS
COMPONENTclk_div10
PORT(clk:
INSTD_LOGIC;
clk_div:
OUTSTD_LOGIC);
ENDCOMPONENT;
componentcount100
PORT(
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
qh:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
endcomponent;
componentcount60
PORT(
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
qh:
outSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
outSTD_LOGIC_VECTOR(3DOWNTO0));
endcomponent;
COMPONENTcount24
PORT(
clk:
INSTD_LOGIC;
qh:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTdisplay
PORT(
clk:
INSTD_LOGIC;
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0);
qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4:
instd_logic_vector(3downto0);
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDCOMPONENT;
signalqh,ql,qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4:
STD_LOGIC_VECTOR(3DOWNTO0);
signalclk0:
STD_LOGIC;
signalcout1,cout2,cout3:
STD_LOGIC;
BEGIN
u0:
clk_div10PORTMAP(clk,clk0);
u1:
count100portmap(clk0,cout1,qh1,ql1);
u2:
count60portmap(cout1,cout2,qh2,ql2);
u3:
count60portmap(cout2,cout3,qh3,ql3);
u4:
count24PORTMAP(cout3,qh4,ql4);
u5:
displayportMAP(clk,qh,ql,qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4,sel,segment);
ENDrt1;
二.分频模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityclk_div10is
port(clk:
instd_logic;
clk_div:
outstd_logic);
endclk_div10;
architecturert1ofclk_div10is
signalq_tmp:
integerrange0to9;
begin
process(clk)
begin
IF(clk'eventandclk='1')THEN
IF(q_tmp=9)THEN
q_tmp<=0;
ELSE
q_tmp<=q_tmp+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(q_tmp=9)THEN
clk_div<='1';
ELSE
clk_div<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDrt1;
三.计时模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount100IS
PORT(
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
qh:
outSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
outSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount100;
ARCHITECTURErt1OFcount100IS
SIGNALqh_temp,ql_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(qh_temp="1001"andql_temp="1001")THEN
qh_temp<="0000";
ql_temp<="0000";
ELSE
IF(ql_temp="1001")THEN
ql_temp<="0000";
qh_temp<=qh_temp+1;
ELSE
ql_temp<=ql_temp+1;
ENDIF;
ENDIF;
ENDIF;
qh<=qh_temp;
ql<=ql_temp;
ENDPROCESS;
cout<='1'whenqh_temp="0000"andql_temp="0000"else'0';
--cout<='1'whenqh_temp="0000"andql_temp="0000"else'0';
ENDrt1;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount24IS
PORT(
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
qh:
outSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
outSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount24;
ARCHITECTURErt1OFcount24IS
SIGNALqh_temp,ql_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(qh_temp="0010"andql_temp="0011")THEN
qh_temp<="0000";
ql_temp<="0000";
ELSE
IF(ql_temp="1001")THEN
ql_temp<="0000";
qh_temp<=qh_temp+1;
ELSE
ql_temp<=ql_temp+1;
ENDIF;
ENDIF;
ENDIF;
qh<=qh_temp;
ql<=ql_temp;
ENDPROCESS;
ENDrt1;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount60IS
PORT(
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
qh:
outSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
outSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount60;
ARCHITECTURErt1OFcount60IS
SIGNALqh_temp,ql_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(qh_temp="0101"andql_temp="1001")THEN
qh_temp<="0000";
ql_temp<="0000";
ELSE
IF(ql_temp="1001")THEN
ql_temp<="0000";
qh_temp<=qh_temp+1;
ELSE
ql_temp<=ql_temp+1;
ENDIF;
ENDIF;
ENDIF;
qh<=qh_temp;
ql<=ql_temp;
ENDPROCESS;
cout<='1'whenqh_temp="0000"andql_temp="0000"else'0';
--cout<='1'whenqh_temp="0000"andql_temp="0000"else'0';
ENDrt1;
四.显示模块
libraryieee;
useieee.std_logic_1164.all;
entityseg7is
port(q:
instd_logic_vector(3downto0);
segment:
outstd_logic_vector(6downto0));
endseg7;
architecturert1ofseg7is
begin
process(q)
begin
caseqis
when"0000"=>segment<="0111111";
when"0001"=>segment<="0000110";
when"0010"=>segment<="1011011";
when"0011"=>segment<="1001111";
when"0100"=>segment<="1100110";
when"0101"=>segment<="1101101";
when"0110"=>segment<="1111101";
when"0111"=>segment<="0100111";
when"1000"=>segment<="1111111";
when"1001"=>segment<="1101111";
whenothers=>segment<="XXXXXXX";
endcase;
endprocess;
endrt1;
libraryieee;
useieee.std_logic_1164.all;
entitytime_chooseis
port(sel:
instd_logic_vector(2downto0);
qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(3downto0));
endtime_choose;
architecturert1oftime_chooseis
begin
process(sel)
begin
caseselis
when"000"=>q<=ql1;
when"001"=>q<=qh1;
when"010"=>q<=ql2;
when"011"=>q<=qh2;
when"100"=>q<=ql3;
when"101"=>q<=qh3;
when"110"=>q<=ql4;
when"111"=>q<=qh4;
whenothers=>q<="XXXX";
endcase;
endprocess;
endrt1;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdisplayIS
PORT(
clk:
INSTD_LOGIC;
qh:
INSTD_LOGIC_VECTOR(3DOWNTO0);
ql:
INSTD_LOGIC_VECTOR(3DOWNTO0);
qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4:
instd_logic_vector(3downto0);
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDdisplay;
ARCHITECTURErt1OFdisplayIS
COMPONENTcount8
PORT(clk:
INSTD_LOGIC;
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDCOMPONENT;
COMPONENTtime_choose
port(sel:
instd_logic_vector(2downto0);
qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(3downto0));
ENDCOMPONENT;
COMPONENTseg7
PORT(q:
INSTD_LOGIC_VECTOR(3DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDCOMPONENT;
SIGNALsel_tmp:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALq:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALsegment_tmp:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
U0:
count8PORTMAP(clk,sel_tmp);sel<=sel_tmp;
U2:
time_choosePORTMAP(sel_tmp,qh1,ql1,qh2,ql2,qh3,ql3,qh4,ql4,q);
U3:
seg7PORTMAP(q,segment_tmp);segment<=segment_tmp;
ENDrt1;
设计总结
为期两周的课程设计,主要是以上机操作为主,在实验室查资料,编程序,画图。
设计语言主要是采用VHDL语言的自上而下的设计方法。
EDA中,自上向下的设计,就是在整个设计流程中各设计环节逐步精益求精的过程,应用VHDL运行自上而下的设计,就是使用VHDL模型