基于CPLD/FPGA的出租车计费器
计费模块是一个模为10、步长可变的加法计数器。该模块通过开关量预制步长,当超过一定预制参数时改变步长。计费模块也采用非压缩BCD码,但因步长不为1,所以在做非压缩BCD加法时必须调整,否则可能导致在超过或未超过预置参数时出现超程错误。这里采用模仿微机的AF标志位,在其设立一个半进位标志,当累加和大于9或半进位标志为“1”时,对累加和进行调整。
ifdatal(3downto0)>9ordatal(4)=‘1’then
datal(3downto0):=datal(3downto0)+“0110”;
datal(8downto5):=datal(8downto5)+1;
endif;
其中,data(4)为半进位标志。“起步价格”和“超价加费”设置参数分别如表3和表4所示。计费模块(以下简称MONEY)封装见图4。
表3起步价格设置
起步价格(元)1.21.62.02.42.83.23.6DIP开关(3位)001010011100101110111
表4超价加费设置
超价加费(元)10.015.020.025.0DIP开关(2位)00011011
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
IFscp’ventandscp=‘1’THENcount<=count+1;
ENDIF;
ENDPROCESSclkl_label;
显示数据的选择由计数器控制,VHDL程序段如下:
temp<=counterlwhencount=“000”else...
counter4whencount=“011”else
milelwhencount=“100”else...
mile4whencount=“111”;
位选信号时序仿真如图3所示。从时序仿真图和上述程序可以看出,位选信号和要显示的数据实现了同步。
图3
动态扫描电路中小数点的显示无法在译码电路中完成。由于小数点的位置是固定的,因此可由计数器提供的同步信号产生另一信号控制DP。VHDL程序实现如下:
if(count:“101”orcount=“001”)thendata(0)<=‘1’;
elsedata(0)<=‘0’;
endif;
显示模块(以下简称SHOW)封装见图4。此模块中应用了两个过程,在过程内程序顺序执行,其中第一个过程触发第二个过程。
3系统综合
3.1模块联调
各个功能子模块设计完成后,利用MAXPLUSⅡ的图形编辑器(GraphicEditor)将各功能子模块(.sym)进行连接。由于MILE模块中存在毛刺,故不能直接与后级相连,通过对输出脉冲信号加门电路延时,再与原始信号相“与”的方法即可消除毛刺。系统顶层原理图如图4所示。
芯片管脚定义可以直接用编辑.pin文件或在Floor—PlanEditor下进行。完成管脚定义后选择器件(EPM7128SIC84—15),编译后生成.sof、.pof及报告文件.rpt。查看报告文件可得到器件管脚的利用情况及器件内部资源的使用情况。通过更换适当的器件使其资源配置达到最优。选择器件的一般原则是系统所使用的资源不要 《基于CPLD/FPGA的出租车计费器(第2页)》