基于CPLD出租车计费器的课程设计.docx

上传人:b****6 文档编号:8018498 上传时间:2023-01-28 格式:DOCX 页数:29 大小:473.23KB
下载 相关 举报
基于CPLD出租车计费器的课程设计.docx_第1页
第1页 / 共29页
基于CPLD出租车计费器的课程设计.docx_第2页
第2页 / 共29页
基于CPLD出租车计费器的课程设计.docx_第3页
第3页 / 共29页
基于CPLD出租车计费器的课程设计.docx_第4页
第4页 / 共29页
基于CPLD出租车计费器的课程设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

基于CPLD出租车计费器的课程设计.docx

《基于CPLD出租车计费器的课程设计.docx》由会员分享,可在线阅读,更多相关《基于CPLD出租车计费器的课程设计.docx(29页珍藏版)》请在冰豆网上搜索。

基于CPLD出租车计费器的课程设计.docx

基于CPLD出租车计费器的课程设计

 

一.总体设计思路

1.设计目的

随着EDA技术的高速发展,电子系统的设计技术发生了深刻的变化,大规模可编程逻辑器件COLD/FPGA的出现,给设计人员带来了诸多方便,利用它进行产品开发,不仅成本低,周期、可靠性高,而且具有完全的知识产权。

随着社会的不断进步,人们生活水平的不断提高,出租车逐渐成为人们日常生活不可缺少的交通工具。

而计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因而出租车司机和乘客双方利益,起着重要的作用,因而出租车计价器的发展非常迅猛。

2.系统原理框图

基于CPLD的出租车计费器的组成如图1所示。

各部分主要功能包括:

信号输入模块对车轮传感器的脉冲信号进行计数,并以高低电平模拟出租车启动、停止、暂停、加速按钮,具有输入信号作用;数据转换模块将计费模块输出的车费和路程换成4位的十进制数据;译码/动态扫描模块将路程与费用的数值译码后用动态扫描的方式驱动数码管;数码管显示模块将公里和计费金额用4位LED数码管显示。

图1.1系统总体框图

 

二.功能模块设计

1.计费模块

此模块为计费模块(即总体结构中的信号输入模块),实现计费功能,计费标准为:

按行驶里程计费,起步价为7.00元,并在车行3公里后按2.20元/km计费,当计数器达到或超过20元时,每公里加收50%的车费,即按3.30元/km计费。

CLK、START、STOP、PAUSE、JS为输入信号,分别代表汽车的起动、停止、暂停和加速,CLK为扫描时钟,硬件实现时加入时钟信号,另有两个输出,即CHEFEI和LUC,分别代表车费和路程,当车处于行驶状态时,此模块会自动记录下路程与车费状况并作为转换模块的输入。

其模块生成图如下:

图2.1计费模块

2.数据转换模块

此模块功能是将计费模块产生的车费与路程的模拟量转换成数字量并输出,它是一个模为10的加法计数器,可将计费模块输出的车费和路程转换成4位的十进制数。

其中DACLK为时钟信号,ASCORE、BSCORE连接计费模块的CHEFEI和LUC,输出为2个4位的十进制数,可以分别表示路程和车费情况。

当车运行于不同状况时,此模块会将不同的车费与路程状况转换为数字量并输出。

其模块生成图如下:

图2.2数据转换模块

3.片选信号产生模块

此模块功能是选择八段数码管按照设计要求进行正确的显示。

其模块生成图如下:

图2.3片选信号产生模块

 

4.显示模块

此模块为显示模块中的动态扫描/译码/数码管显示模块,功能是将已转换好的数字量加载到两个4位七段数码管上并加以显示。

C[2..0]为片选端,用来连接片选模块的片选输出端A[2..0],A1、A2、A3、A4、B1、B2、B3、B4分别连接数据转换模块的八个转换输出端,因为设计要求路程和车费都要用2位小数点来表示,所以须设置一个控制小数点的变量,即程序中的DP端,D[3..0]连接数码管控制模块的输入端。

其模块生成图如下:

图2.4显示模块

 

5.数码管控制模块

此模块功能是控制七段数码管对转换后的数字量进行显示,使其完成路程和车费的显示。

其中D[3..0]连接动态扫描/译码/数码管显示模块的D[3..0]端,Q[6..0]连接七段数码管,利用其控制特性在数码管上显示出车费和路程。

其模块生成图如下:

图2.5数码管控制模块

6.分频模块

div模块将实验箱上50Mhz脉冲信号分频为500hz。

div生成模块图:

图2.6分频模块

7.数码管选择模块

sel通过decode3_8模块选择数码管

decode3_8生成模块图:

图2.7数码管选择模块

三.各个模块设计及仿真

1.计费模块

计费模块源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjfmkis

port(clk,start,stop,pause,js:

instd_logic;

chefei,luc:

outintegerrange0to8000);

endjfmk;

architectureoneofjfmkis

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;

endone;

jifei模块的时序仿真图:

图3.1计费模块时序仿真图

 

图3.2计费模块时序仿真图

 

时序仿真图分析:

图中的stop为汽车停止输入端,上升沿有效;start为汽车启动输入端,上升沿有效;pause为汽车暂停输入端,上升沿有效;js为汽车加速输入端,上升沿有效。

CLK为时钟源信号;chefei为汽车车费输出端,luc为汽车路程输出端。

由图3.1可知:

当stop,Start,pause,js全为高电平时路程按5的速度增加,起车车价为700.由图3.2可知,当路程增加到300时,车费变为920,以后路程每增加100,车费增加220

 

2.数据转换模块

x模块的源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityxis

port(daclk:

instd_logic;

ascore,bscore:

inintegerrange0to8000;

age,ashi,abai,aqian,bge,bshi,bbai,bqian:

outstd_logic_vector(3downto0));

endx;

architecturert1ofxis

begin

process(daclk,ascore)

variablecomb1:

integerrange0to8000;

variablecomb1a,comb1b,comb1c,comb1d:

std_logic_vector(3downto0);

begin

if(daclk'eventanddaclk='1')then

if(comb1

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

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

图3.3数据转换模块时序仿真图

图3.4数据转换模块时序仿真图

图3.5数据转换模块时序仿真图

3.片选信号产生模块

se模块的源程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityselis

port(clk:

instd_logic;

a:

outstd_logic_vector(2downto0));

endsel;

architecturert1ofselis

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;

图3.6片选信号产生模块时序仿真图

由图可以看出,当CLK加入时钟信号时,a从000到111逐个变化,该模块可将模拟信号进行片选并有对应的数码管进行显示。

4.显示模块

xxx1模块的源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityxxxlis

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));

endxxxl;

architecturertlofxxxlis

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;

endrtl;

图3.7显示模块时序仿真图

由上图可知,输入信号C为3位片选信号其变化范围为0到7,输入信号c从0到7逐个变化时,输出d逐个输a1,a2,a3,a4,b1,b2,b3,b4的输入信号。

5.数码管控制模块

di模块的源程序:

libraryieee;

useieee.std_logic_1164.all;

entitydiis

port(d:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(6downto0));

enddi;

architecturertlofdiis

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;

endrtl;

图3.8数码管控制模块时序仿真图

图3.9数码管控制模块时序仿真图

从波形图中可看出,此模块可控制数码管完成对数字量的显示。

当输入为0000-1000时数码管分别显示0,1,2,3,4,5,6,7,8。

当输入为其他时数码管显示9。

6.分频模块

div模块源程序:

LIBRARYieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

ENTITYdivIS

port(clk:

INstd_logic;

clkout:

OUTstd_logic

);

enddiv;

ARCHITECTUREoneOFdivIS

BEGIN

process(clk)

variablecnt:

integerrange0to100000;

variabletmp:

std_logic;

begin

ifclk'eventandclk='1'then

ifcnt>=99999then

cnt:

=0;

tmp:

=nottmp;

else

cnt:

=cnt+1;

endif;

endif;

clkout<=tmp;

endprocess;

endone;

 

图3.10分频模块时序仿真图

 

7.数码管选择模块

其源程序:

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;

图3.11数码管选择模块时序仿真图

 

四.总体设计电路图

 

图4.1总原理图

 

五.硬件实现

通过硬件下载,该电路可以完成硬件实现,芯片管脚定义可以直接用编辑.pin文件。

完成管脚定义后选择器件,编译后生成.sof、.pof文件。

选择sof文件进行下载。

通过对每一模块的仿真和下载,可以实现各个模块的逻辑功能,验证了各个模块的正确性。

在出租车计费系统的5个模块中,重点在于jifei模块,x(转化)模块,显示模块。

jifei模块主要有汽车的启动、停止、暂停、加速按键;转化模块主要是把车费和路程转化为4位十进制;显示模块是将车费和路程显示出来。

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

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

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

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

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

实验表明:

该计费器实现了按预置参数自动计费(最大计费金额为99.99元)、自动计程(最大计程公里数为99.99km)等功能;能够实现起步价、每公里收费、车型及加费里程的参数预置(如:

起步价7.00元;3km后,2.20元/km;计费超过20.00元,每公里加收50%的车费等),且预置参数可调范围广。

由于采用CPLD大规模可编程逻辑器件,整机功耗小、抗干扰能力强、系统稳定、工作可靠、升级方便。

 

其调试结果如下图所示:

图5.1调试结果

由图5.1可知,起步价为7元。

图5.2调试结果

由图5.2可知,当每增加半公里时,价格增加1.2元

 

六.心得体会

短短两周的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。

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

车暂停时停止计费。

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

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

本设计在使用方面居庸一点的价值。

由于时间有限和经验是平的欠缺,不足之处还望老师予以指正。

在这辆周里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。

VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。

通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。

本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。

课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。

在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。

通过的对源代码的修改,发现了一些易忽略的细节。

课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。

课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。

课设让我们认识到所学本科知识的真正实用性,只是这门课开始研究的第一步。

在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

课程设计结束了,但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。

在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

最后,我们衷心的感谢课设期间一直指导和陪伴着我们的老师。

七.程序清单

计费模块源程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjfmkis

port(clk,start,stop,pause,js:

instd_logic;

chefei,luc:

outin

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

当前位置:首页 > 解决方案 > 学习计划

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

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