FPGA课程设计出租车简易计价器.docx
《FPGA课程设计出租车简易计价器.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计出租车简易计价器.docx(9页珍藏版)》请在冰点文库上搜索。
FPGA课程设计出租车简易计价器
西安邮电大学
FPGA课程设计报告
题 目:
出租车简易计价器设计
院 系:
电子工程学院
专业班级:
微电子0901
学生姓名:
导师姓名:
黄海生
起止时间:
2010.06.18至2012.06.29
2012年07月01 日
基于FPGA的出租车简易计价器设计
一.功能要求:
设计一个出租车简易计价器,用FPGA开发板的按键手动来控制出租车的状态,即行驶或等待,数码管显示当前的行驶里程,等待时间以及总共的费用。
二.功能描述:
(1)异步复位,复位信号与时钟信号不同步。
(2)基准时钟(50MHZ)由原来的每秒跳变50M下分成每秒跳变3下,即便于人眼的观察,设计5秒钟里程变化一公里,6秒钟时间等待为一分钟。
(3)用一个拨码开关来控制当前的状态,如果是高电平1则开始计里程,如果是低电平0则开始计等待时间。
(4)用7个7段数码管来显示当前的里程,等待时间以及最后的费用。
(5)手动控制计费系统,当一位客人下车而另一位客人上车则按复位键清0,使得数码管只显示起始价8元。
三.系统描述:
(1)系统结构:
(2)输入输出信号描述
信号
输入/输出
目标/源
功能描述
clk
input
pin
系统时钟(50MHZ)
reset
input
pin
异步清零,低电平有效
start
input
pin
状态选择,1时计里程,0时计等待时间
hex0
input
pin
显示里程的十位上的数字
hex1
input
pin
显示里程个位上的数字
hex2
output
pin
显示计时十位上的数字
hex4
output
pin
显示计时个位上的数字
hex5
output
pin
显示计费百位上的数字
hex6
output
pin
显示计费十位上的数字
hex7
output
pin
显示计费个位上的数字
(3)顶层划分
(4)设计思想:
计价器功能要求:
出租车起步价为8元,行驶过程中每公里1元,中途停止等待时间累计大于三分钟后按每两分钟1元计价。
计价系统里程显示范围为:
0~99公里,分辨率1公里。
计价费用显示范围为:
0~999元,分辨率1元。
等待计时器显示范围为:
0~60分钟,分辨率1分钟。
计价系统原理:
出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从8开始计算。
再根据行驶里程或停止等待的时间按以上的标准计费。
若在行驶状态,则计程器开始加计数,每公里1元。
若出租车停止等待状态,则计时器开始加计数,当时间超过三分钟后,计费器以每分钟1元累加。
出租车到达目的地停止计费器,显示总费用。
根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。
其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。
四.模块代码
分频模块:
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
仿真结果:
里程模块:
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'b000010)
begin
lch=lch+1'b1;
count=count+1'b1;
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'b000100)
count=6'b000000;
else
count=count+1'b1;
end
else
lch[7:
0]=lch[7:
0];
end
end
endmodule
modulejs(reset,start,clk_1,jishi);
inputreset,start,clk_1;
outputjishi;
reg[5:
0]count1;
reg[7:
0]jishi;
always@(negedgereset,posedgeclk_1)
begin
if(!
reset)
begin
count1=6'b000000;
jishi=8'b00000000;
end
else
begin
if(!
start)
begin
if(count1==6'b000010)
begin
jishi=jishi+1'b1;
if(jishi[3:
0]>4'b1001)
begin
jishi[7:
4]=jishi[7:
4]+4'b0001;
jishi[3:
0]=4'b0000;
end
count1=count1+1'b1;
end
elseif(count1==6'b000100)
count1=6'b000000;
else
count1=count1+1'b1;
end
else
jishi[7:
0]=jishi[7:
0];
end
end
endmodule
里程计时模块仿真结果:
说明:
从图上可以看出根据start的不同状态,里程和计时模块交替工作,若在行驶状态,则计程器开始加计数,。
若出租车停止等待状态,则计时器开始加计数。
里程计时模块框图:
计费模块:
modulejf(lch,jishi,fee);
inputlch,jishi;
outputfee;
reg[13:
0]fee;
wire[7:
0]lch;
wire[7:
0]jishi;
always@(lch,jishi)
begin
if(jishi[7:
0]<8'b00000011)
begin
fee[4:
0]={1'b0,lch[3:
0]}+5'b01000;
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;