数字电路出租车计费器.docx
《数字电路出租车计费器.docx》由会员分享,可在线阅读,更多相关《数字电路出租车计费器.docx(17页珍藏版)》请在冰豆网上搜索。
![数字电路出租车计费器.docx](https://file1.bdocx.com/fileroot1/2022-10/11/2ffe463f-9494-4acb-84b5-d85535303e61/2ffe463f-9494-4acb-84b5-d85535303e611.gif)
数字电路出租车计费器
一、课题要求
(1)技术要求
1.掌握较复杂逻辑的设计、调试。
2.进一步掌握用VHDL语言设计数字逻辑电路。
3.掌握用quartusII6.0软件进展编程设计。
(2)功能要求
1.能实现计费功能,计费标准为:
按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器到达或超过一定收费〔如20元〕。
每公里加收50%的车费,车停顿不计费
2.实现预置功能、每公里收费、车行驶加费里程。
3.实现模拟功能:
能模拟汽车启动、停顿、暂停、车速等状态。
4.设计动态扫描电路
将车费显示出来。
有两位小数。
5.用VHDL语言设计符合上述功能要求的出租车计费器。
并用层次化设计方法设计该电路。
6.各计数器的技术状态用功能的方法验证,并用有关波形确认电路设计是否正确
7.完成电路全部设计后,通过系统试验箱下载验证设计课题的正确性。
二本人工作:
本人主要负责软件和硬件电路方面的设计,并进展引脚设定,以及与软硬件之间的调试运行,及时修改程序,帮助查找和分析问题,确保能够成功完成出租车计费器的设计。
三设计方案:
3.1主要中心组成
3.2FPGA芯片部主要程序:
3.3工作原理:
基于CPLD/FPGA的出租车计费器的组成如图1所示。
各局部主要功能如下:
(1)A计数器对车轮传感器送来的脉冲信号进展计数(每转一圈送一个脉冲)。
不同车型的车轮直径可能不一样,通过“设置1〞对车型做出选择,以实现对不同车轮直径的车进展调整。
(2)B计数器对百米脉冲进展累加,并输出实际公里数的BCD码给译码动态扫描模块。
每计满500送出一个脉冲给C计数器。
“设置2〞实现起步公里数预制。
(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。
“设置3〞用来完成超价加费、起步价预制等。
(4)译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。
(5)数码管显示将公里数和计费金额均用四位LED数码管显示(2位整数,2位小数)。
3.4功能模块设计
出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用VHDL编写功能模块,然后用顶层原理图将各功能模块连接起来。
四单元模块设计:
首先出租车计费器的设计需要分频,所以需要设计了两个频率:
4.1oneMHZ:
由于给定的50MHZ太大,这个程序完成5000分频,实现第一次分频,确保实现动态计数,并且保证频率在驱动围之。
libraryieee;
useieee.std_logic_1164.all;
entityoneMHZis
port(daclk:
instd_logic;
clkout:
outstd_logic);
endoneMHZ;
architectureoneofoneMHZis
signaldata:
integerrange0to5000;
signalQ:
std_logic;
begin
process(daclk)
begin
ifdaclk'eventanddaclk='1'then
if(data=5000)then
data<=0;
Q<=notQ;
else
data<=data+1;
endif;
endif;
clkout<=Q;
endprocess;
endone;
4.2twoMHZ:
这个程序完成2500分频,实现第二次分频,确保最后数码管显示频率在适宜围
libraryieee;
useieee.std_logic_1164.all;
entitytwoMHZis
port(daclk:
instd_logic;
clkout:
outstd_logic);
endtwoMHZ;
architectureoneoftwoMHZis
signaldata:
integerrange0to2500;
signalQ:
std_logic;
begin
process(daclk)
begin
ifdaclk'eventanddaclk='1'then
if(data=2500)then
data<=0;
Q<=notQ;
else
data<=data+1;
endif;
endif;
clkout<=Q;
endprocess;
endone;
4.3Charge:
实现计费功能,按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器到达或超过一定收费〔如20元〕。
每公里加收50%的车费,车停顿不计费,实现预置功能、每公里收费、车行驶加费里程,实现模拟功能,能模拟汽车启动、停顿、暂停、车速等状态,将车费显示出来。
有两位小数。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitychargeis
port(cp,ks,tz,zt:
instd_logic;
dis,mon:
outintegerrange0to9999);
endcharge;
architecturechofchargeis
begin
process(cp,ks,tz,zt)
variabledis1,mon1:
integerrange0to9999;
begin
if(cp'eventandcp='1')then
if(tz='0')then
dis1:
=0;mon1:
=0;
elsif(ks='0')then
dis1:
=0;mon1:
=700;
elsif(ks='1'andtz='1'andzt='1')then
dis1:
=dis1+10;
elsif(ks='1'andtz='1'andzt='0')then
dis1:
=dis1;mon1:
=mon1;
endif;
if(dis1<300)thennull;
elsif(dis1<600anddis1>300)then
mon1:
=mon1+22;
elsif(dis1>=600)then
mon1:
=mon1+33;
endif;
mon<=mon1;dis<=dis1;
endif;
endprocess;
endch;
4.4Transform实现将电路计数分上下位显示,将二进制转化为数码管可识别的十进制
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytransformis
port(daclk:
std_logic;
dis,mon:
integerrange0to9999;
dg,ds,db,dq,mg,ms,mb,mq:
outstd_logic_vector(3downto0));
endtransform;
architecturetranoftransformis
begin
process(daclk,dis)
variabled:
integerrange0to9999;
variabled1,d2,d3,d4:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(dif(d1=9andd2=9andd3=9)then
d1:
="0000";d2:
="0000";d3:
="0000";
d4:
=d4+1;d:
=d+1;
elsif(d1=9andd2=9)then
d1:
="0000";d2:
="0000";d3:
=d3+1;d:
=d+1;
elsif(d1=9)then
d1:
="0000";d2:
=d2+1;d:
=d+1;
else
d1:
=d1+1;d:
=d+1;
endif;
else
d:
=0;d1:
="0000";d2:
="0000";d3:
="0000";d4:
="0000";
endif;
endif;
dg<=d1;ds<=d2;db<=d3;dq<=d4;
endprocess;
process(daclk,mon)
variablem:
integerrange0to9999;
variablem1,m2,m3,m4:
std_logic_vector(3downto0);
begin
if(daclk'eventanddaclk='1')then
if(mif(m1=9andm2=9andm3=9)then
m1:
="0000";m2:
="0000";m3:
="0000";m4:
=m4+1;m:
=m+1;
elsif(m1=9andm2=9)then
m1:
="0000";m2:
="0000";m3:
=m3+1;m:
=m+1;
elsif(m1=9)then
m1:
="0000";m2:
=m2+1;m:
=m+1;
else
m1:
=m1+1;m:
=m+1;
endif;
else
m:
=0;m1:
="0000";m2:
="0000";m3:
="0000";m4:
="0000";
endif;
endif;
mg<=m1;ms<=m2;mb<=m3;mq<=m4;
endprocess;
endtran;
4.5Sel通过选择器将路程和车费每位分别输出,送到数码管
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityselis
port(c:
instd_logic_vector(2downto0);
dg,ds,db,dq,mg,ms,mb,mq:
instd_logic_vector(3downto0);
da:
outstd_logic_vector(3downto0)
);
endsel;
architectureseofselis
begin
process(c,dg,ds,db,dq,mg,ms,mb,mq)
variableco:
std_logic_vector(2downto0);
begin
co:
=c;
casecois
when"000"=>da<=dg;
when"001"=>da<=ds;
when"010"=>da<=db;
when"011"=>da<=dq;
when"100"=>da<=mg;
when"101"=>da<=ms;
when"110"=>da<=mb;
when"111"=>da<=mq;
whenothers=>null;
endcase;
endprocess;
endse;
4.6W用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备
libr