出租车计费器设计报告.docx
《出租车计费器设计报告.docx》由会员分享,可在线阅读,更多相关《出租车计费器设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
出租车计费器设计报告
摘要
为了克服出租车计费系统传统设计方法的弊端,介绍了基于FPGA的出租车计费器设计的一般思路和方法。
本系统是利用VHDL语言、PLD设计基于FPGA的出租车计费系统,选用ALTERA公司低功耗、低成本、高性能的FPGA芯片EPF10K10,以MAX+PLUSⅡ软件作为开发平台,设计了出租车计费器系统程序并进行了编译,功能仿真和下载。
使其实现计费以及预置和模拟汽车启动、加速、停止、暂停等功能,并动态扫描显示车费数目。
将计费器分成计费电路模块,数据转换模块,动态扫描模块,选择信号模块,显示模块,译码模块进行模拟仿真设计加以实现。
运用顶层设计思路设计好各个底层文件对各个底层文件进行功能仿真,并用文本方法来实现顶层文件的设计,对顶层文件进行功能仿真,并把顶层文件下载到实验箱的FPGA加以硬件分析。
关键词:
出租车计费器;计数器;VHDL语言;MAX+PLUSⅡ;FPGA;
目录
1方案比较与选择(须详细阐述创新点或新见解)1
2底层文件仿真与分析5
2.1底层文件仿真5
2.2底层文件分析5
3顶层文件仿真与分析8
3.1顶层文件仿真8
3.2顶层文件分析8
4硬件验证分析9
5课程设计心得10
Abstract11
参考文献12
附录(源代码)
1.方案比较与选择
方案选择对比:
方案—:
原理框图:
分析:
1、分频模块:
假设车轮每转一圈为2米,送一个脉冲,则需要50分频(共100米),同理,若知道车轮直径,即可算出分频比
2、里程模块:
每一百米记一次数,最大可以计999.9公里,精确到0.1公里。
3、取整模块:
现实中出租车的精确度为0.1公里,计算价格的时候不足一公里的按一公里算,所以加了这一个模块,输出的是计算价格时的里程数。
4、计费模块:
按行驶里程收费,起步费为7.0元,在车行3公里后再按2.2元/公里,车行9公里后按3.3元/公里,车停止不计费。
5、显示模块:
通过动态扫描显示车费和里程数,将十进制数转化为四位十进制数(如将9999转化为四个9)以方便显示
方案二:
1.原理框图:
图表2方案2的原理框图
2.分析:
如(图表2方案2的原理框图)
(1)计程车在不同的路程阶段都有不同的算法。
每来一次时钟边沿,计程车走10米,再根据计程车费用算发算出相应的路费。
再把十进制的路费和路程通过转换模块转换成四位二进制BCD码。
(2)通过一个通道选择,把要显示出来的二进制BCD码数据输入译码模块,完成了一个动态选择数码管。
注意的是:
通道选择的时钟CLK1要比CLK2大的很多。
一般来说几千赫兹〈CLK1〈12MHZ,CLK2〈46HZ。
(3)从显示模块输出的数据通过译码模块翻译成数码管上可以显示的阿拉伯数字。
方案三:
1.原理框图:
图表1方案1的原理框图
2.分析:
基于CPLD/FPGA的出租车计费器的组成如(图表1方案1的原理框图)所示。
各部分主要功能如下:
(1)A计数器对送来的脉冲信号进行计数(假定每转一圈送一个脉冲)。
不同车型的车轮直径可能不一样,通过“设置1”对车型做出选择,以实现对不同车轮直径的车进行调整。
(2)B计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。
每计满500送出一个脉冲给C计数器。
“设置2”实现起步公里数预制。
(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。
“设置3”用来完成超价加费、起步价预制等。
(4)译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。
(5)数码管显示将公里数和计费金额均用四位LED数码管显示(三位整数,1位小数)。
方案选择:
方案二
1.理由:
三个方案总体思想是一致的,都是通过(计数模块)→(转换模块)→(显示选择)→(译码模块)→(数码管的输出)的形式,但是在具体实现上有所不同。
方案一和三的路程计数方式较为繁琐,既考虑不同的车轮直径,又考虑脉冲分级。
而方案二直接假定车轮大小不考虑,直接设定每次脉冲为一定的距离,我们假定是10m,这样就免去考虑车轮转了多少圈,每圈代表多少距离,使整个设计显得更加简单,容易。
根据我们组员的讨论,结合不同途径找到的资料,方案二较为容易实现,另外方案二的找到资料比较详细。
我们决定选择方案二。
2.方案二的程序基本流图
图表3方案2的基本流图
2.底层文件仿真与分析
1.计费模块
计费模块分有三段仿真:
1、当路程不到3公里时,收费7元(图表4luc<300(3公里)时的仿真波形);2、当路程大于3公里时,在7元基础上,每公里加2.2元(图表5900>luc>300时的仿真波形);3、当大于9公里时,每公里加3.3元(图表6luc>900时的仿真波形)。
图表4luc<300(3公里)时的仿真波形
波形说明:
stop=’1’时,lc(路程)和num(计数)清零,chf(车费)保持初始起步价不变。
当按下start时,开始启动lc和num计数,chf依然保持初始的70,等待lc变化到一定程度而变化。
图表5900>luc>300时的仿真波形
波形说明:
每一次脉冲num累积一次,当900>luc>300时累积到一百次的时候chf相应相加22,然后num清零,继续下一轮的计数。
lc一直在每次脉冲时计数加1。
图表6luc>900时的仿真波形
波形说明:
每一次脉冲num累积一次,当luc>900时累积到一百次的时候chf相应相加33,然后num清零,继续下一轮的计数。
lc一直在每次脉冲时计数加1。
2.转换模块
转换模块即把从计费模块传来的数据的千位、百位、十位、个位转换成四位二进制BCD码。
实际上就是把数据的千位、百位、十位、个位分离出来。
具体波形图看(图表7转换模块的仿真波形图)。
图表7转换模块的仿真波形图
波形说明:
将计费模块的的数字输入转换模块,包括lc和chf,在clk1上升沿来临的时候,将各位十进制数个,十,百,千对应的数字转换成对应的二进制BCD码。
lc和chf各四个,每个都是四位二进制码。
3.显示模块
显示模块即把数据的千位、百位、十位、个位经过选择通道的作用把对应的位数显示出来。
实际上就是实现下一步的数码管动态扫描。
具体仿真波形如(图表8显示模块的仿真波形)。
图表8显示模块的仿真波形
波形说明:
将转换模块的数据a1~a4,b1~b4输入显示模块,通过选择通道动态扫描显示输出d。
4.译码模块
译码模块即分别把显示模块传来的数据的千位、百位、十位、个位进行翻译,使之成为可以在数码管上显示的阿拉伯数字。
真所谓“分别”是由于实验箱上的数码管是动态显示的。
具体仿真波形如(图表9译码模块的仿真图)。
图表9译码模块的仿真图
输入端口:
d
输出端口:
q
波形说明:
将转换模块的十进制BCD码d输入译码模块,根据LED工作原理,为了使相应的数字能显示出来,将其翻译为LED数码管点亮对应数字所需要的电平。
用‘0’代表低电平,‘1’代表高电平。
相应电平使数码管对应的灯亮灭,使之显示需要的数字q。
5.通道选择模块
通道选择即在显示模块上选择那个数将要通过译码模块显示到数码管。
但由于频率很高,所以人眼是看不出数码管的动态变化。
这也是时钟1的频率要比时钟2的频率大得很多的原因。
具体仿真波形如(图表10选择通道的仿真波形)。
图表10选择通道的仿真波形
输入端口:
clk
输出端口:
a
波形说明:
在clk上升沿来临的时候a变化,累加一次。
a是三位二进制码,能表达整数范围为0~7,相当于八进制。
a一直从0~7循环,选择相应数码管输出显示。
3.顶层文件仿真与分析
本实验作品的顶层文件是文本形式编,即用文本的元件例化语句把各个模块的输入输出端口连起来。
具体的仿真波形如(图表11顶层文件仿真波形图)。
图表11顶层文件仿真波形图
波形说明:
输入端口:
tstop,tstart,tpause,toclk,tclk
输出端口:
tq,tac
当按下tstart时,在时钟tclk来临的时候,开始计费,按下tpause的路程和计费都暂停保持原状,当按下tstop的时候路程和车费回到初始状态,路程为0,车费为7。
4.硬件验证分析
本实验作品是经过一个不断调试的漫长时间,在调试过程中,把自己的代码得到了完善作用。
(1)在下载时老是存在“系统繁忙”和“连不上系统”等等问题。
分析:
我们认为是实验室的计算机有问题。
结果换了电脑则恢复正常。
(2)把每个模块和顶层文件写好后把代码通过并口下载到实验箱,结果发现只有一
个数码管显示。
分析:
结果发现原来在顶层文件少定义了三个74LS138的输出端口,是为了实现软件与数码管的动态扫描相连接。
(3)当按下启动按键时,发现数字的显示有很大的抖动。
分析:
因为之前我没写按
键抖动软件。
后来把引脚改为用开关。
(4)当连上电源时,发现车费的十位和个位(小数点的前两位)一样跳动。
分析
可能是顶层文件引脚连接时把他们一起连给某个信号。
后来改过则正常运行。
(5)当一切搞好后,发现车费和路程数据的显示有时存在很大的延时。
分析:
本以
为是计费模块的代码不够优化,结果发现是转换模块存在着这样的缺点。
5.课程设计心得
从本次课程设计,加深了对可编程逻辑器件进一步的认识,充分了解了它的强大功能和巨大作用,也熟悉了VHDL的编写及其应用,是对之前EDA课程的巩固和加深,也熟悉了max+plus
软件的编译,仿真,引脚分配,下载等功能的使用,使我们收益匪浅。
单单从这次课程设计,我们组按照老师给的项目安排表进行操作,我们组从一开始的查阅资料和方案对比以至最后的方案落实,都进行很好的配合合作。
但是编写源程序比较繁琐,特别是代码完成后的修改,调试,仿真,都是相当繁重的事情,这项重活我们组组长比较辛苦。
还有硬件分析时由于实验箱等问题也是弄到很繁琐,但是最后坚持下来并将这个课程设计完成,这是令我们都很振奋的一次体验。
总的上来说,这次课程设计我们都参加了,并且能够从中收获很多东西,重要的是我们之前的配合合作还有平时几乎没有的动手机会。
所以,我们都是觉得这次课程设计意义非凡。
Rentalcarfareregistersystemdesign
Abstract:
InordertoovercomethetaxibillingsystemoftraditionaldesignmethodbasedonFPGA,introducesthegeneraldesignofthetaxidevicesandmethod.ThissystemisdesignedbyVHDLlanguageandPLDbasedonFPGAtaxibillingsystem,selectionALTERACo.,lowpowerconsumption,lowcost,highperformanceEPF10K10chip,inordertoMAX+PLUSⅡsoftwareasadevelopmentplatformdesignedtaxibillingdevicesystemprogramandhadcompiled,functionalsimulationanddownloads.Causesitsrealizationtocostaswellastheinitializationandthesimulationautomobilestarts,stops,functionandsoonsuspension,anddynamicscanningdemonstrationfarenumber.Thefareresisterisdividedintofare-registercircuitmodule,dataconversionmodule,dynamicscanningmodule,selectsignalmodule,displaymodule,decodingmodule,allaredesignedusedinanalogsimulation.Accordingtotheideausingthetop-leveldocumentsdesign,finishitwithallthelow-levelunderlyingdocumentsdesignedandfunctionalsimulation.Thentodownloadthetop-leveldocumentstotheexperimentboxandanalysesinhardware.
Keywords:
Therentalcarcoststhesystem;thecounter;theVHDLlanguage;MAX+PLUSII;FPGA
参考文献
[1].潘松,黄继业.EDA技术实用教程.科学出版社.2005.2:
145~156.
[2].陈楚,黄道宗.《可编程逻辑器件实验指导书》.华南农业大学工程学院实验室出版社.2009.11
附录(源代码)
程序清单1taxi顶层模块
--******************************文件开始******************************
**文件名称:
taxi_top.vhd
**最后修改日期:
2012.12.10
**功能描述:
taxi计费器顶层模块
*******************************************************************--
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytaxi_topis
port(toclk:
instd_logic;--数码管扫描时钟
tclk:
instd_logic;--计费时钟
tstart:
instd_logic;--系统启动
tstop:
instd_logic;--系统停止
tpause:
instd_logic;--系统暂停
--tsu:
instd_logic;
tdp:
outstd_logic;--系统小数点输出
tq:
outstd_logic_vector(6downto0);--数码管显示输出
tac:
outstd_logic_vector(2downto0)--74LS138的数码管片选输出端口
);
endtaxi_top;
architecturebehavoftaxi_topis
componentjifei--计费模块
port(clk:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
pause:
instd_logic;
--su:
instd_logic;
chefei:
outintegerrange0to9999;
luc:
outintegerrange0to9999);
endcomponent;
componentzhuanghuan--转换模块
port(zhclk:
instd_logic;
lscore:
inintegerrange0to9999;
chscore:
inintegerrange0to9999;
lge:
outstd_logic_vector(3downto0);
lshi:
outstd_logic_vector(3downto0);
lbai:
outstd_logic_vector(3downto0);
lqian:
outstd_logic_vector(3downto0);
chge:
outstd_logic_vector(3downto0);
chshi:
outstd_logic_vector(3downto0);
chbai:
outstd_logic_vector(3downto0);
chqian:
outstd_logic_vector(3downto0));
endcomponent;
componentsele--选择输出通道模块
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
endcomponent;
componentxianshi--显示模块
port(c:
instd_logic_vector(2downto0);
dp:
outstd_logic;
a1:
instd_logic_vector(3downto0);
a2:
instd_logic_vector(3downto0);
a3:
instd_logic_vector(3downto0);
a4:
instd_logic_vector(3downto0);
b1:
instd_logic_vector(3downto0);
b2:
instd_logic_vector(3downto0);
b3:
instd_logic_vector(3downto0);
b4:
instd_logic_vector(3downto0);
d:
outstd_logic_vector(3downto0));
endcomponent;
componentyima--译码模块
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
endcomponent;
signalch1:
integerrange0to9999;--车费输出中间连点
signallc1:
integerrange0to9999;--路程输出中间连点
signalla1:
std_logic_vector(3downto0);--la1~la4和chb1~chb4是片选数码管的中间连点
signalla2:
std_logic_vector(3downto0);
signalla3:
std_logic_vector(3downto0);
signalla4:
std_logic_vector(3downto0);
signalchb1:
std_logic_vector(3downto0);
signalchb2:
std_logic_vector(3downto0);
signalchb3:
std_logic_vector(3downto0);
signalchb4:
std_logic_vector(3downto0);
signalac:
std_logic_vector(2downto0);--选择输出口的中间连点
signaldd:
std_logic_vector(3downto0);--译码管数据输入中间连点
begin
u1:
jifeiportmap(clk=>tclk,start=>tstart,--元件1计费
stop=>tstop,pause=>tpause,chefei=>ch1,luc=>lc1);
u2:
zhuanghuanportmap(zhclk=>toclk,chscore=>ch1,--元件2转换
lscore=>lc1,lge=>la1,lshi=>la2,lbai=>la3,lqian=>la4,
chge=>chb1,chshi=>chb2,chbai=>chb3,chqian=>chb4);
u3:
xianshiportmap(a1=>la1,a2=>la2,a3=>la3,a4=>la4,--元件3显示
b1=>chb1,b2=>chb2,b3=>chb3,b4=>chb4,c=>ac,dp=>tdp,d=>dd);
u4:
yimaportmap(d=>dd,q=>tq);--元件4译码
u5:
seleportmap(clk=>toclk,a=>ac);--元件5选择通道
u6:
seleportmap(clk=>toclk,a=>tac);--元件6选择通道,连上74LS138
endbehav;
--****************************文件结束*******************************--
程序清单2计费模块
--******************************文件开始******************************
**文件名称:
jifei.vhd
**最后修改日期:
2012.12.10
**功能描述:
计出路程和路费
*******************************************************************--
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjifeiis
port(clk:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
pause:
instd_logic;
chefei:
outintegerrange0to9999;
luc:
outintegerrange0to9999);
endjifei;
architecturebehavofjifeiis
begin
process(clk,start,stop,pause)
variablechf,lc:
integerrange0to9999;--车费、路程变量
variablenum:
integerrange0to100;
variablea:
std_logic;--标志,当标志1时,路程记数满1公里
begin
if(clk'eventandclk='1')then
if(stop='1')then--停止开关,车费、路程和记