EDA课设出租车计费系统的VHDL实现Word格式文档下载.docx
- 文档编号:18900862
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:20
- 大小:122.64KB
EDA课设出租车计费系统的VHDL实现Word格式文档下载.docx
《EDA课设出租车计费系统的VHDL实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA课设出租车计费系统的VHDL实现Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
该计费器能实现计费功能,车起步开始计费,首先显示起步价,起步费为3.00元,车在行驶3km以内,只收起步价。
车行驶超过3km后,每km2元,车费一次累加。
当总费用达到或超过40元时,每km收费4元。
当遇到红灯或者客户需要停车等待时,则按时间计费,计费单价为每20s收费一元。
实现计费器预置功能,能够预置起步费、每公里收费、车行加费里程、计时收费等。
可以模拟汽车行驶、停止、暂停等状态,并根据不同状态进行计费。
以十进制显示出租车行驶路程与车费。
二系统设计方案
Speed模块
Reset
Start
sp
Time模块
总里程
总费用
Kilometers模块
Kmmoney模块
图3.1出租车计费器系统结构图
系统接收到reset信号后,总费用变为3元,同时其他计数器、寄存器等全部清零。
系统接收到start信号后,首先把部分寄存器赋值,总费用不变,单价price寄存器通过对总费用的判断后赋为2元。
其他寄存器和计数器继续保持为0.
速度模块:
通过对速度信号sp的判断,决定变量kinside的值。
Kinside即是行进100m所需的时钟周期数,然后每行进100m,则产生一个脉冲clkout。
计程模块:
由于一个clkout信号代表行进100m,故通过对clkout计数,可以获得共行进的距离kmcount。
计时模块:
在汽车启动后,当遇到顾客等人或红灯时,出租车采用计时收费的方式。
通过对速度信号sp的判断决定是否开始记录时间。
当sp=0时,开始记录时间。
当时间达到足够长时则产生timecount脉冲,并重新计时一个timecount脉冲相当于等待的时间达到了时间计费的长度。
这里选择系统时钟频率为500hz,20s即计数值为1000。
计费模块由两个进程组成。
其中,一个进程根据条件对enable和price赋值:
当记录的距离达到3公里后enable变为1,开始进行每公里收费,当总费用大于40元后,则单价price由原来的2元每公里变为4元每公里;
第二个进程在每个时钟周期判断timecount和clkout的值。
当其为1时,则在总费用上加上相应的费用。
三.主要模块
从上述设计方案中可以大致得到出租车计费器的系统框图,如图4.1所示,其中clk为输入时钟脉冲,时钟上升沿有效;
rest为复位信号,start为开始计费信号,stop为停止计费信号,均为高电平有效;
sp[2.....0]表示出租车状态(停止或不同行驶速度);
kmcnt和count信号则分别输出出租车行驶的里程和花费。
系统的显示电路由共阴极LED数码显示管组成。
4.1出租车计费器系统框图
4.1速度模块
速度模块首先根据start信号判断是否开始计费,然后根据输入的速度档位sp[2...0]的判断,确定行驶100m所需要的时钟数,每前进100m,输出一个clout信号。
同时由cnt对clk进行计数,当cnt等于kinside时,把clkout信号置1,cnt清0.其模块框图如图4.2所示。
4.2速度模块框图
4.2计程模块
此模块主要应用与记录行进的距离,其模块框图如图4.3所示。
通过对clkout信号计数,可以计算行驶的距离kmcount。
一个clkout脉冲相当于行进100m,所以只要记录clkout的脉冲数即可以确定共行进的距离。
Kmcount为十分位,kmcount2为个位,kmcount3为十位,分别为十进制数。
4.3计程模块框图
4.3计时模块
速度模块主要用于计时收费,记录计程车速度为0的时间(如等待红灯)其模块框图如图4.4所示。
通过对sp信号的判断,当是sp=0,开始记录时间。
当时间达到足够长时,产生timecount脉冲,并重新计时。
4.4速度模块
4.4计费模块
计费模块如图4.5所示,可分为kmmoney1和kmmoney2两个进程。
Kmmoney1用于产生enable和price信号。
当记录距离达到3km后,enable信号为1,开始进行每km收费。
当总费用大于40元后,单价price由原来的2元变为4元,用作计时收费,通过对sp信号的判断,当sp=0,开始记录时间。
当时间达到足够长时,长生timecount脉冲并重新计时。
Kmmoney2用于判断timecount和clkout的值,当其为1时,总费用加1.最终输出为总费用。
4.5计费模块框图
四VHDL源程序
速度模块的VHDL代码如下:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entityspeedis
Port(
clk:
instd_logic;
reset:
start:
stop:
sp:
instd_logic_vector(2downto0);
clkout:
outstd_logic
);
endspeed;
architecturertlofspeedis
begin
process(clk,reset,stop,start,sp)
typestate_typeis(s0,s1);
variables_state:
state_type;
variablecnt:
integerrange0to28;
variablekinside:
integerrange0to30;
begin
casespis--速度选择
when"
000"
=>
kinside:
=0;
--停止状态或空挡
001"
=28;
--第一档,慢速行驶状态,行驶100m需要28个时钟周期
010"
=24;
--第二档
011"
=20;
--第三档
100"
=16;
--第四档
101"
=12;
--第五档
110"
=8;
--第六档
111"
=4;
--第七档,也是速度最大的档
endcase;
ifreset='
1'
then
s_state:
=s0;
elsifclk'
eventandclk='
then
cases_stateis
whens0=>
cnt:
clkout<
='
0'
;
ifstart='
s_state:
=s1;
else
endif;
whens1=>
ifstop='
then
--相当于无客户上车
elsifsp="
---有客户上车,但车速位0,即客户刚上车还未起步
elsifcnt=kinsidethen
cnt:
clkout<
=cnt+1;
endcase;
endif;
endprocess;
endrtl;
计程模块的VHDL代码如下:
Entitykilometersis
clkout,reset:
kmcnt1:
outstd_logic_vector(3downto0);
kmcnt2:
kmcnt3:
outstd_logic_vector(3downto0)
endkilometers;
architecturertlofkilometersis
process(clkout,reset)
variablekm_reg:
std_logic_vector(11downto0);
km_reg:
="
000000000000"
elsifclkout'
eventandclkout='
ifkm_reg(3downto0)="
1001"
then--km_reg(3downto0)对应里程十分位
km_reg:
=km_reg+"
0111"
--十分位向个位的进位处理
else
km_reg(3downto0):
=km_reg(3downto0)+"
0001"
endif;
ifkm_reg(7downto4)="
1010"
01100000"
--个位向十位的进位处理
kmcnt1<
=km_reg(3downto0);
kmcnt2<
=km_reg(7downto4);
kmcnt3<
=km_reg(11downto8);
计时模块的VHDL代码如下:
Entitytimesis
clk:
stop:
sp:
timecount:
Endtimes;
architecturertloftimesis
process(reset,clk,sp,stop,start)
typestate_typeis(t0,t1,t2);
variablet_state:
variablewaittime:
integerrange0to1000;
t_state:
=t0;
elsif(clk'
)then
caset_stateis
whent0=>
waittime:
timecount<
t_state:
=t1;
whent1=>
ifsp="
=t2;
waittime:
whent2=>
=waittime+1;
ifwaittime=1000then
timecount<
--20s,即1000个clk,产生一个时间计费脉冲
elsifstop='
计费模块的VHDL代码如下:
Entitykmmoneyis
timecount:
instd_logic_vector(3downto0);
count1:
count2:
count3:
Endkmmoney;
Architecturertlofkmmoneyis
Signalcash:
Signalprice:
std_logic_vector(3downto0);
Signalenable:
std_logic;
Begin
kmmoney1:
Process(cash,kmcnt2)
Begin
Ifcash>
000001000000"
price<
0100"
Else
0010"
Endif;
If(kmcnt2>
0011"
)or(kmcnt3>
)then
enable<
Endprocess;
kmmoney2:
process(reset,clkout,clk,enable,price,kmcnt2)
variablereg2:
variableclkout_cnt:
integerrange0to10;
cash<
000000000011"
--起步费用设为3元
then
iftimecount='
then--判断是否需要时间计费,每20s加一元
reg2:
=cash;
ifreg2(3downto0)+"
>
"
reg2(7downto0):
=reg2(7downto0)+"
00000111"
ifreg2(7downto4)>
cash<
=reg2+"
000001100000"
cash<
=reg2;
else
cash<
endif;
elsifclkout='
andenable='
then--里程计费
ifclkout_cnt=9then
clkout_cnt:
reg2:
if"
0000"
&
reg2(3downto0)+price(3downto0)>
00001001"
reg2(7downto0):
00000110"
+price;
ifreg2(7downto4)>
cash<
else
endif;
else
=reg2+price;
=clkout_cnt+1;
count1<
=cash(3downto0);
--总费用的个位
count2<
=cash(7downto4);
--总费用的十位
count3<
=cash(11downto8);
--总费用的百位
Endrtl;
顶层模块的VHDL代码如下:
Entitytopis
ENDtop;
ARCHITECTURErtlOFtopIS
COMPONENTspeedis
endCOMPONENTspeed;
COMPONENTtimesis
EndCOMPONENTtimes;
COMPONENTkilometersis
endCOMPONENTkilometers;
COMPONENTkmmoneyis
instd_logic_vector(3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 出租车 计费 系统 VHDL 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)