出租车计价器.docx
《出租车计价器.docx》由会员分享,可在线阅读,更多相关《出租车计价器.docx(19页珍藏版)》请在冰豆网上搜索。
出租车计价器
出租车计价器课程设计
学生姓名:
专业:
班级:
学号:
初始条件:
本设计利用QuartusⅡ软件编写VHDL代码,运用EDA实验板上的FPGA、数码管、点阵模块、按键、拨码开关等硬件资源,实现简易的出租车计价器的相关功能。
要求完成的主要任务:
1.课程设计工作量:
4次课。
2.技术要求:
(1)基本要求:
1 行驶公里:
用时钟2秒钟表示出租车匀速行驶1公里,在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。
燃油附加费为每运次1元。
途中等待:
用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后每等待3秒钟加收1元。
2 用数码管分时显示计费金额、行驶里程和等候时间。
字母A表示当前处于显示计费金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等候时间状态。
3 用按键控制出租车空驶、载客状态并用点阵显示空驶、载客状态。
(2)提高要求:
1 用点阵滚动显示收费单据。
2 具有夜间模式,基本单价加收20%的费用。
出租汽车收费结算以元为单位,元以下四舍五入。
3 出租车行驶速度可调可控。
4 多人乘车,分段计价。
5 自拟其它功能。
摘要
本文介绍了一种采用单片FPGA芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。
本设计实现了出租车计费器所需的一些基本功能,计费包括起步价、行车里程计费、等待时间计费,同时考虑到出租车行业的一些特殊性,更注重了把一些新的思路加入到设计中。
主要包括采用了FPGA芯片,使用VHDL语言进行编程,使其具有了更强的移植性,更加利于产品升级。
关键词:
VHDL;计费器;QuartusⅡ;FPGA
Abstract
ThispaperdescribestheuseofasinglechipFPGAforthedesignofaccounting-feemachine,mainlyonhowtousetheemergingEDAelectronicdevicesdesignedtoreplacetraditionalmethods,usingtheprogrammableFPGA,conciseandchangingthedesignWaystoshortenthedevelopmentcycle,sothattaxiaccounting-feemachineinasmallermorepowerful.Thedesignandimplementationofthetaxiaccounting-feemachineforsomebasicfunctions,includingbillingstartingprice,drivingmetered,thewaitingtimebilling,takingintoaccountthespecialnatureofsomeofthetaxiindustry,topaymoreattentiontoanumberofnewIdeasintothedesign.MainlyincludingtheuseoftheFPGAchip,theuseofVHDLprogramming,soastomakeitastrongertransplanted,andmoreconducivetoproductupgrades.
Keywords:
VHDL,accounting-feemachine,QuartusⅡ,FPGA
1.绪论
人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。
现代电子产品在性能提高、复杂度降低的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要原因就是生产制造技术和电子设计技术的发展。
前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数万个晶体管;后者的核心就是EDA技术[1]。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必须对EDA技术提出新要求。
EDA代表了当今电子设计技术的最新发展方向,它的基本特征是:
设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成电路(ASIC)实现,然后采用硬件描述语言(VHDL)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件[2]。
可编程逻辑器件自20世纪70年代以来,经历了PAL、GAL、CPLD、FPGA几个发展阶段,其中CPLD、FPGA属高密度可编程逻辑器件,目前集成度以高达200万门/片,它将掩膜ASIC集成度高的优点和可编程逻辑器件设计生产方便的特点结合在一起,特别适合于样品研制和小批量产品开发,使产品能以最快的速度上市,而当市场扩大时,它可以和容易地转由ASIC实现,因此开发风险也大为降低。
CPLD/FPGA器件已成为现代高层次电子设计方法的实现载体[3]。
VHDL是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持结构、数据流和行为3种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件描述语言的功能,整个自顶向下或自底向上的电路设计过程都可以用VHDL来完成[4]。
另外,VHDL还有以下优点:
VHDL的宽范围描述能力使它成为高层次设计的核心,将设计人员的工作重心转移到了系统功能的实现和调试上,只需要花较少的精力用于物理实现;VHDL可以用简洁明确的代码描述来进行复杂控制逻辑的设计,灵活且方便,而且也便于设计结果的交流、保存和重用;VHDL的设计不依赖于特定的器件,方便了工艺的转换。
VHDL是一个标准语言,为众多的EDA场上支持,因此移植性好[5]。
2.设计内容及要求
2.1.设计的目的及主要任务
2.1.1.设计的目的
①学会在QuartusⅡ环境中运用VHDL语言设计方法构建具有一定逻辑功能的模块,并能运用图形设计方法完成顶层原理图的设计。
②掌握出租车自动计费器的主要功能与在FPGA中的实现方法。
2.1.2.设计任务及主要技术指标
①设计一个出租车计价器。
要求显示行驶里程、停车时间和计费值:
用时钟2秒钟表示出租车匀速行驶1公里,在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。
燃油附加费为每运次1元。
途中等待:
用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后每等待3秒钟加收1元。
②运用QuartusⅡ软件中的仿真功能对所设计的出租车自动计费器的各个模块及顶层电路的功能进行仿真分析。
③将所设计的整个系统写入FPGA器件中,加上需要的外围电路在实验箱上实现整个系统的硬件搭建。
2.2.设计思想
本次设计首先在QuartusⅡ环境中对出租车自动计费器的各个部分利用VHDL这一硬件描述语言予以设计,生成模块。
主要有:
运算控制模块、分频器、显示模块这三大部分组成。
由顶层模块协调控制完成设计任务。
3.设计原理与仿真结果
3.1.设计原理及方法
出租车自动计费器系统流程图
本次设计首先在QuartusⅡ环境中对出租车自动计费器的各个部分利用VHDL这一硬件描述语言予以设计,进行仿真,然后编写顶层模块将各个模块连接,并对相互之间的信号进行必要处理,从而实现整机功能,最后在实验板上进行物理测试,寻找漏洞、调整参数,最终确定设计。
3.2.单元模块设计
3.2.1.分频器模块设计
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpinqiIS
PORT(clk:
INSTD_LOGIC;
clk1,clk2,clk3:
OUTSTD_LOGIC);
ENDfenpinqi;
ARCHITECTUREbehaveOFfenpinqiIS
SIGNALtemp1,temp2,temp3:
STD_LOGIC;
BEGIN
p1:
PROCESS(clk)
variablecount1:
integer:
=0;--2000HZ分频,用于数码管扫描显示
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount1=12499THEN
count1:
=0;
temp1<=nottemp1;
ELSE
count1:
=count1+1;
ENDIF;
clk1<=temp1;
ENDIF;
ENDPROCESSp1;
p2:
process(clk)
variablecount2:
integer:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN--1Hz分频,用于等待时间计算
IFcount2=24999999THEN
count2:
=0;
temp2<=nottemp2;
ELSE
count2:
=count2+1;
ENDIF;
clk2<=temp2;
ENDIF;
ENDPROCESSp2;
p3:
process(clk)
variablecount3:
integer:
=0;
BEGIN
IFclk'EVENTANDclk='1'THEN--0.5Hz分频,用于里程计算
IFcount3=49999999THEN
count3:
=0;
temp3<=nottemp3;
ELSE
count3:
=count3+1;
ENDIF;
clk3<=temp3;
ENDIF;
ENDPROCESSp3;
ENDbehave;
模块儿实现:
仿真实现:
3.2.2.计价器模块设计
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYjijiaIS
PORT(clk2,clk3,rst:
INSTD_LOGIC;
btn1,btn2,btn3:
INSTD_LOGIC;
mile,pause,price:
outintegerrange0to99);
endjijia;
ARCHITECTUREbehaveOFjijiaIS
signalmile_out,pause_out,price_out:
integerrange0to99:
=0;
signali:
integerrange0to1;
signalj:
integerrange0to1;
begin
p1:
PROCESS(rst,btn1,btn2,btn3)--中间变量赋值
begin
ifrst='0'then
i<=0;
j<=0;
else
ifbtn1'eventandbtn1='1'then
i<=1;
j<=0;
endif;
ifbtn2='1'then
i<=0;
j<=1;
endif;
ifbtn3='1'then
i<=0;
j<=0;
endif;
endif;
endprocessp1;
p2:
process(rst,clk3,i)--计算里程
begin
ifrst='0'then
mile_out<=0;
else
ifrst='1'then
ifclk3'eventandclk3='1'then
ifi=1then
mile_out<=mile_out+1;
endif;
endif;
endif;
endif;
mile<=mile_out;
endprocessp2;
p3:
process(rst,clk2,j)--计算等待时间
begin
ifrst='0'then
pause_out<=0;
else
ifrst='1'then
ifclk2'eventandclk2='1'then
ifj=1then
pause_out<=pause_out+1;
endif;
endif;
endif;
endif;
pause<=pause_out;
endprocessp3;
p4:
process(rst,mile_out,pause_out)--总费用的结算
begin
ifrst='0'then
price_out<=0;
endif;
ifrst='1'then
ifmile_out<=5andpause_out<=5then
price_out<=14;
endif;
ifmile_out>5andpause_out<=5then
price_out<=14+(mile_out-5)*2;
endif;
ifmile_out<=5andpause_out>5then
price_out<=14+(pause_out-5)/3;
endif;
ifmile_out>5andpause_out>5then
price_out<=14+(mile_out-5)*2+(pause_out-5)/3;
endif;
endif;
price<=price_out;
endprocessp4;
endbehave;
模块儿实现:
仿真实现:
3.2.3.显示模块设计
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityxianshiis
port
(clk1,rst:
instd_logic;
mile,price,pause:
inintegerrange0to99;
smg:
outstd_logic_vector(6downto0);--数码管7段显示
cat:
outstd_logic_vector(5downto0));--数码管地址
endxianshi;
architecturebehaveofxianshiis
signall:
integerrange0to5;--用于调整扫描显示的中间量
begin
p1:
process(clk1,price,mile,pause)--数码管扫描显示
begin
ifrst='0'then
cat<="111111";
l<=0;
else
ifclk1'eventandclk1='1'then
ifl=5then
l<=0;
else
l<=l+1;
endif;
endif;
caselis
when0=>cat<="101111";
casemilemod10is--显示里程个位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
when1=>cat<="011111";
case(mile-milemod10)/10is--显示里程十位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
when2=>cat<="111011";
casepausemod10is--显示等待时间个位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
when3=>cat<="110111";
case(pause-pausemod10)/10is--显示等待时间十位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
when4=>cat<="111110";
casepricemod10is--显示费用个位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
when5=>cat<="111101";
case(price-pricemod10)/10is--显示费用十位
when0=>smg<="0111111";
when1=>smg<="0000110";
when2=>smg<="1011011";
when3=>smg<="1001111";
when4=>smg<="1100110";
when5=>smg<="1101101";
when6=>smg<="1111101";
when7=>smg<="0000111";
when8=>smg<="1111111";
when9=>smg<="1101111";
whenothers=>smg<="0000000";
endcase;
whenothers=>cat<="111111";
endcase;
endif;
endprocessp1;
endbehave;
模块儿实现:
仿真实现:
3.2.4.点阵模块设计
程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdianzhenIS
PORT(clk1,rst:
INSTD_LOGIC;
rowout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
colout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDdianzhen;
ARCHITECTUREbehaveOFdianzhenIS
SIGNALrow:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALcol:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALcnt:
INTEGERRANGE0TO7;
BEGIN
p1:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(cnt=7)THENcnt<=0;
ELSE
cnt<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
p2:
PROCESS(cnt)
BEGIN
IF(rst='0')THEN
CASEcntIS
WHEN7=>row<="01111111";col<="00000000";
WHEN0=>row<="10111111";col<="01111110";
WHEN1=>row<="11011111";col<="01111110";
WHEN2=>row<="11101111";col<="01111110";
WHEN3=>row<="11110111";col<="01111110";
WHEN4=>row<="11111011";col<="01111110";
WHEN5=>row<="11