基于VHDL语言的两位数简易记分板设计.docx
《基于VHDL语言的两位数简易记分板设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的两位数简易记分板设计.docx(38页珍藏版)》请在冰点文库上搜索。
基于VHDL语言的两位数简易记分板设计
本科毕业设计
(2015届)
题目:
基于VHDL语言的两位数简易记分板设计
学院:
机电工程学院
专业:
自动化
学生姓名:
学号:
指导教师:
职称(学位):
合作导师:
职称(学位):
完成时间:
2015年05月25日
成绩:
黄山学院教务处制
学位论文原创性声明
兹呈交的学位论文,是本人在指导老师指导下独立完成的研究成果。
本人在论文写作中参考的其他个人或集体的研究成果,均在文中以明确方式标明。
本人依法享有和承担由此论文而产生的权利和责任。
声明人(签名):
年月日
黄山学院本科毕业设计说明书正文
基于VHDL语言的两位数简易记分板设计
机电工程学院自动化专业
指导老师:
摘要:
目前市场上销售的记分器大都是依据单片机技术的制造的,它的主要器件是单片机,并且它的编码器及解码器是由单片机内部的软件生成的。
在实际应用中,由于种种未知的因素可能导致程序出现运行不稳定的现象,从而导致系统的可靠性随时受到严重的威胁。
而基于EDA技术设计的记分器,它的系统完全由FPGA构成,系统要求实现的功能全部由FPGA内部的硬件来提供,从而大大提高了系统工作的稳定性和可靠性。
FPGA的最重要的特色就是它具有现场可编程功能,所以如果需要对设计进行修改,不必重新设计系统,只需更改芯片内部的控制和接口电路,再利用EDA软件将更新后的设计程序下载到FPGA中即可,无需更改外部电路的设计。
本论文详细阐述了运用EDA技术结合FPGA芯片在MAX+PlusII开发环境下设计两位数简易记分板的方法。
记分板的功能有:
加分、减分、清零以及鸣叫提示。
将设计好的程序下载到FPGA芯片中进行验证,完全符合本论文的设计要求。
可以看出,FPGA芯片与VHDL硬件描述语言相结合不仅简化了电路的设计、降低了编程的难度,而且大大缩短了产品开发的周期,提高了产品的竞争力。
关键词:
EDA技术;FPGA;VHDL;MAX+PlusII;记分板
DesignSimpleTwoDigitScoreboardBasedonEDATechnology
ChenGuitingDirector:
ZhaoNianshun
(SchoolofMechanicalandElectricalEngineering,HuangshanUnivercity,China,245041)
Abstract:
Thescoreboardonthemarketaremostlybasedonthemanufacturingofmicrocomputertechnology,itsmaindeviceisasinglechip,andtheencoderanddecoderwhichisgeneratedbytheinternalmicrocontrollersoftware.Inpracticalapplications,duetovariousfactorsmayleadtounknownprogramappearsunstablephenomenon,whichleadstothereliabilityofthesystematanytimeunderseriousthreat.ThescoringdevicebasedonEDA,thesystemiscompletelycomposedofFPGA,systemrequirementstoachieveallfunctionsprovidedbytheFPGAinternalhardware,whichgreatlyimprovesthestabilityandreliabilityofthesystem.ThemostimportantfeatureofFPGAisthatithasafieldprogrammablefunction,soifyouneedtomodifythedesign,donothavetoredesignthesystem,onlyneedtochangethecontrolandinterfacecircuitinsidethechip,thendownloadtheupdateddesignprogramtoFPGAyoucanuseEDAsoftware,withoutchangingtheexternalcircuitdesign.
ThispaperdescribesthemethodofcombiningFPGAchipdesignasimpletwodigitscoreboardintheMAX+PlusIIdevelopmentenvironmentusingEDAtechnology.Thescoreboardfeatures:
plus,minus,andzeropromptsthe.TheprogramisdownloadedtotheFPGAchipverification,fullymeettherequirementsofthisdesign.Asyoucansee,theFPGAchipandtheVHDLhardwaredescriptionlanguagecombinationnotonlysimplifiesthecircuitdesign,reducethedifficultyofprogramming,butalsogreatlyshortentheproductdevelopmentcycle,improvethecompetitivenessofproducts.
KeyWords:
EDATechnology;Thescoreboard;FPGA;VHDL;MAX+PlusII
1引言
1.1研究背景
20世纪60年代中期,电子设计自动化(ElectronicDesignAutomation,缩写:
EDA)技术从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来[1]。
它以计算机为工具,设计者只需使用EDA软件开发环境,使用硬件描述语言完成设计文件,剩下的任务就交给计算机,由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
在这种情况下,FPGA(Field-ProgrammableGateArray,即现场可编程门阵列)器件应运而生[2]。
由于FPGA具有现场可编程功能,所以,当系统的功能需要更改时,我们可以不用修改外围电路结构,只需更改FPGA中的控制电路和接口电路,然后利用EDA工具将更新后的程序下载到FPGA中即可,这不仅大大提高了设计的效率以及使用的成本。
还大大提高了电路设计的效率和可操作性、减轻了设计者的劳动强度、同时也大大缩短了产品的开发周期、提升了产品的竞争能力[3]。
1.2选题的目的和意义
大到奥运比赛小到班级的比赛,记分板始终扮演着举足轻重的角色。
为了体现出比赛的公正、公平,其质量的重要性显得尤为突出。
目前使用的记分器大部分是基于单片机技术制造的,其编码器与解码器的生成方式是单片机内部的软件编译后生成的。
在实际应用中,由于程序可能不稳定,从而影响系统的可靠性。
而基于现场可编程逻辑门阵列FPGA器件制造的记分器则不会发生这种情况,它采用FPGA器件构造系统,所有算法完全由硬件电路来实现,使得系统的工作可靠性大为提高[4]。
2系统方案的拟定
2.1EDA软件的选择
本设计所选用的EDA软件是MAX+PlusII。
它是Altera公司提供的上一代FPGA开发集成环境。
由于它的操作界面友好,操作方式简单,一度被誉为业内最简单、最好用的EDA软件之一。
它主要有以下几个优点:
(1)开放的界面
Max+plusⅡ支持与Cadence、MentorGraphics等公司所提供的EDA工具接口。
(2)与结构无关
Max+plusⅡ系统的核心编译器支持阿尔特拉公司的FLEX10K、FLEX8000、FLEX6000、MAX9000、MAX7000、MAX5000和Classic可编程逻辑器件,提供了世界上唯一真正与结构无关的可编程逻辑设计环境。
(3)丰富的设计库
该软件为开发者提供了丰富的库单元,其中包括多种特殊的逻辑功能块和74系列的全部器件以及新型的参数化的兆功能。
(4)硬件多种描述语言(HDL)
支持各种HDL设计输入选项,包括VHDL、VerilogHDL以及Altera公司自己的硬件描述语言AHDL。
2.2硬件描述语言的选择
硬件描述语言(英文:
HardwareDescriptionLanguage,简称:
HDL)是电子系统硬件行为描述、结构描述、数据流描述的语言。
利用硬件描述语言,数字电路系统的设计可以从顶层到底层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统[5]。
HDL发展至今已有20多年的历史,截止到上世纪80年代,许多大公司都先后推出了具有自己特色的硬件描述语言,这对电子设计自动化行业起到了极大的促进作用。
但是,各大公司自己的硬件描述语言一般都只适用于自己的设计领域和层次,而且种类繁多的开发语言使得开发者左右为难。
因此,急需一种面向设计的多领域、多层次并得到普遍认同的标准硬件描述语言。
在这种环境驱使下,VHDL和VerilogHDL语言从中脱颖而出,先后成为IEEE标准[6]。
行为级抽象建模的覆盖面范围的能力是VHDL和VerilogHDL的一大区别,具体体现在:
VerilogHDL在系统级抽象方面要略差一些,而在门级开关电路描述方面要强的多。
至于别的方面二者的功能都不分伯仲,谈不上孰优孰劣。
由于本人首先接触的是VHDL,对其有一定的了解,所以,本次设计采用的是VHDL语言。
2.3记分板系统的设计
(1)系统的功能
两位分数00-99显示、加分、减分。
分数清零同时蜂鸣器鸣叫提示。
(2)系统的设计
EDA技术采用的是“自顶向下”(Top-Down)的设计方法,所以,首要任务就是分析整个系统的结构,然后根据结构的特点将其分成若干个子模块,然后对这些子模块进行分析、设计和验证,当子模块都设计成功后,再将一个个小的子模块联合在一起形成一个完整的系统。
再对系统进行修改和验证,直到设计完成[7]。
结构原理图如图2-1所示:
图2-1系统结构框图
如图2-1,外部时钟源由于其频率太高,不能直接用于FPGA内部的各功能模块所以需要对其进行分频;按键信号由于具有抖动性,所以要对其进行去抖才能将信号送入FPGA中的模块进行使用;译码模块是驱动数码管显示的模块。
3软件设计
本章共分三个小节来介绍记分板软件部分的设计。
第一节阐述了分频器的原理应用以及软件的实现;第二节描述了去抖模块的原理以及用VHDL语言如何去实现;第三节介绍了数码管的显示原理应用范围以及使用软件的方法来驱动数码管显示我们需要显示的内容。
3.1偶数分频器模块的设计
(1)原理
对于偶数2N分频,通常是由模N计数器实现一个占空比为1:
1的2N分频器,分频输出信号在计数器的值达到模N时自动使其取反。
(2)程序设计
首先,打开程序,进入MAX+PlusII的开发环境,然后点击File菜单出现下拉菜单,如图3-1。
然后点击新建选项“NEW”出现图3-2所示文件类型选择界面。
图3-1文件选项下拉菜单
选择第三项,点击OK,就可新建一个文本文件,如图3-3所示。
然后保存文件,首先选择需要保存的目录,之后为文件重命名,后缀为.vhd,并在下方下拉菜单中选择.vhd,最后单击OK即可保存文件。
注意:
文件名与实体名应一致!
图3-2文件类型选择菜单
图3-3文本编辑界面
文件保存成功后,就开始在此界面编辑VHDL程序,如图3-4所示。
下面就程序的主要部分进行分析:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
以上四个语句是VHDL语言的库和程序包的声明。
库的声明格式为:
LIBRARY库名;
程序包的声明格式为:
USELIBRARY库名.程序包名.项目名;
库是存储和放置可编译设计单元的地方,程序包包含的资源主要有:
常数说明、数据类型说明、元件语句定义、子程序定义和其他说明。
这些资源对引用它的设计单元都是可见的。
entityfenpinis
generic(n:
integer:
=1);
port(clkin1:
instd_logic;
clkout:
outstd_logic;
res:
instd_logic
);
endentityfenpin;
这部分是分频模块的实体声明部分,用来描述该实体与外部电路的接口。
clkin是外部时钟源的输入端口,clkout是分频后的信号输出端口,res是复位按键信号输入。
generic语句是类属参数传递语句,它的作用是在不同层次设计模块之间传递信息和参数。
在本段程序中,修改n的值即可改变分频器的分频数[8]。
architectureaoffenpinis
signalclkq:
std_logic:
='0';
signalleijia:
std_logic_vector(30downto0):
=(others=>'0');
begin
process(clkin1,res)
begin
ifres='0'then
leijia<=(others=>'0');
clkq<='0';
else
if(clkin1'eventandclkin1='1')then
if(leijia=n-1)then
leijia<=(others=>'0');
clkq<=notclkq;
else
leijia<=leijia+1;
endif;
endif;
endif;
endprocess;
clkout<=clkq;
endarchitecturea;
这部分是分频模块的结构体说明部分,放在实体说明后面,它的功能是描述设计实体的结构或行为,从功能上对实体进行描述。
在该部分中,结构体的描述方式为“行为描述”,并且定义了两个信号,一个是“leijia”信号,用来对外部时钟的脉冲进行计数,一个是“clkq”,因为输出信号“clkout”不能进行运算操作,所以它起到了运算并存储中间数据的作用。
当计数达到N-1时,通过语句“clkq<=notclkq;”使其状态反转,再将其值赋给clkout。
这样就实现了分频的功能。
程序编写完成后就可以编译程序[9]。
在此之前需要进行一项设置:
将工程设置为当前工程,如图3-5所示。
图3-4分频器程序编辑界面
图3-5工程设置
然后就可以对写好的程序进行编译,点击MAXplusII中的Compiler选项,出现编译窗口,再点击OK就可对程序进行编译。
若程序无误,则出现图3-6所示编译成功的窗口,否则,显示图3-7所示窗口,根据提示信息改正错误,保存后再重新编译,直至编译成功,显示图3-6所示界面。
图3-6编译成功界面
图3-7编译失败界面
(3)波形图文件
波形图文件的作用是观察设计的程序产生的时序图,让设计者直观地看出设计的程序是否满足设计的要求。
首先,如图3-1点击File菜单,再点击New出现图3-2的界面,选择最后一项波形编辑文件单击OK出现图3-8所示界面。
图3-8波形文件观察界面
单击鼠标右键,选择倒数第二项,出现图3-9的窗口,然后点击“List”按钮,左边窗口出现程序中的全部端口,需要观察哪个就选中该端口,在点击“=>”将其移动到右边窗口。
图3-9端口选择画面
单击ok出现图3-10的画面。
选中输入信号clkin设置其时序图,点击图3-10中被圈出的那个图标,出现时序设置窗口,设置完成后单击OK[10]。
保存设置后开始仿真。
图3-10波形设置窗口
如图3-11所示,选择File菜单中的Simulator选项,弹出右边的编译窗口,单击Start开始仿真,完成后点击OpenSCF选项。
出现图3-12所示界面。
观察生成的时序图是否与预期一致。
若一致则说明程序完全符合要求,否则再重新修改、编译、仿真,直至时序图符合要求。
图3-11仿真启动界面
图3-12仿真时序图
从图3-12中可以直观地看出这是一个二分频的分频器,每当clkin的上升沿到来时,clkout的电平都会发生反转,另外,当复位信号res有效时,clkout的电平立即复位[11]。
所以,可以得出本次设计符合预期要求这一结论。
3.2按键去抖模块的设计
(1)原理
我们经常用到的按键大都是利用“弹性形变”的原理制作的开关,当按下或释放按钮时,由于机械触点发生的是弹性形变,它总是阻止触点的形态产生变化,从而产生一定的抖动,这个短暂的抖动使得按钮在吸合时不会瞬时稳定地连接,在断开时同样不会瞬间地分离,如图3-13所示。
而按钮产生抖动时间的长短取决于它的机械性质,一般为5ms~10ms[12]。
按钮的抖动会让CPU无法判断按钮是否确实按下,从而产生一系列的误动作。
为了确保CPU能时刻准确地判断按钮的状态,必须对按钮实施去抖措施。
即CPU必须在键值稳定时才读取其状态,在抖动时不做任何处理。
这种措施就是按键去抖。
有两种方式来消除按钮的抖动,即硬件去抖和软件去抖。
当按键的数目较少时,适合使用硬件去抖,当按键数目较多时,软件去抖则更加方便。
本课题使用的是软件消抖,即使用VHDL语言编写去抖程序,基本原理如下:
事先规定,按键未按下时为高电平1,按键按下时为低电平0。
键值扫描脉冲反复扫描按钮当前的状态,若检测到按钮当前的输入值为0时,延时5ms~10ms,再次检测,如果键值还是0,那么就认为有按键按下。
反之则认为是抖动,程序不做任何处理,继续扫描按键状态。
而延时的5ms~10ms这段时间间隙刚好好避开了按钮的抖动时间,达到了去抖的目的[13]。
图3-13按键抖动示意图
(2)程序设计
如图3-1到3-5所示步骤新建一个文本编辑文件,保存后在其中编写去抖程序,完成后如图3-14所示。
图3-14去抖程序编辑窗口
下面对去抖程序中去除抖动的进程进行分析:
process(clk_200hz)
variablecount:
integerrange0to3;
variablecount1:
integerrange0to1;
begin
ifclk_200hz'eventandclk_200hz='1'then
ifanjian_in='0'then
ifcount=2then
count:
=0;
anjian_out<='0';
else
count:
=count+1;
endif;
else
count:
=0;
anjian_out<='1';
endif;
endif;
endprocess;
信号clk_200hz是一个周期为5ms的脉冲信号,用这一信号来检测是否有键按下。
变量count对脉冲进行计数。
在clk_200hz信号的每个上升沿对按键的状态进行检测,当检测到按钮的键值为0时,即有键按下时,count加1[14]。
当count的值达到2时,在clk_200hz的第三个脉冲上升沿到来时,若键值仍为0,则说明当前按钮按下的时间已过了10ms,确实有键按下,并非抖动,则令去抖模块的输出为低电平,否则将count清零并使输出为高电平。
(3)波形图文件
按照图3-8到图3-11所示步骤新建一个波形图文件,然后设置各项参数并保存。
最后开始仿真,仿真时序图如图3-15所示。
图3-15
为了方便理解,我引入了guancha_200hz这一输出信号,实际上它就是按键的扫描脉冲信号。
再者,之所以该信号使用的是2分频,目的是为了方便观察。
从图中可以直观地看出以下结论:
当按键第一次按下时,保持的时间是两个周期,当第三个脉冲上升沿到来时,按键已恢复到高电平,所以算是抖动;当按键第二次按下时,由于持续的时间大于两个周期,所以在第三个周期的上升沿令输出值为零,直到检测到按键松开时,置位输出值[15]。
而第三次按下表示按键时长时间按下,在这里,程序设置的是只做一次按键处理,即在anjian_in长时间处于低电平时,anjian_out始终是低电平,不会发生电平跳变。
这样做的目的是使每次按键时如果按键按下的时间比较长,分数只会增加一次,而不会连续自动地增加。
这样做的目的是防止程序产生错误的判断从而导致发出指令出现错误。
从而得出,该仿真图符合预期的设计要求。
3.3译码显示模块
(1)数码管的选取
将多个发光二极管按照8字型拼接在一起,再在右下角加一个LED构成小数点,这样就构成了我们常用的八段数码管(LEDSegmentDisplays)。
它的引线在内部已经连接完成,而外部引脚连接的是它们的各个段以及公共电极。
数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8段,分别由字母a,b,c,d,e,f,g,dp来表示。
数码管有共阴和共阳两种,在功能上二者没什么区别,只是为了增加它的使用范围才设计这两种。
本设计中选用的是共阴8段数码管,BCD显示字符真值表见表3-1,根据真值表就可让数码管显示0-9十个数字。
表3-1共阴数码管真值表
十进制数
hgfedcba
显示字符
十六进制数
0
01111110
0
7E
1
00110000
1
30
2
01101101
2
6D
3
01111001
3
79
4
00110011
4
33
5
01011011
5
5B
6
01011111
6
5F
7
01110000
7
70
8
01111111
8
7F
9
01111011
9
7B
(2)程序设计
以下两个进程是两位数记分板的编码译码显示进程:
xianshiled1:
process(leda1)
begin
caseleda1is
when0=>led1<=B"1111110";
when1=>led1<=B"0110000";
when2=>led1<=B"1101101";
when3=>led1<=B"1111001";
when