数字电路出租车计费器.docx

上传人:b****2 文档编号:19159408 上传时间:2023-04-24 格式:DOCX 页数:20 大小:294.51KB
下载 相关 举报
数字电路出租车计费器.docx_第1页
第1页 / 共20页
数字电路出租车计费器.docx_第2页
第2页 / 共20页
数字电路出租车计费器.docx_第3页
第3页 / 共20页
数字电路出租车计费器.docx_第4页
第4页 / 共20页
数字电路出租车计费器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数字电路出租车计费器.docx

《数字电路出租车计费器.docx》由会员分享,可在线阅读,更多相关《数字电路出租车计费器.docx(20页珍藏版)》请在冰豆网上搜索。

数字电路出租车计费器.docx

数字电路出租车计费器

 

一、课题要求

(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(d

if(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(m

if(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用第一次分频过的脉冲实现八进制计数,为下面实现动态扫描做准备

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitywis

port(clk:

instd_logic;

a:

outstd_logic_vector(2downto0)

);

endw;

architecturech1ofwis

begin

process(clk)

variableb:

std_logic_vector(2downto0);

begin

if(clk'eventandclk='1')then

if(b="111")then

b:

="000";

elseb:

=b+1;

endif;

endif;

a<=b;

endprocess;

endch1;

4.73—8译码器:

通过八进制计数实现动态扫描

libraryieee;

useieee.std_logic_1164.all;

entitymux38ais

port(d:

instd_logic_vector(2downto0);

q:

outstd_logic_vector(7downto0));

endmux38a;

architectureoneofmux38ais

begin

process(d)

begin

casedis

when"000"=>q<="11101111";

when"001"=>q<="11011111";

when"010"=>q<="10111111";

when"011"=>q<="01111111";

when"100"=>q<="11111110";

when"101"=>q<="11111101";

when"110"=>q<="11111011";

when"111"=>q<="11110111";

whenothers=>null;

endcase;

endprocess;

endone;

4.8数码管显示:

显示模块由8个七段LED数码管组成。

各个模块用四个数码管,三个表示整数部分,一个表示小数部分。

由于小数点的位置是固定的,因此可以将小数点接到一个固定的高电平上一直显示。

libraryieee;

useieee.std-_logic_1164.all;

entityledis

port(a:

instd_logic_vector(3downto0);

L:

outstd_logic_vector(6sownto0));

endled;

architectureoneofledis

begin

process(a)

begin

caseais

when"0000"=>L<="0111111";

when"0001"=>L<="0000110";

when"0010"=>L<="1011011";

when"0011"=>L<="1001111";

when"0100"=>L<="1100110";

when"0101"=>L<="1101101";

when"0110"=>L<="1111101";

when"0111"=>L<="0000111";

when"1000"=>L<="1111111";

when"1001"=>L<="1101111";

whenother=>null;

endcase;

endprocess;

endone;

五顶层模块设计:

将各个程序块联合起来,实现层次化设计

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytaxiis

port(cp,start,stop,pause:

instd_logic;

ss1:

outstd_logic_vector(7downto0);

ss2:

outstd_logic_vector(6downto0));

endentitytaxi;

architectureymoftaxiis

componentoneMHZ

port(daclk:

instd_logic;

clkout:

outstd_logic);

endcomponent;

componenttwoMHZ

port(daclk:

instd_logic;

clkout:

outstd_logic);

endcomponent;

componentcharge

port(cp,ks,tz,zt:

instd_logic;

dis,mon:

outintegerrange0to9999);

endcomponent;

componenttransform

port(daclk:

std_logic;

dis,mon:

integerrange0to9999;

dg,ds,db,dq,mg,ms,mb,mq:

outstd_logic_vector(3downto0));

endcomponent;

componentw

port(clk:

instd_logic;

a:

outstd_logic_vector(2downto0));

endcomponent;

componentsel

port(c:

instd_logic_vector(2downto0);

dg,ds,db,dq,mg,ms,mb,mq:

instd_logic_vector(3downto0);

da:

outstd_logic_vector(3downto0));

endcomponent;

componentmux38a

port(d:

instd_logic_vector(2downto0);

q:

outstd_logic_vector(7downto0));

endcomponent;

componentled

port(a:

instd_logic_vector(3downto0);

L:

outstd_logic_vector(6downto0));

endcomponent;

signalaa0,aa1:

std_logic;

signala0,b0:

integerrange0to9999;

signalb2,a1,b1,c1,d1,e1,f1,g1,h1:

std_logic_vector(3downto0);

signaly:

std_logic_vector(2downto0);

begin

u0:

oneMHZportmap(daclk=>cp,clkout=>aa0);

u1:

twoMHZportmap(daclk=>aa0,clkout=>aa1);

u2:

chargeportmap(cp=>aa1,ks=>start,tz=>stop,zt=>pause,dis=>a0,mon=>b0);

u3:

transformportmap(daclk=>aa0,dis=>a0,mon=>b0,dg=>a1,ds=>b1,db=>c1,dq=>d1,

mg=>e1,ms=>f1,mb=>g1,mq=>h1);

u4:

wportmap(clk=>aa0,a=>y);

u5:

selportmap(c=>y,dg=>a1,ds=>b1,db=>c1,dq=>d1,

mg=>e1,ms=>f1,mb=>g1,mq=>h1,da=>b2);

u6:

mux38aportmap(d=>y,q=>ss1);

u7:

ledportmap(a=>b2,L=>ss2);

endym;

 

六调试结果:

1、下载步骤:

(1)安装驱动

插入USB下载线后,自动跳出窗口,手动设置D:

altera\quartus6.0\driver\usb_blaster

(2)IDE环境设置

Assigements—device—ep2cst144c8

device&pingoptions—configurations—useconfigurationdevise—EPCS1

--编译

(3)programmer

Tools—hardwaresetup—usb—blaster

Mode—SJTAG选文件xx.sof

(4)下载成功后,先拔电源VCC再拔USB下载线。

注意事项:

保证下载板载断电情况下进行ASP或JTAG借口的插拔。

引脚安装图:

出租车计费器成功运行,软硬件之间衔接全无问题,我们成功调试出预想结果,并且增加一些附加功能,比如考虑出租车夜晚和白天计费不一样,设计了加速计费功能,除了软件方面,在硬件上设计了显示灯,便于观察哪个功能起作用。

虽然再调试过程出现了一些问题,但经过讨论以及观察摆出故障,测试完软硬件的独立运行,我们的软硬件之间的衔接运行相当顺利。

七实验中出现问题

在编写程序时出现了一些问题,例如编译错误,仿真结果不正确,但经过细心检查和查找资料,及时改正,尤其在实际顶层文件时出现一系列问题,但很大部分是由于更部分引脚接错造成问题。

这大多由于粗心和不熟练造成的。

在此过程中浪费了一些时间。

并且在下载过程中,尽管操作不熟练,但还是顺利完成。

再软硬件连接过程中,出现了一系列问题,刚开始出现乱码,经检查是数码管和FPGA引脚连错了,接着出现显示没有置数功能,经核查后发现为软硬件不协调,除此之外还有由于频率太快,造成显示太快,无法看清示数显示,经过一系列修改后终于达到预期要求,并增加附加功能。

八、设计小结

出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。

车暂时停止不计费,车费保持不变。

若停止则车费清零,等待下一次计费的开始。

出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。

车暂时停止不计费,车费保持不变。

若停止则车费清零,等待下一次计费的开始。

各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改进的是控制系统的纠错功能。

出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。

九收获与体会:

两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。

在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。

学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。

通过本次数字电路课程设计,我不但熟练的掌握了有关EDA,VHDL的设计方法以及上机的实际操作,而且还获知了有关出租车计费器基于FPGA的设计方法以及实际操作,并且成功的在多方面资料的帮助下设计出了出租车计费器。

看到出租车计费器成功的运行,我由衷的高兴,在此次的方案设计过程中,一次次的困难并没有吓倒我们,反而激起我们解决它们的决心,一次次的挫折使我们对出租车计费器的了解更加深刻。

在此感谢对我帮助过的同学们,谢谢你们对

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1