基于FPGA的出租车计价器设计.docx

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

基于FPGA的出租车计价器设计.docx

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

基于FPGA的出租车计价器设计.docx

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

 

信号与信息处理综合应用设计报告

 

题目:

基于FPGA的出租车计费器设计

 

二级学院电子信息与其自动化学院

专业电子信息工程

班级电子2班

学生许震学号

指导教师包明王培容施邦利

时间2014.10.21-2014.11.7

 

 

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

摘要

介绍了出租车计费器系统的组成与工作原理,简述了在EDA平台上用FPGA器件构成该数字系统的设计思想和实现过程。

论述了计程模块,计费模块,计时模块,动态译码模块等的设计方法与技巧。

1.引言:

随着EDA技术的高速发展,电子系统的设计技术发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。

利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。

本文介绍了一个以fpga芯片为控制核心、附加一定外围电路组成的出租车计费器系统。

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

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

2.系统规:

2.1,出租车计价器的要求:

◇出租车起步价为8元,行驶过程于两公里后每公里1元,中途停止等待时间累计大于三分钟后按每3分钟1元计价。

◇计价系统里程显示围为:

0~99公里,分辨率1公里。

计价费用显示围为:

0~999元,分辨率1元。

等待计时器显示围为:

0~60分钟,分辨率1分钟。

2.2计价系统原理:

出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从8开始计算。

再根据行驶里程或停止等待的时间按以上的标准计费。

若在行驶状态,则计程器开始加计数,超过两公里后每公里1元。

若出租车停止等待状态,则计时器开始加计数,当时间超过三分钟后,计费器以每3分钟1元累加。

出租车到达目的地停止后,停止计费器,显示总费用。

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

其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。

总设计图:

3.各模块设计:

3.1分频模块:

3.1.1,计数器的分频模块:

3.1.2计数器的分频模块具体框图:

引脚分配:

信号名称

功能描述

方向

宽度

Clk

输入50MHz的时钟信号

input

1

Clk_1

输出经过分频以后的1Hz的时钟信号

output

1

reset

复位信号

input

1

电路设计:

 

此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。

设计该模块的时候用了一个30位的计数器,当计数器计到25_000000的时候产生时钟。

3.1.3,计数器的分频模块VerilogHDL源代码:

modulefenpin(clk,reset,clk_1);

inputclk,reset;

outputclk_1;

regclk_1;

reg[29:

0]count;

always(posedgeclk,negedgereset)

begin

if(!

reset)

begin

count=0;

clk_1=1'b0;

end

elseif(count==25000000)

begin

count=0;

clk_1=!

clk_1;

end

else

count=count+1'd1;

end

endmodule

仿真的结果:

 

3.2,计程模块:

3.2.1,计程模块的框图:

引脚分配

信号名称

功能描述

方向

宽度

start

出租车开启信号

input

1

Clk_1

分频后计时时钟,频率为1Hz

Input

1

reset

清零信号

Input

1

lch

计程模块计算出的里程数

Output

8

此模块的功能是计算出租车行驶的路程。

在出租车启动并行驶的过程中(即复位/启动信号reset为0,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对里程计数器进行加计数。

计程模块的VerilogHDL源代码:

modulelicheng(reset,start,clk_1,lch);

inputreset,start,clk_1;

outputlch;

reg[7:

0]lch;

reg[5:

0]count;

always(negedgereset,posedgeclk_1)

begin

if(!

reset)

begin

lch=8'b00000000;

count=6'b000000;

end

else

begin

if(start)

begin

if(count==6'b000001)

begin

lch=lch+8'b00000001;

count=count+6'b000001;

if(lch[3:

0]>4'b1001)

begin

lch[7:

4]=lch[7:

4]+4'b0001;

lch[3:

0]=4'b0000;

end

end

elseif(count==6'b000010)

count=6'b000000;

else

count=count+6'b000001;

end

 

end

end

endmodule

计程模块的仿真结果:

3.3计时模块:

3.3.1,计时模块的框图:

管脚分配

信号名称

功能描述

输入输出

位宽

Clk_1

分频后计时时钟,频率为1Hz

input

1

reset

清零信号

input

1

start

出租车开启信号

input

1

jishi

计时模块计算的时间数据

output

8

Jishi_1

计时收费输出数据

output

8

 

3.3.2,计时模块的VerilogHDL源代码:

modulejs(reset,start,clk_1,jishi,jishi_1);

inputreset,start,clk_1;

outputjishi,jishi_1;

reg[5:

0]count1,count2;

reg[7:

0]jishi,jishi_1;

always(negedgereset,posedgeclk_1)

begin

if(!

reset)

begin

count2=6'b000000;

count1=6'b000000;

jishi=8'b00000000;

jishi_1=8'b00000000;

end

else

begin

if(!

start)

begin

if(count1==6'b000001)

begin

jishi=jishi+8'b00000001;

count2=count2+6'b000001;

count1=count1+6'b000001;

if(count2==6'b000011)

begin

jishi_1=jishi_1+1'b1;

count2=6'b000000;

end

if(jishi[3:

0]>4'b1001)

begin

jishi[7:

4]=jishi[7:

4]+4'b0001;

jishi[3:

0]=4'b0000;

end

end

elseif(count1==6'b000010)

count1=6'b000000;

else

count1=count1+6'b000001;

end

end

end

endmodule3.3.3计时模块的仿真结果:

3.5,计费模块:

3.5.1计费模块的框图:

费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。

当出租车停车时,时钟select_clk用于将费用计数器复位为起步价8元;当车处于行驶状态且满3公里时,此后路程每满1公里,费用计数器加1元;当出租车处于停止等待状态且时钟满3分钟时,时间每满3分钟,费用计数器加1元。

 

信号名称

功能描述

输入输出

位宽

lch

计程模块计算出的里程数

Input

8

Jishi_1

计时收费输出数据

Input

8

fee

计价器计算出的总价

Output

14

3.5.2,计费模块的VerilogHDL源代码如下所示:

modulejf(lch,jishi_1,fee);

inputlch,jishi_1;

outputfee;

reg[13:

0]fee;

wire[7:

0]lch;

wire[7:

0]jishi_1;

always(lch,jishi_1)

begin

if(lch[7:

0]>8'b00000010)

begin

if(jishi_1[7:

0]<8'b00000010)

begin

fee[4:

0]={1'b0,lch[3:

0]}+5'b01000-5'b00010;

fee[9:

5]={1'b0,lch[7:

4]};

fee[13:

10]=4'b0000;

if(fee[4:

0]>5'b01001)

begin

fee[4:

0]=fee[4:

0]-5'b01010;

fee[9:

5]=fee[9:

5]+5'b00001;

end

end

else

begin

fee[4:

0]={1'b0,jishi_1[3:

0]}+{1'b0,lch[3:

0]}-5'b00001+5'b01000-5'b00010;

fee[9:

5]={1'b0,jishi_1[7:

4]}+{1'b0,lch[7:

4]};

fee[13:

10]=4'b0000;

if(fee[4:

0]>5'b10011)

begin

fee[4:

0]=fee[4:

0]-5'b10100;

fee[9:

5]=fee[9:

5]+5'b00010;

end

elseif(fee[4:

0]>5'b01001)

begin

fee[4:

0]=fee[4:

0]-5'b01010;

fee[9:

5]=fee[9:

5]+5'b00001;

end

if(fee[9:

5]>5'b10011)

begin

fee[9:

5]=fee[9:

5]-5'b10100;

fee[13:

10]=fee[13:

10]+4'b0010;

end

elseif(fee[9:

5]>5'b01001)

begin

fee[9:

5]=fee[9:

5]-5'b01010;

fee[13:

10]=fee[13:

10]+4'b0001;

end

end

end

else

begin

if(jishi_1[7:

0]<8'b00000010)

begin

fee[13:

0]=14'b000;

end

else

begin

fee[4:

0]={1'b0,jishi_1[3:

0]}-5'b00001+5'b01000;

fee[9:

5]={1'b0,jishi_1[7:

4]}+{1'b0,lch[7:

4]};

fee[13:

10]=4'b0000;

if(fee[4:

0]>5'b10011)

begin

fee[4:

0]=fee[4:

0]-5'b10100;

fee[9:

5]=fee[9:

5]+5'b00010;

end

elseif(fee[4:

0]>5'b01001)

begin

fee[4:

0]=fee[4:

0]-5'b01010;

fee[9:

5]=fee[9:

5]+5'b00001;

end

if(fee[9:

5]>5'b10011)

begin

fee[9:

5]=fee[9:

5]-5'b10100;

fee[13:

10]=fee[13:

10]+4'b0010;

end

elseif(fee[9:

5]>5'b01001)

begin

fee[9:

5]=fee[9:

5]-5'b01010;

fee[13:

10]=fee[13:

10]+4'b0001;

end

end

end

end

endmodule

3.5.3,计费模块的仿真结果:

3.6,数码管显示模块:

3.6.1,数码管显示模块的框图:

3.6.2,数码管显示的VerilogHDL源代码:

moduledisplay(clk_1,lch,reset,jishi,fee,hex0,hex1,hex2,hex4,hex5,hex6,hex7);

inputclk_1,lch,jishi,fee,reset;

outputhex0,hex1,hex2,hex4,hex5,hex6,hex7;

wirereset;

wire[7:

0]lch;

wire[7:

0]jishi;

wire[13:

0]fee;

reg[6:

0]hex0,hex1,hex2,hex4,hex5,hex6,hex7;

always(posedgeclk_1,negedgereset)

begin

if(!

reset)

begin

hex6[6:

0]=7'b1000000;

hex7[6:

0]=7'b1000000;

hex4[6:

0]=7'b1000000;

hex5[6:

0]=7'b1000000;

hex0[6:

0]=7'b1000000;

hex1[6:

0]=7'b1000000;

hex2[6:

0]=7'b1000000;

end

case(lch[3:

0])

4'b0000:

hex6[6:

0]=7'b1000000;

4'b0001:

hex6[6:

0]=7'b1111001;

4'b0010:

hex6[6:

0]=7'b0100100;

4'b0011:

hex6[6:

0]=7'b0110000;

4'b0100:

hex6[6:

0]=7'b0011001;

4'b0101:

hex6[6:

0]=7'b0010010;

4'b0110:

hex6[6:

0]=7'b0000010;

4'b0111:

hex6[6:

0]=7'b1111000;

4'b1000:

hex6[6:

0]=7'b0000000;

4'b1001:

hex6[6:

0]=7'b0010000;

default:

hex6[6:

0]=7'b1000000;

endcase

case(lch[7:

4])

4'b0000:

hex7[6:

0]=7'b1000000;

4'b0001:

hex7[6:

0]=7'b1111001;

4'b0010:

hex7[6:

0]=7'b0100100;

4'b0011:

hex7[6:

0]=7'b0110000;

4'b0100:

hex7[6:

0]=7'b0011001;

4'b0101:

hex7[6:

0]=7'b0010010;

4'b0110:

hex7[6:

0]=7'b0000010;

4'b0111:

hex7[6:

0]=7'b1111000;

4'b1000:

hex7[6:

0]=7'b0000000;

4'b1001:

hex7[6:

0]=7'b0010000;

default:

hex7[6:

0]=7'b1000000;

endcase

case(jishi[3:

0])

4'b0000:

hex4[6:

0]=7'b1000000;

4'b0001:

hex4[6:

0]=7'b1111001;

4'b0010:

hex4[6:

0]=7'b0100100;

4'b0011:

hex4[6:

0]=7'b0110000;

4'b0100:

hex4[6:

0]=7'b0011001;

4'b0101:

hex4[6:

0]=7'b0010010;

4'b0110:

hex4[6:

0]=7'b0000010;

4'b0111:

hex4[6:

0]=7'b1111000;

4'b1000:

hex4[6:

0]=7'b0000000;

4'b1001:

hex4[6:

0]=7'b0010000;

default:

hex4[6:

0]=7'b1000000;

endcase

case(jishi[7:

4])

4'b0000:

hex5[6:

0]=7'b1000000;

4'b0001:

hex5[6:

0]=7'b1111001;

4'b0010:

hex5[6:

0]=7'b0100100;

4'b0011:

hex5[6:

0]=7'b0110000;

4'b0100:

hex5[6:

0]=7'b0011001;

4'b0101:

hex5[6:

0]=7'b0010010;

4'b0110:

hex5[6:

0]=7'b0000010;

4'b0111:

hex5[6:

0]=7'b1111000;

4'b1000:

hex5[6:

0]=7'b0000000;

4'b1001:

hex5[6:

0]=7'b0010000;

default:

hex5[6:

0]=7'b1000000;

endcase

case(fee[3:

0])

4'b0000:

hex0[6:

0]=7'b1000000;

4'b0001:

hex0[6:

0]=7'b1111001;

4'b0010:

hex0[6:

0]=7'b0100100;

4'b0011:

hex0[6:

0]=7'b0110000;

4'b0100:

hex0[6:

0]=7'b0011001;

4'b0101:

hex0[6:

0]=7'b0010010;

4'b0110:

hex0[6:

0]=7'b0000010;

4'b0111:

hex0[6:

0]=7'b1111000;

4'b1000:

hex0[6:

0]=7'b0000000;

4'b1001:

hex0[6:

0]=7'b0010000;

default:

hex0[6:

0]=7'b1000000;

endcase

case(fee[8:

5])

4'b0000:

hex1[6:

0]=7'b1000000;

4'b0001:

hex1[6:

0]=7'b1111001;

4'b0010:

hex1[6:

0]=7'b0100100;

4'b0011:

hex1[6:

0]=7'b0110000;

4'b0100:

hex1[6:

0]=7'b0011001;

4'b0101:

hex1[6:

0]=7'b0010010;

4'b0110:

hex1[6:

0]=7'b0000010;

4'b0111:

hex1[6:

0]=7'b1111000;

4'b1000:

hex1[6:

0]=7'b0000000;

4'b1001:

hex1[6:

0]=7'b0010000;

default:

hex1[6:

0]=7'b1000000;

endcase

case(fee[13:

10])

4'b0000:

hex2[6:

0]=7'b1000000;

4'b0001:

hex2[6:

0]=7'b1111001;

4'b0010:

hex2[6:

0]=7'b0100100;

4'b0011:

hex2[6:

0]=7'b0110000;

4'b0100:

hex2[6:

0]=7'b0011001;

4'b0101:

hex2[6:

0]=7'b0010010;

4'b0110:

hex2[6:

0]=7'b0000010;

4'b0111:

hex2[6:

0]=7'b1111000;

4'b1000:

hex2[6:

0]=7'b0000000;

4'b1001:

hex2[6:

0]=7'b0010000;

default:

hex2[6:

0]=7'b1000000;

endcase

end

endmodule

3.7,顶层模块:

各模块设计仿真实现后,可分别创建成元件符号。

顶层就是将各分模块用VerilogHDL语言或者是图形方法连接起来,便可实现系统电路。

3.7.1,顶层模块的VerilogHDL源代码:

modulePIS_QQ_LX(reset,start,clk,hex0,hex1,hex2,hex4,hex5,hex6,hex7,clk_1);

inputreset,start,clk;

outputhex0,hex1,hex2,hex4,hex5,hex6,hex7,clk_1;

wirereset,start,clk;

wire[6:

0]hex0,hex1,hex2,hex4,hex5,hex6,hex7;

wireclk_1;

wire[7:

0]lch,jishi,jishi_1;

wire[13:

0]fee;

fenpinQQ1(.clk(clk),.reset(reset),.clk_1(clk_1));

lichengQQ2(.clk_1(clk_1),.reset(reset),.start(start),.lch(lch));

jsQQ5(.clk_1(clk_1),.reset(reset),.start(start),.jishi(jishi),.jishi_1(jishi_1));

jfQQ3(.lch(lch),.jishi_1(jishi_1),.fee(fee));

displayQQ4(.reset(reset),.jishi(jishi),.clk_1(clk_1),.lch(lch),.fee(fee),.hex0(hex0),.hex1(hex1),.hex2(hex2),.hex4(hex4),.hex5(hex5),.hex6(hex6),.hex7(hex7));

endmodule

 

4.验证方案:

4.1,验证的流程图:

 

不满足

不合格

 

合格

满足

 

4.2,验证的VerilogHDL源代码:

`timescale1ns/100ps//时间的单位与时间的精度

moduletest;

regclk,reset,start;

wire[6:

0]hex0,hex1,hex2,hex4,hex5,hex6,hex7;

PIS_QQ_LXmain(.reset(reset),.start(start),.clk(clk),.hex0(hex0),

.hex1(hex1),.hex2(hex2),.hex4(hex4),.hex5(hex5),.hex6(hex6),.hex7(hex7));

initial

begin

reset=0;

clk=0

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

当前位置:首页 > 表格模板 > 合同协议

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

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