基于FPGA的出租车计费系统设计.docx
《基于FPGA的出租车计费系统设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的出租车计费系统设计.docx(21页珍藏版)》请在冰豆网上搜索。
基于FPGA的出租车计费系统设计
基于FPGA的数字秒表设计
摘要:
该设计是用于体育比赛的数字秒表,基于FPGA在QuartusII9.0sp2软件下应用VHDL语言编写程序,采用ALTRA公司CycloneII系列的EP2C8Q208芯片进行了计算机仿真,并给出了相应的仿真结果。
本设计有效的克服了传统的数字秒表的缺点采用EDA技术采取自上而下的设计思路。
绘制出了具体的逻辑电路,最后又通过硬件上对其进行调试和验证。
该电路能够实现很好的计时功能,计时精度高,最长计时时间可达一个小时。
关键字:
数字秒表;EDA;FPGA;VHDL;QuartusII
ThedesignofdigitalstopwatchbasedonFPGA
Abstract:
ThisdesignisadigitalstopwatchwhichisusedforathleticcontestsandisbasedonFPGAusingVHDLlanguagetowriteprograminQuartusIIsoftware,adoptingEP2C8Q208chipofCycloneIIseriesofALTRAcompanyforcomputersimulationandatthesametimeshowingthecorrespondingsimulationresult.Thisdesigneffectivelyovercomesthetraditionaldigitalstopwatchweaknessesandtakesatop-downapproachtodesign.Drawoutaparticularlogiccircuits,andfinallypassthecircuitstothehardwaretodebugandverifyit.Thiscircuitisabletocarryoutexcellenttimingfunction,hashightimingprecision,andthelongesttimingtimecouldreachanhour.
KeyWords:
Digitalstopwatch;EDA;FPGA;VHDL;MAXPlusⅡ
引言
数字秒表是日常生活中比较常见的电子产品,其设计也是EDA技术中最基本的设计实验之一[1]。
当今社会是数字化的社会,是数字集成电路广泛应用的社会。
数字集成电路本身在不断进行更新换代,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。
系统设计师更愿意自己设计专业集成电路(ASIC)芯片,而且希望设计周期尽可能短,最好在实验室里就能设计出合适的ASIC芯片并且立即投入实际应用之中,因而出现了现场可编程器件[2](FPLD)。
现场可编程门阵列(FPGA)即属其中应用最广泛的一种。
超高速硬件描述语言VHDL,是对数字系统进行抽象的行为与功能描述到具体的内部线路结构描述,利用EDA工具可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可大大降低设计成本,缩短设计周期[3]。
本文介绍的数字秒表,利用基于VHDL的EDA设计工具,采用大规模可编程逻辑器件FPGA,通过设计芯片来实现系统功能。
给出了顶层电路图,和各模块的设计.增加了消除抖动的控制方法,消除了开关按键的机械抖动.通过编辑、编译和器件编程,并将编程器文件下载到SE-5型EDA实验开发板上[4],经实际电路测试验证,达到了预期的设计要求,显示结果准确无误。
⒈概述
在科技高度发展的今天,集成电路和计算机应用得到了高速发展。
尤其是计算机应用的发展。
它在人们日常生活已逐渐崭露头角。
大多数电子产品多是由计算机电路组成,如:
手机、mp3等。
而且将来的不久他们的身影将会更频繁的出现在我们身边。
各种家用电器多会实现微电脑技术。
电脑各部分在工作时多是一时间为基准的。
本文就是基于计算机电路的时钟脉冲信号、状态控制等原理设计出的数字秒表[1]。
秒表在很多领域充当一个重要的角色。
在各种比赛中对秒表的精确度要求很高,尤其是一些科学实验。
他们对时间精确度达到了几纳秒级别。
1.1设计要求
(1)能对0秒~59分59.99秒范围进行计时,显示最长时间是59分59秒;
(2)计时精度达到10ms;
(3)设计复位开关和启停开关,复位开关可以在任何情况下使用,使用以后计时器清零,并做好下一次计时的准备。
1.2数字秒表设计的目的
本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,对计算机系统中时钟控制系统进一步了解,掌握状态机工作原理,同时了解计算机时钟脉冲是怎么产生和工作的。
在掌握所学的计算机组成与结构课程理论知识时。
通过对数字秒表的设计,进行理论与实际的结合,提高与计算机有关设计能力,提高分析、解决计算机技术实际问题的能力。
通过课程设计深入理解计算机结构与控制实现的技术,达到课程设计的目标。
1.3EDA技术
EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作[5]。
目前EDA主要辅助进行三个方面的设计工作:
IC设计、电子电路设计和PCB设计。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求[6]。
1.4硬件描述语言——VHDL
1.4.1VHDL的简介
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
但是,由于它在一定程度上满足了当时的设计需求,于是他在1987年成为AI/IEEE的标准(IEEESTD1076-1987)。
1993年更进一步修订,变得更加完备,成为AI/IEEE的AI/IEEESTD1076-1993标准。
目前,大多数的CAD厂商出品的EDA软件都兼容了这种标准。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
1.4.2VHDL语言的特点
VHDL的程序结构特点是将一项工程设计,关于用VHDL和原理图输入进行CPLD/FPGA设计的粗略比较:
在设计中,如果采用原理图输入的设计方式是比较直观的。
你要设计的是什么,你就直接从库中调出来用就行了。
这样比较符合人们的习惯。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的[4]。
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
1.4.3VHDL的设计流程
它主要包括以下几个步骤:
(1)文本编辑:
用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。
通常VHDL文件保存为.vhd文件,Verilog文件保存为.v文件
(2)功能仿真:
将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真)
(3)逻辑综合:
将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式。
逻辑综合软件会生成.edf或.edif的EDA工业标准文件。
(4)布局布线:
将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放PLD/FPGA内。
(5)时序仿真:
需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。
(也叫后仿真)通常以上过程可以都在PLD/FPGA厂家提供的开发工具。
(6)器件编程
2.系统的设计流程
2.1设计规划
本系统设计采用自顶向下的设计方案,系统的整体组装设计原理图如图1所示,它主要由控制模块、时基分频模块,计时模块和显示模块四部分组成。
各模块分别完成计时过程的控制功能、计时功能与显示功能。
图1系统组成图
图2系统设计框图
如图2所示,计时控制器的作用是控制计时。
计时控制器的输入信号是启动,暂停和清零。
为符合惯例,将启动和暂停功能设置在同一个按键上,按一次是启动,按第二次是暂停,按第三次是继续。
所以计时控制器共有2个开关输入信号,即启动/暂停和清零信号。
计时电路的输入信号为4o96HZ时钟、计数允许,保持和清零信号,输出为IOMS、10OMS、S和MIN的计时数据。
时基分频器是一个41分频器,产生10MS周期的脉冲.用于计时电路时钟信号。
显示电路为动态扫描电路。
用以显示十分位、MIN、10S、S、lOOMS和1OMS信号。
2.2系统的原理图及各模块的程序
图3系统的整体组装设计原理图
设计由控制模块、时基分频模块,计时模块和显示模块四部分组成。
各模块实现秒表不同的功能[7]。
图3就是整个系统原理图。
2.2.1控制模块
计时模块的作用是针对计时过程进行控制。
计时控制模块可用俩个按钮来完成秒表的启动、停止和复位。
部分源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycontrolis
port(clk,start:
instd_logic;
startstop,clks:
outstd_logic);
endcontrol;
architectureaaofcontrolis
signalsstart,asstart:
std_logic;
signalcount:
std_logic_vector(3downto0);——声明结构体所用的内部信号及数据类型
begin
clk_label:
PROCESS(clk)——进程(敏感表)
BEGIN
IFclk'eventandclk='1'THEN——表示时钟的上升沿
ifcount="1001"thencount<="0000";elsecount<=count+1;endif;
sstart<=start;——同步置数
ENDIF;
ENDPROCESSclk_label;
clkss_label:
PROCESS(sstart)
BEGIN
IFsstart'eventandsstart='1'THEN
asstart<=notasstart;
ENDIF;——产生10ms周期的脉冲,用于计时电路时钟信号
ENDPROCESSclkss_label;
startstop<=asstart;
clks<=count(3);
endaa;
2.2.2时基分频模块
时基分频模块的作用把输入时钟信号变为分频输出信号。
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCB10IS
PORT(CLK:
INSTD_LOGIC;
CO:
OUTSTD_LOGIC);
ENDCB10;
ARCHITECTUREARTOFCB10IS
SIGNALCOUNT:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFRISING_EDGE(CLK)THEN
IFCOUNT="1001"THEN
COUNT<="0000";
CO<='1';
ELSE
COUNT<=COUNT+1;
CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDART;
2.2.3时模块
计时模块执行计时功能,计时方法和计算机一样是对标准时钟脉冲计数[9]。
他是由四个十进制计数器和俩个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器[10]。
源程序:
①十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCDU10IS
PORT(CLK:
INSTD_LOGIC;
CLR,EN:
INSTD_LOGIC;
CN:
OUTSTD_LOGIC;
COUNT10:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCDU10;
……………………………………
……………………………………
ENDIF;
ENDIF;
ENDPROCESS;
ENDART;
②六进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCDU6IS
…………………………………
…………………………………
ENDIF;
ENDIF;
ENDPROCESS;
ENDART;
③计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCOUNTIS
………………………………
………………………………
ENDART;
2.2.4显示模块
计时显示电路的作用是将计时值在LED数码管上显示出来。
计时电路产生的值经过BCD七段译码后,驱动LED数码管。
计时显示电路的实现方案采用扫描显示[8]。
部分源程序:
①数据选择器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYMULXIS
PORT(CLK,CLR,EN:
INSTD_LOGIC;
S_1MS:
INSTD_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);
M_1MIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
M_10MIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
HOUR:
INSTD_LOGIC_VECTOR(3DOWNTO0);
OUTBCD:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SEG:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDMULX;
ARCHITECTUREARTOFMULXIS
SIGNALCOUNT:
STD_LOGIC_VECTOR(3DOWNTO0);
………………………………
………………………………
ENDCASE;
ENDIF;
ENDPROCESS;
ENDART;
②BCD七段译码器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYBCD7IS
PORT(
BCD:
INSTD_LOGIC_VECTOR(3DOWNTO0);
LED:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDBCD7;
ARCHITECTUREARTOFBCD7IS
BEGIN
LED<="1111110"WHENBCD="0000"ELSE
"0110000"WHENBCD="0001"ELSE
"1101101"WHENBCD="0010"ELSE
"1111001"WHENBCD="0011"ELSE
"0110011"WHENBCD="0100"ELSE
"1011011"WHENBCD="0101"ELSE
"1011111"WHENBCD="0110"ELSE
"1110000"WHENBCD="0111"ELSE
"1111111"WHENBCD="1000"ELSE
"1111011"WHENBCD="1001"ELSE
"0000000";
ENDART;
3.系统仿真
(1)时基分频模块的仿真(如图4示)
图4基分频模块的仿真
分析:
CLK为时钟信号的输入,CO为分频输出信号。
(2)控制模块的仿真(如图5示)
图5制模块的仿真
分析:
CLK、CLR和SP为输入信号,EN为输出信号。
(3)计时电路模块的仿真(如图6~图8示)
a、十进制计数器的仿真(如图6示)
b、六进制计数器的仿真(如图7示)
c、计数器的仿真(如图8)
图6进制计数器的仿真
图7进制计数器的仿真图
图8计数器的仿真图
分析:
clk为时钟脉冲脉冲,s_1ms是毫秒计数值,s_10ms是十毫秒计数器,s_100ms是百毫秒计数器,s_1s是秒计数器,s_10s是十秒计数器,m_1min是分计数器,s_10min是十分计数器,hour是小时计数器。
它们均为输入信号。
每来两个时钟脉冲,s_1ms加1,当s_1ms满十时,s_10ms加1,依次类推,s_10ms满十的时候,s_100ms加1等等作为输出[11]。
(4)显示电路模块的仿真(如图9~图10所示)
a、数据选择器的仿真(如图9所示)
b、BCD七段译码器驱动器的仿真(如图10所示)
图9数据选择器的仿真图
图10BCD七段译码器的仿真图
分析:
bcd为时钟脉冲输入信号,led是输出信号,如图所示:
当输出为“1111110”时候,输入为“0000”;当输出为“0110000”时输入“0001”,当输入为“0010”时输出为“1101101”,当输入为“0011”时输出为“1111001”等等来实现七段译码功能[12]。
(5)数字秒表整个系统的仿真(如图11所示)
图11数字秒表起始工作的仿真图状态仿真图
分析:
秒表开始从零开始计数,每次增加10ms。
工作很正常的进行。
⒋硬件电路的设计与调试
本系统的主要逻辑设计由一片EPF10K10LC84-4芯片完成,编写的VHDL源程序在Altera公司的逻辑综合工具Max+PlusⅡ下经过编译和功能仿真测试后,针对下载芯片进行管脚配置,下载到EPF10K10LC84-4芯片中,进行相应的硬件调试,调试结果与软件仿真的结果相吻合,验证了设计完成了预定功能[13]。
根据需求选择电路的设计单元进行组合,完成系统的原理图设计与PCB设计,对制作好的PCB板,或准备好的面包板,按照装配图或原理图进行器件装配,装配好之后再进行电路的调试。
4.1PCB板制作
本设计的PCB电路板通过Protel99来完成。
首先创建扩展名为DDB的设计文件,打开Document文挡新建Schematicdocument文件,在此文件里面画出本设计的各模块电路图,添好元器件的封装,生成网络表。
然后在Document文挡新建PCBdocument文件,装载网络表。
装载网络表完成后将各元器件重新布局,让图中的交叉线尽可能的少,以免布线时出现过多的交叉线。
重新布置元件位置后,根据需要修改布线参数。
根据制作的难易程度一般在元器件少的情况下选择单面PCB板,因为元器件少时单面板布线的成功率高,易于腐蚀和焊接,本设计的电路图不是很复杂,且采用了分模块设计,故均采用单面PCB板。
另一个需要修改的参数是PCB板的线宽。
线宽的选择很重要,线宽太细在腐蚀时易出断线,线宽太宽需要的板子面积就大,这样浪费材料,不经济。
线宽一般选择在0.5mm~2mm之间。
本设计的线宽除地线和电源线以外,均采用0.8mm线宽,最终效果很好[14]。
PCB板本身的基板是由绝缘隔热、且不易弯曲的材料所制作成。
在表面可以看到的细小线路材料是铜箔,原本铜箔是覆盖在整个PCB板上的,而在制造过程中部分被腐蚀处理掉,留下来的部分就变成网状的细小线路了。
这些线路被称作导线或称布线,并用来提供PCB板上零件的电路连接。
通常PCB板的颜色都是绿色或是棕色,这是阻焊漆的颜色。
是绝缘的防护层,可以保护铜线,也可以防止零件被焊到不正确的地方。
在布局时首先要考虑的一个因素就是电性能,把连线关系密切的元器件尽量的放在一起,尤其对一些高速线,布局时就要使它尽可能地短,功率信号和小信号器件要分开。
在满足电路性能的前提下,还要考虑元器件摆放整齐、美观,便于测试,板子的机械尺寸,插座的位置等也需认真考虑。
所有平行信号线之间要尽量留有较大的间隔,以减少串扰。
如果有两条相距较近的信号线,最好在两线之间走一条接地线,这样可以起到屏蔽作用。
设计信号传输线时要避免急拐弯,以防传输线特性阻抗的突变而产生反射,要尽量设计成具有一定尺寸的均匀的圆弧线。
PCB板布线完成后即用转印纸将所有的板层打印出来。
将选好的PCB板除污后用转印机将转印纸上的碳迹转印到PCB板上。
转印完成后检查转印的碳迹是否有断线,若有则用