基于FPGA的出租车计价器设计.docx
《基于FPGA的出租车计价器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的出租车计价器设计.docx(22页珍藏版)》请在冰豆网上搜索。
![基于FPGA的出租车计价器设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/2d88b56b-43b7-45a5-89be-bb2a9cf71147/2d88b56b-43b7-45a5-89be-bb2a9cf711471.gif)
基于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