基于verilog语言的出租车计费器文档格式.docx
《基于verilog语言的出租车计费器文档格式.docx》由会员分享,可在线阅读,更多相关《基于verilog语言的出租车计费器文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;
反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
本文采用verilog语言来设计实现出租车计费系统,经过ModelSim和Quartus仿真将其实例化。
如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。
另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。
一、设计要求
(1)行程3公里内(包括3公里),且等待累计时间2分钟内(包括2分钟),起步费为6.0元;
(2)3公里外(不包括3公里)以每公里1.0元,等待累计时间2分钟外(不包括2分钟)以每分钟以1.0元计费。
(3)能显示行驶公里数、等待累计时间和最后的总费用。
本计费器的显示范围为0~99元,计价分辨率为1元;
计程器显示范围为0~99公里,分辨率为1公里;
计时器的显示范围是分钟的显示范围是0—99,辨率为1分钟。
秒的显示范围是0—59。
分辨率为1秒。
二、工作原理
出租车的一般计费过程为:
出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从6开始计算。
再根据行驶里程或停止等待的时间按以上的标准计费。
若在行驶状态,则计程器开始加计数,当路程超过三公里后,计费器以每公里1元累加。
若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。
出租车到达目的地停止后,停止计费器,显示总费用。
根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。
其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。
系统框图如下所示:
三、各模块的设计
本系统采用层次化、模块化的设计方法,设计顺序为自下向上。
首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。
为了便于显示,这里的路程、时间和费用计数器均用十六进制表示。
3.1分频模块:
3.1.1计数器的分频模块:
计数器的分频模块具体框图:
此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。
设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。
在仿真的时候为了方便观察设计了一个8分频的电路。
当下载的时候用的是2HZ的时钟。
计数器的分频模块VerilogHDL源代码:
modulediv(clk_50M,clk,reset);
//端口的定义
inputclk_50M,reset;
//总的时钟是50M
outputclk;
//分频后输的时钟
regclk;
reg[31:
0]count;
//32位的计数器
always@(posedgeclk_50Mornegedgereset)//异步复位
begin
if(!
reset)
begin
clk<
='
d0;
count=32'
end
elseif(count==32'
d25_000000)//判断计时器记到了25_000000吗
count<
=32'
//计到25_000000计数器清零
=~clk;
//输出的时钟取反
end//endbegin
elsecount<
=count+1'
d1;
//没计到25_000000计数器加一
end//endalways
endmodule//结束分频模块
仿真的结果:
从波形可以看出当reset为低电平的时候clk为零,当为高电平的时候clk的高电平占了clk_50M的八个周期,低电平也占了clk_50M的八个周期。
3.1.2数码管的分频模块:
具体框图:
此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,因为总的时钟是50M的。
设计该模块的时候用了一个32位的计数器,当计数器计到50_000的时候产生时钟。
数码管的分频模块VerilogHDL源代码:
modulediv1(clk_50M,clk1,reset);
outputclk1;
regclk1;
clk1<
d50_000)//判断计时器记到了50_000吗
//计到50_000计数器清零
=~clk1;
//没计到50_000计数器加一
3.2计程模块:
计程模块的框图:
此模块的功能是计算出租车行驶的路程。
在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。
计程模块的VerilogHDL源代码:
moduledistancemokuai(clk,start,reset,distance,distance_enable);
//端口的定义
inputclk,start,reset;
output[7:
0]distance;
//输出的公里
reg[7:
outputdistance_enable;
//控制计费的公里信号
regdistance_enable;
always@(posedgeclkornegedgereset)//异步复位
reset)//低电平复位
distance<
=8'
end
elseif(start)//start高电平有效
if(distance[3:
0]==9)//判断distance的低四位计到了9没有
begin
distance[3:
0]<
=4'
//计到9清零
if(distance[7:
4]==9)//判断distance的高四位计到了9没有
distance[7:
4]<
elsedistance[7:
=distance[7:
4]+1'
//distance的高四位没有计到9的时候加一
end
elsedistance[3:
=distance[3:
0]+1'
//distance的低四位没有计到9的时候加一
end//endstart
//*产生distance_enable信号*//
always@(posedgeclkornegedgereset)
if(!
distance_enable<
=1'
//复位
else
if(distance>
8'
d2)//大于公里三的时候
distance_enable<
//输出distance_enable信号
endmodule//结束计程模块
计程模块的仿真结果:
从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。
3.3计时模块:
计时模块的框图:
此模块用于计算停车等待的时间。
在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。
计时模块的VerilogHDL源代码:
moduletimemokuai(clk,reset,start,s,m,time_enable);
inputclk,reset,start;
0]s;
//输出的秒
0]m;
//输出的分
outputtime_enable;
//输出的控制计费的信号
wiretime_enable;
reset)//低电平有效
begin//复位
s<
m<
elseif(!
start)//start信号低电平有效
if(s[3:
0]==9)//秒的低四位是9
begin
s[3:
//清零
if(s[7:
4]==5)//秒的高四位是5
s[7:
//清零
if(m[3:
0]==9)//分的低四位是9
begin
m[3:
if(m[7:
4]==9)//分的高四位是9
m[7:
//清