APP下载

计价器的研究与实现

2019-02-27贾海云

长春师范大学学报 2019年2期
关键词:数码管计数器计价

贾海云

(合肥财经职业学院,安徽合肥 230601)

大规模集成电路技术的出现,逐渐凸显出传统单片机在电路设计方面的不足。比如,由于不同类型的芯片带有不同的指令,而单片机程序并非都适用于这些芯片。修改程序仅满足了电路在短期内的功能需求,却依旧要面临软件升级的繁琐。电路设计技术必须朝着高扩展性、便捷性方向发展。本文对计价器电路进行研究[1],主要通过VHDL来实现。

1 方案原理

对计价器的功能定义如下:(1)白班时间段定为早上5点到晚上11点。在该时间段内行驶里程数在3公里以内的统一计价8元;行驶里程数在3~8公里的按照每公里2元加价。行驶里程数超出8公里的按照每公里3元加价。(2)夜班时间段的计价方式为在白班正常计价的基础上加价20%。燃油费则按照每次载客加收2元来执行。根据上述功能需求,构建出如图1所示的计价系统结构图。

图1 计价系统结构

定义车轮直径为52 cm,行驶完整一圈约163 cm后A计数器则计存一次CLK脉冲信号。里程数达到10 km后,A计数器输出OCLK2来计存里程信息。同时B计数器CLK开始计数,当里程计到100 M后B计数器输出OCLK1来计存里程信息。C计数器对10 M的OCLK2执行累计操作,再将里程数据传至动态扫描电路。D计数器对100 M的OCLK1执行累计操作,同时也要控制在乘客上车开始启动时显示的价格,即8元。当行驶里程在3~8 km时,每增加一个100 M脉冲就执行相应的加价金额。此外,当车轮在5分钟内没有跑起则不计价,5分钟过后每5分钟加价2元。译码/动态扫描电路将行驶里程信息和价格信息译码后以动态数据传至数码管显示。这里定义低二位用于显示小数,高二位用于显示整数。

本次研究通过VHDL设计再将一个扫描电路和4个计数器构建的底层模块[2]加载到FPGA上,辅以外围数码显示、轮胎感应等电路组建出一套计价系统方案。

2 电路设计

计价系统电路图如图2所示。试验箱可生成脉冲信号CLK。供电电源AD-DC输出/输入分别为+5 V(4 A)/115~230 VAC。

图2 计价系统电路

START/STOP采用双刀双路。由于在终止计价时要将计价信息保留并显示于数码显示管上,当再次启动计价时将上次显示的计价数据给予清零并重新开始计价。另外两路开关,其中一路用于启动指示和启动/停止输出信号给FPGA芯片的I/O口。当按下按键后,清零部分和启动计价部分同时进行。清零操作瞬间,计价指示灯亮起。再次按下按键后开关切换至另外两路,空车指示灯亮起。如图3所示。

图3 启动/终止电路

VHDL无法在相同的结构里对不同的动作赋值,在图4所示电路中将FPGA I/O置为高电平1执行清零操作。当断开按键开关,清零的输出接地,合上按键开关电容充电清零口置为高电平。充电结束后清零口的输入再次置为低电平。当断开按键开关,2 kΩ电阻可放电为下次充电准备。

图4 清零电路

图5 分频电路

3 测试

3.1 分频模块

计价计数器和行驶里程计数器的计算不同。前者计数频率为100 M,后者计数频为10 M。因此通过定义分频系数6和60将传感器传输的车轮CLK进行分频。分频电路如图5所示。

当启动端口的START置1便开始计数,直到轮胎CLK为6,此时输出一个如图6所示的10 M OCLK2信号。累计轮胎CLK等于60则输出一个如图7所示的100 M信号。相反,当启动端口置零则不再执行计数直至重置为1再执行计数。显然仿真[3]数据与功能要求是吻合的。

图6 输出10 M OCLK2信号

图7 输出100 M OCLK1信号

3.2 行驶里程计数模块

将分频模块输出的信号脉冲定义为计数的信号脉冲进行动态显示。当收到一个信号脉冲时行驶里程数则增加100 M,如果再接收到一个信号脉冲,继续按照100 M的里程数值累加,依此类推。行驶里程计数模块如图8所示。

图8 行驶里程计数模块

当将复位键置1,所有数据被初始化,即执行清零操作;相反,当将复位键置零,里程模块的百位开始执行计数操作。百位的计数规则为随着脉冲信号逐个增加,百位逐次加1直到百位达到9,此时开始执行向十位进位操作。整个计数执行过程如图9至图12所示。

图9 百位执行计数操作

图10 十位执行进位操作

图11 个位向十位进位

图12 复位

3.3 计费模块

将分频模块输出的100 M信号脉冲定义为计价模块的计数信号脉冲。计价模块初始化数据置为8。如果行驶里程数在3 km以内,不接受分频模块输出的信号;反之,才接受脉冲驱动。当里程在3~8 km和8 km以上,则每次在收到一个信号脉冲后其数值分别增加0.2和0.3。夜班时间段则额外加价20%的加班费。终止计价时需加价燃油附加费2元。逻辑框图如图13所示。

图13 计价模块

根据设计要求,不超过3 km仅计起步费,如图14所示。

图14 白班的起步价

里程在3~8 km,(1)白天行驶时,每来一个脉冲均在8元基础上加价0.2元,如图15所示。超过8 km,则在原计价数据上每来一个脉冲增加0.3元,如图16所示;(2)夜间行驶由于额外增加20%加班费,故不超过3 km的计价均为9.6元,如图17所示。3~8 km区段,每来一个脉冲都在起步价基础上加价0.24元,如图18所示。超出8 km则在原有计价数据基础上每来一个脉冲增加0.36元,如图19所示。按下复位按键将reset置1即为重置起步价开始执行下一次的计价,如图20所示。

图15 白班的3~8 km区段

图16 白班的8 km以上区段

图17 夜班的起步价

图18 夜班的3~8 km区段

图19 夜班的8 km以上区段

图20 复位起步价

3.4 动态扫描模块

译码单元位于动态扫描模块内,用于将行驶里程数据与价格数据转换成编码后动态驱动小数点和字段。动态扫描逻辑结构如图21所示。定义动态扫描的周期为8,对动态扫描过程执行如图22所示的模拟。

图21 动态扫描逻辑结构

图22 模拟扫描

3.5 计时模块

根据功能设计要求,车辆途径十字路口遇红灯等待前5分钟不计价,过后开始加价2元的堵车费。此时CLK用于计算堵车时长,再将时间信号通过TIME out输出。用于复位的RESET口和其它模块的复位端相连一块复位。START用于启动计时,STOP用于终止计时。计时模块如图23所示。

图23 计时模块

3.6 显示模块

显示模块的原理如图24所示,1~8号端口用来控制a~g和dp,9~16号端口用来控制1~8数码管,16个端口协调一起控制数码管的亮暗以及数字的显示[5]。所有数码管显示不是在同一时刻完成,刚开始对数码管1进行赋值,用choice数据来选择数码管,再把data数据赋予1~8号端口,然后显示第一位数码管。choice进行第二次选择,再把data数据赋予1~8号端口,然后显示第二位数码管。据此原理依次进行选择、赋值最终让数码管依次亮起。整个工作过程都会因为数码管较快的赋值速度、人眼较低的分辨率以及较小的延时,使人眼错觉地认为所有的数码管似乎同时发亮显示。

图24 显示模块

4 结语

本文结合了车辆计价的实际需求提出了电子计价器的设计方案。整个过程借助FPGA芯片和VHDL[6]作为载体,并根据功能需求对整个计价系统展开模块化设计。通过QuartusⅡ测试验证了所设计的电子计价器方案的计价结果和功能指标完全吻合,具备可行性。

猜你喜欢

数码管计数器计价
采用虚拟计数器的电子式膜式燃气表
工程量清单计价模式下的工程预结算审核
工程造价计价模式和造价控制分析
建筑工程预结算中的定额与清单计价应用
微课教学设计之“数码管动态显示”
关于74LS90计数器的Multisim仿真分析
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
算盘是个“小气鬼”