出租车计费器Word格式文档下载.docx
《出租车计费器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《出租车计费器Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
AF21
WCLK
AA10
DATAOUT[6]
U18
DATAOUT[19]
AB18
DATAOUT[5]
U17
DATAOUT[18]
V17
DATAOUT[4]
W19
DATAOUT[17]
W17
DATAOUT[3]
V18
DATAOUT[16]
AA18
DATAOUT[2]
AE22
DATAOUT[15]
AA17
DATAOUT[1]
AF22
DATAOUT[14]
AC19
DATAOUT[0]
AD21
DATAOUT[13]
AD19
波形仿真
1等待判别模块
Start=0时,随着时钟CLK1HZ的变化,每60个周期T60S出现一个跳变,这期间wclk小于20时,等待标志位DDBZ为高电平。
正确。
2等待计时模块的仿真
在start=1时,所有数据清零。
Start=0时,随着时钟CLK1HZ的变化,等待时间ddsj的数据相应依次增加(秒个位0000-0001-0010-0011)。
3总模块
Start=0时,随着时钟CLK1HZ的变化,CLK1HZ60个周期内,wclk大于20则等待时间ddsj为0,等待费用DDFY为0,
行驶里程逐步变化,里程费用LCFY刚开始保持不变,因为小于起步里程,费用为起步价。
行驶里程逐步变化到大于起步里程,里程费用LCFY开始增加。
CLK1HZ60个周期内,wclk小于20则等待时间ddsj的数据相应依次增加,等待费用DDFY开始计费。
当start=1时,所有数据重新清零。
下图为方便观察,其中变化明显部分给出特写,不再赘述。
VHDL源程序代码
---clkgen.vhd
libraryIEEE;
--1HZ
useIEEE.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityclkgenis
port(
CLK:
instd_logic;
CLK1HZ:
outstd_logic
);
endentity;
architectureclk_archofclkgenis
signalCOUNT:
integerrange0to50000000;
--50MHZ-->
1hz
begin--50M/1=50000000
PROCESS(CLK)
BEGIN
ifclk'
eventandclk='
1'
then
IFCOUNT=50000000then
COUNT<
=0;
ELSECOUNT<
=COUNT+1;
ENDIF;
ENDPROCESS;
PROCESS(COUNT)
BEGIN
IFCOUNT=5000000THEN--1HZ
CLK1HZ<
='
;
ELSECLK1HZ<
0'
endarchitecture;
--等待判别
--DDPB.VHD
Libraryieee;
useieee.std_logic_1164.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityDDPBis
port(
WCLK,START:
instd_logic;
INSTD_LOGIC;
DDBZ:
OUTSTD_LOGIC:
end;
architecturebehvofDDPBis
SIGNALT60S:
STD_LOGIC;
SIGNALwclkc:
STD_LOGIC_VECTOR(7DOWNTO0);
--脉冲计数信号,记录车轮传感器传来的数字,在60秒内
--产生60s周期性调变信号
PROCESS(CLK1HZ,START)
VARIABLECNT60:
STD_LOGIC_VECTOR(7DOWNTO0);
ifstart='
CNT60:
="
00000000"
t60s<
ELSIFclk1hz'
eventandclk1hz='
IFCNT60="
00111100"
then--60
T60S<
ELSE
=CNT60+'
T60S<
--每分钟行驶距离计算进程
PROCESS(WCLK,START,T60S)
WCLKc<
ELSIFWCLK'
eventandWCLK='
IFT60S='
then--60s?
=WCLKc+'
------计算距离,单位为10m
---等待标志判别进程
IFt60s'
eventandt60s='
IFWCLKc<
00010100"
then------WCLKc<
=20十米,12km/h,比这个速度小
DDBZ<
ENDBEHV;
--实验十四出租车计费器
--里程计算模块
--LCJS.VHD
useieee.std_logic_arith.all;
entityLCJSis
GENERIC(--0:
INTEGER:
=160;
--06:
00-22:
00单价
--1:
=180;
--其它时间
qibu:
=60--起步公里数,6公里内为固定价格
--jg:
=1000--起步价格,6公里内为10元
);
port(START,DDBZ,WCLK:
XSLC:
outstd_logic_vector(15downto0);
LCBZ,jfbz:
architecturearchofLCJSis
signalbms:
std_logic_vector(15downto0);
--百米数
signalbms1:
integerrange0to99999;
signaljfbz1:
std_logic;
begin
PROCESS(start,wclk)
variablesms:
std_logic_vector(7downto0);
--十米数
then--newcycle,notwait,running
sms:
bms<
0000000000000000"
--百米数
lcbz<
elsifwclk'
eventandwclk='
then
ifddbz='
then--行驶中
ifsms="
00001010"
then--10次计数,100m
=bms+1;
---new100m
ifbms>
=qibuthen--->
6km大于起步里程,6000m
endif;
else
=sms+1;
endif;
endprocess;
---里程计算结果输出
xslc<
=bms;
---里程计算结果转换
BMS1<
=CONV_INTEGER(BMS);
---generate计费信号
process(bms1)
begin
casebms1is
when10|20|30|40|50|60|70|80|90|100=>
jfbz1<
---
when110|120|130|140|150|160|170|180|190|200=>
when210|220|230|240|250|260|270|280|290|300=>
when310|320|330|340|350|360|370|380|390|400=>
when410|420|430|440|450|460|470|480|490|500=>
when510|520|530|540|550|560|570|580|590|600=>
when610|620|630|640|650|660|670|680|690|700=>
when710|720|730|740|750|760|770|780|790|800=>
when810|820|830|840|850|860|870|880|890|900=>
when910|920|930|940|950|960|970|980|990|1000=>
when1010|1020|1030|1040|1050|1060|1070|1080|1090|1100=>
when1110|1120|1130|1140|1150|1160|1170|1180|1190|1200=>
when1210|1220|1230|1240|1250|1260|1270|1280|1290|1300=>
when1310|13130|1330|1340|1350|1360|1370|1380|1390|1400=>
when1410|1420|1430|14140|1450|1460|1470|1480|1490|1500=>
when1510|1520|1530|1540|15150|1560|1570|1580|1590|1600=>
when1610|1620|1630|1640|1650|16160|1670|1680|1690|1700=>
when1710|1720|1730|1740|1750|1760|1770|1780|1790|1800=>
when1810|1820|1830|1840|1850|1860|1870|18180|1890|1900=>
when1910|1920|1930|1940|1950|1960|1970|1980|1990|2000=>
when2010|2020|2030|2040|2050|2060|2070|2080|2090|2100=>
when2110|2120|2130|2140|2150|2160|2170|2180|2190|2200=>
when2210|22220|2230|2240|2250|2260|2270|2280|2290|2300=>
when2310|2320|2330|2340|2350|2360|2370|2380|2390|2400=>
when2410|2420|2430|24240|2450|2460|2470|2480|2490|2500=>
when2510|2520|2530|2540|25250|2560|2570|2580|2590|2600=>
when2610|2620|2630|2640|2650|26260|2670|2680|2690|2700=>
when2710|2720|2730|2740|2750|2760|2770|2780|2790|2800=>
when2810|2820|2830|2840|2850|2860|2870|28280|2890|2900=>
when2910|2920|2930|2940|2950|2960|2970|2980|2990|3000=>
whenothers=>
endcase;
--计费标志去毛刺
process(wclk,jfbz1)
begin
ifwclk'
jfbz<
=jfbz1;
endif;
endarch;
--里程计费模块
--LCJF.VHD
entityLCJFis
GENERIC(SD0:
=160;
00单价,1.6元
SD1:
--其它时间1.8元
=60;
--起步公里数,6公里内为固定价格
qbjg:
port(START,DDBZ:
---开始,等待标志
LCBZ,jfbz,SDBZ:
--里程,计费,时段标志
LCFY:
outstd_logic_vector(15downto0)---行驶产生的费用
architecturearchofLCJFis
signalLCFY1:
--里程费用缓存
PROCESS(start,LCBZ,jfbz,SDBZ)
LCFY1<
---CLEAROLDVALUES
elsifJFBZ'
eventandJFBZ='
then--计费了
then--运行中
ifLCBZ='
then--6KM以内,起步以内
elsifLCBZ='
then--6KM以上,超过起步
ifSDBZ='
then--时段0
=LCFY1+SD0;
--相应费用
elsifSDBZ='
then--时段1
=LCFY1+SD1;
endif;
lcfy<
=lcfy1+qbjg;
---此处费用为:
没有超过6千米时为10元,超过了为(10+超过的里程×
时段单价
endarch;
--等待计时模块
--DDJS.VHD
entityddjsis
DDBZ,START:
--等待标志,开始
--时钟
DDSJ:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
--等待时间
XDBZ:
OUTSTD_LOGIC--标志
architecturebehvofddjsis
SIGNALXIDENG:
SIGNALMS,MG,FS,FG:
STD_LOGIC_VECTOR(3DOWNTO0);
PROCESS(CLK1HZ,START,DDBZ)
MS<
0000"
MG<
FS<
FG<
IFDDBZ='
then--等待中
IFMG=9thenMG<
--十进制计数秒数十位计算
IFMS=5thenMS<
--6进制计数秒数十位计算
--十进制计数分数个位计算
--6进制计数分数十位计算
XIDENG<
FS<
--等待够一个小时标志
=FS+'
---分数十位计算
=FG+'
---分数个位计算
=MS+'
---秒数十位计算
=MG+'
XDBZ<
=XIDENG;
DDSJ(15downto12)<
=fs;
DDSJ(11downto8)<
=fg;
DDSJ(7downto4)<
=ms;
DDSJ(3downto0)<
=mg;
endbehv;
--等待计费模块
entityDDJFis
---每分钟等待费用定义,单位为分
GENERIC(DD0:
=20;
--一小时以内20分每分钟,5分钟一元
DD1:
=33--一小时以上33分每分钟,每小时20元
--qibu:
--起步公里数,8公里内为固定价格
--qbjg:
=1000--起步价格,8公里内为10元
port(START,DDBZ,XDBZ,CLK1HZ:
DDFY:
outstd_logic_vector(15downto0)--等待费用
architecturearchofDDJFis
signalDDFY1:
SIGNALT60S:
SIGNALCNT60:
PROCESS(CLK1HZ)
IFclk1hz'
IFCNT60=60then
CNT60<
=CNT60+1;
---等待费用计算进程
PROCESS(DDBZ,XDBZ,T60S,START)
DDFY1<
elsifT60S'
eventandT60S='
then--够60秒
then--等待
ifxdbz='
then--1小时以内
=DDFY1+DD0;
elsifXDBZ='
then--1小时以内以上
DDFY1