社区导航

 

搜索
查看: 3945|回复: 4

[资料分享] 基于CPLD/FPGA的出租车计费器

[复制链接]

1734

TA的帖子

0

TA的资源

至上芯片

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2008-8-18 08:59 | 显示全部楼层 |阅读模式
摘要: 介绍了出租车计费器系统的组成及工作原理,简述了在EDA平台上用单片CPLD器件构成该数字系统的设计思想和实现过程。论述了车型调整模块、计程模块、计费模块、译码动态扫描模块等的设计方法与技巧。
关键词: CPLD/PPGA 硬件描述语言 出租车计费器 MAX+PLUS软件 数字系统
随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。本文介绍了一个以Altera公司可编程逻辑芯片EPM7128SLC84-15 为控制核心、附加一定外围电路组成的出租车计费器系统。
1 系统组成
基于CPLD/FPGA的出租车计费器的组成如图1所示。各部分主要功能如下:(1)A计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。不同车型的车轮直径可能不一样,通过“设置1”对车型做出选择,以实现对不同车轮直径的车进行调整。(2)B计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。每计满500送出一个脉冲给C计数器。“设置2”实现起步公里数预制。(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。“设置3”用来完成超价加费、起步价预制等。(4)译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。(5) 数码管显示将公里数和计费金额均用四位LED数码管显示(三位整数,1位小数)。


2 功能模块设计
出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用VHDL编写功能模块,然后用顶层原理图将各功能模块连接起来。
2.1 车型调整模块
出租车车型并非单一,各个车型的轮胎直径亦有所不同。据调查统计,现行出租车轮胎直径大致有四种,直径分别为520mm、540mm、560mm和 580mm。若要使不同车型的出租车每行驶一百米均送出一个脉冲,可通过设置“可预制分频器”的系数来完成。根据上述车轮直径计算出的分频系数分别为 61、59、57和55。预制数据受两个车型设置开关控制,DIP开关状态与车轮直径对应关系如表1所示(表中“1”为高电平,“0”为低电平)。

表1 车型设置
车轮直径(mm)
520
540
560
580
DIP开关(两位)
00
01
10
11

在参数预制中,使用With_Select语句(查表法)做分频选择:
with cartype select
typecounter<=“111101”when“00”, --520mm
“111011”when“01”, --540mm
“111001”when“10”, ——560mm
“111000”when“11”, --580mm
“000000”when others;
分频器采用的是加法分频电路,其占空比可通过datal(x)进行调整,并且分频器带有“开始”/“清零”端(高电平清零)。时序仿真波形如图2所示。从图中可以看出,对于设置开关为“10”的车型,当第57个脉冲到来时,该模块oclk端从高变低,输出一低电平信号。车型调整模块(以下简称FP)封装见图 4。
2.2 计程模块
计程模块是一个模为10、步长为1的加法计数器。该模块可以预制参数,使其实际计数值大于预制数值后,每500米送出一个脉冲,并将计数值送译码动态扫描模块进行显示。预制参数采用非压缩BCD码,所以在计数器设计时必须将二进制1010至1111六个状态跳过去。在VHDL程序中,用IF语句来实现。
if km(3 downto 0)=“1001”then km:=km+“0111”:
else km:=kin+1;
end if;
计程模块也带有“开始”/“清零”端。参数预制同样使用With_Select语句。“起步里程”和“开关设置”对应关系如表2所示。计程模块(以下简称MILE)封装见图4。

表2 起步里程设置
起步里程(km)
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
DIP开关(3位)
000
001
010
011
100
101
110
111
2.3 计费模块
计费模块是一个模为10、步长可变的加法计数器。该模块通过开关量预制步长,当超过一定预制参数时改变步长。计费模块也采用非压缩BCD码,但因步长不为 1,所以在做非压缩BCD加法时必须调整,否则可能导致在超过或未超过预置参数时出现超程错误。这里采用模仿微机的AF标志位,在其设立一个半进位标志,当累加和大于9或半进位标志为“1”时,对累加和进行调整。
if datal(3 downto 0)>9 or datal(4)=‘1'then
datal(3 downto 0):=datal(3 downto 0)+“0110”;
datal(8 downto 5):=datal(8 downto 5)+1;
end if;
其中,data(4)为半进位标志。“起步价格”和“超价加费”设置参数分别如表3和表4所示。计费模块(以下简称MONEY)封装见图4。

表3 起步价格设置
起步价格(元)
1.2
1.6
2.0
2.4
2.8
3.2
3.6
DIP开关(3位)
001
010
011
100
101
110
111
表4 超价加费设置
超价加费(元)
10.0
15.0
20.0
25.0
DIP开关(2位)
00
01
10
11
2.4 显示模块
显示模块由七段LED数码管译码和动态扫描显示两部分组成。
2.4.1 七段LED数码管译码
本次设计采用的是共阴极七段数码管,根据16进制数和七段显示段码表的对应关系,用VHDL的With_Select或When_Else语句可方便实现它们的译码。

图2

2.4.2 动态扫描显示
动态扫描是利用人眼的视觉暂留原理,只要扫描频率不小于24Hz,人眼就感觉不到显示器的闪烁。本系统24Hz的扫描脉冲由相应的外围电路提供。动态扫描电路设计的关键在于位选信号要与显示的数据在时序上一一对应,因此电路中必须提供同步脉冲信号。这里采用八进制计数器提供同步脉冲,VHDL程序段如下:
cIkl_label:PROCESS(scp)
BEGIN
IF scp'vent and scp=‘1'THEN count<=count+1;
END IF;
END PROCESS clkl_label;
显示数据的选择由计数器控制,VHDL程序段如下:
temp<=counterl when count=“000”else...
counter4 when count=“011”else
milel when count=“100”else...
mile4 when count=“111”;
位选信号时序仿真如图3所示。从时序仿真图和上述程序可以看出,位选信号和要显示的数据实现了同步。

图3

动态扫描电路中小数点的显示无法在译码电路中完成。由于小数点的位置是固定的,因此可由计数器提供的同步信号产生另一信号控制DP。VHDL程序实现如下:
if (count:“101”or count=“001”)then data(0)<=‘1';
else data(0)<=‘0';
end if;
显示模块(以下简称SHOW)封装见图4。此模块中应用了两个过程,在过程内程序顺序执行,其中第一个过程触发第二个过程。
3 系统综合
3.1 模块联调
各个功能子模块设计完成后,利用MAXPLUSⅡ的图形编辑器(Graphic Editor)将各功能子模块(.sym)进行连接。由于MILE模块中存在毛刺,故不能直接与后级相连,通过对输出脉冲信号加门电路延时,再与原始信号相“与”的方法即可消除毛刺。系统顶层原理图如图4所示。
芯片管脚定义可以直接用编辑.pin文件或在Floor—Plan Editor下进行。完成管脚定义后选择器件(EPM7128SIC84—15),编译后生成.sof、.pof及报告文件.rpt。查看报告文件可得到器件管脚的利用情况及器件内部资源的使用情况。通过更换适当的器件使其资源配置达到最优。选择器件的一般原则是系统所使用的资源不要超过器件资源的 80%,若超过90%,系统功耗将增大,工作不稳定。从本次设计器件部分报告中得知:输入、输出管脚各用16只,芯片资源利用率仅为51%,具有较大的扩展空间。

此帖出自FPGA/CPLD论坛


1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2008-8-27 17:41 | 显示全部楼层
yuikjhiuyiuyi


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2008-10-25 17:11 | 显示全部楼层

求教

能不能给个完整VHDL 的程序:P :P


回复

使用道具 举报

310

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-4-20 12:39 | 显示全部楼层

楼主怎么不给个完整版的呀~~~



回复

使用道具 举报

8910

TA的帖子

0

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2011-4-20 13:07 | 显示全部楼层

这个关键是传感器,其他部分程序都很简单. 此外也可以考虑其他方案,比如采用光电编码器, 轮胎每转一圈, 送出一个脉冲, 统计脉冲个数X轮胎周长,求得路长即可!

一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-30 10:53 , Processed in 0.202094 second(s), 26 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表