数电课程设计出租车计费.docx

上传人:b****5 文档编号:11643205 上传时间:2023-03-29 格式:DOCX 页数:14 大小:85.09KB
下载 相关 举报
数电课程设计出租车计费.docx_第1页
第1页 / 共14页
数电课程设计出租车计费.docx_第2页
第2页 / 共14页
数电课程设计出租车计费.docx_第3页
第3页 / 共14页
数电课程设计出租车计费.docx_第4页
第4页 / 共14页
数电课程设计出租车计费.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数电课程设计出租车计费.docx

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

数电课程设计出租车计费.docx

数电课程设计出租车计费

江苏科技大学

数电课程设计报告

 

题目:

出租车简易计价器设计

院系:

电子信息学院

专业班级:

11电子信息工程(张)

学生姓名:

徐胜

老师姓名:

陈迅

起止时间:

2014.02.24至2014.03.09

 

2014年03月05日

基于FPGA的出租车简易计价器设计

一.功能要求:

(1)设计一个出租车自动计费器,具有行车里程计费、等候时

间计费、及起价三部分;

(2)用五位数码管显示总金额,最大值为999.99元;

(3)行车里程单价2元/公里,等候时间单价1元/10分钟,起价

8元(3公里);

(4)行车里程的计费电路将汽车行驶的里程数转换成与之成正

比的脉冲数,一个脉冲模拟汽车前进十米,则每100个脉

冲表示1公里,以100米为最小计费单位;

(5)根据需要自行确定需要的功能按键,显示可通过按键切换

分别显示乘坐里程数、等候时间长度、等候时间费用,行

驶里程费用和总金额。

二.方案论证:

根据设计要求可以把出租车计费器分为四种模式:

启动模式(计量路程)、暂停模式(计量等待时间)、停止模式(停止一切计数)、复位模式(所有数字清零)。

同时题目要求要能够可通过按键切换分别显示乘坐里程数、等候时间长度、等候时间费用,行驶里程费用和总金额五种数字,那么可知要设计五种显示模式。

由上可知此出租车计数器设计有许多种模式组成,那么就要涉及到模式之间的切换问题。

在这里有些同学选择了一个按键控制所有的模式切换,这样由于模式众多操作不够方便。

也有同学选择了每个按键控制一种状态,这样虽然操作简单但是需要多个按键,有些浪费资源。

在这里我选择了独立按键与状态机相结合的方法既减少了按键的个数又方便操作。

根据题目要求可知在行驶过程中既要对行驶路程进行计数又要对等待时间进行计数。

有些同学在设计过程中只采用了一路脉冲作为参考时钟,这样虽然设计简单,但是由于路程和等待时间不在同一个计量单位上,所以不能够使用同一个参考时钟。

在这里我设计了两路时钟输入CLK和CLK1,一路为时间参考时钟,一路是车辆行驶过程中传送回来的速度脉冲。

由于时间计数最小单位为一分钟,路程计数最小单位为一百米,而模拟脉冲一个脉冲代表十米,所以都要对参考时钟进行相应的分频处理,然后再将分频后的时钟作为计数时钟。

设计要求能够显示数字,数字最大量为999.99,试验箱上的数码管已经进行译码,只需要将每个数字用四位二进制输出即可。

在这里由于牵扯的数字比较多有些同学为了方便输出将每个数字拆分成五位独立的数字来表示,这样虽然操作简单,但是数字计算变得复杂,中间变量众多。

我在这里采用了取余和取整的C语言编程思想,这样是计算变得方便,但是由于FPGA计算能力有限,处理比较占用资源。

设计要求显示小数,FPGA处理浮点数比较困难,所以我在这里统一将所有数字放大一百倍用整数表示,由于小数位数是固定的单独将小数点点亮即可。

计价系统原理:

出租车载客后,启动计费器,整个系统开始运行,里程计数器和从0开始计数,费用计数器从8开始计算,如果路程小于三公里,路程计费和总计费等于8,如果路程计数大于三公里每次相应的加上0.2元。

在行驶过程中如果停止行驶等待,那么启动等待模式,等待时间、时间计费和总计费进行相应的处理。

最终停止,那么选择停止显示模式,这时可以通过按键对乘坐里程数、等候时间长度、等候时间费用,行驶里程费用和总金额进行查看。

最后在下一次启动前进行清零即可开始下一次操作。

根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统结构图如下所示。

三.系统描述:

(1)系统结构:

状态检测

启动模式

清零模式

停止显示模式

等待模式

时间计费

时间计量

路车计费

路程计量

数字清零

 

显示模式选择

费用相加,计算总费用

显示等待费用

显示等待时间

显示路程费用

显示行驶路程

显示总的费用

 

 

(2)输入输出信号描述

信号

输入/输出

目标/源

功能描述

clk

input

pin

时间参考时钟(100HZ)

clk1

input

pin

速度采集脉冲(模拟100HZ)

reset

input

pin

异步清零,高电平有效

start

input

pin

起始标志,默认开始计量路程

start1

input

pin

状态切换,切换为计量等待时间

stop

input

pin

停止与显示切换,分为五种显示

S1

output

pin

显示数字第二位小数

S2

output

pin

显示数字第一位小数

S3

output

pin

显示个位上的数字

S4

output

pin

显示十位上的数字

S5

output

pin

显示百位上的数字

四.模块代码

分频模块:

modulediv1(clk,clk_1);//输入clk,输出clk_1,分频由full控制

inputclk;

outputclk_1;

regc,clk_1;

reg[12:

0]full;

always@(posedgeclk)

begin

if(full<10)//改变这里的数值,即可改变分频数

begin

full=full+1;

c=1;

end

else

begin

full=0;

c=0;

end

end

always@(posedgec)//将分频过后的时钟信号变为标准的50%的脉冲信号

begin

clk_1=~clk_1;

end

Endmodule

仿真结果:

状态机模块:

moduleseqdet(clk,stop,stop1,stop2,stop3,stop4,stop5);

inputclk;

inputstop;

outputstop1,stop2,stop3,stop4,stop5;

reglock,stop1,stop2,stop3,stop4,stop5;

reg[2:

0]courrent_state,next_state;

parameter[2:

0]IDLE=3'b000,//状态分配

A=3'b010,

B=3'b001,

C=3'b100,

D=3'b101,

E=3'b110;

/******************************************/

always@(posedgeclk)//按键消抖处理

beginlock<=stop;end

/********************************************/

always@(posedgelock)//状态初始化

begincourrent_state<=next_state;end

always@(courrent_state)//状态转化

begin

case(courrent_state)

IDLE:

beginnext_state<=A;end

B:

beginnext_state<=C;end

A:

beginnext_state<=B;end

C:

beginnext_state<=D;end

D:

beginnext_state<=E;end

E:

beginnext_state<=A;end

default:

next_state<=IDLE;

endcase

end

always@(next_state)//将状态转化为stop的输出

begin

case(next_state)

IDLE:

beginstop1=0;stop2=0;stop3=0;stop4=0;stop5=0;end

A:

beginstop1=1;stop2=0;stop3=0;stop4=0;stop5=0;end

B:

beginstop1=0;stop2=1;stop3=0;stop4=0;stop5=0;end

C:

beginstop1=0;stop2=0;stop3=1;stop4=0;stop5=0;end

D:

beginstop1=0;stop2=0;stop3=0;stop4=1;stop5=0;end

E:

beginstop1=0;stop2=0;stop3=0;stop4=0;stop5=1;end

default:

beginstop1=0;stop2=0;stop3=0;stop4=0;stop5=0;end

endcase

end

/******************************************/

endmodule

仿真结果:

由上图可以看出根据状态机对按键stop的检测可以将stop按下的次数转换为stop1--stop5的值输出。

总的程序模块:

endmodulemoduletexi(clk,clk1,start,start1,stop,reset,s1,s2,s3,s4,s5);

inputclk,clk1,start,stop,reset,start1;

output[3:

0]s1,s2,s3,s4,s5;

regstart_1,start1_1,stop_1,reset1;

reg[3:

0]s1,s2,s3,s4,s5;

reg[2:

0]A;

reg[9:

0]s,t,cost_s,cost_t,cost;

reg[9:

0]s_1,t1,cost_s1,cost_t1,cost1;//用来存放中间变量

/***************************************/

initial//数据初始化

begin

s1=0;

s2=0;

s3=0;

s4=0;

s5=0;

s=0;

t=0;

cost_s=0;

cost_t=0;

cost=0;

A=3'b111;

end

/********************************/

always@(posedgeclk)//按键消抖

begin

start_1<=start;

start1_1<=start1;

stop_1=stop;

reset1<=reset;

end

/*************************************/

always@(negedgeclk)//状态判断

begin

if(start_1)

A=3'b000;

if(start1_1)

A=3'b001;

if(reset1)

A=3'b111;

if(stop_1)//在stop键按下的情况下对显示状态进行选择

begin

if(stop1)A=3'b110;

if(stop2)A=3'b010;

if(stop3)A=3'b011;

if(stop4)A=3'b100;

if(stop5)A=3'b101;

end

end

/***************************/

seqdet(clk,stop,stop1,stop2,stop3,stop4,stop5);//状态机调用

/***************************/

div1(clk,clk1_1);//f对时钟做分频处理

div2(clk1,clk2_1);

/***************************/

always@(posedgeclk2_1)//路程计费程序

begin

if(A==3'b000)

begin

s=s+1;

if(s<31)

cost_s=80;

else

cost_s=cost_s+2;

end

if(A==3'b111)

begin

s=0;

cost_s=0;

end

end

/*****************************/

always@(posedgeclk1_1)//时间计费程序

begin

if(A==3'b001)

begin

t=t+10;

cost_t=cost_t+1;

end

if(A==3'b111)

begin

t=0;

cost_t=0;

end

end

/****************************/

always@(posedgeclk)//状态判断,现实选择模块

begin

cost=cost_s+cost_t;

case(A)

3'b011:

//显示走过的路程

begin

s_1=s;

s1=0;

s2=s_1%4'b1010;

s_1=s_1/4'b1010;

s3=s_1%4'b1010;

s_1=s_1/4'b1010;

s4=s_1%4'b1010;

s5=s_1/4'b1010;

end

3'b100:

//显示路程收费

begin

cost_s1=cost_s;

s1=0;

s2=cost_s1%4'b1010;

cost_s1=cost_s1/4'b1010;

s3=cost_s1%4'b1010;

cost_s1=cost_s1/4'b1010;

s4=cost_s1%4'b1010;

s5=cost_s1/4'b1010;

end

3'b101:

//显示等待时间

begin

t1=t;

s1=0;

s2=t1%4'b1010;

t1=t1/4'b1010;

s3=t1%4'b1010;

t1=t1/4'b1010;

s4=t1%4'b1010;

s5=t1/4'b1010;

end

3'b110:

//显示时间计费

begin

cost_t1=cost_t;

s1=0;

s2=cost_t1%4'b1010;

cost_t1=cost_t1/4'b1010;

s3=cost_t1%4'b1010;

cost_t1=cost_t1/4'b1010;

s4=cost_t1%4'b1010;

s5=cost_t1/4'b1010;

end

3'b111:

//数据清零

begin

cost=0;

s1=0;

s2=0;

s3=0;

s4=0;

s5=0;

end

default:

//其他情况均显示总费用

begin

cost1=cost;

s1=0;

s2=cost1%4'b1010;

cost1=cost1/4'b1010;

s3=cost1%4'b1010;

cost1=cost1/4'b1010;

s4=cost1%4'b1010;

s5=cost1/4'b1010;

end

endcase

end

endmodule

仿真结果:

五.实验心得:

此次数电课程设计我们做的是出租车计费器系统,通过查阅参考资料明白了具体实现步骤,在老师的指导下进行编程、仿真、以及硬件连接显示,最终实现了出租车计费器系统的功能。

刚开始编程时由于整体放在一块编,结果很繁琐并且编译出现了很多错误,后来同学建议把程序分成几个模块编写,这样不容易出错,这样编写果然容易多了并且终于编译仿真通过。

通过在QuartusⅡ软件下进行的模拟仿真,并进行相应的硬件下载调试,证明所设计的系统完成了出租车计费器的功能,各项技术指标符合预定标准,具有一定实用性。

如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。

另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。

本次课程设计还是比较有成就感的,因为遇到一些很棘手的问题,最终解决之后感觉很好,还学到一些之前没学到的东西。

通过这次数电课程设计,我们对verilog语言有了更深层次的认识,增加了自己的编程实践经验,在编程中发现问题并且解决问题的过程中,我们学到了很多新知识,我们的编程以及实践水平得到了很大提高。

这次的课程设计对于我来说是毕业前的一次演练,从选题到画出流程图,再到写出程序,不停的编不停的改不停的查资料„„直至最后完成,有问题大家都坐在一起讨论,一起努力,一起攻克问题。

我想我们享受的就是这个过程,而不仅仅只是结果。

通过这次的设计,我知道了,在任何问题面前,只要我们努力,只要我们勇敢,我想,它们都不是问题,都不是困难。

 

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

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

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

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