数字电路出租车计费器文档格式.docx
《数字电路出租车计费器文档格式.docx》由会员分享,可在线阅读,更多相关《数字电路出租车计费器文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
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+1;
endif;
clkout<
=Q;
endprocess;
endone;
4.2twoMHZ:
这个程序完成2500分频,实现第二次分频,确保最后数码管显示频率在适宜围
entitytwoMHZis
endtwoMHZ;
architectureoneoftwoMHZis
integerrange0to2500;
if(data=2500)then
4.3Charge:
实现计费功能,按行驶里程收费,起步费为7.00元,并在车行3公里后再按2.2元/公里,当计费器到达或超过一定收费〔如20元〕。
每公里加收50%的车费,车停顿不计费,实现预置功能、每公里收费、车行驶加费里程,实现模拟功能,能模拟汽车启动、停顿、暂停、车速等状态,将车费显示出来。
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='
)then
if(tz='
0'
)then
dis1:
mon1:
elsif(ks='
)then
=700;
andtz='
andzt='
=dis1+10;
=dis1;
=mon1;
if(dis1<
300)thennull;
elsif(dis1<
600anddis1>
300)then
mon1:
=mon1+22;
elsif(dis1>
=600)then
=mon1+33;
mon<
dis<
endprocess;
endch;
4.4Transform实现将电路计数分上下位显示,将二进制转化为数码管可识别的十进制
entitytransformis
port(daclk:
std_logic;
dg,ds,db,dq,mg,ms,mb,mq:
outstd_logic_vector(3downto0));
endtransform;
architecturetranoftransformis
process(daclk,dis)
variabled:
variabled1,d2,d3,d4:
std_logic_vector(3downto0);
if(daclk'
if(d<
dis)then
if(d1=9andd2=9andd3=9)then
d1:
="
0000"
;
d2:
d3:
d4:
=d4+1;
d:
=d+1;
elsif(d1=9andd2=9)then
=d3+1;
elsif(d1=9)then
=d2+1;
=d1+1;
d:
d1:
d4:
endif;
dg<
=d1;
ds<
=d2;
db<
=d3;
dq<
=d4;
process(daclk,mon)
variablem:
variablem1,m2,m3,m4:
if(m<
mon)then
if(m1=9andm2=9andm3=9)then
m1:
m2:
m3:
m4:
=m4+1;
m:
=m+1;
elsif(m1=9andm2=9)then
=m3+1;
elsif(m1=9)then
=m2+1;
=m1+1;
m:
m1:
mg<
=m1;
ms<
=m2;
mb<
=m3;
mq<
=m4;
endtran;
4.5Sel通过选择器将路程和车费每位分别输出,送到数码管
entityselis
port(c:
instd_logic_vector(2downto0);
instd_logic_vector(3downto0);
da:
outstd_logic_vector(3downto0)
);
endsel;
architectureseofselis
process(c,dg,ds,db,dq,mg,ms,mb,mq)
variableco:
std_logic_vector(2downto0);
co:
=c;
casecois
when"
000"
=>
da<
=dg;
001"
=ds;
010"
=db;
011"
=dq;
100"
=mg;
101"
=ms;
110"
=mb;
111"
=mq;
whenothers=>
null;
endcase;
endse;
4.6W用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备
libr