出租车计费系统的设计与分析.doc
FPGA出租车计费系统设计与分析小组成员及分工:卓 琪 等待计费模块 DDJF输出数据选择模块 SCXZ李 翔 分频器模块 FPQ等待判别模块 DDPB朱寿岱 里程计算模块 LCJS周 丹 里程计费模块 LCJF孙宙清 等待计时模块 DDJS指导老师: 查根龙 李海霞设计时间: 2010年4月出租车计费系统的设计与分析一、系统设计要求以FPGA为主体,设计一出租车计费系统。其中系统电源由汽车上的电平提供,电源电压为916V。速度传感器不需要进行设计,而是根据在一定的距离里共产生多少秒脉冲来确定速度的大小。显示器可以采用LED数码管/LCD液晶显示模块。具体功能如下:1、计费及显示(1)、里程,即行驶里程,用四位数字显示,显示方式为“XXX.X”,单位为Km。(2)、单价,即里程单价,用三位数字显示,显示方式为“X.XX”,根据每天不同的时间段有两种情况:当时间段为06:0123:00时单价为1.40元/Km; 当时间段为23:0106:00时单价为1.80元/Km。(3)、等候时间,用四位数字显示分钟和秒,显示方式为“XX:XX”,等候的定义是当汽车行驶速度小于或等于12Km/h时为等候。(4)、等候单价,有两种情况:在等候时间小于1小时下,等候单价为1元每五分钟, 在等候时间大于1小时下,等候单价为20元每小时。(5)、费用的计算,出租车的起价为5.00元,当里程小于2Km时,按起步价计算费用;当里程大于2Km时按以下计算费用:费用=起步费+(里程2)×里程单价+等待时间×等待单价(6)、费用的显示,用五位数字显示,显示方式是“XXX.XX”,单价为元。2、时钟及显示当出租车在常态下,显示当前的时间。在汽车熄火的情况下,时钟必须正常运行,但可以不显示时钟。3、计费开始提示当出租车载上乘客并起步后,将空车指示牌搬到时,空车指示牌的指示灯熄灭,并有灯光提示信号。二、系统设计方案测控FPGA芯片通过采集传感器脉冲信号WCLK进行里程计算、里程计费,利用外部脉冲信号SCLK产生标准时钟信号,以计算等待时间、等待费用,并产生里程标志(LCBZ)、等待标志(DDBZ)、熄灯标志(XDBZ)等有关控制标志信号,同时根据单片机发出的开始信号(START)、时段标志(SDBZ)、传输数据选择(SEL)等控制信号将有关计算结果传给单片机。单片机MCU除了完成键盘扫描、显示控制外,还通过P0口与FPGA进行数据交换,并向测控FPGA芯片发出有关控制信号。本设计方案利用单片机和FPGA的结合,发挥他们各自的长处,分工清晰,世纪使用和操作符合大众逻辑,单片机丰富的I/O口和FPGA模块化的设计为系统功能的扩展提供了空间和便利。三、测控FPGA的VHDL程序设计根据系统设计的要求,我们组将整个测控FPGA系统分为七个模块,分别是:分频器模块FPQ、等待判别模块DDPB、里程计算模块LCJS、里程计费模块LCJF、等待计时模块DDJS、等待计费模块DDJF、输出数据选择模块SCXZ。其内部组成原理图如下所示: (1)、分频器模块FPQ:将外部时钟信号SCLK(设计时假设为200Hz)经过适当分频后,产生1Hz的系统工作用基准时钟信号CLK1HZ,供系统中的有关模块计时用。(2)、等待判别模块DDPB:根据速度传感器脉冲信号WCLK和分频器产生的基准时钟信号CLK1HZ,计算单位时间里WCLK的脉冲个数(每Km产生1000个脉冲信号,即每米产生一个脉冲信号),即出租车行驶速度,从而判别出租车是否处于等待状态,发出等待标志信号DDBZ。、当速度大于12Km/h,出租车处于运行状态,这时等待标志DDBZ=0;、当速度小于12Km/h,出租车处于等待状态,这时等待标志DDBZ=1。该模块的VHDL程序设计可分为三个进程:、60s周期性跳变信号产生进程;、每分钟行驶距离计算进程;、等待标志判别进程。等待标志判别进程就是比较每分钟WCLK脉冲个数与等待状态WCLK脉冲临界个数200的大小,从而确定DDBZ的赋值。(3)、里程计算模块LCJS:根据速度传感器脉冲信号WCLK和等待标志DDBZ,对出租车行驶的里程数XSLC进行计算,同时发出里程标志信号LCBZ和里程计费标志信号JFBZ。如果LCBZ=1,说明行驶距离超过2Km,里程计费启动;如果LCBZ=0,说明行驶距离没有超过2Km,按起价计费。每行驶1Km应计费一次,并且计费的启动信号应该是某一时刻,因此每行驶1km,计费标志信号JFBZ应跳变一次。该模块的VHDL程序设计可分为两个进程:、里程计算及标志产生进程;、产生计费信号进程。产生计费信号进程就是每行驶一千米JFBZ由低电平0变为1,经过一个系统时钟周期后JFBZ又回复到低电平0,里程计费模块LCJF就是在JFBZ脉冲信号的上升沿进行计费的加法操作。(4)、里程计费模块LCJF:在计费标志信号JFBZ、等待标志信号DDBZ、里程标志信号LCBZ和时段标志信号XDBZ等信号的控制下,计算行驶里程超过2km以上里程的费用LCFY。该模块的VHDL程序是通过由多个条件控制的加法进程来完成程序计费的,里程计费的条件在DDBZ=0,并且在JFBZ的上升沿根据SDBZ分别进行加法计费操作。当SDBZ=1时,表示在06:0023:00时段,其单价SD1为1.4元/km;当SDBZ=0,表示其他时段,其单价SD2为1.8元/km。如果LCBZ=1,说明行驶距离超过2km,里程计费启动;如果LCBZ=0,说明没超过2km,按起价计费。(5)、等待计时模块DDJS:在等待标志信号DDBZ和基准时钟信号CLK1HZ的控制下,进行等待时间DDSJ的计算,其中DDSJ的第8位表示等待时间的秒数,DDSJ的高8位表示等待时间的分钟数,同时根据等待时间的长短发出一个熄灯标志信号XDBZ。当等待时间小于等于1h是,XDBZ=0,等待时间显示灯亮;当等待时间大于1h时,XDBZ=1,等待时间显示灯亮。该模块的VHDL程序是通过一个嵌套的加法进程来完成计时的。(6)、等待计费模块DDJF:在等待标志信号DDBZ和熄灯标志信号XDBZ控制下,进行等待费用DDFY的计费操作。该模块的VHDL程序包括两个进程:60s周期性跳变信号产生进程、等待费用计算过程。等待费用计算的条件是在DDBZ=1并且在60s周期性跳变信号T60s的上升沿,根据XDBZ分别进行加法计费操作。当DDBZ=1且XDBZ=0时,按1元/5分钟,当DDBZ=1且XDBZ=1时,按20元/小时计费。(7)、输出数据选择模块SCXZ:根据单片机发出的数据传输选择控制信号SEL,选择有关计算机处理结果传输给单片机。SEL与被传送数据的具体关系如下表:SEL000001010011100101110111被选数据等待时间秒数DDSJ70等待时间分数DDSJ158超过两公里计费低8位LCFY70超过两公里计费低8位LCFY158等待计费低8位DDFY70等待计费低8位DDFY158里程数据低8位XSLC70里程数据高8位XSLC70四、 主要源程序代码分析基于FPGA的出租车计费系统我们分为以下八个模块:1、 分频器模块FPQ的VHDL源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY FPQ IS PORT(SCLK:IN STD_LOGIC;CLK1HZ:OUT STD_LOGIC);END ENTITY FPQ;ARCHITECTURE ART OF FPQ IS SIGNAL CNT100:INTEGER RANGE 0 TO 99; SIGNAL CLK1:STD_LOGIC;BEGINPROCESS(SCLK)BEGINIF SCLKEVENT AND SCLK=1THEN IF CNT100=99 THEN CNT100<=0; CLK1<=NOT CLK1;ELSE CNT100<=CNT100+1;END IF;ELSE CLK1<=CLK1;END IF;CLK1HZ<=CLK1;END PROCESS;END ARCHITECTURE ART;2、等待判别模块DDPB的VHDL源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY DDPB IS PORT(START, WCLK:IN STD_LOGIC; CLK1HZ:IN STD_LOGIC; DDBZ:OUT STD_LOGIC);END ENTITY DDPB;ARCHITECTURE ART OF DDPB IS SIGNAL T60S:STD_LOGIC; SIGNAL WCLKCOU:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN -产生60s周期性跳变信号进程, PROCESS(START, CLK1HZ) IS VARIABLE CNT60: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF START='1' THEN CNT60:="" T60S<='0' ELSIF CLK1HZ'EVENT AND CLK1HZ='1' THEN IF CNT60="" THEN -CNT60=60 T60S<='1' CNT60:="" ELSE CNT60: =CNT60+'1' T60S<='0' END IF; END IF; END PROCESS; -每分钟行驶距离计算进程 PROCESS(START, WCLK, T60S) IS BEGIN IF START='1' THEN WCLKCOU<="" ELSIF WCLK'EVENT AND WCLK='1' THEN IF T60S='1' THEN WCLKCOU<="" ELSE WCLKCOU<=WCLKCOU+'1' -距离计算,单位为 m END IF; END IF;END PROCESS;-等待标志判别进程PROCESS(WCLKCOU,T60S) IS BEGIN IF T60S'EVENT AND T60S='1' THEN IF WCLKCOU<=" " THEN -WCLKCOU<=200 DDBZ<=1; -等待 ELSE DDBZ<='0' -行驶 END IF; END IF; END PROCESS; END ARCHITECTURE ART;3、里程计算模块LCJS的VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY LCJS IS PORT(START, DDBZ, WCLK: IN STD_LOGIC; XSLC: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); LCBZ,JFBZ:OUT STD_LOGIC); END ENTITY LCJS; ARCHITECTURE ART OF LCJS IS SIGNAL BMS:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL BMS1: INTEGER RANGE 0 TO 99999; SIGNAL JFBZ1: STD_LOGIC; BEGIN -里程计算及标志产生进程 PROCESS(START, WCLK) VARIABLE MS: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF START='1'THEN MS:= "" BMS<="00000"LCBZ<='0' ELSIF WCLK'EVENT AND WCLK='1'THEN IF DDBZ='0'THEN IF MS="" THEN MS:="" BMS<=BMS+'1' -百米数计算 IF BMS>=20 THEN LCBZ<='1' -大于2km标志 END IF; ELSE MS:=MS+'1' -米数计算 END IF; END IF; END IF;END PROCESS;-里程计算结果输出XSLC<=BMS;-里程计算结果转换BMS1<=CONV_INTEGER(BMS);-产生计费信号进程PROCESS(BMS1) IS BEGIN CASE BMS1 IS WHEN 10|20|30|40|50|60|70|80|90|100=>JFBZ1<='1' WHEN 110|120|130|140|150|160|170|180|190|200=>JFBZ1<='1' WHEN 210|220|230|240|250|260|270|280|290|300=>JFBZ1<='1' WHEN 310|320|330|340|350|360|370|380|390|400=>JFBZ1<='1' WHEN 410|420|430|440|450|460|470|480|490|500=>JFBZ1<='1' WHEN 510|520|530|540|550|560|570|580|590|600=>JFBZ1<='1' WHEN 610|620|630|640|650|660|670|680|690|700=>JFBZ1<='1' WHEN 710|720|730|740|750|760|770|780|790|800=>JFBZ1<='1' WHEN 810|820|830|840|850|860|870|880|890|900=>JFBZ1<='1' WHEN 910|920|930|940|950|960|970|980|990|1000=>JFBZ1<='1' WHEN 1010|1020|1030|1040|1050|1060|1070|1080|1090|1100=>JFBZ1<='1' WHEN 1110|1120|1130|1140|1150|1160|1170|1180|1190|1200=>JFBZ1<='1' WHEN 1210|1220|1230|1240|1250|1260|1270|1280|1290|1300=>JFBZ1<='1' WHEN 1310|1320|1330|1340|1350|1360|1370|1380|1390|1400=>JFBZ1<='1' WHEN 1410|1420|1430|1440|1450|1460|1470|1480|1490|1500=>JFBZ1<='1' WHEN 1510|1520|1530|1540|1550|1560|1570|1580|1590|1600=>JFBZ1<='1' WHEN 1610|1620|1630|1640|1650|1660|1670|1680|1690|1700=>JFBZ1<='1' WHEN 1710|1720|1730|1740|1750|1760|1770|1780|1790|1800=>JFBZ1<='1' WHEN 1810|1820|1830|1840|1850|1860|1870|1880|1890|1900=>JFBZ1<='1' WHEN 1910|1920|1930|1940|1950|1960|1970|1980|1990|2000=>JFBZ1<='1' WHEN 2010|2020|2030|2040|2050|2060|2070|2080|2090|2100=>JFBZ1<='1' WHEN 2110|2120|2130|2140|2150|2160|2170|2180|2190|2200=>JFBZ1<='1' WHEN 2210|2220|2230|2240|2250|2260|2270|2280|2290|2300=>JFBZ1<='1' WHEN 2310|2320|2330|2340|2350|2360|2370|2380|2390|2400=>JFBZ1<='1' WHEN 2410|2420|2430|2440|2450|2460|2470|2480|2490|2500=>JFBZ1<='1' WHEN 2510|2520|2530|2540|2550|2560|2570|2580|2590|2600=>JFBZ1<='1' WHEN 2610|2620|2630|2640|2650|2660|2670|2680|2690|2700=>JFBZ1<='1' WHEN 2710|2720|2730|2740|2750|2760|2770|2780|2790|2800=>JFBZ1<='1' WHEN 2810|2820|2830|2840|2850|2860|2870|2880|2890|2900=>JFBZ1<='1' WHEN 2910|2920|2930|2940|2950|2960|2970|2980|2990|3000=>JFBZ1<='1' WHEN 3010|3020|3030|3040|3050|3060|3070|3080|3090|3100=>JFBZ1<='1' WHEN 3110|3120|3130|3140|3150|3160|3170|3180|3190|3200=>JFBZ1<='1' WHEN 3210|3220|3230|3240|3250|3260|3270|3280|3290|3300=>JFBZ1<='1' WHEN 3310|3320|3330|3340|3350|3360|3370|3380|3390|3400=>JFBZ1<='1' WHEN 3410|3420|3430|3440|3450|3460|3470|3480|3490|3500=>JFBZ1<='1' WHEN 3510|3520|3530|3540|3550|3560|3570|3580|3590|3600=>JFBZ1<='1' WHEN 3610|3620|3630|3640|3650|3660|3670|3680|3690|3700=>JFBZ1<='1' WHEN 3710|3720|3730|3740|3750|3760|3770|3780|3790|3800=>JFBZ1<='1' WHEN 3810|3820|3830|3840|3850|3860|3870|3880|3890|3900=>JFBZ1<='1' WHEN 3910|3920|3930|3940|3950|3960|3970|3980|3990|4000=>JFBZ1<='1' WHEN OTHERS =>JFBZ1<='0' END CASE; END PROCESS; -计费标志去毛刺进程 PROCESS(WCLK,JFBZ1) IS BEGIN IF WCLK'EVENT AND WCLK='1'THEN JFBZ<=JFBZ1; END IF; END PROCESS; END ARCHITECTURE ART;4、里程计费模块LCJF的VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY LCJF IS GENERIC(SD1:INTEGER:= 160; -06:0022:00 单价 SD2:INTEGER:=240); - 其他时段单价 PORT(LCBZ,JFBZ, START, DDBZ,SDBZ:IN STD_LOGIC; LCFY:OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END ENTITY LCJF; ARCHITECTURE ART OF LCJF IS SIGNAL LCFY1: STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN PROCESS(START, LCBZ, SDBZ, JFBZ) BEGIN IF START='1'THEN LCFY1<="00000" ELSIF JFBZ'EVENT AND JFBZ='1'THEN IF DDBZ='0'THEN -行驶状态 IF LCBZ='0'THEN -2 km以内 LCFY1 <="00000" ELSIF LCBZ='1'THEN -2 km以上 IF SDBZ='0'THEN LCFY1<=LCFY1+SD1; ELSIF SDBZ='1'THEN LCFY1<=LCFY1+SD2; END IF; END IF; END IF; END IF; END PROCESS; LCFY<=LCFY1; END ARCHITECTURE ART;5、等待计时模块DDJS的VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DDJS IS PORT(START, DDBZ: IN STD_LOGIC; CLK1HZ: IN STD_LOGIC; DDSJ: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); XDBZ: OUT STD_LOGIC); END ENTITY DDJS; ARCHITECTURE ART OF DDJS IS SIGNAL MS,MG,FS, FG: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL XIDENG: STD_LOGIC; BEGIN PROCESS(START, DDBZ, CLK1HZ) IS BEGIN IF START='1'THEN MS<="0000"MG<="0000" FS<="0000"FG<="0000" ELSIF CLK1HZ'EVENT AND CLK1HZ='1'THEN IF DDBZ='1'THEN IF MG=9 THEN MG<="0000" IF MS=5 THEN MS<="0000" IF FG=9 THEN FG<="0000" IF FS=5 THEN XIDENG<='1'FS<="0000" ELSE FS<=FS+'1' -分数十位计算 END IF; ELSE FG<=FG+'1' -分数个位计算 END IF; ELSE MS<=MS+'1' -秒数十位计算 END IF; ELSE MG<=MG+'1' -秒数个位计算 END IF; END IF; END IF; END PROCESS; XDBZ<=XIDENG; DDSJ(15 DOWNTO 12)<=FS; DDSJ(11 DOWNTO 8)<=FG; DDSJ(7 DOWNTO 4)<=MS; DDSJ(3 DOWNTO 0)<=MG; END ARCHITECTURE ART;6、等待计费模块DDJF的VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DDJF IS -每分钟等待费用定义,单位为分 GENERIC(WDJ1: INTEGER:=20; WDJ2: INTEGER:=33); PORT(START, XDBZ, DDBZ, CLK1HZ: IN STD_LOGIC; DDFY:OUT STD_LOGIC_VECTOR(15 DOWNTO 0); END ENTITY DDJF; ARCHITECTURE ART OF DDJF IS SIGNAL DDFY1: STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL CNT60: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL T60S: STD_LOGIC; BEGIN - 产生60s周期性跳变信号进程 PROCESS(CLK1HZ) ISBEGIN IF CLK1HZ'EVENT AND CLK1HZ='1'THEN IF CNT60="" THEN -CNT60=60 T60S<='1'CNT60<="" ELSE CNT60<=CNT60+'1'T60S<='0' END IF; END IF; END PROCESS; -等待费用计算进程 PROCESS(T60S,XDBZ,DDBZ) IS BEGIN IF START='1' THEN DDFY1 <="00000" ELSIF T60S'EVENT AND T60S='1'THEN IF DDBZ='1' THEN IF XDBZ='0' THEN -等待时间小于1小时 DDFY1<=DDFY1 +WDJ1; ELSIF XDBZ='1' THEN -等待时间大于1小时 DDFY1<=DDFY1+WDJ2; END IF; END IF; END IF; END PROCESS; -等待费用计算结果输出 DDFY<=DDFY1; END ARCHITECTURE ART;7、输出数据选择模块SCXZ的VHDL源程序LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SCXZ IS PORT( SEL:IN STD_LOGIC_VECTOR(2 DOWNTO 0); XSLC: IN STD_LOGIC_VECTOR(15 DOWNTO 0); LCFY: IN STD_LOGIC_VECTOR(15 DOWNTO 0); DDSJ: IN STD_LOGIC_VECTOR(15 DOWNTO 0); DDFY: IN STD_LOGIC_VECTOR(15 DOWNTO 0); DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ENTITY SCXZ; ARCHITECTURE ART OF SCXZ IS BEGIN DATA<= DDSJ(7 DOWNTO 0) WHEN SEL="000" ELSE DDSJ(15 DOWNTO 8) WHEN SEL="001" ELSE LCFY(7 DOWNTO 0) WHEN SEL="010" ELSE LCFY(15 DOWNTO 8) WHEN SEL="011" ELSE DDFY(7 DOWNTO 0) WHEN SEL="100" ELSE DDFY(15 DOWNTO 8) WHEN SEL="101" ELSE XSLC(7 DOWNTO 0) WHEN SEL="110" ELSE X