eda.docx
《eda.docx》由会员分享,可在线阅读,更多相关《eda.docx(29页珍藏版)》请在冰豆网上搜索。
![eda.docx](https://file1.bdocx.com/fileroot1/2023-2/23/6585056a-74f5-4c34-aedc-48ba9a725787/6585056a-74f5-4c34-aedc-48ba9a7257871.gif)
eda
河南商业高等专科学校
毕业论文
题 目 VHDL的出租车计费器设计
学 号 08040202035班 级 08电子2班
专 业 应用电子技术系 别 计算机系
作者姓名 李静芝 完成时间 2011/5/16
指导教师 孙汉卿 职 称 助教
VHDL的出租车计费器设计
摘要
本文介绍了一种采用单片FPGA芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。
本设计不仅实现了出租车计费器所需的一些基本功能,同时考虑到出租车行业的一些特殊性,更注重了把一些新的思路加入到设计中。
主要包括采用了FPGA芯片,使用VHDL语言进行编程,使其具有了更强的移植性,更加利于产品升级;灵活的计价标准设定使得油价波动等成本因数和出租车价格联动成为可能;从而使得设计更加具有使用价值。
【关键词】出租车计费器FPGAVHDLQuartusⅡ
目录
引言1
一、VHDL的出租车计费器的设计背景1
二、FPGA、VHDL的介绍2
(一)FPGA的介绍2
(二)VHDL介绍3
三、VHDL的出租车计费器设计的主要实现功能及要求3
(一)实现功能3
(二)设计要求4
四、VHDL的出租车计费器设计的主要内容4
(一)计费器的工作原理4
(二)计费器的设计内容5
五、系统的仿真结果15
(一)QuartusII的介绍15
(二)验证结果16
1.模块speed的结果验证16
2.模块sout的结果验证16
3.模块fp的结果验证17
4.模块counter的结果验证17
5.模块scan_led的结果验证17
6.模块taxi的结果验证18
六、结果分析18
七、设计小结19
参考文献20
致谢21
引言
随着出租车行业的发展,对出租车计费器的要求也越来越高,不仅要求计费器性能稳定、计费准确、有反作弊功能,同时还要求有车票资料打印、IC卡付费、语音报话和电脑串行通信等功能,而这些与电子技术的发展是分不开的。
二十一世纪后半期,随着集成电路和计算机技术的飞速发展,数字系统也得到了很大的发展。
其实现方法经历了由分立原件到整体原件的过程。
同时为了提高可靠性和通用性,微处理器和专业集成电路(ASIC)逐渐取代了通用全硬件LST电路,而ASIC以其体重小,重量轻,功耗低,速度快,成本低,保密性好而脱颖而出。
基于计算机技术的面向用户的低成本,大规模ASIC设计的技术的到了广泛的应用。
目前,业界大量可编程器件(PLD),尤其是现场可编程器件(FPGA)被大量的应用在ASIC的制作当中。
在可编程集成电路的开发中,以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术最新成果的电子设计自动化(EDA)技术主要能辅助进行三方面的设计工作:
IC设计,电子电路设计及PCB设计。
理想的可编程逻辑开发系统能符合大量的设计要求:
它能够支持不同的结构器件,在多种平台运行,提供易于使用的界面,并且有广泛的特征。
此外,一个设计系统能给设计师提供充分自由的设计输入方法和设计工具的选择。
随着城市建设日益加快,象征着城市面貌的出租车行业加速发展,计费器的普及也毫无疑问,所以未来汽车计费器的市场是十分有潜力的。
一、VHDL的出租车计费器的设计背景
几年来,出租车行业发展迅速,全国大大小小的出租车公司己有数千家,基于出租车的附属品市场前景也是十分广阔。
传统的出租车计费器大多是有单片机实现的,发展实用也是十几年了,在稳定性、成本、制造工艺、使用习惯等方面都具有一定的优势,但在运营工程中系统不是很稳定,容易造成死机的现象。
传统的计费器的不足点:
1.产品更新周期长:
传统的计费器利用微控器,大部分功能依靠单片机实现。
但单片机程序不通用,不同芯片指令集不同,因此设计研发比较困难,周期很长。
2.计价方式不灵活:
每次计价标准修改都需要重新烧录芯片,使得每次价格调整都成为很费力的事情,很难适应社会的发展需要。
本设计基于FPGA的出租车计费器主要有Altera公司的CycloneⅡ型系列芯片EPC2C35F672C8及一些外部控制电路组成。
使用软件QuartusⅡ和超高硬件描述语言VHDL来实现计价标准灵活设定。
FPGA在电子设计领域中价格低廉,有良好的发展趋势,它的出现必定会占领大部分数字器件市场。
二、FPGA、VHDL的介绍
(一)FPGA的介绍
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点
1.FPGA的特点
(1)采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。
(2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
(3)FPGA内部有丰富的触发器和I/O引脚。
(4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
(5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。
用户可以根据不同的配置模式,采用不同的编程方式。
2.FPGA的发展状况与前景
目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。
一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA所具有的无限次可重复编程能力,灵活的体系结构,丰富的触发器及布线资源等一系列的特点使得它可以满足电子产品设计的多种需求。
FPGA的应用领域主要集中在替换通用逻辑和复杂逻辑、重复编程使用、板极设计集成、高速计数器、加减法器、累加器和比较器的实现、总线接口逻辑等方面。
基于EDA技术的现场可编程门阵列FPGA集成度高,结构灵活,设计方法多样,开发周期短,调试方便,修改容易,应用领域极为广泛。
面对科学技术高速发展、市场竞争十分激烈的现实,熟练的掌握EDA设计技术,灵活巧妙的使用FPGA至关重要,其前景将是十分乐观的。
(二)VHDL介绍
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
1.与其他硬件描述语言相比,VHDL具有以下特点:
(1)功能强大、设计灵活强大的系统硬件描述能力
(2)独立于器件的设计、与工艺无关
(3)很强的移植能力
(4)易于共享和复用
(5)支持广泛、易于修改
2.VHDL的优势:
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
三、VHDL的出租车计费器设计的主要实现功能及要求
(一)该计费器的功能
1.实现计费功能
2.预置功能:
能预置起步费,每公里收费,车行加费里程。
3.显示功能:
将车费及里程用数码管显示出来。
4.模拟功能:
模拟汽车启动,停止,车速等状态。
(二)设计参数
1.按行驶里程计费,起步价为2公里10.00元,超过3公里时按照2元/公里计费,当计费器达到或者超过20.00元时,按3元/公里计费
2.车停止不计费。
3.路费(显示精度0.1元)和车程(显示精度为0.1公里)用数码管显示出来,各有两位小数。
4.要求用VHDL语言实现功能,并用QuartusII软件完成仿真,设计的系统用FPGA器件进行下载测试。
四、VHDL的出租车计费器设计的主要内容
(一)计费器的工作原理:
基于FPGA的出租车计费是外部输入模块,车速控制模块和显示模块(计费和里程显示)三部分组成,其中车速控制模块是整个系统的核心。
如图1是系统顶层框图
车速选择
起/停开关
基本速率
reset
显示输出
图1系统顶层框图显示输出
计费器按里程收费,每100米开始一次计费,各功能如下:
1.车速控制模块
当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
2.里程动态显示模块
其包括计数车速控制模块发出的脉冲以及将计数显示状态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
3.计费动态显示模块
起初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示状态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时,数值加1.5元。
(二)计费器的设计内容
根据出租车的计费原理,将出租车计费器由五部分实现,分别为speed模块、sout模块、fp模块、counter模块、scan_led模块。
其中,speed模块用来模拟汽车的加速与匀速状态;sout模块用来实现车行状态输出;fp模块实现时钟的分频功能;counter模块用来模拟计费显示;scan_led模块实现显示车费功能。
通过分析各模块的功能,使用VHDL编程语言设计计费系统,以QuartusII软件为开发平台,设计出了出租车计费器的系统程序,最后进行仿真来验证设计结果。
1.如图2是出租车计费器的电路原理图
图2出租车计费器电路原理图
顶层图的程序如下:
libraryieee;
useieee.std_logic_1164.all;
entitytaxiis
port(t_clk0:
instd_logic;
t_clk1:
instd_logic;
t_clk2:
instd_logic;
t_js:
instd_logic;
t_enable:
instd_logic;
t_clr:
instd_logic;
t_sto:
instd_logic;
t_bt:
outstd_logic_vector(2downto0);
t_sg:
outstd_logic_vector(6downto0));
endtaxi;
architecturestrucoftaxiis
componentspeed
port(ck0:
instd_logic;
ck1:
instd_logic;
js:
instd_logic;
clk_out:
outstd_logic);
endcomponent;
componentsout
port(clk:
instd_logic;
enable:
instd_logic;
sto:
instd_logic;
clr:
instd_logic;
st:
outstd_logic_vector(1downto0));
endcomponent;
componentfp
port(clk0:
instd_logic;
four:
outstd_logic);
endcomponent;
componentcounter
port(clk_div:
instd_logic;
clr1:
instd_logic;
si:
instd_logic_vector(1downto0);
c1:
outstd_logic_vector(3downto0);
c2:
outstd_logic_vector(3downto0);
c3:
outstd_logic_vector(3downto0));
endcomponent;
componentscan_led
port(di1:
outstd_logic_vector(3downto0);
di2:
outstd_logic_vector(3downto0);
di3:
outstd_logic_vector(3downto0);
clk2:
instd_logic;
sg:
outstd_logic_vector(6downto0);
bt:
outstd_logic_vector(2downto0));
endcomponent;
singall_clk:
std_logic;
singall_four:
std_logic;
singall_st:
std_logic_vector(1downto0);
singall_c1:
std_logic_vector(3downto0);
singall_c2:
std_logic_vector(3downto0);
singall_c3:
std_logic_vector(3downto0);
begin
u0:
speedportmap(ck0=>t_clk0,ck1=>t_clk1,js=>t_js,clk_out=>l_clk);
u1:
sout
portmap(clk=>l_clk,enable=>t_enable,clr=>t_clr,sto=>t_sto,st=>l_st);
u2:
fpportmap(clk0=>l_clk,four=>l_four);
u3:
counter
portmap(clr1=>t_clr,si=>l_st,clk_div=>l_four,c3=>l_c3,c2=>l_c2,c1=>L_c1);
u4:
scan_led
portmap(clk2=>t_clk2,di3=>l_c3,di2=>l_c2,di1=>l_c1,bt=>t_bt,sg_t_sg);
endstruc;
endone;
2.模块speed的实现(如图3所示)
图3speed模块
模块speed,输入端口ck0、ck1为两个不同的时钟信号,来模拟汽车的加速和匀速,js为加速按键。
该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
entityspeedis
port(ck0:
instd_logic;//慢速档的时钟信号
ck1:
instd_logic;//时钟信号
js:
instd_logic;//按键信号
clk_out:
outstd_logic);
endspeed;
architectureoneofspeedis
begin
process(js,ck0,ck1)
begin
ifjs='0'thenclk_out<=ck0;//js低电平,则为慢速档
elseclk_out<=ck1;
endif;
endprocess;
endone;
3.模块sout的实现(如图4所示)
图4sout模块
该模块实现车行状态输出功能,其中clk为时钟信号,enable为启动使能信号,sto为暂停信号,clr为清零信号,st为状态信号。
该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysoutis
port(clk:
instd_logic;
enable:
instd_logic;
sto:
instd_logic;
clr:
instd_logic;
st:
outstd_logic_vector(1downto0));
endsout;
architectureoneofsoutis
begin
process(clk,enable,sto,clr)
variablecqi:
std_logic_vector(7downto0);
variablestate:
std_logic_vector(1downto0);
begin
ifclr='0'thencqi:
=(others=>'0');//clr低电平,cqi清零
elsifclk'eventandclk='1'then//clk上升沿触发
ifsto='1'thenstate:
="00";cqi:
=cqi;//sto高电平时,state赋00态
elsifenable='1'then//enable高电平,cqi计数加1
cqi:
=cqi+1;
ifcqi<=30thenstate:
="01";//cqi<=30时,state赋01态
elsifcqi>30andcqi<=80thenstate:
="10";//30else
state:
="11";//cqi>80时,state赋11态
endif;
endif;
endif;
st<=state;
endprocess;
end
图5fp模块
4.模块fp的实现(如图5所示)
该模块实现将时钟信号5分频功能。
该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfpis
port(clk0:
instd_logic;
four:
outstd_logic);
endfp;
architectureoneoffpis
begin
process(clk0)
variablecnt:
std_logic_vector(2downto0);
variablefull:
std_logic;
begin
ifclk0'eventandclk0='1'then
ifcnt="100"then//cnt计数到5(“100”)
cnt:
="000";//cnt清零
full:
='1';//full高电平
else
cnt:
=cnt+1;//否则计数cnt加1
full:
='0';//cnt赋低电平
endif;
endif;
four<=full;//full为clk的五分频信号,赋值给four做输出信号
endprocess;
endone;
5.模块counter的结果验证(如图6所示)
图6counter模块
实现汽车模拟计费功能:
clr1为清零信号,si为状态信号,c1,c2,c3分别为费用的显示
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycounteris
port(clk_div:
instd_logic;
clr1:
instd_logic;
si:
instd_logic_vector(1downto0);
c1:
outstd_logic_vector(3downto0);
c2:
outstd_logic_vector(3downto0);
c3:
outstd_logic_vector(3downto0));
endcounter;
architectureoneofcounteris
begin
process(clk_div,clr1,si)
variableq1:
std_logic_vector(3downto0);
variableq2:
std_logic_vector(3downto0);
variableq3:
std_logic_vector(3downto0);
begin
ifclr1='0'thenq1:
="0000";q2:
="0000";q3:
="0000";//clr低电平,清零
elsifclk_div'eventandclk_div='1'then//clk_div上升沿触发
casesiis//si:
“00”表示计费值停止,“01”计费清零,设置为起步价10元,“10”正常计费,每公里1元,“11”超过20元后,每公里1.5元;
when"00"=>q1:
=q1;q2:
=q2;q3:
=q3;
when"01"=>q1:
="0000";q2:
="0000";q3:
="0001";//起步价10元
when"10"=>ifq2<"1001"then
q2:
=q2+1;
else
q2:
="0000";
ifq3<"1001"then
q3:
=q3+1;
endif;
endif;
q1:
="0000";
when"11"=>ifq1<"0101"then
q1:
=q1+5;
else
q1:
="0000";
endif;
ifq1="0101"then
ifq2<"1001"then
q2:
=q2+1;
else
q2:
="0000";
ifq3<"1001"then
q3:
=q3+1;
endif;
endif;
else
ifq2<"1001"