出租车计费器课程设计报告.docx
《出租车计费器课程设计报告.docx》由会员分享,可在线阅读,更多相关《出租车计费器课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
![出租车计费器课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/9/09b2b605-8cef-4769-8205-a391a9fb543d/09b2b605-8cef-4769-8205-a391a9fb543d1.gif)
出租车计费器课程设计报告
电子技术课程设计
——出租车计费器
一、设计任务与要求………………………………3
二、总框体图 ………………………………3
三、选择器件 ………………………………5
四、功能模块 ………………………………6
1、模块se……………………………6
2、模块di ……………………………7
3、模块jifei ……………………………8
4、模块zh…………………………11
5、模块xxx1…………………………15
6、模块div_clk……………………………17
7、模块docode3_8……………………………18
五、总体设计电路图 …………………………19
1、总体电路原理图…………………………19
2、管脚分配图…………………………20
3、电路仿真结果…………………………21
4、硬件验证……………………………21
六、设计心得 ……………………………23
出租车计费器
一、设计任务与要求
1.能实现计费功能,计费标准为:
按行驶里程收费,起步费为7.00元,并在3km后按2.20元/km计费,当计费器计费达到或超过20元时,每公里加收50%的车费,车停止不计费。
2、现场模拟功能:
能模拟汽车启动、停止及暂停以及加速状态。
3、设计动态扫描电路:
将车费和里程显示出来,各有两位小数。
二、总体框图
decode3_8
se
div_clk
图1.1
di
xxx1
zh
jifei
1、设计思路:
(1)根据出租车计费原理,将出租车计费部分由5个计数器来完成分别为counterA,counterB,counterC,counterD,counterE。
①计数器A完成车费百位。
②计数器B完成车费十位和个位。
③计数器C完成车费角和分。
④计数器D完成计数到30(完成车费的起步价)。
⑤计数器E完成模拟实现车行驶100m的功能。
(2)行驶过程中车费附加50%的功能:
由比较器实现。
(3)车费的显示:
由动态扫描电路来完成。
用专用模块来实现,完成数据的输入即动
2、设计方案比较:
方案一:
采用数字电路控制。
其原理方框图如图1.21.2所示。
采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用,所以我们不予采用。
图1.2
方案二:
采用单片机控制。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。
其原理如图1.3所示。
单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。
缺点在于实现起来相对比较复杂,因此暂不考虑这种方法。
图1.3
方案三:
采用VHDL语言
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
而且它还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。
这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
除此之外,采用VHDL耗费资源比较小,速度比较快,效率比较高,且易于共享和复用。
故综合以上几点我们选择VHDL语言来设计出租车计费器。
三、选择器件
模块se,模块di,模块jifei,模块zh,模块xxx1,模块div_clk
模块decode3_8
四、功能模块
1、模块se
说明:
模块如图1.4所示,为八进制选择模块实现,该模块主要负责对不同时刻的车费路程的数值显示进行选择。
图1.4
以下为该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityseis
port(clk:
instd_logic;
a:
outstd_logic_vector(2downto0));
endse;
architecturert1ofseis
begin
process(clk)
variableb:
std_logic_vector(2downto0);
begin
if(clk'eventandclk='1')then
if(b="111")then
b:
="000";
else
b:
=b+1;
endif;
endif;
a<=b;
endprocess;
endrt1;
仿真图
图1.5
仿真结果分析:
输入端为:
clk,输出端为:
a,如图1.5所示,在clk的上升沿a开始发生变化,并开始进行计数,当进行到“111”时在下一个上升沿复位为“000”,此模块与“车费路程显示模块”相连接,负责选择显示车费路程。
2、模块di
说明:
模块如图1.6,显示译码模块实现
图1.6
以下为该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
entitydiis
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
enddi;
architecturert1ofdiis
begin
process(d)
begin
casedis
when"0000"=>q<="0111111";
when"0001"=>q<="0000110";
when"0010"=>q<="1011011";
when"0011"=>q<="1001111";
when"0100"=>q<="1100110";
when"0101"=>q<="1101101";
when"0110"=>q<="1111101";
when"0111"=>q<="0100111";
when"1000"=>q<="1111111";
whenothers=>q<="1101111";
endcase;
endprocess;
endrt1;
仿真图
图1.7
仿真结果分析:
输入端为:
d,输出端为:
q,
如图1.7,经过本模块以后,输入端输入的2进制数被7段显示译码器翻译成为相对应的数字显示出来。
3、模块jifei
说明:
计费模块如图1.8所示,输入端口START、STOP、PAUSE、JS分别为汽车起动、停止、暂停、加速按键。
LUC、CHEFEI分别表示汽车行驶的路程及相应的车费。
图1.8
以下为该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjifeiis
port(clk,start,stop,pause,js:
instd_logic;
chefei,luc:
outintegerrange0to8000);
endjifei;
architecturert1ofjifeiis
begin
process(clk,start,stop,pause,js)
variablea,b:
std_logic;
variableaa:
integerrange0to100;
variablechf,lc:
integerrange0to8000;
variablenum:
integerrange0to9;
begin
if(clk'eventandclk='1')then
if(stop='0')then
chf:
=0;
num:
=0;
b:
='1';
aa:
=0;
lc:
=0;
elsif(start='0')then
b:
='0';
chf:
=700;
lc:
=0;
elsif(start='1'andjs='1'andpause='1')then
if(b='0')then
num:
=num+1;
endif;
if(num=9)then
lc:
=lc+5;
num:
=0;
aa:
=aa+5;
endif;
elsif(start='1'andjs='0'andpause='1')then
lc:
=lc+1;
aa:
=aa+1;
endif;
if(aa>=100)then
a:
='1';
aa:
=0;
else
a:
='0';
endif;
if(lc<300)then
null;
elsif(chf<2000anda='1')then
chf:
=chf+220;
elsif(chf>=2000anda='1')then
chf:
=chf+330;
endif;
endif;
chefei<=chf;
luc<=lc;
endprocess;
endrt1;
仿真图
图1.9
仿真结果分析:
该模块是模拟汽车的启动、停止、暂停、加速按键,输入端口为:
stop,start,pause,js,clk,输出端口为:
b,如图1.9所示,在clk的上升沿,js变为1的时候,计费系统开始计费。
4、模块zh
说明:
如图2.0所示,为十进制转换模块的实现,该模块把车费和路程转化为4位十进制数,daclk的频率要比clk快得多。
图2.0
以下为该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityzhis
port(daclk:
instd_logic;
ascore,bscore:
inintegerrange0to8000;
age,ashi,abai,aqian,bge,bshi,bbai,bqian:
outstd_logic_vector(3downto0));
endzh;
architecturert1ofzhis
begin
process(daclk,ascore)
variablecomb1:
integerrange0to8000;
variablecomb1a,comb1b,comb1c,comb1d:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(comb1if(comb1a=9andcomb1b=9andcomb1c=9)then
comb1a:
="0000";
comb1b:
="0000";
comb1c:
="0000";
comb1d:
=comb1d+1;
comb1:
=comb1+1;
elsif(comb1a=9andcomb1b=9)then
comb1a:
="0000";
comb1b:
="0000";
comb1:
=comb1+1;
comb1c:
=comb1c+1;
elsif(comb1a=9)then
comb1a:
="0000";
comb1b:
=comb1b+1;
comb1:
=comb1+1;
else
comb1a:
=comb1a+1;
comb1:
=comb1+1;
endif;
else
ashi<=comb1b;
age<=comb1a;
abai<=comb1c;
aqian<=comb1d;
comb1:
=0;
comb1a:
="0000";
comb1b:
="0000";
comb1c:
="0000";
comb1d:
="0000";
endif;
endif;
endprocess;
process(daclk,bscore)
variablecomb2:
integerrange0to8000;
variablecomb2a,comb2b,comb2c,comb2d:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(comb2if(comb2a=9andcomb2b=9andcomb2c=9)then
comb2a:
="0000";
comb2b:
="0000";
comb2c:
="0000";
comb2d:
=comb2d+1;
comb2:
=comb2+1;
elsif(comb2a=9andcomb2b=9)then
comb2a:
="0000";
comb2b:
="0000";
comb2:
=comb2+1;
comb2c:
=comb2c+1;
elsif(comb2a=9)then
comb2a:
="0000";
comb2b:
=comb2b+1;
comb2:
=comb2+1;
else
comb2a:
=comb2a+1;
comb2:
=comb2+1;
endif;
else
bshi<=comb2b;
bge<=comb2a;
bbai<=comb2c;
bqian<=comb2d;
comb2:
=0;
comb2a:
="0000";
comb2b:
="0000";
comb2c:
="0000";
comb2d:
="0000";
endif;
endif;
endprocess;
endrt1;
仿真图
图2.1
仿真结果分析:
输入端为:
Daclk,ascore,bscore,输出端为:
age,ashi,abai,aqian,bge,bshi,bbai,bqian,将车费和路程转换成4位的十进制,如图2.1所示,age,ashi,abai,aqian,分别表示车费的个位,十位,百位和千位的计数显示,在daclk的上升沿发生变化。
bge,bshi,bbai,bqian;分别表示路程的个位,十位,百位和千位的显示,在daclk的下降沿开始发生变化
5、模块xxx1
说明:
如图2.2所示,为车费路程显示模块的实现,通过该八进制模块,车费和路程将被显示出来。
图2.2
以下为该模块的程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxxx1is
port(c:
instd_logic_vector(2downto0);
dp:
outstd_logic;
a1,a2,a3,a4,b1,b2,b3,b4:
instd_logic_vector(3downto0);
d:
outstd_logic_vector(3downto0));
endxxx1;
architecturert1ofxxx1is
begin
process(c,a1,a2,a3,a4,b1,b2,b3,b4)
variablecomb:
std_logic_vector(2downto0);
begin
comb:
=c;
casecombis
when"000"=>d<=a1;dp<='0';
when"001"=>d<=a2;dp<='0';
when"010"=>d<=a3;dp<='1';
when"011"=>d<=a4;dp<='0';
when"100"=>d<=b1;dp<='0';
when"101"=>d<=b2;dp<='0';
when"110"=>d<=b3;dp<='1';
when"111"=>d<=b4;dp<='0';
whenothers=>null;
endcase;
endprocess;
endrt1;
仿真图:
图2.3
仿真结果分析:
输入端为:
c,a1,a2,a3,a4,b1,b2,b3,b4,输出端为:
dp,d,该模块是将车费和路程显示出来,每来一个选通地址c,模块就把选到的那一位十进制输入值向后输出,同时在路程的百位和费用的十位显示小数点。
6、模块div_clk
图2.4
以下为该模块的程序:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdiv_clkIS
PORT(clk_in:
INstd_logic;
div_out:
OUTstd_logic);
ENDdiv_clk;
ARCHITECTUREaOFdiv_clkIS
SIGNALfre_N:
integerrange0to100000;
SIGNALclk_tmp:
std_logic;
BEGIN
div_out<=clk_tmp;
process(clk_in)
begin
iffalling_edge(clk_in)then
iffre_N>=99999then
fre_N<=0;
clk_tmp<=notclk_tmp;
else
fre_N<=fre_N+1;
endif;
endif;
endprocess;
ENDa;
7、模块decode3_8
说明:
模块decode3_8驱动数码管的显示。
图2.5
以下为该模块的程序:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdecode3_8IS
PORT(SEL:
INstd_logic_vector(2downto0);
Q:
OUTstd_logic_vector(7downto0)
);
ENDdecode3_8;
ARCHITECTUREaOFdecode3_8IS
BEGIN
Q<="11111110"whensel=0else
"11111101"whensel=1else
"11111011"whensel=2else
"11110111"whensel=3else
"11101111"whensel=4else
"11011111"whensel=5else
"10111111"whensel=6else
"01111111"whensel=7else
"11111111";
ENDa;
五、总体设计电路图
1、总体电路原理图
W
图2.6
2、管脚分配图
图2.7
3、电路仿真结果
图2.8
4、硬件验证
左边为路程,右边为车费。
图2.9
图3.0
图3.1
图3.2
六、设计心得
短短两周的课程设计已经完成了,从挑选课设题目,查阅资料,到研究出
总体设计,详细设计,再到最后的编程上机调试,修改程序,完善程序,收获颇多。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
若停止则车费清零,等待下一次计费的开始。
在出租车计费系统的7个模块中,重点在于jifei模块,zh模块、xxx1模块。
jifei模块主要有汽车的启动、停止、暂停、加速按键;zh模块主要是把车费和路程转化为4位十进制;zh模块是将车费和路程显示出来。
各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。
出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
在这两周里我们再次熟悉和增强了对vhdl语言的基本知识,熟悉利用vhdl语言对常用的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。
Vhdl硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述、直接设计数字电路硬件系统。
通过编程,下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能。
更加了解和加深了对编程和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路,在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
课程设计结束了,但是从中学到的知识会让我受益终身。
最后,我衷心地感谢课设期间指导我的老师。