出租车设计报告Word下载.docx
《出租车设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《出租车设计报告Word下载.docx(17页珍藏版)》请在冰点文库上搜索。
第3章主体电路与波形仿真4
3.1 两个模块生成符号文件4
3.2 对taxi模块进行波形仿真观察到的现象4
3.3 对decoder模块进行波形仿真观察到的现象5
3.4 整机电路的连接5
第4章 程序的设计7
4.1taxi模块程序7
4.2decoder模块程序9
第5章 总结15
参考文献16
第1章前言
1.1 发展概括与设计背景
伴随中国经济的腾飞,城市化的进程也随之加快。
虽然人们出行的选择趋于多样化,但是出租车作为一种重要的交通工具,也为很多人作为出行的选择。
大城市里出租车已经相当普及,但是在中小城市出租车依然处于快速发展的阶段。
出租车的计费方式也在发生变化,由只能显示里程的方式变为现在的自主计费和打印发票及语音提示的智能化方式;
根据出租车行业的发展需求,国内许多生产厂商也制造出不同类型的计价器,传统的出租车计费器经过十几年的使用,在稳定性,成本等方面都具有一定的优势。
第2章 设计目标与主体
2.1 设计目标
1.实现计费功能。
按行驶里程计费,起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每千米加收50%的车费,车停止和暂停时不计费;
2.现场模拟汽车的起动、停止、暂停和换挡等状态;
3.设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。
2.2 设计主体
假设出租车有启动键、停止键、暂停键和档位键。
启动键为脉冲触发信号,当它为一个脉冲是,表示汽车已启动,并根据车速的选择和基本车速发出相应频率的脉冲(计费脉冲)实现车费和路程的计数,同时车费显示起步价;
当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;
当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;
档位键用来改变车速,不同档位对应着不同的车速,同时路程计数的速度也不同。
首先设计taxi计费模块,实现计费功能。
起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每千米加收50%的车费,车停止和暂停时不计费。
其次将输出的费用和路程作为输入,给decoder模块,完成数码管显示功能,并且对小数点等做出明确定义。
2.3 系统框图
出租车计费器可分为两大模块,即控制模块和译码显示模块,系统框图如图2.3所示,控制模块实现了计费和路程的技术,并且通过不同的档位控制车速。
译码显示模块实现了十进制到4位十进制的转换,以及车费和路程的显示。
计费时钟
档位
起动
暂停
停止
图2.3出租车计费器系统框图
第3章主体电路与波形仿真
3.1 两个模块生成符号文件
电路符号,其中clk为计费时钟脉冲信号输入端,clk20MHZ为译码高频时钟信号输入端,start为汽车启动键,stop为汽车停止键,pause为汽车暂停键,speed【1..0】为档位键,scan【7..0】为数码管地址选择信号输出端,seg7【6..0】为7段显示控制信号输出端,dp为小数点信号输出端。
图3.1.1taxi模块生成符号文件
图3.1.2decoder模块生成符号文件
3.2 对taxi模块进行波形仿真观察到的现象
对控制模块taxi进行仿真后得到的功能仿真结果如图3.2所示。
观察波形可知,当起动键(start)为一个脉冲时,表示汽车已起动,车费money显示起步价6.00元,同时路程distance随着计费脉冲开始计数;
当停止键(stop)为1时,表示汽车熄火停止,车费money和路程distance均为0;
当暂停键(pause)为1时,车费和路程停止计数;
当档位键分别取0、2、3时路程的计数逐渐加快,表示车速逐渐加快。
图3.2taxi模块波形仿真
3.3 对decoder模块进行波形仿真观察到的现象
将扫描数码管的分频系数改小后对译码显示模块decoder的功能仿真结果如图3.3所示。
进行译码的时钟频率必须比计费的时钟高得多才能实时显示出车费和路程的变化,这里直接采用晶振时钟20MHz即可。
图3.3decoder模块波形仿真
3.4 整机电路的连接
连接整机电路我们是通过前面生成的taxi模块和decoder模块进行搭接电路的,其电路如图3.4所示。
整机电路的搭接与实现,让我们更加具体和直观的看到我们对出租车计价器的仿真效果。
更好的证明了仿真与实物很接近。
图3.4整机电路图
第4章 程序的设计
4.1taxi模块程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytaxiis
port(clk:
instd_logic;
----计费时钟
start:
----汽车起动
stop:
----汽车停止
pause:
----汽车暂停
speedup:
instd_logic_vector(1downto0);
----档位(4个档位)
money:
outintegerrange0to8000;
----车费
distance:
outintegerrange0to8000);
----路程
end;
architectureoneoftaxiis
begin
process(clk,start,stop,pause,speedup)
variablemoney_reg,distance_reg:
integerrange0to8000;
----车费和路程的寄存器
variablenum:
integerrange0to9;
----控制车速的计数器
variabledis:
integerrange0to100;
----千米计数器
variabled:
std_logic;
----千米标志位
ifstop='
1'
then-----汽车停止,计费和路程清零
money_reg:
=0;
distance_reg:
dis:
num:
elsifstart='
then-----汽车起动后,起步价为6元
=600;
elsifclk'
eventandclk='
then
ifstart='
0'
andspeedup="
00"
andpause='
andstop='
then---1档
ifnum=9then
=distance_reg+1;
=dis+1;
elsenum:
=num+1;
endif;
elsifstart='
01"
then---2档
=distance_reg+2;
=dis+2;
10"
then---3档
=distance_reg+5;
=dis+5;
11"
then---4档
ifdis>
=100then
d:
='
;
elsed:
ifdistance_reg>
=300then-------如果超过3km按1.2元/千米计算
ifmoney_reg<
2000andd='
=money_reg+120;
elsifmoney_reg>
=2000andd='
=money_reg+180;
-------当计费器达到20元,每千米加收50%的车费
money<
=money_reg;
distance<
=distance_reg;
endprocess;
end;
4.2decoder模块程序
entitydecoderis
port(clk20mhz:
-----系统时钟20MHZ
money_in:
inintegerrange0to8000;
-----车费
distance_in:
-----路程
scan:
outstd_logic_vector(7downto0);
-----数码管地址选择信号
seg7:
outstd_logic_vector(6downto0);
-----7段显示控制信号(abcdefg)
dp:
outstd_logic);
---------小数点
architectureoneofdecoderis
signalclk1khz:
----1KHZ的分频时钟,用于扫描数码管地址
signaldata:
std_logic_vector(3downto0);
signalm_one,m_ten,m_hun,m_tho:
-----钱数的4位十进制表示
signald_one,d_ten,d_hun,d_tho:
-----路程的4位十进制表示
-------------1KHZ分频,用于扫描数码管地址---
process(clk20mhz)
variablecount:
integerrange0to9999;
ifclk20mhz'
eventandclk20mhz='
ifcount=9999thenclk1khz<
=notclk1khz;
count:
elsecount:
=count+1;
endif;
endprocess;
------将车费的十进制数转化为4位十进制数---
process(clk20mhz,money_in)
variablecomb1:
variablecomb1_a,comb1_b,comb1_c,comb1_d:
ifcomb1<
money_inthen
ifcomb1_a=9andcomb1_b=9andcomb1_c=9then
comb1_a:
="
0000"
comb1_b:
comb1_c:
comb1_d:
=comb1_d+1;
comb1:
=comb1+1;
elsifcomb1_a=9andcomb1_b=9then
=comb1_c+1;
elsifcomb1_a=9then
=comb1_b+1;
else
=comb1_a+1;
elsifcomb1=money_inthen
m_one<
=comb1_a;
m_ten<
=comb1_b;
m_hun<
=comb1_c;
m_tho<
=comb1_d;
elsifcomb1>
---------将路程的十进制转化为4位十进制数---
process(clk20mhz,distance_in)
variablecomb2:
variablecomb2_a,comb2_b,comb2_c,comb2_d:
ifcomb2<
distance_inthen
ifcomb2_a=9andcomb2_b=9andcomb2_c=9then
comb2_a:
comb2_b:
comb2_c:
comb2_d:
=comb2_d+1;
comb2:
=comb2+1;
elsifcomb2_a=9andcomb2_b=9then
=comb2_c+1;
elsifcomb2_a=9then
=comb2_b+1;
=comb2_a+1;
elsifcomb2=distance_inthen
d_one<
=comb2_a;
d_ten<
=comb2_b;
d_hun<
=comb2_c;
d_tho<
=comb2_d;
elsifcomb2>
---------数码管动态扫描
process(clk1khz,m_one,m_ten,m_hun,m_tho,d_one,d_ten,d_hun,d_tho)
variablecnt:
std_logic_vector(2downto0);
ifclk1khz'
eventandclk1khz='
cnt:
=cnt+1;
casecntis
when"
000"
=>
data<
=m_one;
dp<
scan<
00000001"
001"
=m_ten;
00000010"
010"
=m_hun;
00000100"
011"
=m_tho;
00001000"
100"
=d_one;
00010000"
101"
=d_ten;
00100000"
110"
=d_hun;
01000000"
111"
=d_tho;
10000000"
endcase;
-------7段译码----
process(data)
casedatais
seg7<
1111110"
0001"
0110000"
0010"
1101101"
0011"
1111001"
0100"
0110011"
0101"
1011011"
0110"
1011111"
1000"
1111111"
1001"
1111011"
whenothers=>
0000000"
第5章 总结
本文介绍了基于FPGA的出租车计费器系统的设计方法,出租车计费器系统的设计能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
在出租车计费系统的几个个模块中,重点在于taxi模块和decoder这两个模块。
taxi模块主要有汽车的启动、停止、暂停、换挡按键;
decoder模块主要是把车费和路程转化为4位十进制;
将车费和路程显示出来。
各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。
出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
参考文献
[1]刘延飞,郭锁利,王晓戎,李琪,常春藤.基于AlteraFPGA/CPLD的电子系统设计及工程实践[M].出版地:
北京:
人民邮电出版社,2009.
[2]黄勇,任家富.EDA技术与VerilogHDL设计.出版社:
西南交通大学出版社,2014.
[3]潘松,黄继业.EDA技术与VHDL.出版社:
清华大学出版社,2005.