出租车计费系统的设计文档格式.docx
《出租车计费系统的设计文档格式.docx》由会员分享,可在线阅读,更多相关《出租车计费系统的设计文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
一般在我们上到出租车里面之后我们可以清楚的看到有一个计价表而且上面会显示走了多少公里从而根据里程来进行计费,一般出租车的起步价就是5.00元,那么它是如何根据里程来进行收费的呢?
它的基本原则就是如果我们的里程(行程)是小于3km的时候,那么这个计价表是按照起步价收费,那就是只需要按照5元收费即可。
当我们的里程(行程)超过3km的时候计价表就会按照1.3元一公里来进行计费。
为了实现这个里程的显示系统,我们需要把计价表用VHD来进行编辑语言编写,从而制造100进制的计数器来进行自动计费,具体操作如下:
只要计数器记一次数,那么里程就增加1KM。
如果计数器记到4的时候,那么费用就是4乘以1.3等于5.2这样来进行计费的。
不然的话,费用根据里程(行程)来乘以起价费来算。
1.2等待计费
我们在制造计价表的时候,应该合理的根据时间来设置,比如乘客在超过2分钟还没有按时上车,就按照每一分钟在原有的起步价的基础上加上1.5元来进行计费。
像这种等待计费我们可以使用VHDL,设置一个60进制的计数器来达到自动计时等待系统的时间从而收取等待的计时费,那么如何设置呢?
应该有以下的操作:
只要计数器计一次数则等待时间增加一分钟,当计数器计到3的时候,我们收取的费用应该按照3乘以1.5等于4.5元来进行收费。
假设计时器没有计数那么就不会产生额外的费用。
1.3显示功能
当我们在设置显示出租车行驶里程的显示器时:
我们必须要用四位数字来体现,那么该如何来进行显示呢?
我们可以把它这样设置,设置显示方式为“XXXX”,单位设置为km。
计程范围设置为0~99km,计程分辨率设置为1km。
显示里程的显示屏我们可以使用液晶显示屏来进行显示,当然也还可以用普通的LED数码管来显示里程,因为本文这次的出租车计费系统的设计是需要在GW48实验中的教学系统上来进行求证的,所以,我们可以这样做,把数码管用4位BCD码显示,那么,为什么要这样操作呢?
因为这样操作能达到一目了然的效果。
因此本文中本次的设置采用数码管来进行显示里程,而计程的范围则是0~99km,这样就可以使用两个数码管来进行显示里程。
设置显示等候的时间:
我们可以这样设置使用两位数字来进行显示分钟的操作,那么显示方式可以是“XX”。
计时范围我们应该设置在0~59min,而计时分辨率应该设置为1min。
这样等待时间的显示我们也可用数码管来进行显示,因为两位数字代表的是分钟,所以,就用两个数码管来显示等待的时间即可。
显示总费用:
在显示费用的时候我们应该特别注意使用四位数字来进行显示,显示方式可以是“XXX.X”,以“元”为单位。
而计价范围可以设置成999.9元,同样的计价分辨率可以设置为0.1元。
因为需要四位数字来进行显示那么务必需要4个数码管,而小数点的话我们可以用一个发光二极管来显示操作就好,这样可以使得我们的系统显示出来的东西一目了然。
第二章系统方案设计
2.1系统基本方案
我们需要设置出租车的计费系统,那么必须把系统设置的很完美并且能稳定使用。
因此在设置系统的时候我们可以把系统分为五个系统来进行运转,这五个系统分别是计量程模块,计时模块,控制模块,计费模块,显示模块。
系统框图如图2-1-1所示。
2.2系统设计原理
根据我们设计出租车的计费系统的设置要求,我们可以把系统的输入信号分为四种:
1.系统的时钟信号(时间信号)CLK,2.计价开始信号(计费信号)START,3.等待信号STOP,4.里程脉冲信号FIN。
把系统的输出信号分为三种:
既总的费用(总费用)MON0~MON3,行驶距离(里程)(km数)RUN0~RUN1,等待时间(min)TIME0~TIME3。
系统的原件框图如图2-2-1所示。
端口定义类型为:
ENTITYjiliangIS
PORT(clk1:
INSTD_LOGIC;
--时钟信号
fin:
--里程脉冲信号
start:
--计价开始信号--
stop:
--等待时间信号
run1,run0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
time1,time0:
mon3,mon2,mon1,mon0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDjiliang;
我们可以把整个系统的控制设置为:
两个脉冲信号CLK和里程脉冲信号FIN,两个控制开关START和STOP。
这样很简洁明了。
只要出租车一旦没有行驶,那么就不会产生里程脉冲信号FIN的,当系统的计价开始信号START为低电平时,而等待信号STOP同样也为低电平时,那么系统则会自动停止工作;
在什么情况下系统才会运行工作呢?
只有在有乘客上车并且车子已经开始在路上行驶的时候,那么里程脉冲信号FIN才会产生,一旦里程脉冲信号FIN产生,那么里程才会开始计数,同样的要想实现计价的话,就必须做到使计价开始的信号START设置为高电平,为什么要这样设置呢?
因为只有计价的开始信号是高电平的时候,系统才会开始计里程价,当系统的等待信号STOP是低电平的时候;
在这个时候假设有乘客需要停车等待的话,那么就没有了里程脉冲信号FIN的产生,我们需要用开关来控制等待信号STOP并且把它设置成高电平,只有这样操作系统才会开始等待计时;
而假设乘客需要把等待结束的时候,我们的开关将会使等待信号STOP设置成低电平,这样操作后里程脉冲信号FIN才会有,只有里程脉冲信号FIN产生的时候里程才会继续开始计数;
在乘客到达目的地需要下车的时候,那么系统的计价开始信号START会设置成低电平,这样系统就停止了工作。
只有这样系统循环的工作,才能使得我们的出租车的计费系统平稳的进行。
2.3系统流程图
为了使得本文的出租车的计费系统的设计有更大的进展,这就需要我们有设计的流程图,也只有这样做我才能非常好的完成本文的出租车计费系统的设计,针对本文的出租车计费系统的设计必须有从底层到顶层的一个设计过程,这需要我们有足够的耐心,从底层的VHDL程序代码开始到顶层的例化原理图设计,都需要我们静下心来只有一步一个脚印才能完成出租车计费系统的设计。
除了需要我们有耐心之外我们还需要有清晰的思路从而对设计出租车计费系统的总体框图来进行更全面,更小的模块来具体设计才能得出设计的流程图。
如图2-3-1所示为出租车价器的流程图。
第三章模块设计及仿真
3.1计量模块
计量模块是什么意思呢?
相信大家都比较陌生,那么就由我来跟大家介绍吧!
计量模块指的是出租车在行驶过程中对里程(行程)的计数,原则上我们设置的是每计一次数即代表行驶了1km。
当出租车的行驶里程大于3km的时候,那么计数的显示也是大于3时,这样设置才能使得信号SIG0为高电平。
当记数器的计数计到99得时候,那么计数就从0重新开始计数。
计量模块原理图如图3-1-1所示。
PORT(start,fin,clk1:
sig0:
OUTSTD_LOGIC;
run1,run0:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
计量模块的仿真波形如图3-1-2所示。
从这个图上我们可以轻而易举的看出当START是低电平的时候,那么系统一定会停止运营工作,而当START是高电平的时候,里程脉冲信号FIN产生的时候,里程run才会开始计数,我们使用100进制的计数器来实现设计出租车计费系统是最好的办法,当里程run0大于9时,里程run0就会从0重新开始计数,里程run1加1,计数器一直计到99时,则会重新从0开始计数。
当计数器计数大于3时,便能使信号SIG0输出高电平(当里程大于3km时每公里按1.3元计费)。
3.2计时模块
计时模块的意思想必大家都不陌生吧!
它的含义指的是当乘客中途有事需要出租车进行等待的时候,对等待时间的一个计数,当计时器每计一次数即意味着等待了1min。
只有等待时间大于2min,即计时器的计数大于2的时候,才能使得信号SIG1成为高电平。
而当计时器计数到59的时候,计数器则会从0开始重新开始计数。
计时模块原理图如图3-2-1所示。
ENTITYjishiIS
PORT(start,STOP,clk2:
Sig1:
time1,time0:
计时模块的仿真波形图如图3-2-2所示。
从图中我们可以看到当START是低电平的时候,那么系统将会停止工作,而只有START是高电平的时候,系统才会运行工作。
当STOP是低电平时,系统是不会进行计时的,而只要达到一些要求之后,比如STOP变为高电平时,CLK2脉冲产生时,系统才会开始进入工作状态即等待计时,只要time0大于9时,time0则会重新开始进行计时,而time1加1,一直计到59的时候,也是会重新从0开始进行计数的。
只有等待时间的计时器计时大于2时,才能使能信号SIG1输出高电平。
3.3控制模块
控制模块的意思想必大家并不陌生,在出租车设计计费系统的时候控制模块主要的作用是通过计量模块的使能输出信号SIG0和计时模块的使能输出信号SIG1两个模块来进行控制费用的一个计算,当计量模块的使能输出信号SIG0是高电平的时候,即代表里程(行程)是大于3km时,则按照每公里1.3元来进行计算计费,当里程(行程)是小于3km时,则按照起步价5元来进行计算收费。
而计时模块的使能输出信号SIG1为高电平时,即代表等待累计的时间超过了2min,那么就按照每分钟1.5元来进行计费,而相反的如果等待时间并没有超过2min,那么费用就无需增加[6]。
因此总的费用可以按照以下的公式来进行计算:
总费用=起价费+(里程-3km)×
里程单价+等候时间×
等候单价
控制模块原理图如图3-3-1所示。
PORT(start:
INSTD_LOGIC;
sig1,sig0:
run1,run0,time1,time0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
cost:
OUTINTEGERRANGE0TO999);
ENDctl;
从图中我们可以发现控制模块的输入信号来源于计量模块与计时模块的输出信号,因此如果单独仿真的话会出现很多的阻碍,因为单独仿真本身就很复杂。
那么如果我们一定要单独仿真的话也不是不可能的,毕竟事在人为,我相信只要我们坚持就会有收获的。
我的想法是要想实现单独仿真那么就必须要与计量模块和计时模块一起共同结合。
如图3-3-2所示为计量模块,计时模块及控制模块的原理图。
计量模块的输入信号START,FIN,CLK1是系统的输入信号,而输出信号SIG0,RUN1,RUN0是作为控制模块的输入信号;
计时模块的输入信号START,STOP,CLK2是系统的输入信号,输出信号SIG1,TIME1,TIME0同样也是作为控制模块的输入信号,计量模块中的输入信号START也是控制模块的输入信号,而COST是控制模块的输出信号。
PORT(clk:
start,STOP:
计量模块,计时模块及控制模块的波形仿真图如图3-3-3所示。
由仿真图可以清晰的看出来当START是高电平的时候,FIN里程脉冲信号才会产生,而此时STOP是低电平的时候,里程(行程)才会开始由0进行计数工作,只有当里程(行程)大于3kn的时候,才能使能信号SIG0变成高电平,那么此时费用就按照每行驶1km,费用则增加1.3元。
当STOP是高电平时,计数器开始进入等待计数,只要等待时间大于2min时,那么费用就按照每等待1min,费用则增加1.5元来计算。
因为计费模块在控制模块中已经体现,所以计费模块不会再来进行研究讨论[5]。
3.4显示模块
本文中的所设计出租车计费系统的显示模块主要是用于体现显示汽车行驶里程(行程),等待乘客的时间,以及乘客需付的费用。
行驶里程(行程)可以用四位数字来进行显示,那么体现的显示方式应该为“XXXX”,以km为单位。
而设置计程的范围应该是怎样的呢?
我认为设置计程范围应该是0~99km,我们设置了计程的范围还应该设置计程的分辨率,在我看来设置计程的分辨率应该是1km。
而里程我们也可以用run1和run0来进行显示输出,因为里程在系统中的输出方式为run和run0的类型是STD_LOGIC_VECTOR(3DOWNTO0)的类型,所以我们可以直接用数码管来进行输出。
再设置等待乘客的时间上,我们可以这样设置,我们把等待时间用两位数字来显示分钟,同样的显示方式是“XX”。
等待时间的计时范围设置为0~59min,计时的分辨率为1min。
我们可以直接用time1和time0输出等待时间,time1和time0的类型是STD_LOGIC_VECTOR(3DOWNTO0)类型,可以很直接的用数码管输出。
那么总的费用我们应该怎么设置呢?
我们可以把总的费用用四位数字来进行显示,同样的显示方式为“XXX.X”,以元为单位。
而总的计价范围设置为999.9元,计价分辨率为0.1元。
我们可以在控制模块中输出费用为十进制数的数,这个要特别注意的是不能直接用数码管来进行输出,针对十进制输出我们进行了2种方法的讨论。
方案一:
这种方法是比较死板的方法了,那就是把每一个十进制数都用8位数的BCD码代替,再用数码管进行输出。
因为本次研究出租车的计费系统的计价范围是999.9元,所以,如果用8位数的BCD来进行代替,那就必须对9999个数进行BCD的编码,由此一来数量很庞大,导致程序代码也会比较长,因此这个方法一般不进行采用[4]。
方案二:
由于本次研究出租车计费系统需要显示的最大范围是0到9999,一共四位数,我们可以这样做,把每一位数字先求出来,然后把每位数转化为4位二进制,这样的话就便于数码管直接输出了,这样方法相对于方法一而言较为简单,其代码也比方法一的代码短。
具体每位数如何求出来呢?
具体操作请继续往下看,我们设定的时候设置其中Ch0为个位数,ch1为十位数,ch2为百位数,ch3位千位数。
设置在个位和十位之间加一个东西,那就是发光二极管,这样可以保证实现小数点。
ch0<
=costrem10;
ch1<
=cost/10;
ch2<
=0;
ch3<
---两位数求个位,十位的算法
=(costrem100)rem10;
ch1<
=(costrem100)/10;
=cost/100;
---三位数求个位,十位,百位的算法
=((costrem1000)rem100)rem10;
=((costrem1000)rem100)/10;
=(costrem1000)/100;
=cost/1000;
---四位数求个位,十位,百位,千位的算法
十进制数转化为4位二进制数的程序如下所示。
mon0<
=conv_std_logic_vector(ch0,4);
--个位数转化为4位二进制数
mon1<
=conv_std_logic_vector(ch1,4);
--十位数转化为4位二进制数
mon2<
=conv_std_logic_vector(ch2,4);
--百位数转化为4位二进制数
mon3<
=conv_std_logic_vector(ch3,4);
--千位数转化为4位二进制数
第四章系统顶层原理图及仿真
4.1系统顶层原理图
依据我们出租车的计费系统的设计要求,我们的系统原理图必须有计量程模块,计时模块,控制模块,计费模块,显示模块这5个模块组成。
我们的计费模块必须在控制模块中实现[3]。
我们的系统应该有四个输入端口,两个脉冲信号和两个开关;
八个输出端口组成,其中八个输出信号用八个数码管来显示结果,两个数码管则显示里程,等待时间则由两个数码管来体现,其余的四个数码管显示总的费用。
系统顶层原理图如图4-1-1所示。
4.2系统顶层仿真
如图4-2-2所示为系统顶层仿真波形图。
由波形图不难看出,只要START是低电平时,那么系统就立即停止工作;
而START为高电平时,FIN里程脉冲就会出现,同样的里程run(run1为高四位,run0为低四位)就会开始进行计数,当里程大于3km时,只要车子每行驶1km,那么费用则mon(mon3为千位,mon2为百位,mon1为十位,mon为个位)增加1.3元,出租车的起价费在我们这现在居住的城市为5.0元;
而只有STOP为高电平时,time才会进入等待计时,只要时间大于2min,这样我们系统自会等待1min,那么相同的费用mon增加1.5元,如果等待时间没有超出2min,那么费用则mon不增加。
第五章硬件验证
5.1引脚锁定
引脚锁定必须与目标芯片型号及具体的硬件开发环境相结合。
那么为什么这样说呢?
因为本次出租车计费系统的设计所使用的试验箱是在EDA实验系统中的GW48-PK2上进行并完成的。
而芯片也是选用的“cyclone”系列中的“EP1C6Q240C8”这个芯片。
在本文中的选择模式0,按键3和按键4分别是作为START和STOP这2个模块的输入按钮,而按键5是作为里程FIN脉冲信号,CLOCK0作为clk的时钟信号,八个数码管则作为里程、等待时间、总费用的的输出显示[2]。
我们在把我们设计电路的输入/输出与目标芯片引脚的链接关系确定后,就可以进行引脚的确定。
引脚锁定如图5-1-1所示。
5.2验证结果
当我们完成管脚锁定后,我们需要对设计文件进行一个程序,那就是重新编译,从而使其产生设计电路的下载文件(.Sof)。
那么下载的文件我们一般是在GW48的实验教学系统上进行下载.sof文件可以进行验证结果。
在所有按键都工作时,那么系统将会停止工作,同样的费用就会显示起价费为5.00元。
当START是高电平的时候,FIN同样也是高电平的时候,在这个时候里程才会开始计数,而只要里程没有超过3km的时候,那么显示起价费5.00元,不会有所增加。
而当里程大于3km的时候,我们的显示就会按照每行驶1km,费用就增加1.3元这样来进行工作,当我们按下STOP的按键时,而且没有FIN的时候,我们的系统开始等待计时的工作程序,当等待时间大于2min时,系统会按照每等待1min,费用就增加1.5元这样的程序来运行工作。
如图5-2-1所示为系统停止工作时的验证结果,图5-2-2为里程小于3km时的验证结果,图5-2-3为里程大于3km时的验证结果,图5-2-4为等待时的验证结果[1]。
从以上的实验数据中我们可以总结出来,总费用=起价费+(里程-3km)×
第六章结论
在刚开始知道要写论文的时候,总觉得这个事情我是解决不了的。
可是,当我真正用心来做的时候,我发现其实也并没有想象中的那么难,但是在因为在做前期工作的时候,其实我有遇到了很多的困难,比如模块该怎么进行选择,如何把功能在系统中实现,还有就是在确定了一个模块之后,我们在写程序的时候会有很多的想法想着怎么来实现功能,可是呢?
通过实验验证了结果并不是那么理想,不能达到我们想要的要求,这就需要我们反复的来进行调试并通过实验进行验证。
本文研究的是如何在出租车上实现计费系统,这个就必须通过我们的EDA来进行综合的设计,我们可以运用FPGA的这个知识来设计本文出租车计费系统设计,通熟一点的来说就是用VHDL语言在Quartus工具上来编写程序从而实现我们出租车计费系统设计的功能。
要把设计出租车的计费系统做到稳定发展,这就必须要能够显示出租车所行驶的里程,以及等待的时间和总的费用,出租车行驶的里程以及等待的时间这2个都还是比较容易实现的,我们可以使用VHDL写两个计数器就能把这个问题解决,而总的费用相对于而言,就不是那么好实现的了,因为我们是需要根据当今社会的发展而设定出租车计费的系统,因此,当出租车所行驶的里程大于3km的时候,我们的系统才能按照每行驶1km,相应的费用增加1.3元,而出租车等待时间的超过2min的时候,我们的系统才会按照每等待1min,相应的费用才会增加1.5元,在做总的费用这一块模块时,我所用的时间是最长的。
为什么这样说呢?
因为在实验中我处理好了里程的计费系统,可是,等待时间的系统确又不能正确的计算,当我实现了等待时间的费用系统功能,那么又出现了新的问题,那就是里程的费用又达不到准确的计算。
所以才会在总的费用这一模块的调试,用的时间是最长的。
不过,幸好最终还是在指导老师以及我的同学的倾力帮助之下,还有一个重要的一点就是前期的我几乎天天在图书馆查阅相关的资料,所有以至于我所有的功能都全部完美的做好!
通过本次论文的撰写,以及为了本次论文我所做的相关实验,我惊奇的发现自己对EDA掌握的还不够完全吃透,而对VHDL的语法也是不熟练的,有时候真感觉是验证了那一句话,在学校学过的东西,不经常温故的话就全部返回给老师了。
不过,还好通过这次论文的撰写以及我全身心的研究出租车计费系统的课程设计,我已然学会很多有关于FPGA的更多的知识点,从而充分的了解到VHDL语言和C语言本质上还是有很大的区别的,如果不是这次的课题研究,我并不会知道FPGA有很多的优点。
通过这次论文的撰写,设计出租车计费系统使自己懂得了书上说的那句话,理论必须与实际想结合的真正意义。
因为如果只有理论知识而没有实际的操作,那么你不会发现在实际中如果运用了理论知识而做成了某件事的那种成就感。
理论知识是比较死板的,只有与实际相结合,我们才会发挥自己最大的潜能去完成一项设计的,因此,我个人认为不论理论知识