基于EDA技术的秒表设计.docx

上传人:b****8 文档编号:9816898 上传时间:2023-02-06 格式:DOCX 页数:24 大小:265.58KB
下载 相关 举报
基于EDA技术的秒表设计.docx_第1页
第1页 / 共24页
基于EDA技术的秒表设计.docx_第2页
第2页 / 共24页
基于EDA技术的秒表设计.docx_第3页
第3页 / 共24页
基于EDA技术的秒表设计.docx_第4页
第4页 / 共24页
基于EDA技术的秒表设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于EDA技术的秒表设计.docx

《基于EDA技术的秒表设计.docx》由会员分享,可在线阅读,更多相关《基于EDA技术的秒表设计.docx(24页珍藏版)》请在冰豆网上搜索。

基于EDA技术的秒表设计.docx

基于EDA技术的秒表设计

编号:

03063076

 

南阳师范学院2007届毕业生

毕业论文(设计)

 

题目:

基于EDA技术的快速计时器设计

完成人:

黄朝伟

班级:

2003-03

学制:

4年

专业:

电子信息与科学技术

指导教师:

张帅

完成日期:

2007-03-31

 

目录

摘要

1绪论

(1)

1.1EDA技术

(1)

1.2系统设计意义

(2)

2数字快速计时器的设计方案及要求

(2)

2.1系统设计要求(3)

2.2系统设计方案(3)

3程序设计及分析(4)

3.1时基分频模块的VHDL源程序(CB10.VHD)(4)

3.2控制模块的VHDL源程序(CTRL.VHD)(5)

3.3计时模块的VHDL源程序(6)

3.3.1十进制计数器的VHDL源程序(CDU10.VHD)(6)

3.3.2六进制计数器的VHDL源程序(CDU6.VHD)(7)

3.3.3计时器的VHDL源程序(COUNT.VHD)(8)

3.4显示模块的VHDL源程序(10)

3.4.1数据选择器的VHDL源程序(MULX.VHD)(10)

3.4.2BCD七段译码驱动器的VHDL源程序(BCD7.VHD)(12)

3.5顶层设计的VHDL源程序(MB.VHD)(12)

4数字快速计时器的系统仿真及结果分析(15)

4.3计时电路模块的仿真(16)

4.3.1十进制计数器的仿真(16)

4.3.2六进制计数器的仿真(16)

4.4显示电路模块的仿真(17)

4.4.1数据选择器的仿真(17)

4.4.2BCD七段译码驱动器的仿真(17)

4.5数字快速计时器整个系统的仿真(17)

4.5.1快速计时器的起始工作状态(17)

4.5.2快速计时器的停止工作状态,(18)

5结论(19)

参考文献…………………………………………………………….(18)

Abstract(20)

基于EDA技术的快速计时器设计

作者:

黄朝伟

指导老师:

张帅

摘要:

基于EDA技术的使用,本文着重讨论了采用EDA技术设计的快速计时器设计,使用硬件描述语言VHDL,在开发软件MAX+PLUS2进行输入、编译、综合、仿真,得到的仿真波形。

实验结果表明,与原有的数控系统的控制电路部分相比采用EDA技术的快速计时器使得数控系统具有更高的可靠性、实时性、高运算速度以及高集成度。

同时由于EDA技术中FPGA芯片具有在系统可编程特性,因此该快速计时器的设计可像软件一样随时更改。

关键词:

EDA;VHDL;快速计时器设计

1绪论

电子技术的发展推动着社会的发展,人民从使用收音机到黑白电视机、彩色电视机、数字电视机到计算机进入千家万户,通过Internet网可以了解世界的变化,这一切都是电子技术发展的结果。

但是,随着信息化社会的进一步发展,传统的电子技术设计与芯片的制造也就不能适应社会发展的需要,EDA技术正是适应社会的这一需要而产生的。

EDA技术就是以大规模可编程逻辑器件为载体,以硬件描述语言为系统逻辑描述的表达方式,以计算机、大规模可编程逻辑器件的开发软件及试验开发系统为设计工具,通过有关的开发软件,自动完成电子系统的设计。

利用EDA技术进行电子设计它可以实现用软件的方式设计硬件;系统可现场编程,在线升级;整个系统低功耗,多功能等特点,成为现代电子设计发展的趋势[1][2][3]。

1.1EDA技术

随着数字集成技术的飞速发展,数字系统的规模和技术复杂度也在急剧增长,人工设计数字系统变得十分困难,必须依靠EDA技术。

EDA(ElectronicDesignAutomation)技术就是电子设计自动化,用EDA技术设计数字系统的实质是一种自顶向下的分层设计方法[4]。

在每一层次上,都有描述、划分、综合和验证四种类型的工作。

描述是把系统设计输入到EDA软件的过程,它可以采用图形输入、硬件描述语言或二者混合使用的方法输入。

整个设计过程只有该部分由设计者完成。

划分、综合和验证则采用EDA软件平台自动完成。

这样做极大地简化了设计工作,提高了效率,因此,采用EDA技术设计数字系统得到了越来越广泛的应用[1]。

与手工设计相比EDA技术有如下特点[7]:

Ø采用自顶向下设计方案

Ø应用硬件描述语言(HDL)描述设计

Ø能够自动完成仿真和测试

Ø开发技术的标准化和规范化

Ø对工程技术人员的硬件知识和经验要求低

1.2系统设计意义

快速计时器由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。

本数字快速计时器可用于体育比赛,计时精度大于1/100S,计时器能显示1/100S的时间,计时器的最长计时时间为1小时,显示的最长时间为59分59.99秒。

系统具有简单、工作稳定可靠等优点,具有一定的实际意义。

与原有的数控系统的控制电路部分相比采用EDA技术的快速计时器使得数控系统具有更高的可靠性、实时性、高运算速度以及高集成度。

 

2数字快速计时器的设计方案及要求

本文介绍的数字快速计时器设计,利用基于VHDL的EDA设计工具,采用大规模可编程逻辑器件FPGA,通过设计芯片来实现系统功能。

快速计时器由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。

快速计时器的工作原理与多功能时钟基本相同,唯一不同的是,由于快速计时器的计时时钟信号,由于其分辨率为0.01秒,所以整个快速计时器的工作时钟是在100Hz的时钟信号下完成。

当快速计时器的计时小于1个小时时,显示的格式是mm-ss-xx(mm表示分钟:

0~59;ss表示秒:

0~59;xx表示百分之一秒:

0~99),当快速计时器的计时大于或等于一个小时时,显示的和多功能时钟是一样的,就是hh-mm-ss(hh表示小时:

0~99),由于快速计时器的功能和钟表有所不同,所以快速计时器的hh表示的范围不是0~23,而是0~99,这也是和多功能时钟不一样的地方。

2.1系统设计要求

Ø数字快速计时器的计时范围是0秒到59.99秒,显示的最长时间为59分59秒。

Ø数字快速计时器的计时精度是10ms。

Ø复位开关可以在任何情况下使用,即便在计时过程中,只要按一下复位开关,计时器就清零,并做好下次计时的准备。

Ø具有启/停开关,即按一下启/停开关,启动计时器开始计时,再按一下复位开关则停止计时。

2.2系统设计方案

根据系统设计要求,系统的组成框图如图1所示。

图1系统的组成框图

系统设计采用自顶向下的设计方法,系统的整体组装设计主要由控制模块、时基分频模块、计时模块和显示模块四部分组成。

(1)控制模块

计时控制模块的作用是对计时过程进行控制。

计时控制模块可用两个按钮快速计时器的启动、停止和复位。

(2)计时模块

计时模块执行计时功能,计时的方法是对标准时钟脉冲计数[6]。

由于计时范围是0秒到59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。

(3)显示模块

计时显示电路的作用是将计时值在LED七段数码管上显示出来。

计时电路产生的计时值经过BCD七段译码管后,驱动LED数码管。

计时显示电路的实现方案采用扫描显示,即每次只驱动一位数码管,各位数据轮流驱动对应的数码管进行显示。

 

3程序设计及分析

3.1时基分频模块的VHDL源程序(CB10.VHD)

architectureARTOFCB10IS

SIGNALCOUNT:

std_logic_vector(3downto0);

BEGIN

PROCESS(CLK)

BEGIN

IFRISING_EDGE(CLK)THEN

IFCOUNT="1001"THENCOUNT<="0000";CO<='1';

ELSECOUNT<=COUNT+1;CO<='0';

ENDIF;ENDIF;

ENDPROCESS;ENDART;

程序分析:

时基分频模块的VHDL源程序(CB10.VHD)的功能是:

当时钟信号CLK发生变化,将启动进程语句PROCESS。

如果此时有信号CLK的上升沿,此时若计数值COUNT小于9,即COUNT<"1001",计数器将进行正常计数,即执行COUNT<=COUNT+'1';否则当计数值COUNT达到9时COUNT变为0,CO输出高电平,作为十进制计数的进位溢出信号,当计数值COUNT为其它值时输出低电平。

3.2控制模块的VHDL源程序(CTRL.VHD)

architectureBEHAVEOFCTRLIS

CONSTANTS0:

STD_LOGIC_VECTOR(1DOWNTO0):

="00";

CONSTANTS1:

STD_LOGIC_VECTOR(1DOWNTO0):

="01";

CONSTANTS2:

STD_LOGIC_VECTOR(1DOWNTO0):

="11";

CONSTANTS3:

STD_LOGIC_VECTOR(1DOWNTO0):

="10";

TYPESTATESIS(S0,S1,S2,S3);

SIGNALCURRENT_STATE,NEXT_STATE:

STATES;

BEGIN

COM:

PROCESS(SP,CURRENT_STATE)

BEGIN

CASECURRENT_STATEIS

WHENS0=>EN<='0';

IFSP='1'THENNEXT_STATE<=S1;

ELSENEXT_STATE<=S0;

ENDIF;

WHENS1=>EN<='1';

IFSP='1'THENNEXT_STATE<=S1;

ELSENEXT_STATE<=S2;

ENDIF;

WHENS2=>EN<='1';

IFSP='1'THENNEXT_STATE<=S3;

ELSENEXT_STATE<=S2;

ENDIF;

WHENS3=>EN<='0';

IFSP='1'THENNEXT_STATE<=S3;

ELSENEXT_STATE<=S0;

ENDIF;ENDCASE;

ENDPROCESS;ENDBEHAVE;

程序分析:

控制模块的VHDL源程序(CTRL.VHD)是用VDHL设计的有限状态机。

SYNCH是主控时序进程;COM是主控组合进程。

在上面的结构体说明部分,定义了含四个状态的数据类型STATES,然后将现态CURRENT_STATE和次态NEXT_STATE变量的数据类型定义为STATES,数据类型定义为SIGNAL。

对于此程序,如果异步清零信号CLR有过一个复位脉冲,当前状态被异步设置为S0。

与此同时,启动组合进程,执行“WHENS0=>EN<='0';…”语句,并使次态NEXT_STATE获得S1,而当此后的第一个CLK上升沿到来时,现态CURRENT_STATE自动转向S1状态。

随着时钟信号的到来,将根据控制信号SP而转向不同的状态,同时输出相应的信号EN去控制外部对象。

3.3计时模块的VHDL源程序

3.3.1十进制计数器的VHDL源程序(CDU10.VHD)

ENTITYCDU10IS

PORT(CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

EN:

INSTD_LOGIC;

CN:

OUTSTD_LOGIC;

COUNT10:

outstd_logic_vector(3downto0));

ENDCDU10;

architectureARTOFCDU10IS

SIGNALSCOUNT10:

std_logic_vector(3downto0);

BEGIN

COUNT10<=SCOUNT10;

PROCESS(CLK,CLR,EN)

BEGIN

IF(CLR='1')THEN

SCOUNT10<="0000";CN<='0';

ELSIFRISING_EDGE(CLK)THEN

IF(EN='1')THEN

IFSCOUNT10="1001"THENCN<='1';SCOUNT10<="0000";

ELSECN<='0';SCOUNT10<=SCOUNT10+'1';

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

ENDART;

程序分析:

十进制计数器的VHDL源程序(CDU10.VHD)的功能是:

当时钟信号CLK、复位信号CLR或时钟使能信号EN中任一信号发生变化,都将启动进程语句PROCESS。

此时如果CLR为’1’,将对计数器清零,即复位,这项独立于CLK的,因而称异步;如果CLR为’0’,则看是否有时钟信号的上升沿:

如果此时有CLK信号,又测得EN=‘1‘,即允许计数器计数,此时若计数值小于9,即SCOUNT10<"1001",计数器将进行正常计数,即执行SCOUNT10<=SCOUNT10+'1';否则当计数值SCOUNT10达到9时,输出高电平,作为十进制计数的进位溢出信号,当计数值SCOUNT10为其它值时输出低电平;但如果测得EN=‘0‘使SCOUNT10保持原值,即将计数值向端口输出:

COUNT10<=SCOUNT10。

3.3.2六进制计数器的VHDL源程序(CDU6.VHD)

ENTITYCDU6IS

PORT(CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

EN:

INSTD_LOGIC;

CN:

OUTSTD_LOGIC;

COUNT6:

outstd_logic_vector(3downto0));

ENDCDU6;

architectureARTOFCDU6IS

SIGNALSCOUNT6:

std_logic_vector(3downto0);

BEGIN

COUNT6<=SCOUNT6;

PROCESS(CLK,CLR,EN)

BEGIN

IF(CLR='1')THENSCOUNT6<="0000";CN<='0';

ELSIFRISING_EDGE(CLK)THEN

IF(EN='1')THEN

IFSCOUNT6="0101"THENCN<='1';

SCOUNT6<="0000";

ELSECN<='0';SCOUNT6<=SCOUNT6+'1';

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

ENDART;

程序分析:

六进制计数器的VHDL源程序(CDU10.VHD)的功能是:

当时钟信号CLK、复位信号CLR或时钟使能信号EN中任一信号发生变化,都将启动进程语句PROCESS。

此时如果CLR为’1’,将对计数器清零,即复位;如果CLR为’0’,则看是否有时钟信号的上升沿:

如果此时有CLK信号,又测得EN=‘1‘,即允许计数器计数,此时若计数值小于5,即SCOUNT6<"0101",计数器将进行正常计数,即执行SCOUNT6<=SCOUNT6+'1';否则当计数值SCOUNT6达到5时,输出高电平,作为十进制计数的进位溢出信号,当计数值SCOUNT6为其它值时输出低电平;但如果测得EN=‘0‘使SCOUNT6保持原值,即将计数值向端口输出:

COUNT6<=SCOUNT6。

3.3.3计时器的VHDL源程序(COUNT.VHD)

ENTITYCOUNTIS

PORT(CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

EN:

INSTD_LOGIC;

S_1MS:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_10MS:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_100MS:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_1S:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_10S:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_1MIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_10MIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

HOUR:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDCOUNT;

architectureARTOFCOUNTIS

COMPONENTCDU10

PORT(CLK,CLR,EN:

INSTD_LOGIC;

CN:

OUTSTD_LOGIC;

COUNT10:

outstd_logic_vector(3downto0));

ENDCOMPONENTCDU10;

COMPONENTCDU6

PORT(CLK,CLR,EN:

INSTD_LOGIC;

CN:

OUTSTD_LOGIC;

COUNT6:

outstd_logic_vector(3downto0));

ENDCOMPONENTCDU6;

SIGNALA,B,C,D,E,F,G,H:

std_logic;

BEGIN

U1:

CDU10PORTMAP(CLK,CLR,EN,A,S_1MS);

U2:

CDU10PORTMAP(A,CLR,EN,B,S_10MS);

U3:

CDU10PORTMAP(B,CLR,EN,C,S_100MS);

U4:

CDU10PORTMAP(C,CLR,EN,D,S_1S);

U5:

CDU6PORTMAP(D,CLR,EN,E,S_10S);

U6:

CDU10PORTMAP(E,CLR,EN,F,S_1MIN);

U7:

CDU6PORTMAP(F,CLR,EN,G,S_10MIN);

U8:

CDU10PORTMAP(G,CLR,EN,H,HOUR);

ENDART;

程序分析:

以上程序是计数器的顶层VHDL描述,计时器执行计时功能,计时的方法是对标准时钟脉冲计数。

计数器由四个十进制计数器和两个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。

为了达到连接底层元件形成更高层次的电路设计结构,文件使用了元件例化语句。

文件在实体中首先定义了计数器顶层设计文件的端口信号,然后在architecture和BEGIN之间利用COMPONENT语句对准备调用的元件作了声明,并定义了A,B,C,D,E,F,G,H八个信号作为器件内部的连接线。

最后利用端口映射语句PORTMAP()将六个十进制计数器和两个六个进制计数器连接起来构成一个完整的计数器。

(详细功能见仿真图的分析)

3.4显示模块的VHDL源程序

3.4.1数据选择器的VHDL源程序(MULX.VHD)

ENTITYMULXIS

PORT(CLK,CLR,EN:

INSTD_LOGIC;

OUTBCD:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

S_10MS:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_100MS:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_1S:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_10S:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_1MIN:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_10MIN:

INSTD_LOGIC_VECTOR(3DOWNTO0);

HOUR:

INSTD_LOGIC_VECTOR(3DOWNTO0);

S_1MS:

INSTD_LOGIC_VECTOR(3DOWNTO0);

SEG:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDMULX;

architectureARTOFMULXIS

SIGNALCOUNT:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PROCESS(CLK)

BEGIN

PROCESS(CLK)

BEGINIFCLR='1'THEN

COUNT<="1111";

ELSIFRISING_EDGE(CLK)THEN

IFEN='1'THENIFCOUNT="1001"THEN

COUNT<="0000";ELSE

COUNT<=COUNT+'1';ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

CASECOUNTIS

WHEN"0000"=>OUTBCD<=S_1MS;SEG<="11111110";

WHEN"0001"=>OUTBCD<=S_10MS;SEG<="11111101";

WHEN"0010"=>OUTBCD<=S_100MS;SEG<="11111011";

WHEN"0011"=>OUTBCD<=S_1S;SEG<="11110111";

WHEN"0100"=>OUTBCD<=S_10S;SEG<="11101111";

WHEN"0101"=>OUTBCD<=S_1MIN;SEG<="11011111";

WHEN"0110"=>OUTBCD<=S_10MIN;SEG<="10111111";

WHEN"0111"=>OUTBCD<=HOUR;SEG<="01111111";

WHEN"1000"=>OUTBCD<=S_1MS;SEG<="11111110";

WHEN"1001"=>OUTBCD<=S_10MS;SEG<="11111101";

WHENOTHERS=>OUTBCD<="0000";SEG<="00000000";

ENDCASE;

ENDIF;

ENDPROCESS;

ENDART;

程序分析:

此程序中包含两个进程,信号CLK都将启动这两个进程。

对于第一个进程:

当信号CLK发生变化,如果此时复位信号CLR为高电平,COUNT将置为“1111”;否则如果遇到信号CLK的上升沿,又测得EN=‘1‘,即允许计数,此时若计数值小于9,即SCOUNT<"1001",计数器将进行正常计数,即执行COUNT<=COUNT+'1';否则当计数值COUNT达到9时,输出高电平,作为十进制计数的进位溢出信号,当计数值COUNT为其它值时输出低电平;但如果测得EN=‘0‘使SCOUNT6保持原值,即将计数值向端口输出:

COUNT6<=SCOUNT6。

对于第二个进程:

当信号CLK发生变化,此时如果遇到信号CLK的上升沿,将执行CASE语句。

根据信号COUNT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1