基于FPGA的出租车计费系统设计

2021-07-19 22:41张炯陈初侠操晓思徐甫欧阳凯
电脑知识与技术 2021年13期

张炯 陈初侠 操晓思 徐甫 欧阳凯

摘要:该文基于FPGA芯片EP1K30QC208-2进行了出租车计费系统设计。首先从设计要求出发,将出租车计费系统分成多个子电路模块并用Verilog HDL语言对其进行设计,然后调用已设计好的各子电路模块采用原理图方式进行顶层电路设计,最后将设计好的顶层电路下载到FPGA芯片中进行硬件验证。实验结果表明,所设计的出租车计费系统能动态显示出租车的行驶里程、等待时间和计费金额,具有一定的实用价值。

关键词:出租车计费;FPGA;Verilog HDL

中图分类号:TP29        文献标识码:A

文章编号:1009-3044(2021)13-0093-03

众所周知,出租车在我们的生活中承担着非常重要的角色,一个具有良好性能的出租车计费系统不仅有助于加强行业管理,还可以减少乘客与司机之间的纠纷[1]。出租车计费系统可以采用模拟电路和数字电路来实现,这种设计方法弊端是整体电路较复杂,而且出现故障时调试比较困难。出租车计费系统也可以采用单片机来实现[2],但由于计费系统经常需要根据油价进行计费标准的相应更改,如果采用单片机,需要每次更改计费标准后再次烧录程序至单片机,费时费力[3]。因此对出租车计费系统的更新换代迫在眉睫。

随着大规模可编程逻辑器件的出现,基于FPGA设计的出租车计费系统逐渐显示其强大的性能,不仅具有很高的可移植性,而且需要更改电路时非常方便,如果计费标准变化,可以实现现场更新[3]。本文以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言(Verilog HDL)为主要表达方式,以Quartus Ⅱ开发软件和ZY11EDA13BE开发系统为设计工具设计了一种能动态显示出租车计程、计时、计费的系统。

1  出租车计费系统设计要求

本文以安徽省巢湖市出租车计价标准为例来进行设计。巢湖市出租车计价标准如下:1)出租车起步开始计费,起步价为6元,车行驶2km以内,只收取起步价。2)当行驶公里数超过2km而少于5km时,超出2km的路程每千米收费为1.6元。3)当行驶公里数超过5km时,超出5km的路程每千米收费加收50%,即为2.4元。4)当遇到红灯或者客户需要停车等待时,1分钟内免费,满1分钟后,每分钟收取0.2元。5)出租车夜间行驶(22:00-次日5:00)起步价、行驶公里租价加收20%夜间补贴。

为了方便出租车计费系统的模拟,本出租车计费系统除了实现以上计费功能外,还包含以下要求:1)设置计费暂停按钮,若计费系统收到暂停命令,则不计费,车费保持不变。2)设置计费复位按钮,若计费系统收到复位命令,则车费清零。3)能动态显示出租车行驶的里程,范围为00.0~99.0km。4)能动态显示等待时间,范围为0~9min。5)能动态显示车费总和,范围为000.0~999.9元。

2  出租车计费系统总体设计方案

出租车计费系统设计框图如图1所示。根据设计要求,将出租车计费系统设计分为三部分,分别是外部输入、控制模块、显示模块[4]。外部输入包含扫描时钟、车轮脉冲、计时时钟、白天信号、行驶信号、使能信号、复位信号。控制模块包含分频模块、计程模块、计时模块、计费模块和转换模块。

3  出租车计费系统设计

本次设计采用层次化的设计方法,分底层各子模块电路设计和顶层电路设计。设计过程中,通过Quartus Ⅱ软件平台利用Verilog HDL语言设计和原理图设计相结合的方式来进行,其中各子模块电路用Verilog HDL语言设计方式来实现,顶层电路通过调用各子模块用原理图设计方式来实现。

3.1  底层电路设计

底层电路有八个子电路模块,分别是50分频模块、60分频模块、计程模块、计时模块、计费模块、转换模块1、转换模块2和动态显示模块。下面分别对它们进行介绍。

3.1.1  50分频模块

该模块的功能是对车轮传感器传送的脉冲信号进行计数,每转一圈计一次数。为方便计算我们设定车轮转一圈为2米,转50圈刚好为100米,即0.1公里。因此这里我们选用一个50分频的分频器,当计数从0开始计到24时,输出信号进行翻转,其仿真波形如图2所示。从波形可以看出,输出信号为一个脉冲周期时,刚好计数记了50次。

3.1.2  60分频模块

为了便于计算出租车行驶过程中的等待时间,我们引入60分频模块电路,其输入时钟为1hz,输出信号为60秒的周期信号。由于此分频器的输出信号周期为60秒,所以输出信号每来一个脉冲刚好就是一分钟,很好地为计时模块服务工作。如图3所示为60分频模块仿真波形图,从波形可以看出,每输入一个时钟就给其进行计数,当计数到29时,输出信号进行翻转,刚好计数60次就可得一个完整的输出脉冲。

3.1.3  计程模块

计程模块用来计量出租车行驶的总里程,计值范围为0-99.9km。为了设计方便,计值范围我们取0-999,那个小数点我们可以从动态显示模块加上,由此999就可变成99.9。如图4所示为计程模块仿真波形图,复位信号rst、计程时钟clk、使能信号en和行驶信号run为输入信号,里程信号q为输出信号。当复位信号rst有效时(高电平有效),总里程为0;当使能信号en和行驶信号run有效时,每来一个计程时钟clk就累加计数一次,一直计到999;当使能信号en无效或行驶信号run无效时,不进行计数,此时计程输出保持里程不变。

3.1.4  计时模块

计时模块用来计量出租车在行驶过程中的等待时间,计值范围为0-9分钟。如图5所示為计时模块仿真波形图,复位信号rst、计程时钟clk、使能信号en和行驶信号run为输入信号,等待时间信号waittime为输出信号。当复位信号rst有效时,计时为0;当使能信号en有效而行驶信号run无效时,每来一个计时时钟clk就累加计数一次,一直计到9;当使能信号en无效或行驶信号run有效时,不进行计数,此时计时输出保持等待时间不变。

3.1.5  计费模块

计费模块用来计算出租车开始运行到结束所产生的总体费用,计值范围为0-999.9元。为了设计方便,计值范围我们取0-9999,那个小数点我们可以从动态显示模块加上。如图6所示为计费模块仿真波形图,复位信号rst、使能信号en、白天信号baihei、里程信号km和等待时间信号waittime为输入信号,总费用信号costout为输出信号。当复位信号rst有效时,总计费为0;当使能信号en无效时,总费用保持不变;当使能信号en有效时,总费用会根据白天黑夜信号baihei、里程信号km和等待时间信号waittime的值而确定。例如,当出租车在白天时分运行时,行驶公里为7km,等待时间为5分钟,则总费用为6+(5-2)×1.6+(7-5)×2.4+5×0.2=16.6元;当出租车在晚上时分运行时,行驶公里为7km,等待时间为5分钟,则总费用为[6+(5-2)×1.6+(7-5)×2.4]×(1+0.2)+5×0.2=19.7元。从图6可以看出,在140ns-160ns之间,仿真结果数值与理论计算值一致,说明设计正确。

3.1.6  转换模块

转换模块是为了把计程模块和计费模块输出的多位十进制数转换成便于数码管显示的多个一位十进制数。如图7所示为转换模块仿真波形图,图7(a)是计程模块输出里程的转换结果,图7(b)是计费模块输出费用的转换结果。从7(a)可以看出,当里程为11.2km时,输出结果为1、1、2;从7(b)可以看出,当费用为103.7元时,输出结果为1、0、3、7,仿真结果与设想一致。

3.1.7  动态显示模块

动态显示模块通过扫描时钟来动态显示出租车行驶里程数、等待时间数和总体费用,其仿真波形如图8所示。输入信号clk32768hz是频率为32768hz的扫描信号;输入信号kmbai、kmshi、kmge为出租车里程的十位、个位和十分位;输入信号waittime为出租车所等待的时间;输入信号bcd3、bcd2、bcd1、bcd0为出租车计费的百位、十位、个位和十分位。

输出信号sel为数码管扫描片选信号,当sel=000时,最右边的数码管点亮,此时“4”会被点亮,以此类推,当sel=111时,最左边的数码管点亮,此时“1”会被点亮[5]。输出信号dataout为7段数码管的显示结果,用8位二进制数表示,最左边一位用于点亮数码管上的小数点。例如,当sel=000时,dataout=01100110,此时显示“4”的数码管会被点亮;当sel=001时,dataout=10000110,此时显示“1.”的数码管会被点亮,由于dataout的最高位为1,所以这里显示了一个小数点。

3.2  顶层电路设计

出租车顶层电路设计采用原理图输入方式进行,通过调用生成的各底层子模块电路符号,并将它们做适当连接就可实现顶层电路的设计,其电路如图9所示。

4  出租车计费系统的硬件验证

本设计选用湖北众友科技实业股份有限公司生产的ZY11EDA13BE实验箱作为硬件验证平台,同时选用Altera公司的EP1K30QC208-2作为FPGA芯片。只要对出租车计费系统顶层文件的输入输出引脚进行锁定,然后重新编译并下载到FPGA芯片中,就可以进行出租车计费系统的硬件测试验证[6]。

硬件验证结果如图10所示,(a)、(b)分别为出租车白天和夜间行驶的计费结果。图(a)中,出租车行驶里程为4.8km,等待时间为4分钟,根据巢湖市出租车计费标准可得出租车的总费用理论值为6+(4.8-2)×1.6+4×0.2=11.28元;图(b)中,出租车行驶里程为15.4m,等待时间为5分钟,根据巢湖市出租车计费标准可得出租车的总费用理论值为[6+(5-2)×1.6+(15.4-5)×2.4]×(1+0.2)+5×0.2=43.912元。由于费用显示精度为0.1元,所以小数点后面的第二位和第三位应省去,即费用分别应为11.2元、43.9元,从图10可看出这与实验硬件验证结果一致。

5 结束语

本文基于FPGA芯片采用层次化的设计方法设计出租车计费系统。设计过程中,首先将出租车计费系统分成多个子电路模块;然后通过Quartus Ⅱ软件平台利用Verilog HDL语言设计各子电路模块并对其进行仿真分析;接着把设计好的各子电路模块生成元件符号并调用它们用原理图设计方式设计出租车计费系统顶层电路;最后把已设计好的顶层电路下载到FPGA芯片中对其进行硬件测试验证。实验结果表明,本出租车计费系统能正确的动态显示出租车的行驶里程、等待时间和计费金额,设计达到预定目标。

参考文献:

[1] 吴承琦,孙培生.出租汽车计价器发展历程回顾、感悟及展望[J].中国计量,2008(3):18-21.

[2] 张立,张光新,柴磊,等.FPGA在多功能计费器系统中的应用[J].仪器仪表学报,2005(S2):735-737.

[3] 任立民.基于FPGA的出租车计费系统设计[J].南阳理工学院学报,2019,11(2):49-52.

[4] 陳乾君,叶冬.基于CPLD的出租车计费器系统的研究与设计[J].物联网技术,2013,3(6):23-24,27.

[5] 陈初侠,袁涛,曾奥运,等.基于EDA技术的汽车速度表设计[J].绥化学院学报,2018,38(5):149-151.

【通联编辑:朱宝贵】