EDA课设出租车计费系统的VHDL实现.docx
- 文档编号:5911480
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:20
- 大小:122.64KB
EDA课设出租车计费系统的VHDL实现.docx
《EDA课设出租车计费系统的VHDL实现.docx》由会员分享,可在线阅读,更多相关《EDA课设出租车计费系统的VHDL实现.docx(20页珍藏版)》请在冰豆网上搜索。
EDA课设出租车计费系统的VHDL实现
目录
绪论2
一.系统设计要求3
二.系统设计方案3
三.主要模块4
4.1速度模块4
4.2计程模块5
4.3计时模块5
4.4计费模块5
四.VHDL源程序6
五.仿真结果与分析16
六.硬件实现17
小结19
谢辞20
参考文献21
绪论
近年来,我国出租汽车行业迅猛发展,出租汽车已成为我国城市公共交通的重要组成部分和现代化城市必备的基础设施,成为人们工作、生活中不可缺少的交通工具。
它对繁荣经济、促进发展、方便群众、改善交通起到了积极作用。
出租汽车对我国人民物质和文化生活影响之大、作用之广是前所未有的。
出租汽车行业的服务水平和程度已经成为现代化的重要标志。
出租汽车服务行业和出租汽车计价器紧密相关,因为出租汽车必须安装出租汽车计价器才能投入营运。
出租汽车计价器是一种能根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并直接显示车费值的计量器具。
计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器量值准确与否,直接关系到经营者和消费者的经济利益
随着出租车行业的发展,对出租车计费器的要求也越来越高,用户不仅要求计费器性能稳定,计费准确,有防作弊功能;同时还要求其具有车票资料打印、IC卡付费、语音报话、和电脑串行通信等功能,而这些与电子技术的发展是分不开的。
二十世纪后半期,随着集成电路和计算机技术的飞速发展,数字系统也得到了飞速发展,其实现方法经历了由分立元件、SSI、MSI到LSI、VLSI以及UVLSI的过程。
同时为了提高系统的可靠性与通用性,微处理器和专业集成电路(ASIC)逐渐取代了通用全硬件LSI电路,而ASIC以其体积小、重量轻、功耗低、速度快、成本低、保密性好而脱颖而出。
目前,业界大量可编程逻辑器件(PLD),尤其是现场可编程逻辑器件(FPLD)被大量地应用在ASIC的制作当中。
在可编程集成电路的开发过程中,以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术最新成果的电子设计自动化(EDA)技术主要能辅助进行三方面的设计工作:
IC设计,电子电路设计以及PCB设计。
一系统设计要求
设计一个满足日常生活所需功能的车租车计费器。
该计费器能实现计费功能,车起步开始计费,首先显示起步价,起步费为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:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
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;--停止状态或空挡
when"001"=>kinside:
=28;--第一档,慢速行驶状态,行驶100m需要28个时钟周期
when"010"=>kinside:
=24;--第二档
when"011"=>kinside:
=20;--第三档
when"100"=>kinside:
=16;--第四档
when"101"=>kinside:
=12;--第五档
when"110"=>kinside:
=8;--第六档
when"111"=>kinside:
=4;--第七档,也是速度最大的档
endcase;
ifreset='1'then
s_state:
=s0;
elsifclk'eventandclk='1'then
cases_stateis
whens0=>
cnt:
=0;
clkout<='0';
ifstart='1'then
s_state:
=s1;
else
s_state:
=s0;
endif;
whens1=>
clkout<='0';
ifstop='1'then
s_state:
=s0;--相当于无客户上车
elsifsp="000"then
s_state:
=s1;---有客户上车,但车速位0,即客户刚上车还未起步
elsifcnt=kinsidethen
cnt:
=0;
clkout<='1';
s_state:
=s1;
else
cnt:
=cnt+1;
s_state:
=s1;
endif;
endcase;
endif;
endprocess;
endrtl;
计程模块的VHDL代码如下:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entitykilometersis
Port(
clkout,reset:
instd_logic;
kmcnt1:
outstd_logic_vector(3downto0);
kmcnt2:
outstd_logic_vector(3downto0);
kmcnt3:
outstd_logic_vector(3downto0)
);
endkilometers;
architecturertlofkilometersis
begin
process(clkout,reset)
variablekm_reg:
std_logic_vector(11downto0);
begin
ifreset='1'then
km_reg:
="000000000000";
elsifclkout'eventandclkout='1'then
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"then
km_reg:
=km_reg+"01100000";--个位向十位的进位处理
endif;
endif;
kmcnt1<=km_reg(3downto0);
kmcnt2<=km_reg(7downto4);
kmcnt3<=km_reg(11downto8);
endprocess;
endrtl;
计时模块的VHDL代码如下:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entitytimesis
Port(
clk:
instd_logic;
reset:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
sp:
instd_logic_vector(2downto0);
timecount:
outstd_logic
);
Endtimes;
architecturertloftimesis
begin
process(reset,clk,sp,stop,start)
typestate_typeis(t0,t1,t2);
variablet_state:
state_type;
variablewaittime:
integerrange0to1000;
begin
ifreset='1'then
t_state:
=t0;
elsif(clk'eventandclk='1')then
caset_stateis
whent0=>
waittime:
=0;
timecount<='0';
ifstart='1'then
t_state:
=t1;
else
t_state:
=t0;
endif;
whent1=>
ifsp="000"then
t_state:
=t2;
else
waittime:
=0;
t_state:
=t1;
endif;
whent2=>
waittime:
=waittime+1;
timecount<='0';
ifwaittime=1000then
timecount<='1';--20s,即1000个clk,产生一个时间计费脉冲
waittime:
=0;
elsifstop='1'then
t_state:
=t0;
elsifsp="000"then
t_state:
=t2;
else
timecount<='0';
t_state:
=t1;
endif;
endcase;
endif;
endprocess;
endrtl;
计费模块的VHDL代码如下:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entitykmmoneyis
Port(
clk:
instd_logic;
reset:
instd_logic;
timecount:
instd_logic;
clkout:
instd_logic;
kmcnt2:
instd_logic_vector(3downto0);
kmcnt3:
instd_logic_vector(3downto0);
count1:
outstd_logic_vector(3downto0);
count2:
outstd_logic_vector(3downto0);
count3:
outstd_logic_vector(3downto0)
);
Endkmmoney;
Architecturertlofkmmoneyis
Signalcash:
std_logic_vector(11downto0);
Signalprice:
std_logic_vector(3downto0);
Signalenable:
std_logic;
Begin
kmmoney1:
Process(cash,kmcnt2)
Begin
Ifcash>="000001000000"then
price<="0100";
Else
price<="0010";
Endif;
If(kmcnt2>="0011")or(kmcnt3>="0001")then
enable<='1';
Else
enable<='0';
Endif;
Endprocess;
kmmoney2:
process(reset,clkout,clk,enable,price,kmcnt2)
variablereg2:
std_logic_vector(11downto0);
variableclkout_cnt:
integerrange0to10;
begin
ifreset='1'then
cash<="000000000011";--起步费用设为3元
elsifclk'eventandclk='1'then
iftimecount='1'then--判断是否需要时间计费,每20s加一元
reg2:
=cash;
ifreg2(3downto0)+"0001">"1001"then
reg2(7downto0):
=reg2(7downto0)+"00000111";
ifreg2(7downto4)>"1001"then
cash<=reg2+"000001100000";
else
cash<=reg2;
endif;
else
cash<=reg2+"0001";
endif;
elsifclkout='1'andenable='1'then--里程计费
ifclkout_cnt=9then
clkout_cnt:
=0;
reg2:
=cash;
if"0000"®2(3downto0)+price(3downto0)>"00001001"then
reg2(7downto0):
=reg2(7downto0)+"00000110"+price;
ifreg2(7downto4)>"1001"then
cash<=reg2+"000001100000";
else
cash<=reg2;
endif;
else
cash<=reg2+price;
endif;
else
clkout_cnt:
=clkout_cnt+1;
endif;
endif;
endif;
endprocess;
count1<=cash(3downto0);--总费用的个位
count2<=cash(7downto4);--总费用的十位
count3<=cash(11downto8);--总费用的百位
Endrtl;
顶层模块的VHDL代码如下:
Libraryieee;
Useieee.std_logic_1164.all;
Entitytopis
Port(
clk:
instd_logic;
reset:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
sp:
instd_logic_vector(2downto0);
kmcnt1:
outstd_logic_vector(3downto0);
kmcnt2:
outstd_logic_vector(3downto0);
kmcnt3:
outstd_logic_vector(3downto0);
count1:
outstd_logic_vector(3downto0);
count2:
outstd_logic_vector(3downto0);
count3:
outstd_logic_vector(3downto0)
);
ENDtop;
ARCHITECTURErtlOFtopIS
COMPONENTspeedis
Port(
clk:
instd_logic;
reset:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
sp:
instd_logic_vector(2downto0);
clkout:
outstd_logic
);
endCOMPONENTspeed;
COMPONENTtimesis
Port(
clk:
instd_logic;
reset:
instd_logic;
start:
instd_logic;
stop:
instd_logic;
sp:
instd_logic_vector(2downto0);
timecount:
outstd_logic
);
EndCOMPONENTtimes;
COMPONENTkilometersis
Port(
clkout,reset:
instd_logic;
kmcnt1:
outstd_logic_vector(3downto0);
kmcnt2:
outstd_logic_vector(3downto0);
kmcnt3:
outstd_logic_vector(3downto0)
);
endCOMPONENTkilometers;
COMPONENTkmmoneyis
Port(
clk:
instd_logic;
reset:
instd_logic;
timecount:
instd_logic;
clkout:
instd_logic;
kmcnt2:
instd_logic_vector(3downto0);
kmcnt3:
instd_logic_vector(3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 出租车 计费 系统 VHDL 实现