基于VHDL的出租车计费器的设计与研究

时间:2022-07-15 06:16:39

基于VHDL的出租车计费器的设计与研究

摘 要:文章利用VHDL语言设计了一种出租车计费器,能够实现计费及显示的功能。采用动态扫描技术分别显示汽车载客时行驶里程、中途停车等待时间及总费用。在Altera公司的QuartusⅡ9.0开发环境下进行了源程序的编译、仿真,下载到FPGA芯片EP1K30TC144-3进行了硬件测试,具有一定的实用价值。

关键词:VHDL;计费器;QuartusⅡ;FPGA

中图分类号:TP312 文献标识码:A 文章编号:1006-8937(2013)29-0007-03

出租车是现代人类的重要交通工具,而出租车的计费系统的安全性和先进性是人们普遍关心的问题,要求计费器性能稳定,计费准确,以及预防司机作弊行为等等都关系到乘客的切身利益。因此,设计出符合人们普遍要求及放心的产品具有重要的意义。采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现。基于单片机设计的计费器更新周期长,而且单片机程序是不通用的,不同的单片机芯片有不同的指令集,因此设计研发比较困难。利用vhdl语言设计的基于CPLD/FPGA的出租车计费器不仅可以解决电子系统小型化、低功耗、高可靠性等问题,而且其开发周期短、设计灵活、易于调试、修改方便。

1 出租车计费器的设计要求

1.1 能够实现计费的功能

费用的计算是按行驶的里程收费,设出租车的起价为5.00元,当里程小于3 km时,按起步价计算费用;当里程大于3 km时每公里按1.3元计费。等待累计时间超过2 min,按每分钟1.5元计费。所以总费用按下式计算:总费用=起费用+(里程-3 km)×里程单价+等候时间×等候单价。

1.2 能够实现显示的功能

显示汽车行驶里程:用两位数字显示,显示方式为“XX”,单位为km。计程范围为0~99 km,计程分辨率为1 km;显示等候时间:用两位数字显示分钟,显示方式为“XX”。计时范围为0~59 min,计时分辨率为1 min;显示总费用:用四位数字显示,显示方式为“XXX.X”,单位为元。计价范围为0~999.9元,计价分辨率为0.1元。

2 系统总体设计

根据设计要求,采用自顶向下的设计方法,将整个系统设计分为分频模块、计量模块、计费模块、控制模块及动态扫描显示模块,系统组成框图如图1所示,其中计量模块是整个设计的重点。

3 各模块具体设计

下面将介绍系统各模块及顶层电路的具体设计。

3.1 分频模块

分频模块对系统时钟信号进行分频,分别得到15 Hz,13 Hz,1 Hz三种频率;1 Hz作为计量模块的驱动信号,计费模块采用13 Hz、15 Hz的驱动信号;计量模块每计数一次,计费模块就实现13次或者15次计数,即为实现出租车等待计时的1.5 元/min、计里程时的1.3元/km的收费。那么分频模块输入时钟频率应为15×13=195 Hz,由于系统设计硬件验证时所用EDA实验箱上面没有195 Hz的时钟源,只有192 Hz及16 384 Hz的时钟源,195 Hz与192 Hz相隔3 Hz,误差太大,而将16 384 Hz的时钟源84分频后得到时钟信号与195 Hz相差0.047619 Hz,误差较小,故分频模块选择输入时钟频率clk_16384为16 384 Hz,经过两次分频得到clk_1(1 Hz),clk_13(13 Hz),clk_15(15 Hz)。

3.2 计量模块

此模块主要功能是计算载客时汽车行驶的公里数及停车等待时的等候时间即完成计程和计时功能。计程器的量程为99 km,满量程后自动归零,计时器的量程为59 min,满量程后自动归零。输入端口clk1为计量脉冲信号,是由分频模块提供的1 Hz时钟信号,s是计量开始/停止信号,pause是停车等待信号,fin是汽车的里程脉冲信号。当s=1,pause=0时表示汽车正常行驶,开始计量,clk1的上升沿到来时,若fin为高电平,则以记录的clk1的脉冲个数作为汽车行驶的公里数,行驶超过3 km时,en0输出高电平。s=1,pause=1表示汽车中途停车等待,记录clk1的脉冲个数,60个脉冲为1 min,当超过2 min时,en1输出高电平。s=0时不论pause为何值,计量停止,显示清零。输出端口k1、k0分别表示里程的十位数字和个位数字,m1、m0分别表示等待时间的十位数字和个位数字。将设计的VHDL程序编译之后生成的元件符号图如图2所示。

程序编译通过后对计量模块进行仿真,仿真图如图3所示。在第2个clk1时钟周期,s信号为1,pause仍为0,里程k0开始计数,计数到3后,表示汽车行驶超过3 km,需按1.3元/km收费,此时en0输出高电平。在具体程序设计中,为了缩短硬件测试时间,使得测试时间与实际时间缩短了6倍,既实际时间1 min,测试时间为10 s。所以当s为1、pause为1时,汽车处于载客等待状态,每10个clk1周期模拟实际的1分钟,m0的值自动加1,当m0加到2后,表示等待超过2 min,需按1.5元/min收费,此时en1输出有效脉冲信号。

3.3 控制模块

控制模块主要是根据两个不同的输入使能信号ent0和ent1,对两个输入脉冲13 Hz及15 Hz进行选择输出,提供给计费模块计费。ent0和ent1分别由计量模块的en0、en1提供。 其参考程序如下:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity kongzhi is

port(ent0,ent1:in std_logic;

clk_in1:in std_logic;

clk_in2:in std_logic;

clk_out:out std_logic);

end kongzhi;

architecture rt4 of kongzhi is

begin

process(ent0,ent1)

begin

if ent1='1' then

clk_out

elsif ent0='1' then

clk_out

end if;

end process;

end rt4;

3.4 计费模块

当输入的start信号不为0时,对不同的输入脉冲频率clk2的脉冲个数进行计数即为乘车费用,输出端口c0、c1、c2、c3分别表示费用的小数位,个位、十位、百位数字的四位BCD码输出。

3.5 动态扫描显示模块

本模块包括9个输入端口,2个输出端口。系统显示部分利用人眼的视觉暂留效应,采用动态扫描的方法,点亮8个数码管,当输入数码管扫描信号clkweixuan选择实验箱上面的750 kHz频率,硬件现象显示良好,没有闪烁的感觉。八个四位BCD码输入中wc0、wc1、wc2、wc3分别是计费模块输出的c0、c1、c2、c3,即为乘客乘车的费用;Wmin0和wmin1为汽车停车等待时间的个位和十位,wk0、wk1为汽车行驶的公里数的个位和十位。输出端口weixuan为数码管的片选信号,qout为数码管的位选信号。

本模块包括两个process,一个process在时钟信号的控制下从0到7进行循环计数,不同的计数值,输出八个不同的4位BCD码输入,并产生数码管的片选信号;一个process完成对4位BCD码输出值的七段数码管显示译码,产生数码管位选信号,在这个进程要注意显示费用个位数字的数码管必须带小数点。

3.6 顶层设计

对各个子模块程序进行编译,仿真,然后生成各个模块的元件符号,采用原理图的输入方式将各模块连接起来构成顶层模块,或者用VHDL语言采用元件例化语句编写顶层模块程序。图4是采用VHDL语言编写顶层程序生成的RTL电路图。

4 硬件测试

整个系统程序设计完成,仿真通过后选择器件。本设计在武汉恒科HK-Ⅵ型EDA实验箱上进行硬件测试,选择器件为Atera的FPGA芯片EP1K30TC144-3,然后根据设计要求合理分配引脚,进行全编译生成编程文件。连接好实验箱,将编程文件下载到FPGA器件上,观察硬件现象。数码管显示初始状态如图5所示。当start=1、pause=1(start输入高电平,pause输入高电平),出租车进入等待状态,行驶路程显示数码管停止计数,等待时间显示数码管跳动计数,同时继续计费。图6为某时刻当前状态下的数码管显示,里程为39 km,等待时间为3 min,总费用=5+(39-3)×1.3+(3-2)

×1.5=53.3元,硬件现象完全符合。

5 总 结

本文设计硬件系统采用VHDL语言编程,基于FPGA实现了出租车计费器的计时、计程、计费功能。使用硬件语言描述的形式,可以充分利用FPGA的优势,成本低、灵活性强、功耗小、周期短。使用VHDL语言设计硬件电路,设计与器件无关,具有良好的可移植性。如果出租车计费标准发生变化时,修改VHDL源程序即可,设计具有一定的实用价值。

参考文献:

[1] 付扬.出租车计价器的FPGA实现[J].微计算机信息,2008,12(2),203-204.

[2] 谭会生,张昌凡.EDA技术及应用[M].西安:西安电子科技大学出版社,2011.

上一篇:中国―东盟自由贸易区内我国与东盟国家之间民... 下一篇:城市供水系统的最经济控制